@burdenoff/microfe-kadaikodi 2026.704.3 → 2026.704.5

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 (145) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +34 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +84 -6
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  65. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  66. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/admin/CartManagementPage.js +564 -729
  68. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  69. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  70. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +201 -120
  72. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  74. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +173 -194
  76. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  77. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  78. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  80. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +428 -347
  82. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +332 -0
  84. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  85. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  86. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  87. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +294 -162
  88. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  90. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  92. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  94. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  95. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  96. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +239 -156
  97. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  98. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  99. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  100. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  101. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  102. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  103. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  104. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +5 -5
  105. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  106. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  107. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  108. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +272 -230
  109. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  110. package/dist/kadaikodi/pages/customer/FavoritesPage.js +150 -413
  111. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  112. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  113. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  114. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +411 -305
  115. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  116. package/dist/kadaikodi/pages/customer/ReviewsPage.js +310 -406
  117. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  119. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  120. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  121. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  122. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  123. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  124. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  125. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  126. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  127. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  128. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  129. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  130. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  131. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  132. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  133. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  134. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  135. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +428 -431
  136. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  137. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  138. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  139. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  140. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  141. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +360 -288
  142. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  143. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +303 -281
  144. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  145. package/package.json +1 -1
@@ -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 { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { EmptyState } from '../../components/EmptyState';\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 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 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 {/* 4 Metrics Grid — the one emphasis zone for this page */}\n {stats && (\n <EmphasisPanel className=\"mb-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Orders at a Glance</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\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={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Total Revenue\"\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(averageOrderValue)}\n label=\"Avg Order Value\"\n />\n <MetricsCard\n icon={<Clock className=\"h-5 w-5\" />}\n value={(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n label=\"Pending Orders\"\n trendValue=\"Awaiting action\"\n />\n </div>\n </EmphasisPanel>\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]) => ({ label: s.replace(/_/g, ' ').replace(/\\b\\w/g, (x) => x.toUpperCase()), value: v }));\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":";;;;;;;;;;;;;AA0CA,IAAM,IAAS,OAAU,KAAK,KACxB,KAAY,MAAY;CAC5B,IAAM,IAAI,IAAI,KAAK,EAAE;AAErB,QADA,EAAE,SAAS,GAAG,GAAG,GAAG,EAAE,EACf,EAAE,SAAS;GAGd,IAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,IAAkB;CAChC,IAAM,EAAE,MAAM,IAAS,EAAE,EAAE,iBAAc,EAAU,EAAE,CAAC,EAChD,EAAE,MAAM,MAAU,GAAmB,EACrC,IAAe,GAAsB,EAErC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAc,KAAmB,EAAS,MAAM,EACjD,CAAC,GAAe,KAAoB,EAA2B,KAAK,EACpE,CAAC,GAAgB,KAAqB,EAAS,GAAM,EAErD,KAAU,MAAmB,EAAe,GAAQ,EAAE,uBAAuB,GAAG,CAAC,EAEjF,KAAc,MAClB,IACI,IAAI,KAAK,EAAE,CAAC,eAAe,SAAS;EAClC,KAAK;EACL,OAAO;EACP,MAAM;EACN,QAAQ;EACT,CAAC,GACF,KAGA,IAAoB,QACpB,KAAS,EAAM,cAAc,IAAU,EAAM,eAAe,EAAM,cAClE,EAAO,WAAW,IAAU,IACzB,EAAO,QAAQ,GAAK,MAAM,IAAM,EAAE,OAAO,EAAE,GAAG,EAAO,QAC3D,CAAC,GAAO,EAAO,CAAC,EAGb,EAAE,iBAAc,iBAAc,QAAc;EAChD,IAAM,IAAQ,kBAAS,IAAI,MAAM,CAAC,EAC5B,IAAQ,IAAQ,KAAK,GACrB,oBAAI,IAAI,KAAqB,EAC7B,oBAAI,IAAI,KAAqB;AACnC,OAAK,IAAI,IAAI,GAAO,KAAK,GAAO,KAAK,EAEnC,CADA,EAAE,IAAI,GAAG,EAAE,EACX,EAAE,IAAI,GAAG,EAAE;AAEb,OAAK,IAAM,KAAK,GAAQ;GACtB,IAAM,IAAI,EAAS,IAAI,KAAK,EAAE,UAAU,CAAC;AACzC,GAAI,EAAE,IAAI,EAAE,KACV,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,EAC7B,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,SAAS,GAAG;;AAG9C,SAAO;GAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;GAAE,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;GAAE;IACnE,CAAC,EAAO,CAAC,EAGN,IAAiB,QAAyB;EAC9C,IAAM,oBAAI,IAAI,KAAqB;AACnC,OAAK,IAAM,KAAK,EAAQ,GAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,EAAE;AACnE,SAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CACpB,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAC3B,KAAK,CAAC,GAAG,QAAQ;GAAE,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC;GAAE,OAAO;GAAG,EAAE;IACvG,CAAC,EAAO,CAAC,EAEN,KAAkB,OACc;EAClC,WAAW;EACX,WAAW;EACX,OAAO;EACP,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,WAAW;EACZ,EACU,MAAW,oCAGlB,KAAkB,MAAmB;AACzC,UAAQ,GAAR;GACE,KAAK,YACH,QAAO,kBAAC,GAAD,EAAc,WAAU,oCAAqC,CAAA;GACtE,KAAK,SACH,QAAO,kBAAC,GAAD,EAAS,WAAU,kCAAmC,CAAA;GAC/D,KAAK,WACH,QAAO,kBAAC,GAAD,EAAW,WAAU,6BAA8B,CAAA;GAC5D,QACE,QAAO,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA;;IAInE,IAAiB,QACd,EAAO,QAAQ,MAAU;EAC9B,IAAM,IACJ,CAAC,KACD,EAAM,GAAG,aAAa,CAAC,SAAS,EAAY,aAAa,CAAC,IAC1D,EAAM,SAAS,aAAa,CAAC,SAAS,EAAY,aAAa,CAAC,EAC5D,IAAgB,MAAiB,SAAS,EAAM,WAAW;AACjE,SAAO,KAAiB;GACxB,EACD;EAAC;EAAQ;EAAa;EAAa,CAAC,EAEjC,KAAsB,GAAiB,MAA2B;AACtE,IAAa,OACX;GAAE,IAAI;GAAS,QAAQ,EAAU,aAAa;GAAE,EAChD,EACE,iBAAiB;AACf,MAAkB,MAAU,KAAO;IAAE,GAAG;IAAM,QAAQ;IAAW,CAAS;KAE7E,CACF;IAGG,KAAiB,MAAqB;EAC1C,IAAM,IAAI,EAAM,iBACV,IAAQ;GAAC,EAAE;GAAQ,EAAE;GAAM,EAAE;GAAM,EAAE;GAAQ,CAAC,OAAO,QAAQ;AACnE,SAAO,EAAM,SAAS,IAAI,EAAM,KAAK,KAAK,GAAG;;AAc/C,QAXI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAmB,aAAY;YAC/C,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAS,WAAU,mDAAoD,CAAA,EACvE,kBAAC,KAAD;IAAG,WAAU;cAAsB;IAAqB,CAAA,CACpD;;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,GAAG,GAAO,eAAe,EAAO,OAAO;YAFtD;GAIE,kBAAC,GAAD;IAAa,WAAU;cAAO;IAKhB,CAAA;GAGb,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,OAAM;OACN,QAAQ,EAAM,eAAe,GAAG,eAAe,QAAQ;OACvD,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,WAAW;OACX,kBAAiB;OACjB,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,OAAO,EAAO,EAAM,aAAa;OACjC,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,WAAW;OACX,kBAAiB;OACjB,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,OAAO,EAAO,EAAkB;OAChC,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;OACxC,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,QAAQ,EAAM,iBAAiB,GAAG,eAAe,QAAQ;OACzD,MAAM,kBAAC,IAAD,EAAO,WAAU,WAAY,CAAA;OACnC,CAAA;MACE;QACN,kBAAC,GAAD;KAAW,WAAU;KAAQ,WAAU;eAAvC,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAiD;MAAiB,CAAA,EAC/E,EAAe,SAAS,IACvB,kBAAC,GAAD;MACE,UAAU;MACV,MAAM;MACN,aAAa,EAAO,OAAO,eAAe,QAAQ;MAClD,eAAc;MACd,iBAAiB,MAAM,EAAE,eAAe,QAAQ;MAChD,CAAA,GAEF,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAgC,CAAA,CAEnE;OACR;;GAIR,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,SAAD;OACE,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;OAC/C,WAAU;OACV,CAAA,CACE;SACN,kBAAC,UAAD;MACE,OAAO;MACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;MAChD,WAAU;gBAHZ,CAKE,kBAAC,UAAD;OAAQ,OAAM;iBAAM;OAAmB,CAAA,EACtC,EAAe,KAAK,MACnB,kBAAC,UAAD;OAAgB,OAAO;iBACpB,EAAE,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC;OACvD,EAFI,EAEJ,CACT,CACK;QACL;;IACF,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAe,KAAK,MACnB,kBAAC,OAAD;OAEE,WAAU;iBAFZ;QAIE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBAAyC,EAAM;UAAc,CAAA,EAC3E,kBAAC,KAAD;UAAG,WAAU;oBAA+B,EAAW,EAAM,UAAU;UAAK,CAAA,CACxE,EAAA,CAAA,EACN,kBAAC,QAAD;UACE,WAAW,EACT,sFACA,EAAe,EAAM,OAAO,CAC7B;oBAEA,EAAM,OAAO,QAAQ,MAAM,IAAI;UAC3B,CAAA,CACH;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAkC;UAAS,CAAA,EACxD,kBAAC,KAAD;UAAG,WAAU;oBAAb,CAAkC,EAAM,MAAM,QAAO,WAAY;YAC7D,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAkC;UAAY,CAAA,EAC3D,kBAAC,KAAD;UAAG,WAAU;oBAAiD,EAAM;UAAO,CAAA,CACvE,EAAA,CAAA,CACF;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA0C;UAAU,CAAA,EACjE,kBAAC,KAAD;UAAG,WAAU;oBAA2C,EAAO,EAAM,MAAM;UAAK,CAAA,CAC5E,EAAA,CAAA,EACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACG,EAAe,EAAM,cAAc,EACpC,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,KAAD;YAAG,WAAU;sBAA6B,EAAM;YAAkB,CAAA,EAClE,kBAAC,KAAD;YAAG,WAAU;sBAA0C,EAAM;YAAkB,CAAA,CAC3E;aACF;YACF;;QACN,kBAAC,UAAD;SACE,MAAK;SACL,eAAe;AAEb,UADA,EAAiB,EAAM,EACvB,EAAkB,GAAK;;SAEzB,WAAU;mBANZ,CAQE,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA,EAAA,gBACpB;;QACL;SAlDC,EAAM,GAkDP,CACN;MACE,CAAA;KAGN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBAAuF;UAEhG,CAAA;SACF;WACC,CAAA,EACR,kBAAC,SAAD;QAAO,WAAU;kBACd,EAAe,KAAK,MACnB,kBAAC,MAAD;SAAmB,WAAU;mBAA7B;UACE,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAM,GAAG,MAAM,GAAG,GAAG;WACnB,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBACZ,kBAAC,OAAD;YAAK,WAAU;sBAAyC,EAAM;YAAe,CAAA;WAC1E,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBAAd,CACG,EAAM,MAAM,QAAO,WACjB;;UACL,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAO,EAAM,MAAM;WACjB,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBACZ,kBAAC,QAAD;YACE,WAAW,EACT,sFACA,EAAe,EAAM,OAAO,CAC7B;sBAEA,EAAM,OAAO,QAAQ,MAAM,IAAI;YAC3B,CAAA;WACJ,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBACZ,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACG,EAAe,EAAM,cAAc,EACpC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;aAAK,WAAU;uBAA6B,EAAM;aAAoB,CAAA,EACtE,kBAAC,OAAD;aAAK,WAAU;uBACZ,EAAM;aACH,CAAA,CACF,EAAA,CAAA,CACF;;WACH,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAW,EAAM,UAAU;WACzB,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBACZ,kBAAC,UAAD;YACE,MAAK;YACL,eAAe;AAEb,aADA,EAAiB,EAAM,EACvB,EAAkB,GAAK;;YAEzB,WAAU;sBAEV,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;YACpB,CAAA;WACN,CAAA;UACF;WAjDI,EAAM,GAiDV,CACL;QACI,CAAA,CACF;;MACJ,CAAA;KAEL,EAAe,WAAW,KACzB,kBAAC,GAAD;MACE,cAAa;MACb,OAAO,EAAO,WAAW,IAAI,kBAAkB;MAC/C,aACE,EAAO,WAAW,IACd,wEACA;MAEN,QACE,EAAO,SAAS,IACd,kBAAC,UAAD;OACE,MAAK;OACL,eAAe;AAEb,QADA,EAAe,GAAG,EAClB,EAAgB,MAAM;;OAExB,WAAU;iBACX;OAEQ,CAAA,GACP,KAAA;MAEN,CAAA;KAEA;;GAGL,KAAkB,KACjB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAAkB,CAAA,EAC1E,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAkB,GAAM;OACvC,WAAU;iBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;OAClB,CAAA,CACL;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OAEE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAuC;QAAsB,CAAA,EAC3E,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAY,CAAA,EACvD,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAc;UACb,CAAA,CACA,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAU,CAAA,EACrD,kBAAC,QAAD;UACE,WAAW,EACT,sFACA,EAAe,EAAc,OAAO,CACrC;oBAEA,EAAc,OAAO,QAAQ,MAAM,IAAI;UACnC,CAAA,CACH,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAc,CAAA,EACzD,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAW,EAAc,UAAU;UAClC,CAAA,CACA,EAAA,CAAA;SACL,EAAc,yBACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAsB,CAAA,EACjE,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAW,EAAc,sBAAsB;UAC9C,CAAA,CACA,EAAA,CAAA;SAEJ;UACF,EAAA,CAAA;OAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,QAC1B;WACL,kBAAC,KAAD;QAAG,WAAU;kBAAiC,EAAc;QAAa,CAAA,CACrE,EAAA,CAAA;OAGL,EAAc,EAAc,KAAK,OAChC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAuC;QAAqB,CAAA,EAC1E,kBAAC,KAAD;QAAG,WAAU;kBAAb,CACE,kBAAC,GAAD,EAAQ,WAAU,yBAA0B,CAAA,EAC3C,EAAc,EAAc,CAC3B;UACA,EAAA,CAAA;OAIR,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAuC;QAAgB,CAAA,EACrE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAc,MAAM,SAAS,IAC5B,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAc,MAAM,KAAK,MACxB,kBAAC,MAAD;UAEE,WAAU;oBAFZ,CAIE,kBAAC,QAAD,EAAA,UAAA;WACG,EAAK;WAAK;WAAI,EAAK;WACf,EAAA,CAAA,EACP,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAO,EAAK,QAAQ,EAAK,SAAS;WAAQ,CAAA,CACtE;YAPE,EAAK,GAOP,CACL;SACC,CAAA,GAEL,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAA2B,CAAA,EAExE,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA,EACrB,kBAAC,QAAD,EAAA,UAAO,EAAO,EAAc,SAAS,EAAQ,CAAA,CACzC;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,kBAAC,QAAD,EAAA,UAAO,EAAO,EAAc,MAAM,EAAQ,CAAA,CACtC;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAM,gBAAmB,CAAA,EACzB,kBAAC,QAAD,EAAA,UAAO,EAAO,EAAc,YAAY,EAAQ,CAAA,CAC5C;;UACL,EAAc,WACb,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA,EACrB,kBAAC,QAAD,EAAA,UAAA,CAAM,KAAE,EAAO,EAAc,SAAS,CAAQ,EAAA,CAAA,CAC1C;eACJ;UACJ,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,kBAAC,QAAD,EAAA,UAAO,EAAO,EAAc,MAAM,EAAQ,CAAA,CACtC;;UACF;WACF;UACF,EAAA,CAAA;OAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAuC;QAAoB,CAAA,EACzE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAU,CAAA,EACrD,kBAAC,KAAD;SAAG,WAAU;mBAAiC,EAAc;SAAkB,CAAA,CAC1E,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAU,CAAA,EACrD,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,EAAe,EAAc,cAAc,EAC5C,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAc;UACV,CAAA,CACH;WACF,EAAA,CAAA,CACF;UACF,EAAA,CAAA;OAGL,EAAc,iBACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAuC;QAAyB,CAAA,EAC9E,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAc;QACb,CAAA,CACA,EAAA,CAAA;OAIR,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAkB,GAAM;SACvC,WAAU;mBACX;SAEQ,CAAA,EACR,EAAc,WAAW,eAAe,EAAc,WAAW,eAChE,kBAAC,UAAD;SACE,UAAU,EAAa;SACvB,WAAU;SACV,OAAO,EAAc;SACrB,WAAW,MACT,EAAmB,EAAc,IAAI,EAAE,OAAO,MAAqB;mBAGpE,EAAe,KAAK,MACnB,kBAAC,UAAD;UAAgB,OAAO;oBACpB,EAAE,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC;UACvD,EAFI,EAEJ,CACT;SACK,CAAA,CAEP;;OACF;QACF;;IACF,CAAA;GAEG"}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminProfilePage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module kadaikodi/pages/admin\n *\n * Read-only view of the signed-in admin's real identity (from the shell's\n * currentUser) plus the platform areas an admin can access. No fabricated\n * phone numbers, login history or account-created timestamps — those have no\n * backend source, so they are omitted rather than invented.\n */\n\nimport {\n Mail,\n Phone,\n Shield,\n ArrowLeft,\n ShoppingBag,\n BarChart3,\n Settings,\n Users,\n Store,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst CAPABILITIES: Array<{ key: string; label: string; icon: typeof Users }> = [\n { key: 'user_management', label: 'User Management', icon: Users },\n { key: 'cart_management', label: 'Cart Management', icon: Store },\n { key: 'order_management', label: 'Order Management', icon: ShoppingBag },\n { key: 'analytics', label: 'Analytics', icon: BarChart3 },\n { key: 'system_settings', label: 'System Settings', icon: Settings },\n];\n\nexport function AdminProfilePage() {\n const { currentUser, navigateTo } = useKadaikodi();\n\n const firstName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? 'Admin';\n const lastName = currentUser?.lastName ?? currentUser?.name?.split(' ').slice(1).join(' ') ?? '';\n const email = currentUser?.email ?? '';\n const phone = currentUser?.phone ?? '';\n const role = currentUser?.role ?? 'admin';\n const initials = `${firstName.charAt(0)}${lastName.charAt(0)}`.trim() || 'A';\n\n return (\n <PageLayout\n title=\"Admin Profile\"\n description=\"Your admin account information and access\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n }\n >\n <PagePurpose className=\"mb-6 max-w-4xl\">\n Your admin identity and the platform areas you can manage. Your name and email come from\n your Burdenoff account; contact your workspace administrator to update account details or\n change your role.\n </PagePurpose>\n\n <div className=\"space-y-6 max-w-4xl\">\n {/* Identity — the one emphasis zone for this page */}\n <EmphasisPanel>\n <div className=\"flex items-center mb-6\">\n <div className=\"w-16 h-16 bg-action-primary-bg text-action-primary-text rounded-full flex items-center justify-center text-2xl font-bold mr-4 uppercase\">\n {initials}\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {firstName} {lastName}\n </h2>\n <p className=\"text-text-secondary\">{email}</p>\n <p className=\"text-sm text-text-secondary capitalize\">{role}</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Email Address\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary flex items-center gap-2\">\n <Mail className=\"h-4 w-4 text-text-secondary\" />\n {email || 'Not available'}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Phone Number\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary flex items-center gap-2\">\n <Phone className=\"h-4 w-4 text-text-secondary\" />\n {phone || 'Not provided'}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">Role</label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary capitalize flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n {role}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Access / Capabilities */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Admin Access</h3>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {CAPABILITIES.map((cap) => {\n const CapIcon = cap.icon;\n return (\n <div\n key={cap.key}\n className=\"flex items-center gap-2 rounded-lg bg-action-primary-bg/10 text-primary p-3 text-sm font-medium\"\n >\n <CapIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"text-xs\">{cap.label}</span>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary mt-4\">\n Access is managed by workspace administrators. Contact your administrator to modify\n your role or permissions.\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminProfilePage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module kadaikodi/pages/admin\n *\n * Read-only view of the signed-in admin's real identity (from the shell's\n * currentUser) plus the platform areas an admin can access. No fabricated\n * phone numbers, login history or account-created timestamps — those have no\n * backend source, so they are omitted rather than invented.\n */\n\nimport {\n Mail,\n Phone,\n Shield,\n ArrowLeft,\n ShoppingBag,\n BarChart3,\n Settings,\n Users,\n Store,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst CAPABILITIES: Array<{ key: string; label: string; icon: typeof Users }> = [\n { key: 'user_management', label: 'User Management', icon: Users },\n { key: 'cart_management', label: 'Cart Management', icon: Store },\n { key: 'order_management', label: 'Order Management', icon: ShoppingBag },\n { key: 'analytics', label: 'Analytics', icon: BarChart3 },\n { key: 'system_settings', label: 'System Settings', icon: Settings },\n];\n\nexport function AdminProfilePage() {\n const { currentUser, navigateTo } = useKadaikodi();\n\n const firstName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? 'Admin';\n const lastName = currentUser?.lastName ?? currentUser?.name?.split(' ').slice(1).join(' ') ?? '';\n const email = currentUser?.email ?? '';\n const phone = currentUser?.phone ?? '';\n const role = currentUser?.role ?? 'admin';\n const initials = `${firstName.charAt(0)}${lastName.charAt(0)}`.trim() || 'A';\n\n return (\n <PageLayout\n title=\"Admin Profile\"\n description=\"Your admin account information and access\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n }\n >\n <PagePurpose className=\"mb-6 max-w-4xl\">\n Your admin identity and the platform areas you can manage. Your name and email come from\n your Burdenoff account; contact your workspace administrator to update account details or\n change your role.\n </PagePurpose>\n\n <div className=\"space-y-6 max-w-4xl\">\n {/* Identity — the one emphasis zone for this page */}\n <EmphasisPanel>\n <div className=\"flex items-center mb-6\">\n <div className=\"w-16 h-16 bg-action-primary-bg text-action-primary-text rounded-full flex items-center justify-center text-2xl font-bold mr-4 uppercase\">\n {initials}\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {firstName} {lastName}\n </h2>\n <p className=\"text-text-secondary\">{email}</p>\n <p className=\"text-sm text-text-secondary capitalize\">{role}</p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Email Address\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary flex items-center gap-2\">\n <Mail className=\"h-4 w-4 text-text-secondary\" />\n {email || 'Not available'}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Phone Number\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary flex items-center gap-2\">\n <Phone className=\"h-4 w-4 text-text-secondary\" />\n {phone || 'Not provided'}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">Role</label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary capitalize flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n {role}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Access / Capabilities */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Admin Access</h3>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {CAPABILITIES.map((cap) => {\n const CapIcon = cap.icon;\n return (\n <div\n key={cap.key}\n className=\"flex items-center gap-2 rounded-lg bg-action-primary-bg/10 text-primary p-3 text-sm font-medium\"\n >\n <CapIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"text-xs\">{cap.label}</span>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary mt-4\">\n Access is managed by workspace administrators. Contact your administrator to modify your\n role or permissions.\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}