@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.625.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/subscriberbot/components/EmptyState.js +17 -10
- package/dist/subscriberbot/components/EmptyState.js.map +1 -1
- package/dist/subscriberbot/components/InvestmentCard.js +23 -22
- package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
- package/dist/subscriberbot/components/MetricsCard.js +15 -12
- package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
- package/dist/subscriberbot/components/PageLayout.js +27 -15
- package/dist/subscriberbot/components/PageLayout.js.map +1 -1
- package/dist/subscriberbot/components/RatingDisplay.js +3 -3
- package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +25 -13
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
- package/dist/subscriberbot/pages/HomePage.js +67 -63
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminOrdersPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\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 } = useSubscriberBot();\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-green-500/20 text-green-600 dark:text-green-400',\n preparing: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n ready: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n out_for_delivery: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n cancelled: 'bg-red-500/20 text-red-600 dark:text-red-400',\n confirmed: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\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-green-600 dark:text-green-400\" />;\n case 'failed':\n return <XCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />;\n case 'refunded':\n return <RefreshCw className=\"h-4 w-4 text-blue-600 dark:text-blue-400\" />;\n default:\n return <AlertCircle className=\"h-4 w-4 text-yellow-600 dark:text-yellow-400\" />;\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-subtle bg-bg-surface p-4 mb-6\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search by order ID, 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/subscriberbot/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\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 } = useSubscriberBot();\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/20 text-status-success-text',\n preparing: 'bg-status-warning-bg/20 text-status-warning-text',\n ready: 'bg-status-warning-bg/20 text-status-warning-text',\n out_for_delivery: 'bg-status-info-bg/20 text-status-info-text',\n cancelled: 'bg-status-error-bg/20 text-status-error-text',\n confirmed: 'bg-status-info-bg/20 text-status-info-text',\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-status-info-text\" />;\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\">\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-seam 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-seam 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-seam 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-seam bg-bg-surface overflow-hidden\">\n {/* Mobile Card View */}\n <div className=\"block md:hidden space-y-4 p-4\">\n {filteredOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-seam bg-bg-sunken/30 p-4\"\n >\n <div className=\"flex justify-between items-start mb-3\">\n <div>\n <h3 className=\"font-medium text-text-primary text-lg\">{order.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\">{order.paymentStatus}</p>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderModal(true);\n }}\n className=\"w-full rounded-lg border border-border-seam 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-seam 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\">\n {order.customerName}\n </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-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-2xl rounded-lg border border-border-seam 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-seam\">\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-seam 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-seam 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-seam 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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"}
|
|
@@ -72,14 +72,14 @@ function v() {
|
|
|
72
72
|
children: [/* @__PURE__ */ _("button", {
|
|
73
73
|
type: "button",
|
|
74
74
|
onClick: () => y("/admin"),
|
|
75
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border-
|
|
75
|
+
className: "flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
76
76
|
children: [/* @__PURE__ */ g(o, { className: "h-4 w-4" }), "Back"]
|
|
77
77
|
}), b ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("button", {
|
|
78
78
|
type: "button",
|
|
79
79
|
onClick: () => {
|
|
80
80
|
x(!1), E();
|
|
81
81
|
},
|
|
82
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border-
|
|
82
|
+
className: "flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
83
83
|
children: "Cancel"
|
|
84
84
|
}), /* @__PURE__ */ _("button", {
|
|
85
85
|
type: "button",
|
|
@@ -98,7 +98,7 @@ function v() {
|
|
|
98
98
|
className: "space-y-6 max-w-4xl",
|
|
99
99
|
children: [
|
|
100
100
|
/* @__PURE__ */ _("div", {
|
|
101
|
-
className: "rounded-lg border border-border-
|
|
101
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6",
|
|
102
102
|
children: [/* @__PURE__ */ _("div", {
|
|
103
103
|
className: "flex items-center mb-6",
|
|
104
104
|
children: [/* @__PURE__ */ _("div", {
|
|
@@ -137,7 +137,7 @@ function v() {
|
|
|
137
137
|
value: w.firstName,
|
|
138
138
|
onChange: (e) => O("firstName", e.target.value),
|
|
139
139
|
disabled: !b,
|
|
140
|
-
className: t("w-full rounded-lg border border-border-
|
|
140
|
+
className: t("w-full rounded-lg border border-border-seam 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")
|
|
141
141
|
})] }),
|
|
142
142
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
143
143
|
className: "block text-sm font-medium text-text-secondary mb-2",
|
|
@@ -147,7 +147,7 @@ function v() {
|
|
|
147
147
|
value: w.lastName,
|
|
148
148
|
onChange: (e) => O("lastName", e.target.value),
|
|
149
149
|
disabled: !b,
|
|
150
|
-
className: t("w-full rounded-lg border border-border-
|
|
150
|
+
className: t("w-full rounded-lg border border-border-seam 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")
|
|
151
151
|
})] }),
|
|
152
152
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
153
153
|
className: "block text-sm font-medium text-text-secondary mb-2",
|
|
@@ -157,7 +157,7 @@ function v() {
|
|
|
157
157
|
value: w.email,
|
|
158
158
|
onChange: (e) => O("email", e.target.value),
|
|
159
159
|
disabled: !b,
|
|
160
|
-
className: t("w-full rounded-lg border border-border-
|
|
160
|
+
className: t("w-full rounded-lg border border-border-seam 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")
|
|
161
161
|
})] }),
|
|
162
162
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
163
163
|
className: "block text-sm font-medium text-text-secondary mb-2",
|
|
@@ -167,7 +167,7 @@ function v() {
|
|
|
167
167
|
value: w.phone,
|
|
168
168
|
onChange: (e) => O("phone", e.target.value),
|
|
169
169
|
disabled: !b,
|
|
170
|
-
className: t("w-full rounded-lg border border-border-
|
|
170
|
+
className: t("w-full rounded-lg border border-border-seam 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")
|
|
171
171
|
})] }),
|
|
172
172
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("label", {
|
|
173
173
|
className: "block text-sm font-medium text-text-secondary mb-2",
|
|
@@ -177,7 +177,7 @@ function v() {
|
|
|
177
177
|
value: w.department,
|
|
178
178
|
onChange: (e) => O("department", e.target.value),
|
|
179
179
|
disabled: !b,
|
|
180
|
-
className: t("w-full rounded-lg border border-border-
|
|
180
|
+
className: t("w-full rounded-lg border border-border-seam 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")
|
|
181
181
|
})] }),
|
|
182
182
|
/* @__PURE__ */ _("div", { children: [
|
|
183
183
|
/* @__PURE__ */ g("label", {
|
|
@@ -188,7 +188,7 @@ function v() {
|
|
|
188
188
|
type: "text",
|
|
189
189
|
value: w.role,
|
|
190
190
|
disabled: !0,
|
|
191
|
-
className: "w-full rounded-lg border border-border-
|
|
191
|
+
className: "w-full rounded-lg border border-border-seam py-2 px-3 text-sm text-text-primary bg-bg-sunken cursor-not-allowed"
|
|
192
192
|
}),
|
|
193
193
|
/* @__PURE__ */ g("p", {
|
|
194
194
|
className: "text-xs text-text-secondary mt-1",
|
|
@@ -199,7 +199,7 @@ function v() {
|
|
|
199
199
|
})]
|
|
200
200
|
}),
|
|
201
201
|
/* @__PURE__ */ _("div", {
|
|
202
|
-
className: "rounded-lg border border-border-
|
|
202
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6",
|
|
203
203
|
children: [/* @__PURE__ */ _("div", {
|
|
204
204
|
className: "flex items-center gap-2 mb-4",
|
|
205
205
|
children: [/* @__PURE__ */ g(c, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ g("h3", {
|
|
@@ -224,7 +224,7 @@ function v() {
|
|
|
224
224
|
})]
|
|
225
225
|
}),
|
|
226
226
|
/* @__PURE__ */ _("div", {
|
|
227
|
-
className: "rounded-lg border border-border-
|
|
227
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6",
|
|
228
228
|
children: [
|
|
229
229
|
/* @__PURE__ */ _("div", {
|
|
230
230
|
className: "flex items-center gap-2 mb-4",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminProfilePage.js","names":[],"sources":["../../../../src/subscriberbot/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\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 } = useSubscriberBot();\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@subscriberbot.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-subtle bg-bg-surface 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} • {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-subtle bg-bg-surface p-6\">\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-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">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/subscriberbot/pages/admin/AdminProfilePage.tsx"],"sourcesContent":["/**\n * Admin Profile Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\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 } = useSubscriberBot();\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@subscriberbot.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-seam 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-seam 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\">\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} • {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-seam 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-seam 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-seam 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-seam 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-seam 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-seam 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\">\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\">\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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"}
|
|
@@ -92,7 +92,7 @@ function v() {
|
|
|
92
92
|
label: "Integrations",
|
|
93
93
|
icon: d
|
|
94
94
|
}
|
|
95
|
-
], k = "w-full rounded-lg border border-border-
|
|
95
|
+
], k = "w-full rounded-lg border border-border-seam bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", A = "block text-sm font-medium text-text-secondary mb-2";
|
|
96
96
|
return /* @__PURE__ */ g(n, {
|
|
97
97
|
title: "System Settings",
|
|
98
98
|
description: "Configure platform-wide settings and policies",
|
|
@@ -101,7 +101,7 @@ function v() {
|
|
|
101
101
|
children: [/* @__PURE__ */ _("button", {
|
|
102
102
|
type: "button",
|
|
103
103
|
onClick: () => v("/admin"),
|
|
104
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border-
|
|
104
|
+
className: "flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
105
105
|
children: [/* @__PURE__ */ g(i, { className: "h-4 w-4" }), " Back"]
|
|
106
106
|
}), /* @__PURE__ */ _("button", {
|
|
107
107
|
type: "button",
|
|
@@ -121,7 +121,7 @@ function v() {
|
|
|
121
121
|
/* @__PURE__ */ g("div", {
|
|
122
122
|
className: "lg:hidden",
|
|
123
123
|
children: /* @__PURE__ */ g("div", {
|
|
124
|
-
className: "rounded-lg border border-border-
|
|
124
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-3 mb-4",
|
|
125
125
|
children: /* @__PURE__ */ g("div", {
|
|
126
126
|
className: "grid grid-cols-2 sm:grid-cols-3 gap-2",
|
|
127
127
|
children: O.map((e) => {
|
|
@@ -139,9 +139,9 @@ function v() {
|
|
|
139
139
|
/* @__PURE__ */ g("div", {
|
|
140
140
|
className: "hidden lg:block lg:w-64 lg:shrink-0",
|
|
141
141
|
children: /* @__PURE__ */ _("div", {
|
|
142
|
-
className: "rounded-lg border border-border-
|
|
142
|
+
className: "rounded-lg border border-border-seam bg-bg-surface sticky top-24",
|
|
143
143
|
children: [/* @__PURE__ */ g("div", {
|
|
144
|
-
className: "p-4 border-b border-border-
|
|
144
|
+
className: "p-4 border-b border-border-seam",
|
|
145
145
|
children: /* @__PURE__ */ g("h2", {
|
|
146
146
|
className: "font-semibold text-text-primary",
|
|
147
147
|
children: "Settings"
|
|
@@ -166,7 +166,7 @@ function v() {
|
|
|
166
166
|
/* @__PURE__ */ g("div", {
|
|
167
167
|
className: "flex-1 min-w-0",
|
|
168
168
|
children: /* @__PURE__ */ _("div", {
|
|
169
|
-
className: "rounded-lg border border-border-
|
|
169
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6",
|
|
170
170
|
children: [
|
|
171
171
|
x === "general" && /* @__PURE__ */ _("div", {
|
|
172
172
|
className: "space-y-6",
|
|
@@ -295,7 +295,7 @@ function v() {
|
|
|
295
295
|
type: "checkbox",
|
|
296
296
|
checked: C.general.maintenanceMode,
|
|
297
297
|
onChange: (e) => E("general", "maintenanceMode", e.target.checked),
|
|
298
|
-
className: "rounded border-border-
|
|
298
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
299
299
|
}), /* @__PURE__ */ g("span", {
|
|
300
300
|
className: "text-sm text-text-primary",
|
|
301
301
|
children: "Enable Maintenance Mode"
|
|
@@ -351,7 +351,7 @@ function v() {
|
|
|
351
351
|
type: "checkbox",
|
|
352
352
|
checked: C.security.passwordPolicy.requireUppercase,
|
|
353
353
|
onChange: (e) => D("security", "passwordPolicy", "requireUppercase", e.target.checked),
|
|
354
|
-
className: "rounded border-border-
|
|
354
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
355
355
|
}), /* @__PURE__ */ g("span", {
|
|
356
356
|
className: "text-sm text-text-primary",
|
|
357
357
|
children: "Require Uppercase"
|
|
@@ -363,7 +363,7 @@ function v() {
|
|
|
363
363
|
type: "checkbox",
|
|
364
364
|
checked: C.security.passwordPolicy.requireNumbers,
|
|
365
365
|
onChange: (e) => D("security", "passwordPolicy", "requireNumbers", e.target.checked),
|
|
366
|
-
className: "rounded border-border-
|
|
366
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
367
367
|
}), /* @__PURE__ */ g("span", {
|
|
368
368
|
className: "text-sm text-text-primary",
|
|
369
369
|
children: "Require Numbers"
|
|
@@ -375,7 +375,7 @@ function v() {
|
|
|
375
375
|
type: "checkbox",
|
|
376
376
|
checked: C.security.passwordPolicy.requireSymbols,
|
|
377
377
|
onChange: (e) => D("security", "passwordPolicy", "requireSymbols", e.target.checked),
|
|
378
|
-
className: "rounded border-border-
|
|
378
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
379
379
|
}), /* @__PURE__ */ g("span", {
|
|
380
380
|
className: "text-sm text-text-primary",
|
|
381
381
|
children: "Require Symbols"
|
|
@@ -387,7 +387,7 @@ function v() {
|
|
|
387
387
|
type: "checkbox",
|
|
388
388
|
checked: C.security.twoFactorAuth,
|
|
389
389
|
onChange: (e) => E("security", "twoFactorAuth", e.target.checked),
|
|
390
|
-
className: "rounded border-border-
|
|
390
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
391
391
|
}), /* @__PURE__ */ g("span", {
|
|
392
392
|
className: "text-sm text-text-primary",
|
|
393
393
|
children: "Two-Factor Auth"
|
|
@@ -443,13 +443,13 @@ function v() {
|
|
|
443
443
|
].map((e) => {
|
|
444
444
|
let t = e.icon;
|
|
445
445
|
return /* @__PURE__ */ _("label", {
|
|
446
|
-
className: "flex items-center gap-3 rounded-lg border border-border-
|
|
446
|
+
className: "flex items-center gap-3 rounded-lg border border-border-seam p-4 cursor-pointer hover:bg-accent/50 transition-colors",
|
|
447
447
|
children: [
|
|
448
448
|
/* @__PURE__ */ g("input", {
|
|
449
449
|
type: "checkbox",
|
|
450
450
|
checked: C.notifications[e.key],
|
|
451
451
|
onChange: (t) => E("notifications", e.key, t.target.checked),
|
|
452
|
-
className: "rounded border-border-
|
|
452
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
453
453
|
}),
|
|
454
454
|
/* @__PURE__ */ g(t, { className: "h-5 w-5 text-text-secondary" }),
|
|
455
455
|
/* @__PURE__ */ g("span", {
|
|
@@ -516,7 +516,7 @@ function v() {
|
|
|
516
516
|
type: "checkbox",
|
|
517
517
|
checked: C.database.autoBackup,
|
|
518
518
|
onChange: (e) => E("database", "autoBackup", e.target.checked),
|
|
519
|
-
className: "rounded border-border-
|
|
519
|
+
className: "rounded border-border-seam text-primary focus:ring-primary"
|
|
520
520
|
}), /* @__PURE__ */ g("span", {
|
|
521
521
|
className: "text-sm text-text-primary",
|
|
522
522
|
children: "Enable Auto Backup"
|