@burdenoff/microfe-kadaikodi 2026.704.2 → 2026.704.4

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 (77) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/hooks/useKadaikodiApi.js +76 -6
  4. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +45 -107
  6. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminDashboard.js +30 -32
  8. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +137 -120
  10. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +2 -2
  12. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  14. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  15. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  16. package/dist/kadaikodi/pages/admin/CartManagementPage.js +278 -283
  17. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  18. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  19. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  20. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +105 -111
  21. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  22. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  23. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  24. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +84 -70
  25. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  26. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  27. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  29. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  30. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +202 -139
  31. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  32. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +232 -0
  33. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  34. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +84 -79
  35. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  36. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  38. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  41. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  42. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +243 -143
  43. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/CartDetailPage.js +4 -4
  45. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  46. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
  47. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  48. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -4
  49. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  50. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +6 -6
  51. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  52. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  53. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  54. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +6 -4
  55. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  56. package/dist/kadaikodi/pages/customer/FavoritesPage.js +6 -6
  57. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +4 -4
  59. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  60. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +409 -304
  61. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/customer/ReviewsPage.js +209 -162
  63. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  65. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  69. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  70. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +207 -186
  71. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +340 -272
  74. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  75. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +122 -75
  76. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  77. 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.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.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\">\n {order.cartName}\n </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":";;;;;;;;;;;AAyCA,IAAM,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,EAEb,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,GAAD;IAAe,WAAU;cAAzB,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAuB,CAAA,EACpF,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,OAAO,EAAM,YAAY,eAAe,QAAQ;OAChD,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,OAAO,EAAO,EAAM,aAAa;OACjC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;OACxC,OAAO,EAAO,EAAkB;OAChC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;OACnC,OAAO,EAAM,cAAc,eAAe,QAAQ;OAClD,OAAM;OACN,YAAW;OACX,CAAA;MACE;OACQ;;GAIlB,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;oBACX,EAAM;UACJ,CAAA,EACL,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;SApDC,EAAM,GAoDP,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
+ {"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 +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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"}