@burdenoff/microfe-adaptercloud 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 (93) hide show
  1. package/dist/adaptercloud/components/PageLayout.js +24 -17
  2. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  3. package/dist/adaptercloud/pages/HomePage.js +18 -16
  4. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  5. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +90 -82
  6. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/adaptercloud/pages/admin/AdminDashboard.js +70 -44
  8. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +60 -55
  10. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +97 -92
  12. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +59 -57
  14. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +118 -104
  16. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/CartManagementPage.js +145 -140
  18. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/UserManagementPage.js +152 -147
  20. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +87 -81
  22. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  23. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +179 -165
  24. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  25. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +73 -48
  26. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  27. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +95 -93
  28. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  29. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +110 -107
  30. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +293 -299
  32. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +218 -224
  34. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +122 -128
  36. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/adaptercloud/pages/common/HelpSupportPage.js +248 -244
  38. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +96 -91
  40. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
  42. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +63 -61
  44. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/customer/CartDetailPage.js +110 -108
  46. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +221 -217
  48. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/customer/CheckoutPage.js +89 -87
  50. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +410 -381
  52. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +120 -118
  54. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +86 -81
  56. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/FavoritesPage.js +53 -51
  58. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +114 -109
  60. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +60 -58
  62. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +87 -72
  64. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/ReviewsPage.js +65 -63
  66. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +68 -53
  68. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +63 -61
  70. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +86 -84
  72. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +57 -55
  74. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +341 -308
  76. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  77. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +34 -32
  78. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +48 -46
  80. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +383 -381
  82. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  83. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +348 -319
  84. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +84 -59
  86. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +73 -71
  88. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +76 -74
  90. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  91. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +70 -68
  92. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  93. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOrdersPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module adaptercloud/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 { useAdapterCloud } from'../../context/AdapterCloudContext';\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 } = useAdapterCloud();\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/adaptercloud/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module adaptercloud/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 } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\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 } = useAdapterCloud();\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 purpose=\"Oversee every order across the marketplace — search, filter by status, and step in on disputes or stuck deliveries. Use it to keep fulfilment moving and catch problem orders before customers complain.\"\n >\n {/* 4 Metrics Grid (emphasis zone) */}\n {stats && (\n <EmphasisPanel className=\"mb-6\">\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}\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 </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 <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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"}
@@ -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 } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/adaptercloud/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 y() {
10
+ let { currentUser: y, navigateTo: b } = e(), [x, S] = a(!1), [C, w] = a(!1), [T, E] = 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@adaptercloud.com",
26
+ }), D = r(() => {
27
+ E({
28
+ firstName: y?.firstName ?? "Admin",
29
+ lastName: y?.lastName ?? "User",
30
+ email: y?.email ?? "admin@adaptercloud.com",
30
31
  phone: "+91 98765 43210",
31
32
  role: "admin",
32
33
  department: "Administration",
@@ -40,24 +41,24 @@ 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
+ }, [y]);
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
+ D();
47
+ }, [D]);
48
+ let O = async () => {
49
+ w(!0), await new Promise((e) => setTimeout(e, 1e3)), alert("Profile updated successfully"), w(!1), S(!1);
50
+ }, k = (e, t) => {
51
+ E((n) => ({
51
52
  ...n,
52
53
  [e]: t
53
54
  }));
54
- }, k = (e) => e ? new Date(e).toLocaleDateString("en-IN", {
55
+ }, A = (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", j = {
61
62
  user_management: m,
62
63
  cart_management: p,
63
64
  order_management: p,
@@ -67,29 +68,30 @@ function v() {
67
68
  return /* @__PURE__ */ g(n, {
68
69
  title: "Admin Profile",
69
70
  description: "Your admin account information and permissions",
71
+ purpose: "Your own admin account — review your details, see exactly which platform permissions you hold, and keep your contact and security information current.",
70
72
  actions: /* @__PURE__ */ _("div", {
71
73
  className: "flex items-center gap-2",
72
74
  children: [/* @__PURE__ */ _("button", {
73
75
  type: "button",
74
- onClick: () => y("/admin"),
76
+ onClick: () => b("/admin"),
75
77
  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
78
  children: [/* @__PURE__ */ g(o, { className: "h-4 w-4" }), "Back"]
77
- }), b ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
79
+ }), x ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
78
80
  type: "button",
79
81
  onClick: () => {
80
- x(!1), E();
82
+ S(!1), D();
81
83
  },
82
84
  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
85
  children: "Cancel"
84
86
  }), /* @__PURE__ */ _("button", {
85
87
  type: "button",
86
- onClick: D,
87
- disabled: S,
88
+ onClick: O,
89
+ disabled: C,
88
90
  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"]
91
+ children: [/* @__PURE__ */ g(u, { className: "h-4 w-4" }), C ? "Saving..." : "Save Changes"]
90
92
  })] }) : /* @__PURE__ */ _("button", {
91
93
  type: "button",
92
- onClick: () => x(!0),
94
+ onClick: () => S(!0),
93
95
  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
96
  children: [/* @__PURE__ */ g(l, { className: "h-4 w-4" }), "Edit Profile"]
95
97
  })]
