@burdenoff/microfe-coolandlovely 2026.625.1 → 2026.625.2

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 (91) hide show
  1. package/dist/coolandlovely/pages/HomePage.js +263 -258
  2. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  3. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +67 -61
  4. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/coolandlovely/pages/admin/AdminDashboard.js +79 -45
  6. package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +39 -33
  8. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +227 -222
  10. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/coolandlovely/pages/admin/AdminProfilePage.js +65 -60
  12. package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/coolandlovely/pages/admin/CartManagementPage.js +268 -263
  16. package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/coolandlovely/pages/admin/UserManagementPage.js +268 -263
  18. package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +92 -84
  20. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +587 -548
  24. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +171 -166
  26. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +219 -211
  28. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +671 -670
  30. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +515 -514
  32. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +244 -246
  34. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/coolandlovely/pages/common/HelpSupportPage.js +96 -96
  36. package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/coolandlovely/pages/common/NotificationCenterPage.js +50 -44
  38. package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
  40. package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
  42. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/coolandlovely/pages/customer/CartDetailPage.js +179 -176
  44. package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +215 -204
  46. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/coolandlovely/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/coolandlovely/pages/customer/CustomerDashboard.js +438 -396
  50. package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
  52. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
  54. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/coolandlovely/pages/customer/FavoritesPage.js +86 -76
  56. package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +118 -109
  58. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
  60. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +82 -76
  62. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/coolandlovely/pages/customer/ReviewsPage.js +83 -73
  64. package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +61 -55
  66. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +293 -255
  68. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +238 -232
  70. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +61 -55
  72. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/coolandlovely/pages/investor/InvestorDashboard.js +356 -320
  74. package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +107 -101
  76. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +170 -137
  78. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +386 -381
  80. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +359 -322
  82. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/coolandlovely/pages/worker/WorkerDashboard.js +574 -537
  84. package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +81 -76
  86. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +78 -73
  90. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOrdersPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured order management with 4 MetricsGrid stats, 3 filters,\n * dual layout (mobile cards + desktop table with 8 columns),\n * Order Details Modal with all sections and update status dropdown.\n */\n\nimport { useState, useEffect, 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 Truck,\n MapPin,\n Phone,\n User,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype OrderStatus =\n | 'pending'\n | 'confirmed'\n | 'preparing'\n | 'ready'\n | 'out_for_delivery'\n | 'delivered'\n | 'cancelled';\n\ninterface Order {\n id: string;\n customerName: string;\n customerPhone: string;\n cartName: string;\n cartOwner: string;\n items: string[];\n total: number;\n status: OrderStatus;\n paymentMethod: string;\n paymentStatus: 'pending' | 'completed' | 'failed' | 'refunded';\n orderDate: string;\n deliveryTime: string;\n deliveryAddress: string;\n workerAssigned?: string;\n notes?: string;\n}\n\ninterface OrderStats {\n totalOrders: number;\n pendingOrders: number;\n totalRevenue: number;\n averageOrderValue: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Mock data */\n/* ------------------------------------------------------------------ */\n\nconst mockOrders: Order[] = [\n {\n id: 'ORD-2024-001',\n customerName: 'Rajesh Kumar',\n customerPhone: '+91 98765 43210',\n cartName: 'Dosa Express',\n cartOwner: 'Suresh Rao',\n items: ['Masala Dosa x2', 'Filter Coffee x2', 'Vada x1'],\n total: 280,\n status: 'delivered',\n paymentMethod: 'UPI',\n paymentStatus: 'completed',\n orderDate: '2024-01-15T10:30:00',\n deliveryTime: '2024-01-15T11:15:00',\n deliveryAddress: '123, 4th Cross, Koramangala',\n workerAssigned: 'Ravi Kumar',\n },\n {\n id: 'ORD-2024-002',\n customerName: 'Priya Sharma',\n customerPhone: '+91 87654 32109',\n cartName: 'Juice Junction',\n cartOwner: 'Amit Patel',\n items: ['Fresh Orange Juice x1', 'Watermelon Juice x1'],\n total: 120,\n status: 'preparing',\n paymentMethod: 'Cash',\n paymentStatus: 'pending',\n orderDate: '2024-01-15T11:45:00',\n deliveryTime: '2024-01-15T12:15:00',\n deliveryAddress: '456, BTM Layout',\n notes: 'Extra ice please',\n },\n {\n id: 'ORD-2024-003',\n customerName: 'Amit Singh',\n customerPhone: '+91 76543 21098',\n cartName: 'Chaat Corner',\n cartOwner: 'Ramesh Verma',\n items: ['Pani Puri x1', 'Bhel Puri x1', 'Dahi Puri x1'],\n total: 150,\n status: 'pending',\n paymentMethod: 'Card',\n paymentStatus: 'completed',\n orderDate: '2024-01-15T12:00:00',\n deliveryTime: '2024-01-15T12:30:00',\n deliveryAddress: '789, HSR Layout',\n },\n];\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminOrdersPage() {\n const { navigateTo } = useCoolAndLovely();\n\n const [orders, setOrders] = useState<Order[]>([]);\n const [stats, setStats] = useState<OrderStats | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [dateFilter, setDateFilter] = useState('today');\n const [selectedOrder, setSelectedOrder] = useState<Order | null>(null);\n const [showOrderModal, setShowOrderModal] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setStats({\n totalOrders: 156,\n pendingOrders: 12,\n totalRevenue: 125600,\n averageOrderValue: 805,\n });\n setOrders(mockOrders);\n setIsLoading(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, []);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const formatDate = (d: string) =>\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 const getStatusColor = (status: string) => {\n const map: Record<string, string> = {\n delivered: 'bg-status-success-bg-subtle/20 text-status-success-text',\n preparing: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n ready: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n out_for_delivery: 'bg-accent-blue-subtle/20 text-accent-blue',\n cancelled: 'bg-status-error-bg-subtle/20 text-status-error-text',\n confirmed: 'bg-accent-blue-subtle/20 text-accent-blue',\n };\n return map[status] ?? 'bg-secondary text-secondary-foreground';\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-accent-blue\" />;\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.customerName.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 setOrders((prev) => prev.map((o) => (o.id === orderId ? { ...o, status: newStatus } : o)));\n setShowOrderModal(false);\n alert(`Order ${orderId} updated to ${newStatus.replace('_', ' ')}`);\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 ?? 0} total orders on the platform`}\n >\n {/* 4 Metrics Grid */}\n {stats && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6\">\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={stats.totalOrders}\n label=\"Total Orders\"\n trendValue=\"Orders today\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Revenue\"\n trend=\"up\"\n trendValue=\"+15.2% vs yesterday\"\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(stats.averageOrderValue)}\n label=\"Avg Order Value\"\n trendValue=\"Average order value\"\n />\n <MetricsCard\n icon={<Clock className=\"h-5 w-5\" />}\n value={stats.pendingOrders}\n label=\"Pending Orders\"\n trendValue=\"Awaiting action\"\n />\n </div>\n )}\n\n {/* 3 Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 mb-6 bg-gloss-card shadow-pop\">\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, customer, 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 <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\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 <option value=\"pending\">Pending</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"out_for_delivery\">Out for Delivery</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n <select\n value={dateFilter}\n onChange={(e) => setDateFilter(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=\"today\">Today</option>\n <option value=\"yesterday\">Yesterday</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n </select>\n </div>\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 key={order.id} className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\">\n <div className=\"flex justify-between items-start mb-3\">\n <div>\n <h3 className=\"font-medium text-text-primary text-lg\">{order.id}</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('_', ' ')}\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\">Customer</p>\n <p className=\"text-text-primary\">{order.customerName}</p>\n <p className=\"text-text-secondary text-xs\">{order.customerPhone}</p>\n </div>\n <div>\n <p className=\"text-text-secondary font-medium\">Cart</p>\n <p className=\"text-text-primary\">{order.cartName}</p>\n <p className=\"text-text-secondary text-xs\">{order.cartOwner}</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\">\n {order.paymentStatus}\n </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 Customer\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 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}\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.customerName}</div>\n <div className=\"text-xs text-text-secondary\">{order.customerPhone}</div>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.cartName}</div>\n <div className=\"text-xs text-text-secondary\">{order.cartOwner}</div>\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('_', ' ')}\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 <div className=\"flex flex-col items-center justify-center py-12 px-4\">\n <ShoppingBag className=\"h-10 w-10 text-text-secondary/50 mb-3\" />\n <p className=\"text-sm text-text-secondary\">No orders found matching your criteria</p>\n </div>\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\">{selectedOrder.id}</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('_', ' ')}\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 <div>\n <p className=\"text-sm text-text-secondary\">Delivery Time</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.deliveryTime)}\n </p>\n </div>\n </div>\n </div>\n\n {/* Customer Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <User className=\"h-4 w-4\" /> Customer Details\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Name</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.customerName}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Phone</p>\n <p className=\"font-medium text-text-primary flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {selectedOrder.customerPhone}\n </p>\n </div>\n <div className=\"sm:col-span-2\">\n <p className=\"text-sm text-text-secondary\">Delivery Address</p>\n <p className=\"font-medium text-text-primary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {selectedOrder.deliveryAddress}\n </p>\n </div>\n </div>\n </div>\n\n {/* Cart Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Cart 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\">Cart Name</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartName}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Cart Owner</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartOwner}</p>\n </div>\n </div>\n </div>\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 <ul className=\"space-y-2\">\n {selectedOrder.items.map((item, i) => (\n <li key={i} className=\"text-sm text-text-primary\">\n {item}\n </li>\n ))}\n </ul>\n <div className=\"mt-4 pt-4 border-t border-border-subtle flex justify-between items-center\">\n <span className=\"font-semibold text-text-primary\">Total Amount</span>\n <span className=\"font-semibold text-lg text-text-primary\">\n {fmtCur(selectedOrder.total)}\n </span>\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 {/* Worker Assignment */}\n {selectedOrder.workerAssigned && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Truck className=\"h-4 w-4\" /> Delivery Assignment\n </h3>\n <div>\n <p className=\"text-sm text-text-secondary\">Assigned Worker</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.workerAssigned}</p>\n </div>\n </div>\n )}\n\n {/* Notes */}\n {selectedOrder.notes && (\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.notes}\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 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 value={selectedOrder.status}\n onChange={(e) =>\n handleUpdateStatus(selectedOrder.id, e.target.value as OrderStatus)\n }\n >\n <option value=\"pending\">Pending</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"out_for_delivery\">Out for Delivery</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"cancelled\">Cancelled</option>\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/coolandlovely/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured order management with 4 MetricsGrid stats, 3 filters,\n * dual layout (mobile cards + desktop table with 8 columns),\n * Order Details Modal with all sections and update status dropdown.\n */\n\nimport { useState, useEffect, 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 Truck,\n MapPin,\n Phone,\n User,\n} from'lucide-react';\nimport { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype OrderStatus =\n | 'pending'\n | 'confirmed'\n | 'preparing'\n | 'ready'\n | 'out_for_delivery'\n | 'delivered'\n | 'cancelled';\n\ninterface Order {\n id: string;\n customerName: string;\n customerPhone: string;\n cartName: string;\n cartOwner: string;\n items: string[];\n total: number;\n status: OrderStatus;\n paymentMethod: string;\n paymentStatus: 'pending' | 'completed' | 'failed' | 'refunded';\n orderDate: string;\n deliveryTime: string;\n deliveryAddress: string;\n workerAssigned?: string;\n notes?: string;\n}\n\ninterface OrderStats {\n totalOrders: number;\n pendingOrders: number;\n totalRevenue: number;\n averageOrderValue: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Mock data */\n/* ------------------------------------------------------------------ */\n\nconst mockOrders: Order[] = [\n {\n id: 'ORD-2024-001',\n customerName: 'Rajesh Kumar',\n customerPhone: '+91 98765 43210',\n cartName: 'Dosa Express',\n cartOwner: 'Suresh Rao',\n items: ['Masala Dosa x2', 'Filter Coffee x2', 'Vada x1'],\n total: 280,\n status: 'delivered',\n paymentMethod: 'UPI',\n paymentStatus: 'completed',\n orderDate: '2024-01-15T10:30:00',\n deliveryTime: '2024-01-15T11:15:00',\n deliveryAddress: '123, 4th Cross, Koramangala',\n workerAssigned: 'Ravi Kumar',\n },\n {\n id: 'ORD-2024-002',\n customerName: 'Priya Sharma',\n customerPhone: '+91 87654 32109',\n cartName: 'Juice Junction',\n cartOwner: 'Amit Patel',\n items: ['Fresh Orange Juice x1', 'Watermelon Juice x1'],\n total: 120,\n status: 'preparing',\n paymentMethod: 'Cash',\n paymentStatus: 'pending',\n orderDate: '2024-01-15T11:45:00',\n deliveryTime: '2024-01-15T12:15:00',\n deliveryAddress: '456, BTM Layout',\n notes: 'Extra ice please',\n },\n {\n id: 'ORD-2024-003',\n customerName: 'Amit Singh',\n customerPhone: '+91 76543 21098',\n cartName: 'Chaat Corner',\n cartOwner: 'Ramesh Verma',\n items: ['Pani Puri x1', 'Bhel Puri x1', 'Dahi Puri x1'],\n total: 150,\n status: 'pending',\n paymentMethod: 'Card',\n paymentStatus: 'completed',\n orderDate: '2024-01-15T12:00:00',\n deliveryTime: '2024-01-15T12:30:00',\n deliveryAddress: '789, HSR Layout',\n },\n];\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminOrdersPage() {\n const { navigateTo } = useCoolAndLovely();\n\n const [orders, setOrders] = useState<Order[]>([]);\n const [stats, setStats] = useState<OrderStats | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [dateFilter, setDateFilter] = useState('today');\n const [selectedOrder, setSelectedOrder] = useState<Order | null>(null);\n const [showOrderModal, setShowOrderModal] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setStats({\n totalOrders: 156,\n pendingOrders: 12,\n totalRevenue: 125600,\n averageOrderValue: 805,\n });\n setOrders(mockOrders);\n setIsLoading(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, []);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const formatDate = (d: string) =>\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 const getStatusColor = (status: string) => {\n const map: Record<string, string> = {\n delivered: 'bg-status-success-bg-subtle/20 text-status-success-text',\n preparing: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n ready: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n out_for_delivery: 'bg-accent-blue-subtle/20 text-accent-blue',\n cancelled: 'bg-status-error-bg-subtle/20 text-status-error-text',\n confirmed: 'bg-accent-blue-subtle/20 text-accent-blue',\n };\n return map[status] ?? 'bg-secondary text-secondary-foreground';\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-accent-blue\" />;\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.customerName.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 setOrders((prev) => prev.map((o) => (o.id === orderId ? { ...o, status: newStatus } : o)));\n setShowOrderModal(false);\n alert(`Order ${orderId} updated to ${newStatus.replace('_', ' ')}`);\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 ?? 0} total orders on the platform`}\n >\n <PagePurpose className=\"mb-6\" icon={<ShoppingBag className=\"h-4 w-4\" />}>\n Every order across the whole platform in one place. Monitor volume,\n revenue and pending orders, filter to investigate any order, and open one\n to see its full detail and update its status — so the admin team can step\n in whenever an order needs help.\n </PagePurpose>\n\n {/* 4 Metrics Grid — primary emphasis zone */}\n {stats && (\n <EmphasisPanel className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6 p-4\">\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={stats.totalOrders}\n label=\"Total Orders\"\n trendValue=\"Orders today\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Revenue\"\n trend=\"up\"\n trendValue=\"+15.2% vs yesterday\"\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(stats.averageOrderValue)}\n label=\"Avg Order Value\"\n trendValue=\"Average order value\"\n />\n <MetricsCard\n icon={<Clock className=\"h-5 w-5\" />}\n value={stats.pendingOrders}\n label=\"Pending Orders\"\n trendValue=\"Awaiting action\"\n />\n </EmphasisPanel>\n )}\n\n {/* 3 Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 mb-6 bg-gloss-card shadow-pop\">\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, customer, 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 <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\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 <option value=\"pending\">Pending</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"out_for_delivery\">Out for Delivery</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n <select\n value={dateFilter}\n onChange={(e) => setDateFilter(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=\"today\">Today</option>\n <option value=\"yesterday\">Yesterday</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n </select>\n </div>\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 key={order.id} className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\">\n <div className=\"flex justify-between items-start mb-3\">\n <div>\n <h3 className=\"font-medium text-text-primary text-lg\">{order.id}</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('_', ' ')}\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\">Customer</p>\n <p className=\"text-text-primary\">{order.customerName}</p>\n <p className=\"text-text-secondary text-xs\">{order.customerPhone}</p>\n </div>\n <div>\n <p className=\"text-text-secondary font-medium\">Cart</p>\n <p className=\"text-text-primary\">{order.cartName}</p>\n <p className=\"text-text-secondary text-xs\">{order.cartOwner}</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\">\n {order.paymentStatus}\n </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 Customer\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 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}\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.customerName}</div>\n <div className=\"text-xs text-text-secondary\">{order.customerPhone}</div>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.cartName}</div>\n <div className=\"text-xs text-text-secondary\">{order.cartOwner}</div>\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('_', ' ')}\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=\"No orders found\"\n description=\"No orders match your current filters. Try adjusting your search criteria.\"\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\">{selectedOrder.id}</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('_', ' ')}\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 <div>\n <p className=\"text-sm text-text-secondary\">Delivery Time</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.deliveryTime)}\n </p>\n </div>\n </div>\n </div>\n\n {/* Customer Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <User className=\"h-4 w-4\" /> Customer Details\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Name</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.customerName}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Phone</p>\n <p className=\"font-medium text-text-primary flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {selectedOrder.customerPhone}\n </p>\n </div>\n <div className=\"sm:col-span-2\">\n <p className=\"text-sm text-text-secondary\">Delivery Address</p>\n <p className=\"font-medium text-text-primary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {selectedOrder.deliveryAddress}\n </p>\n </div>\n </div>\n </div>\n\n {/* Cart Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Cart 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\">Cart Name</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartName}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Cart Owner</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartOwner}</p>\n </div>\n </div>\n </div>\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 <ul className=\"space-y-2\">\n {selectedOrder.items.map((item, i) => (\n <li key={i} className=\"text-sm text-text-primary\">\n {item}\n </li>\n ))}\n </ul>\n <div className=\"mt-4 pt-4 border-t border-border-subtle flex justify-between items-center\">\n <span className=\"font-semibold text-text-primary\">Total Amount</span>\n <span className=\"font-semibold text-lg text-text-primary\">\n {fmtCur(selectedOrder.total)}\n </span>\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 {/* Worker Assignment */}\n {selectedOrder.workerAssigned && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Truck className=\"h-4 w-4\" /> Delivery Assignment\n </h3>\n <div>\n <p className=\"text-sm text-text-secondary\">Assigned Worker</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.workerAssigned}</p>\n </div>\n </div>\n )}\n\n {/* Notes */}\n {selectedOrder.notes && (\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.notes}\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 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 value={selectedOrder.status}\n onChange={(e) =>\n handleUpdateStatus(selectedOrder.id, e.target.value as OrderStatus)\n }\n >\n <option value=\"pending\">Pending</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"out_for_delivery\">Out for Delivery</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -4,9 +4,10 @@ import { PageLayout as n } from "../../components/PageLayout.js";
4
4
  import { useCallback as r, useEffect as i, useState as a } from "react";
5
5
  import { ArrowLeft as o, BarChart3 as s, Clock as c, Edit3 as l, Save as u, Settings as d, Shield as f, ShoppingBag as p, Users as m } from "lucide-react";
6
6
  import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
7
+ import { EmphasisPanel as v, PagePurpose as y } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/coolandlovely/pages/admin/AdminProfilePage.tsx
8
- function v() {
9
- let { currentUser: v, navigateTo: y } = e(), [b, x] = a(!1), [S, C] = a(!1), [w, T] = a({
9
+ function b() {
10
+ let { currentUser: b, navigateTo: x } = e(), [S, C] = a(!1), [w, T] = a(!1), [E, D] = a({
10
11
  firstName: "",
11
12
  lastName: "",
12
13
  email: "",
@@ -22,11 +23,11 @@ function v() {
22
23
  ],
23
24
  lastLogin: "",
24
25
  accountCreated: ""
25
- }), E = r(() => {
26
- T({
27
- firstName: v?.firstName ?? "Admin",
28
- lastName: v?.lastName ?? "User",
29
- email: v?.email ?? "admin@coolandlovely.com",
26
+ }), O = r(() => {
27
+ D({
28
+ firstName: b?.firstName ?? "Admin",
29
+ lastName: b?.lastName ?? "User",
30
+ email: b?.email ?? "admin@coolandlovely.com",
30
31
  phone: "+91 98765 43210",
31
32
  role: "admin",
32
33
  department: "Administration",
@@ -40,89 +41,93 @@ function v() {
40
41
  lastLogin: (/* @__PURE__ */ new Date(Date.now() - 1440 * 60 * 1e3)).toISOString(),
41
42
  accountCreated: (/* @__PURE__ */ new Date(Date.now() - 2160 * 60 * 60 * 1e3)).toISOString()
42
43
  });
43
- }, [v]);
44
+ }, [b]);
44
45
  i(() => {
45
- E();
46
- }, [E]);
47
- let D = async () => {
48
- C(!0), await new Promise((e) => setTimeout(e, 1e3)), alert("Profile updated successfully"), C(!1), x(!1);
49
- }, O = (e, t) => {
50
- T((n) => ({
46
+ O();
47
+ }, [O]);
48
+ let k = async () => {
49
+ T(!0), await new Promise((e) => setTimeout(e, 1e3)), alert("Profile updated successfully"), T(!1), C(!1);
50
+ }, A = (e, t) => {
51
+ D((n) => ({
51
52
  ...n,
52
53
  [e]: t
53
54
  }));
54
- }, k = (e) => e ? new Date(e).toLocaleDateString("en-IN", {
55
+ }, j = (e) => e ? new Date(e).toLocaleDateString("en-IN", {
55
56
  year: "numeric",
56
57
  month: "long",
57
58
  day: "numeric",
58
59
  hour: "2-digit",
59
60
  minute: "2-digit"
60
- }) : "N/A", A = {
61
+ }) : "N/A", M = {
61
62
  user_management: m,
62
63
  cart_management: p,
63
64
  order_management: p,
64
65
  analytics: s,
65
66
  system_settings: d
66
67
  };
67
- return /* @__PURE__ */ g(n, {
68
+ return /* @__PURE__ */ _(n, {
68
69
  title: "Admin Profile",
69
70
  description: "Your admin account information and permissions",
70
71
  actions: /* @__PURE__ */ _("div", {
71
72
  className: "flex items-center gap-2",
72
73
  children: [/* @__PURE__ */ _("button", {
73
74
  type: "button",
74
- onClick: () => y("/admin"),
75
+ onClick: () => x("/admin"),
75
76
  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",
76
77
  children: [/* @__PURE__ */ g(o, { className: "h-4 w-4" }), "Back"]
77
- }), b ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
78
+ }), S ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
78
79
  type: "button",
79
80
  onClick: () => {
80
- x(!1), E();
81
+ C(!1), O();
81
82
  },
82
83
  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",
83
84
  children: "Cancel"
84
85
  }), /* @__PURE__ */ _("button", {
85
86
  type: "button",
86
- onClick: D,
87
- disabled: S,
87
+ onClick: k,
88
+ disabled: w,
88
89
  className: "flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50",
89
- children: [/* @__PURE__ */ g(u, { className: "h-4 w-4" }), S ? "Saving..." : "Save Changes"]
90
+ children: [/* @__PURE__ */ g(u, { className: "h-4 w-4" }), w ? "Saving..." : "Save Changes"]
90
91
  })] }) : /* @__PURE__ */ _("button", {
91
92
  type: "button",
92
- onClick: () => x(!0),
93
+ onClick: () => C(!0),
93
94
  className: "flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
94
95
  children: [/* @__PURE__ */ g(l, { className: "h-4 w-4" }), "Edit Profile"]
95
96
  })]
96
97
  }),
97
- children: /* @__PURE__ */ _("div", {
98
+ children: [/* @__PURE__ */ g(y, {
99
+ className: "mb-6",
100
+ icon: /* @__PURE__ */ g(f, { className: "h-4 w-4" }),
101
+ children: "Your admin account and what you're allowed to do. Review and update your personal details, see your role, department and permissions, and check recent account activity — so your access stays accurate and your account secure."
102
+ }), /* @__PURE__ */ _("div", {
98
103
  className: "space-y-6 max-w-4xl",
99
104
  children: [
100
- /* @__PURE__ */ _("div", {
101
- className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
105
+ /* @__PURE__ */ _(v, {
106
+ className: "p-6",
102
107
  children: [/* @__PURE__ */ _("div", {
103
108
  className: "flex items-center mb-6",
104
109
  children: [/* @__PURE__ */ _("div", {
105
110
  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",
106
- children: [w.firstName.charAt(0), w.lastName.charAt(0)]
111
+ children: [E.firstName.charAt(0), E.lastName.charAt(0)]
107
112
  }), /* @__PURE__ */ _("div", { children: [
108
113
  /* @__PURE__ */ _("h2", {
109
114
  className: "text-xl font-semibold text-text-primary",
110
115
  children: [
111
- w.firstName,
116
+ E.firstName,
112
117
  " ",
113
- w.lastName
118
+ E.lastName
114
119
  ]
115
120
  }),
116
121
  /* @__PURE__ */ g("p", {
117
122
  className: "text-text-secondary",
118
- children: w.email
123
+ children: E.email
119
124
  }),
120
125
  /* @__PURE__ */ _("p", {
121
126
  className: "text-sm text-text-secondary capitalize",
122
127
  children: [
123
- w.role,
128
+ E.role,
124
129
  " • ",
125
- w.department
130
+ E.department
126
131
  ]
127
132
  })
128
133
  ] })]
@@ -134,50 +139,50 @@ function v() {
134
139
  children: "First Name"
135
140
  }), /* @__PURE__ */ g("input", {
136
141
  type: "text",
137
- value: w.firstName,
138
- onChange: (e) => O("firstName", e.target.value),
139
- disabled: !b,
140
- className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !b && "bg-bg-sunken cursor-not-allowed")
142
+ value: E.firstName,
143
+ onChange: (e) => A("firstName", e.target.value),
144
+ disabled: !S,
145
+ className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !S && "bg-bg-sunken cursor-not-allowed")
141
146
  })] }),
142
147
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
143
148
  className: "block text-sm font-medium text-text-secondary mb-2",
144
149
  children: "Last Name"
145
150
  }), /* @__PURE__ */ g("input", {
146
151
  type: "text",
147
- value: w.lastName,
148
- onChange: (e) => O("lastName", e.target.value),
149
- disabled: !b,
150
- className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !b && "bg-bg-sunken cursor-not-allowed")
152
+ value: E.lastName,
153
+ onChange: (e) => A("lastName", e.target.value),
154
+ disabled: !S,
155
+ className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !S && "bg-bg-sunken cursor-not-allowed")
151
156
  })] }),
152
157
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
153
158
  className: "block text-sm font-medium text-text-secondary mb-2",
154
159
  children: "Email Address"
155
160
  }), /* @__PURE__ */ g("input", {
156
161
  type: "email",
157
- value: w.email,
158
- onChange: (e) => O("email", e.target.value),
159
- disabled: !b,
160
- className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !b && "bg-bg-sunken cursor-not-allowed")
162
+ value: E.email,
163
+ onChange: (e) => A("email", e.target.value),
164
+ disabled: !S,
165
+ className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !S && "bg-bg-sunken cursor-not-allowed")
161
166
  })] }),
162
167
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
163
168
  className: "block text-sm font-medium text-text-secondary mb-2",
164
169
  children: "Phone Number"
165
170
  }), /* @__PURE__ */ g("input", {
166
171
  type: "tel",
167
- value: w.phone,
168
- onChange: (e) => O("phone", e.target.value),
169
- disabled: !b,
170
- className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !b && "bg-bg-sunken cursor-not-allowed")
172
+ value: E.phone,
173
+ onChange: (e) => A("phone", e.target.value),
174
+ disabled: !S,
175
+ className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !S && "bg-bg-sunken cursor-not-allowed")
171
176
  })] }),
172
177
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
173
178
  className: "block text-sm font-medium text-text-secondary mb-2",
174
179
  children: "Department"
175
180
  }), /* @__PURE__ */ g("input", {
176
181
  type: "text",
177
- value: w.department,
178
- onChange: (e) => O("department", e.target.value),
179
- disabled: !b,
180
- className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !b && "bg-bg-sunken cursor-not-allowed")
182
+ value: E.department,
183
+ onChange: (e) => A("department", e.target.value),
184
+ disabled: !S,
185
+ className: t("w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !S && "bg-bg-sunken cursor-not-allowed")
181
186
  })] }),
182
187
  /* @__PURE__ */ _("div", { children: [
183
188
  /* @__PURE__ */ g("label", {
@@ -186,7 +191,7 @@ function v() {
186
191
  }),
187
192
  /* @__PURE__ */ g("input", {
188
193
  type: "text",
189
- value: w.role,
194
+ value: E.role,
190
195
  disabled: !0,
191
196
  className: "w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary bg-bg-sunken cursor-not-allowed"
192
197
  }),
@@ -213,13 +218,13 @@ function v() {
213
218
  children: "Last Login"
214
219
  }), /* @__PURE__ */ g("p", {
215
220
  className: "rounded-lg bg-bg-sunken p-3 text-sm text-text-primary",
216
- children: k(w.lastLogin)
221
+ children: j(E.lastLogin)
217
222
  })] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
218
223
  className: "block text-sm font-medium text-text-secondary mb-2",
219
224
  children: "Account Created"
220
225
  }), /* @__PURE__ */ g("p", {
221
226
  className: "rounded-lg bg-bg-sunken p-3 text-sm text-text-primary",
222
- children: k(w.accountCreated)
227
+ children: j(E.accountCreated)
223
228
  })] })]