@@ -97,32 +99,32 @@ function v() {
97
99
  children: /* @__PURE__ */ _("div", {
98
100
  className: "space-y-6 max-w-4xl",
99
101
  children: [
100
- /* @__PURE__ */ _("div", {
101
- className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
102
+ /* @__PURE__ */ _(v, {
103
+ className: "p-6",
102
104
  children: [/* @__PURE__ */ _("div", {
103
105
  className: "flex items-center mb-6",
104
106
  children: [/* @__PURE__ */ _("div", {
105
107
  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)]
108
+ children: [T.firstName.charAt(0), T.lastName.charAt(0)]
107
109
  }), /* @__PURE__ */ _("div", { children: [
108
110
  /* @__PURE__ */ _("h2", {
109
111
  className: "text-xl font-semibold text-text-primary",
110
112
  children: [
111
- w.firstName,
113
+ T.firstName,
112
114
  " ",
113
- w.lastName
115
+ T.lastName
114
116
  ]
115
117
  }),
116
118
  /* @__PURE__ */ g("p", {
117
119
  className: "text-text-secondary",
118
- children: w.email
120
+ children: T.email
119
121
  }),
120
122
  /* @__PURE__ */ _("p", {
121
123
  className: "text-sm text-text-secondary capitalize",
122
124
  children: [
123
- w.role,
125
+ T.role,
124
126
  " • ",
125
- w.department
127
+ T.department
126
128
  ]
127
129
  })
128
130
  ] })]
@@ -134,50 +136,50 @@ function v() {
134
136
  children: "First Name"
135
137
  }), /* @__PURE__ */ g("input", {
136
138
  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")
139
+ value: T.firstName,
140
+ onChange: (e) => k("firstName", e.target.value),
141
+ disabled: !x,
142
+ 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)]", !x && "bg-bg-sunken cursor-not-allowed")
141
143
  })] }),
142
144
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
143
145
  className: "block text-sm font-medium text-text-secondary mb-2",
144
146
  children: "Last Name"
145
147
  }), /* @__PURE__ */ g("input", {
146
148
  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")
149
+ value: T.lastName,
150
+ onChange: (e) => k("lastName", e.target.value),
151
+ disabled: !x,
152
+ 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)]", !x && "bg-bg-sunken cursor-not-allowed")
151
153
  })] }),
152
154
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
153
155
  className: "block text-sm font-medium text-text-secondary mb-2",
154
156
  children: "Email Address"
155
157
  }), /* @__PURE__ */ g("input", {
156
158
  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")
159
+ value: T.email,
160
+ onChange: (e) => k("email", e.target.value),
161
+ disabled: !x,
162
+ 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)]", !x && "bg-bg-sunken cursor-not-allowed")
161
163
  })] }),
162
164
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
163
165
  className: "block text-sm font-medium text-text-secondary mb-2",
164
166
  children: "Phone Number"
165
167
  }), /* @__PURE__ */ g("input", {
166
168
  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")
169
+ value: T.phone,
170
+ onChange: (e) => k("phone", e.target.value),
171
+ disabled: !x,
172
+ 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)]", !x && "bg-bg-sunken cursor-not-allowed")
171
173
  })] }),
172
174
  /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