224
229
  })]
225
230
  }),
@@ -235,9 +240,9 @@ function v() {
235
240
  }),
236
241
  /* @__PURE__ */ g("div", {
237
242
  className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3",
238
- children: w.permissions.map((e) => /* @__PURE__ */ _("div", {
243
+ children: E.permissions.map((e) => /* @__PURE__ */ _("div", {
239
244
  className: "flex items-center gap-2 rounded-lg bg-action-primary-bg/10 text-primary p-3 text-sm font-medium",
240
- children: [/* @__PURE__ */ g(A[e] ?? f, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ g("span", {
245
+ children: [/* @__PURE__ */ g(M[e] ?? f, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ g("span", {
241
246
  className: "uppercase text-xs",
242
247
  children: e.replace(/_/g, " ")
243
248
  })]
@@ -250,10 +255,10 @@ function v() {
250
255
  ]
251
256
  })
252
257
  ]
253
- })
258
+ })]
254
259
  });
255
260
  }
256
261
  //#endregion
257
- export { v as AdminProfilePage };
262
+ export { b as AdminProfilePage };
258
263
 
259
264
  //# sourceMappingURL=AdminProfilePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminProfilePage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured admin profile with edit mode toggle, save/cancel buttons,\n * editable form fields, account information, permissions as icon badges,\n * admin note, and back navigation.\n */\n\nimport { useState, useEffect, useCallback } from'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n ArrowLeft,\n Save,\n Edit3,\n Building2,\n Clock,\n ShoppingBag,\n BarChart3,\n Settings,\n Users,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AdminProfile {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: string;\n department: string;\n permissions: string[];\n lastLogin: string;\n accountCreated: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminProfilePage() {\n const { currentUser, navigateTo } = useCoolAndLovely();\n const [isEditing, setIsEditing] = useState(false);\n const [saving, setSaving] = useState(false);\n const [profile, setProfile] = useState<AdminProfile>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'admin',\n department: 'Administration',\n permissions: [\n 'user_management',\n 'cart_management',\n 'order_management',\n 'analytics',\n 'system_settings',\n ],\n lastLogin: '',\n accountCreated: '',\n });\n\n const loadProfile = useCallback(() => {\n const mockProfile: AdminProfile = {\n firstName: currentUser?.firstName ?? 'Admin',\n lastName: currentUser?.lastName ?? 'User',\n email: currentUser?.email ?? 'admin@coolandlovely.com',\n phone: '+91 98765 43210',\n role: 'admin',\n department: 'Administration',\n permissions: [\n 'user_management',\n 'cart_management',\n 'order_management',\n 'analytics',\n 'system_settings',\n ],\n lastLogin: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n accountCreated: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),\n };\n setProfile(mockProfile);\n }, [currentUser]);\n\n useEffect(() => {\n loadProfile();\n }, [loadProfile]);\n\n const handleSave = async () => {\n setSaving(true);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n alert('Profile updated successfully');\n setSaving(false);\n setIsEditing(false);\n };\n\n const handleInputChange = (field: keyof AdminProfile, value: string) => {\n setProfile((prev) => ({ ...prev, [field]: value }));\n };\n\n const formatDate = (d: string) => {\n if (!d) return'N/A';\n return new Date(d).toLocaleDateString('en-IN', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n const permissionIcons: Record<string, typeof Users> = {\n user_management: Users,\n cart_management: ShoppingBag,\n order_management: ShoppingBag,\n analytics: BarChart3,\n system_settings: Settings,\n };\n\n return (\n <PageLayout\n title=\"Admin Profile\"\n description=\"Your admin account information and permissions\"\n actions={\n <div className=\"flex items-center gap-2\">\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 {!isEditing ? (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Edit3 className=\"h-4 w-4\" />\n Edit Profile\n </button>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => {\n setIsEditing(false);\n loadProfile();\n }}\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 Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50\"\n >\n <Save className=\"h-4 w-4\" />\n {saving ? 'Saving...' : 'Save Changes'}\n </button>\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6 max-w-4xl\">\n {/* Profile Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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\">\n {profile.firstName.charAt(0)}\n {profile.lastName.charAt(0)}\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profile.firstName} {profile.lastName}\n </h2>\n <p className=\"text-text-secondary\">{profile.email}</p>\n <p className=\"text-sm text-text-secondary capitalize\">\n {profile.role} &bull; {profile.department}\n </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 First Name\n </label>\n <input\n type=\"text\"\n value={profile.firstName}\n onChange={(e) => handleInputChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={profile.lastName}\n onChange={(e) => handleInputChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Email Address\n </label>\n <input\n type=\"email\"\n value={profile.email}\n onChange={(e) => handleInputChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Phone Number\n </label>\n <input\n type=\"tel\"\n value={profile.phone}\n onChange={(e) => handleInputChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Department\n </label>\n <input\n type=\"text\"\n value={profile.department}\n onChange={(e) => handleInputChange('department', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">Role</label>\n <input\n type=\"text\"\n value={profile.role}\n disabled\n className=\"w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary bg-bg-sunken cursor-not-allowed\"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n Role cannot be changed from profile page\n </p>\n </div>\n </div>\n </div>\n\n {/* Account Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Clock className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Account Information</h3>\n </div>\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 Last Login\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary\">\n {formatDate(profile.lastLogin)}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Account Created\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary\">\n {formatDate(profile.accountCreated)}\n </p>\n </div>\n </div>\n </div>\n\n {/* Permissions */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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\">Permissions</h3>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {profile.permissions.map((permission) => {\n const PermIcon = permissionIcons[permission] ?? Shield;\n return (\n <div\n key={permission}\n className=\"flex items-center gap-2 rounded-lg bg-action-primary-bg/10 text-primary p-3 text-sm font-medium\"\n >\n <PermIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"uppercase text-xs\">{permission.replace(/_/g, ' ')}</span>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary mt-4\">\n Permissions are managed by super administrators. Contact your system administrator to\n modify 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/coolandlovely/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured admin profile with edit mode toggle, save/cancel buttons,\n * editable form fields, account information, permissions as icon badges,\n * admin note, and back navigation.\n */\n\nimport { useState, useEffect, useCallback } from'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n ArrowLeft,\n Save,\n Edit3,\n Building2,\n Clock,\n ShoppingBag,\n BarChart3,\n Settings,\n Users,\n} from'lucide-react';\nimport { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AdminProfile {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: string;\n department: string;\n permissions: string[];\n lastLogin: string;\n accountCreated: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminProfilePage() {\n const { currentUser, navigateTo } = useCoolAndLovely();\n const [isEditing, setIsEditing] = useState(false);\n const [saving, setSaving] = useState(false);\n const [profile, setProfile] = useState<AdminProfile>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'admin',\n department: 'Administration',\n permissions: [\n 'user_management',\n 'cart_management',\n 'order_management',\n 'analytics',\n 'system_settings',\n ],\n lastLogin: '',\n accountCreated: '',\n });\n\n const loadProfile = useCallback(() => {\n const mockProfile: AdminProfile = {\n firstName: currentUser?.firstName ?? 'Admin',\n lastName: currentUser?.lastName ?? 'User',\n email: currentUser?.email ?? 'admin@coolandlovely.com',\n phone: '+91 98765 43210',\n role: 'admin',\n department: 'Administration',\n permissions: [\n 'user_management',\n 'cart_management',\n 'order_management',\n 'analytics',\n 'system_settings',\n ],\n lastLogin: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n accountCreated: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),\n };\n setProfile(mockProfile);\n }, [currentUser]);\n\n useEffect(() => {\n loadProfile();\n }, [loadProfile]);\n\n const handleSave = async () => {\n setSaving(true);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n alert('Profile updated successfully');\n setSaving(false);\n setIsEditing(false);\n };\n\n const handleInputChange = (field: keyof AdminProfile, value: string) => {\n setProfile((prev) => ({ ...prev, [field]: value }));\n };\n\n const formatDate = (d: string) => {\n if (!d) return'N/A';\n return new Date(d).toLocaleDateString('en-IN', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n const permissionIcons: Record<string, typeof Users> = {\n user_management: Users,\n cart_management: ShoppingBag,\n order_management: ShoppingBag,\n analytics: BarChart3,\n system_settings: Settings,\n };\n\n return (\n <PageLayout\n title=\"Admin Profile\"\n description=\"Your admin account information and permissions\"\n actions={\n <div className=\"flex items-center gap-2\">\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 {!isEditing ? (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Edit3 className=\"h-4 w-4\" />\n Edit Profile\n </button>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => {\n setIsEditing(false);\n loadProfile();\n }}\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 Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50\"\n >\n <Save className=\"h-4 w-4\" />\n {saving ? 'Saving...' : 'Save Changes'}\n </button>\n </>\n )}\n </div>\n }\n >\n <PagePurpose className=\"mb-6\" icon={<Shield className=\"h-4 w-4\" />}>\n Your admin account and what you're allowed to do. Review and update your\n personal details, see your role, department and permissions, and check\n recent account activity — so your access stays accurate and your account\n secure.\n </PagePurpose>\n\n <div className=\"space-y-6 max-w-4xl\">\n {/* Profile Information — primary emphasis zone */}\n <EmphasisPanel className=\"p-6\">\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\">\n {profile.firstName.charAt(0)}\n {profile.lastName.charAt(0)}\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profile.firstName} {profile.lastName}\n </h2>\n <p className=\"text-text-secondary\">{profile.email}</p>\n <p className=\"text-sm text-text-secondary capitalize\">\n {profile.role} &bull; {profile.department}\n </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 First Name\n </label>\n <input\n type=\"text\"\n value={profile.firstName}\n onChange={(e) => handleInputChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={profile.lastName}\n onChange={(e) => handleInputChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Email Address\n </label>\n <input\n type=\"email\"\n value={profile.email}\n onChange={(e) => handleInputChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Phone Number\n </label>\n <input\n type=\"tel\"\n value={profile.phone}\n onChange={(e) => handleInputChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Department\n </label>\n <input\n type=\"text\"\n value={profile.department}\n onChange={(e) => handleInputChange('department', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">Role</label>\n <input\n type=\"text\"\n value={profile.role}\n disabled\n className=\"w-full rounded-lg border border-border-subtle py-2 px-3 text-sm text-text-primary bg-bg-sunken cursor-not-allowed\"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n Role cannot be changed from profile page\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Account Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Clock className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Account Information</h3>\n </div>\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 Last Login\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary\">\n {formatDate(profile.lastLogin)}\n </p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-secondary mb-2\">\n Account Created\n </label>\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-primary\">\n {formatDate(profile.accountCreated)}\n </p>\n </div>\n </div>\n </div>\n\n {/* Permissions */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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\">Permissions</h3>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {profile.permissions.map((permission) => {\n const PermIcon = permissionIcons[permission] ?? Shield;\n return (\n <div\n key={permission}\n className=\"flex items-center gap-2 rounded-lg bg-action-primary-bg/10 text-primary p-3 text-sm font-medium\"\n >\n <PermIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"uppercase text-xs\">{permission.replace(/_/g, ' ')}</span>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary mt-4\">\n Permissions are managed by super administrators. Contact your system administrator to\n modify permissions.\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}