173
175
  className: "block text-sm font-medium text-text-secondary mb-2",
174
176
  children: "Department"
175
177
  }), /* @__PURE__ */ g("input", {
176
178
  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")
179
+ value: T.department,
180
+ onChange: (e) => k("department", e.target.value),
181
+ disabled: !x,
182
+ 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)]", !x && "bg-bg-sunken cursor-not-allowed")
181
183
  })] }),
182
184
  /* @__PURE__ */ _("div", { children: [
183
185
  /* @__PURE__ */ g("label", {
@@ -186,7 +188,7 @@ function v() {
186
188
  }),
187
189
  /* @__PURE__ */ g("input", {
188
190
  type: "text",
189
- value: w.role,
191
+ value: T.role,
190
192
  disabled: !0,
191
193
  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
194
  }),
@@ -213,13 +215,13 @@ function v() {
213
215
  children: "Last Login"
214
216
  }), /* @__PURE__ */ g("p", {
215
217
  className: "rounded-lg bg-bg-sunken p-3 text-sm text-text-primary",
216
- children: k(w.lastLogin)
218
+ children: A(T.lastLogin)
217
219
  })] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
218
220
  className: "block text-sm font-medium text-text-secondary mb-2",
219
221
  children: "Account Created"
220
222
  }), /* @__PURE__ */ g("p", {
221
223
  className: "rounded-lg bg-bg-sunken p-3 text-sm text-text-primary",
222
- children: k(w.accountCreated)
224
+ children: A(T.accountCreated)
223
225
  })] })]
224
226
  })]
225
227
  }),
@@ -235,9 +237,9 @@ function v() {
235
237
  }),
236
238
  /* @__PURE__ */ g("div", {
237
239
  className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3",
238
- children: w.permissions.map((e) => /* @__PURE__ */ _("div", {
240
+ children: T.permissions.map((e) => /* @__PURE__ */ _("div", {
239
241
  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", {
242
+ children: [/* @__PURE__ */ g(j[e] ?? f, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ g("span", {
241
243
  className: "uppercase text-xs",
242
244
  children: e.replace(/_/g, " ")
243
245
  })]
@@ -254,6 +256,6 @@ function v() {
254
256
  });
255
257
  }
256
258
  //#endregion
257
- export { v as AdminProfilePage };
259
+ export { y as AdminProfilePage };
258
260
 
259
261
  //# sourceMappingURL=AdminProfilePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminProfilePage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module adaptercloud/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 { useAdapterCloud } from'../../context/AdapterCloudContext';\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 } = useAdapterCloud();\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@adaptercloud.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/adaptercloud/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module adaptercloud/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 } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\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 } = useAdapterCloud();\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@adaptercloud.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 purpose=\"Your own admin account — review your details, see exactly which platform permissions you hold, and keep your contact and security information current.\"\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 (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":";;;;;;;;AAkDA,SAAgB,IAAmB;CACjC,IAAM,EAAE,gBAAa,kBAAe,GAAiB,EAC/C,CAAC,GAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,CAAC,GAAS,KAAc,EAAuB;EACnD,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,aAAa;GACX;GACA;GACA;GACA;GACA;GACD;EACD,WAAW;EACX,gBAAgB;EACjB,CAAC,EAEI,IAAc,QAAkB;AAkBpC,IAjBkC;GAChC,WAAW,GAAa,aAAa;GACrC,UAAU,GAAa,YAAY;GACnC,OAAO,GAAa,SAAS;GAC7B,OAAO;GACP,MAAM;GACN,YAAY;GACZ,aAAa;IACX;IACA;IACA;IACA;IACA;IACD;GACD,4BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU,KAAK,IAAK,EAAC,aAAa;GACnE,iCAAgB,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU,KAAK,KAAK,IAAK,EAAC,aAAa;GAC9E,CACsB;IACtB,CAAC,EAAY,CAAC;AAEjB,SAAgB;AACd,KAAa;IACZ,CAAC,EAAY,CAAC;CAEjB,IAAM,IAAa,YAAY;AAK7B,EAJA,EAAU,GAAK,EACf,MAAM,IAAI,SAAS,MAAY,WAAW,GAAS,IAAK,CAAC,EACzD,MAAM,+BAA+B,EACrC,EAAU,GAAM,EAChB,EAAa,GAAM;IAGf,KAAqB,GAA2B,MAAkB;AACtE,KAAY,OAAU;GAAE,GAAG;IAAO,IAAQ;GAAO,EAAE;IAG/C,KAAc,MACb,IACE,IAAI,KAAK,EAAE,CAAC,mBAAmB,SAAS;EAC7C,MAAM;EACN,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC,GAPY,OAUV,IAAgD;EACpD,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EAClB;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,SAAS;IACnC,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;OACP,IAUA,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe;AAEb,KADA,EAAa,GAAM,EACnB,GAAa;;IAEf,WAAU;cACX;IAEQ,CAAA,EACT,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU;IACV,WAAU;cAJZ,CAME,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,IAAS,cAAc,eACjB;MACR,EAAA,CAAA,GA7BH,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAa,GAAK;IACjC,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,eAEtB;MAwBP;;YAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,GAAD;KAAe,WAAU;eAAzB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAQ,UAAU,OAAO,EAAE,EAC3B,EAAQ,SAAS,OAAO,EAAE,CACvB;UACN,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACG,EAAQ;SAAU;SAAE,EAAQ;SAC1B;;OACL,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAQ;QAAU,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAQ;SAAK;SAAS,EAAQ;SAC7B;;OACA,EAAA,CAAA,CACF;SAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAQ;QACf,WAAW,MAAM,EAAkB,aAAa,EAAE,OAAO,MAAM;QAC/D,UAAU,CAAC;QACX,WAAW,EACT,0JACA,CAAC,KAAa,kCACf;QACD,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAQ;QACf,WAAW,MAAM,EAAkB,YAAY,EAAE,OAAO,MAAM;QAC9D,UAAU,CAAC;QACX,WAAW,EACT,0JACA,CAAC,KAAa,kCACf;QACD,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAQ;QACf,WAAW,MAAM,EAAkB,SAAS,EAAE,OAAO,MAAM;QAC3D,UAAU,CAAC;QACX,WAAW,EACT,0JACA,CAAC,KAAa,kCACf;QACD,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAQ;QACf,WAAW,MAAM,EAAkB,SAAS,EAAE,OAAO,MAAM;QAC3D,UAAU,CAAC;QACX,WAAW,EACT,0JACA,CAAC,KAAa,kCACf;QACD,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAQ;QACf,WAAW,MAAM,EAAkB,cAAc,EAAE,OAAO,MAAM;QAChE,UAAU,CAAC;QACX,WAAW,EACT,0JACA,CAAC,KAAa,kCACf;QACD,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA;QACE,kBAAC,SAAD;SAAO,WAAU;mBAAqD;SAAY,CAAA;QAClF,kBAAC,SAAD;SACE,MAAK;SACL,OAAO,EAAQ;SACf,UAAA;SACA,WAAU;SACV,CAAA;QACF,kBAAC,KAAD;SAAG,WAAU;mBAAmC;SAE5C,CAAA;QACA,EAAA,CAAA;OACF;QACQ;;IAGhB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EACjD,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAAwB,CAAA,CAC5E;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAqD;OAE9D,CAAA,EACR,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAW,EAAQ,UAAU;OAC5B,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAqD;OAE9D,CAAA,EACR,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAW,EAAQ,eAAe;OACjC,CAAA,CACA,EAAA,CAAA,CACF;QACF;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EAClD,kBAAC,MAAD;QAAI,WAAU;kBAA0C;QAAgB,CAAA,CACpE;;MACN,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAQ,YAAY,KAAK,MAGtB,kBAAC,OAAD;QAEE,WAAU;kBAFZ,CAIE,kBANa,EAAgB,MAAe,GAM5C,EAAU,WAAU,oBAAqB,CAAA,EACzC,kBAAC,QAAD;SAAM,WAAU;mBAAqB,EAAW,QAAQ,MAAM,IAAI;SAAQ,CAAA,CACtE;UALC,EAKD,CAER;OACE,CAAA;MACN,kBAAC,KAAD;OAAG,WAAU;iBAAmC;OAG5C,CAAA;MACA;;IACF;;EACK,CAAA"}