@burdenoff/microfe-adaptercloud 2026.614.1 → 2026.624.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/adaptercloud/components/EmptyState.js +3 -3
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +9 -9
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +5 -5
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +3 -3
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +2 -2
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +54 -54
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +60 -60
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +77 -77
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +43 -43
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +85 -85
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +34 -34
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +40 -40
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +86 -86
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +80 -80
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +29 -29
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +81 -81
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +67 -67
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +94 -94
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +57 -57
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +75 -75
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +102 -102
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +35 -35
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +109 -109
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +60 -60
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +71 -71
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +54 -54
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +75 -75
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +69 -69
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +72 -72
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +75 -75
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +30 -30
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +41 -41
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +53 -53
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +51 -51
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +33 -33
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +33 -33
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +108 -108
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +76 -76
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +69 -69
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +53 -53
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +32 -32
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +55 -55
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +138 -138
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +65 -65
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +74 -74
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +49 -49
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +92 -92
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +55 -55
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/adaptercloud/utils/cn.js +2 -2
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +1 -1
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminDashboard.tsx"],"sourcesContent":["/**\n * Admin Dashboard Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured admin dashboard with loading state, 8 stats cards,\n * user distribution, recent activity, system health, financial overview,\n * management links, pending approvals banner, and quick actions.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Users,\n Store,\n ShoppingBag,\n IndianRupee,\n Activity,\n ArrowRight,\n CheckCircle2,\n AlertCircle,\n Clock,\n UserPlus,\n Settings,\n BarChart3,\n ShieldCheck,\n Server,\n Database,\n Wifi,\n CreditCard,\n TrendingUp,\n FileText,\n AlertTriangle,\n Loader2,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface SystemMetrics {\n totalUsers: number;\n totalCarts: number;\n totalOrders: number;\n totalInvestments: number;\n activeUsers: number;\n pendingApprovals: number;\n totalRevenue: number;\n platformCommission: number;\n}\n\ninterface RecentActivity {\n id: string;\n type: 'user_registration' | 'cart_approval' | 'investment' | 'order' | 'dispute';\n description: string;\n timestamp: string;\n status: 'completed' | 'pending' | 'failed';\n user?: string;\n amount?: number;\n}\n\ninterface UserStats {\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n growth: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminDashboard() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Admin';\n\n const [metrics, setMetrics] = useState<SystemMetrics | null>(null);\n const [activities, setActivities] = useState<RecentActivity[]>([]);\n const [userStats, setUserStats] = useState<UserStats | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setMetrics({\n totalUsers: 12847,\n totalCarts: 2934,\n totalOrders: 45621,\n totalInvestments: 1256,\n activeUsers: 8934,\n pendingApprovals: 47,\n totalRevenue: 2450000,\n platformCommission: 122500,\n });\n\n setUserStats({\n customers: 8934,\n cartOwners: 2456,\n workers: 1245,\n investors: 212,\n growth: 15.7,\n });\n\n setActivities([\n {\n id: 'ACT-001',\n type: 'user_registration',\n description: 'New cart owner registered: Rajesh Kumar',\n timestamp: '2 minutes ago',\n status: 'completed',\n user: 'Rajesh Kumar',\n },\n {\n id: 'ACT-002',\n type: 'cart_approval',\n description: 'Cart approval request from Mumbai Chaat Corner',\n timestamp: '5 minutes ago',\n status: 'pending',\n user: 'Priya Sharma',\n },\n {\n id: 'ACT-003',\n type: 'investment',\n description: 'New investment in Dosa Express',\n timestamp: '12 minutes ago',\n status: 'completed',\n user: 'Amit Patel',\n amount: 75000,\n },\n {\n id: 'ACT-004',\n type: 'order',\n description: 'Large order placed: ₹2,500',\n timestamp: '18 minutes ago',\n status: 'completed',\n amount: 2500,\n },\n {\n id: 'ACT-005',\n type: 'dispute',\n description: 'Payment dispute raised by customer',\n timestamp: '25 minutes ago',\n status: 'pending',\n user: 'Suresh Nair',\n amount: 450,\n },\n {\n id: 'ACT-006',\n type: 'user_registration',\n description: 'New investor registered: Fatima Ali',\n timestamp: '32 minutes ago',\n status: 'completed',\n user: 'Fatima Ali',\n },\n ]);\n\n setIsLoading(false);\n }, 1000);\n\n return () => clearTimeout(timer);\n }, []);\n\n const getActivityIcon = (type: RecentActivity['type']) => {\n const iconMap = {\n user_registration: UserPlus,\n cart_approval: Store,\n investment: IndianRupee,\n order: ShoppingBag,\n dispute: AlertTriangle,\n };\n const Icon = iconMap[type] ?? Activity;\n return <Icon className=\"h-4 w-4\" />;\n };\n\n const getActivityIconColor = (type: RecentActivity['type']) => {\n const colorMap: Record<string, string> = {\n user_registration: 'text-blue-600 dark:text-blue-400',\n cart_approval: 'text-purple-600 dark:text-purple-400',\n investment: 'text-emerald-600 dark:text-emerald-400',\n order: 'text-green-600 dark:text-green-400',\n dispute: 'text-yellow-600 dark:text-yellow-400',\n };\n return colorMap[type] ?? 'text-muted-foreground';\n };\n\n const getStatusBadge = (status: RecentActivity['status']) => {\n const config = {\n completed: 'bg-green-500/20 text-green-600 dark:text-green-400',\n pending: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n failed: 'bg-red-500/20 text-red-600 dark:text-red-400',\n };\n return config[status] ?? 'bg-secondary text-secondary-foreground';\n };\n\n /* ---- Loading state ---- */\n if (isLoading) {\n return (\n <PageLayout title=\"Admin Dashboard\" description=\"Loading...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-muted-foreground mb-4\" />\n <p className=\"text-muted-foreground\">Loading admin dashboard...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Admin Dashboard\"\n description={`Welcome, ${firstName}! Monitor and manage the platform.`}\n actions={\n metrics?.pendingApprovals && metrics.pendingApprovals > 0 ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2\">\n <AlertTriangle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n <span className=\"text-sm font-medium text-red-600 dark:text-red-400\">\n {metrics.pendingApprovals} pending approvals\n </span>\n </div>\n ) : undefined\n }\n >\n {/* Quick Actions */}\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-foreground mb-4\">Quick Actions</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/carts')}\n className=\"flex items-center gap-3 rounded-lg bg-red-600 hover:bg-red-700 text-white p-3 text-sm font-medium transition-colors\"\n >\n <AlertTriangle className=\"h-5 w-5\" />\n Approve Carts ({metrics?.pendingApprovals})\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/carts')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <Store className=\"h-5 w-5 text-muted-foreground\" />\n Manage Carts\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/users')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <Users className=\"h-5 w-5 text-muted-foreground\" />\n User Management\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/orders')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <ShoppingBag className=\"h-5 w-5 text-muted-foreground\" />\n Order Management\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/financial')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <IndianRupee className=\"h-5 w-5 text-muted-foreground\" />\n Financial Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <BarChart3 className=\"h-5 w-5 text-muted-foreground\" />\n Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/settings')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <Settings className=\"h-5 w-5 text-muted-foreground\" />\n Settings\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-3 rounded-lg border border-border bg-card hover:bg-accent p-3 text-sm font-medium text-foreground transition-colors\"\n >\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n Reports\n </button>\n </div>\n </div>\n\n {/* Platform Overview - 4 Primary Stats */}\n {metrics && (\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-foreground mb-4\">Platform Overview</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={metrics.totalUsers.toLocaleString('en-IN')}\n label=\"Total Users\"\n trend=\"up\"\n trendValue=\"+15.7%\"\n />\n <MetricsCard\n icon={<Store className=\"h-5 w-5\" />}\n value={metrics.totalCarts.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trend=\"up\"\n trendValue=\"+8 this week\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={metrics.totalOrders.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue=\"+12.3%\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={`₹${(metrics.totalRevenue / 100000).toFixed(1)}L`}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue=\"+8.5%\"\n />\n </div>\n\n {/* 4 Additional Metric Cards */}\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4 mt-4\">\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <p className=\"text-xs text-muted-foreground\">Active Users (24h)</p>\n <p className=\"text-xl font-bold text-green-600 dark:text-green-400\">\n {metrics.activeUsers.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <p className=\"text-xs text-muted-foreground\">Pending Approvals</p>\n <p className=\"text-xl font-bold text-red-600 dark:text-red-400\">\n {metrics.pendingApprovals}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <p className=\"text-xs text-muted-foreground\">Total Investments</p>\n <p className=\"text-xl font-bold text-blue-600 dark:text-blue-400\">\n {metrics.totalInvestments.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <p className=\"text-xs text-muted-foreground\">Platform Commission</p>\n <p className=\"text-xl font-bold text-purple-600 dark:text-purple-400\">\n ₹{(metrics.platformCommission / 1000).toFixed(0)}K\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* User Distribution */}\n {userStats && (\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-foreground mb-4\">User Distribution</h2>\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-6\">\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {userStats.customers.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-muted-foreground\">Customers</div>\n <div className=\"text-xs text-muted-foreground\">69.5%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-green-600 dark:text-green-400\">\n {userStats.cartOwners.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-muted-foreground\">Cart Owners</div>\n <div className=\"text-xs text-muted-foreground\">19.1%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-yellow-600 dark:text-yellow-400\">\n {userStats.workers.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-muted-foreground\">Workers</div>\n <div className=\"text-xs text-muted-foreground\">9.7%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-purple-600 dark:text-purple-400\">\n {userStats.investors.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-muted-foreground\">Investors</div>\n <div className=\"text-xs text-muted-foreground\">1.7%</div>\n </div>\n </div>\n <div className=\"mt-4 pt-4 border-t border-border\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-muted-foreground\">User Growth (This Month)</span>\n <span className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n +{userStats.growth}%\n </span>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Recent Activity */}\n <div className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-foreground\">Recent Platform Activity</h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all activities\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"rounded-lg border border-border bg-card divide-y divide-border\">\n {activities.map((activity) => (\n <div key={activity.id} className=\"flex items-start gap-3 px-4 py-3\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted mt-0.5',\n getActivityIconColor(activity.type)\n )}\n >\n {getActivityIcon(activity.type)}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-2\">\n <p className=\"text-sm font-medium text-foreground\">{activity.description}</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize w-fit',\n getStatusBadge(activity.status)\n )}\n >\n {activity.status}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center mt-1 text-xs text-muted-foreground gap-3\">\n <span>{activity.timestamp}</span>\n {activity.user && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {activity.user}\n </span>\n )}\n {activity.amount && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" />₹{activity.amount.toLocaleString('en-IN')}\n </span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* System Health & Financial Overview */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* System Health */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <ShieldCheck className=\"h-5 w-5 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold text-foreground\">System Health</h3>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Server className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Server Status</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Healthy\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Database className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Database Performance</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Optimal\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Payment Gateway</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Online\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Wifi className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">API Response Time</span>\n </div>\n <span className=\"text-sm font-medium text-foreground\">145ms</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Uptime (30 days)</span>\n </div>\n <span className=\"text-sm font-medium text-foreground\">99.8%</span>\n </div>\n </div>\n </div>\n\n {/* Financial Overview */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <IndianRupee className=\"h-5 w-5 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold text-foreground\">Financial Overview</h3>\n </div>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-muted-foreground\">Today's Revenue</span>\n <span className=\"font-medium text-foreground\">₹1,45,230</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-muted-foreground\">This Month</span>\n <span className=\"font-medium text-foreground\">₹24,50,000</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-muted-foreground\">Platform Commission</span>\n <span className=\"font-medium text-foreground\">₹1,22,500</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-muted-foreground\">Active Investments</span>\n <span className=\"font-medium text-foreground\">₹1.52Cr</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-muted-foreground\">Pending Payouts</span>\n <span className=\"font-medium text-foreground\">₹45,600</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Management Links */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[\n {\n icon: Store,\n label: 'Cart Management',\n desc: 'Approve, manage, and monitor carts',\n path: '/admin/carts',\n },\n {\n icon: Users,\n label: 'User Management',\n desc: 'Manage users and permissions',\n path: '/admin/users',\n },\n {\n icon: BarChart3,\n label: 'Analytics & Reports',\n desc: 'View detailed platform analytics',\n path: '/admin/analytics',\n },\n {\n icon: IndianRupee,\n label: 'Financial Analytics',\n desc: 'View revenue, investments, and financial metrics',\n path: '/admin/financial',\n },\n {\n icon: AlertTriangle,\n label: 'Order & Dispute Management',\n desc: 'Handle orders, disputes, and customer issues',\n path: '/admin/orders',\n },\n {\n icon: Settings,\n label: 'Platform Settings',\n desc: 'Configure platform-wide settings',\n path: '/admin/settings',\n },\n ].map((link) => {\n const LinkIcon = link.icon;\n return (\n <button\n key={link.label}\n type=\"button\"\n onClick={() => navigateTo(link.path)}\n className={cn(\n 'flex items-center gap-4 rounded-lg border border-border bg-card p-4 sm:p-6 text-left shadow-sm transition-all',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n <LinkIcon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"font-semibold text-foreground text-sm sm:text-base\">{link.label}</h3>\n <p className=\"text-xs sm:text-sm text-muted-foreground\">{link.desc}</p>\n </div>\n </button>\n );\n })}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminDashboard.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminDashboard.tsx"],"sourcesContent":["/**\n * Admin Dashboard Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured admin dashboard with loading state, 8 stats cards,\n * user distribution, recent activity, system health, financial overview,\n * management links, pending approvals banner, and quick actions.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Users,\n Store,\n ShoppingBag,\n IndianRupee,\n Activity,\n ArrowRight,\n CheckCircle2,\n AlertCircle,\n Clock,\n UserPlus,\n Settings,\n BarChart3,\n ShieldCheck,\n Server,\n Database,\n Wifi,\n CreditCard,\n TrendingUp,\n FileText,\n AlertTriangle,\n Loader2,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface SystemMetrics {\n totalUsers: number;\n totalCarts: number;\n totalOrders: number;\n totalInvestments: number;\n activeUsers: number;\n pendingApprovals: number;\n totalRevenue: number;\n platformCommission: number;\n}\n\ninterface RecentActivity {\n id: string;\n type: 'user_registration' | 'cart_approval' | 'investment' | 'order' | 'dispute';\n description: string;\n timestamp: string;\n status: 'completed' | 'pending' | 'failed';\n user?: string;\n amount?: number;\n}\n\ninterface UserStats {\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n growth: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminDashboard() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Admin';\n\n const [metrics, setMetrics] = useState<SystemMetrics | null>(null);\n const [activities, setActivities] = useState<RecentActivity[]>([]);\n const [userStats, setUserStats] = useState<UserStats | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setMetrics({\n totalUsers: 12847,\n totalCarts: 2934,\n totalOrders: 45621,\n totalInvestments: 1256,\n activeUsers: 8934,\n pendingApprovals: 47,\n totalRevenue: 2450000,\n platformCommission: 122500,\n });\n\n setUserStats({\n customers: 8934,\n cartOwners: 2456,\n workers: 1245,\n investors: 212,\n growth: 15.7,\n });\n\n setActivities([\n {\n id: 'ACT-001',\n type: 'user_registration',\n description: 'New cart owner registered: Rajesh Kumar',\n timestamp: '2 minutes ago',\n status: 'completed',\n user: 'Rajesh Kumar',\n },\n {\n id: 'ACT-002',\n type: 'cart_approval',\n description: 'Cart approval request from Mumbai Chaat Corner',\n timestamp: '5 minutes ago',\n status: 'pending',\n user: 'Priya Sharma',\n },\n {\n id: 'ACT-003',\n type: 'investment',\n description: 'New investment in Dosa Express',\n timestamp: '12 minutes ago',\n status: 'completed',\n user: 'Amit Patel',\n amount: 75000,\n },\n {\n id: 'ACT-004',\n type: 'order',\n description: 'Large order placed: ₹2,500',\n timestamp: '18 minutes ago',\n status: 'completed',\n amount: 2500,\n },\n {\n id: 'ACT-005',\n type: 'dispute',\n description: 'Payment dispute raised by customer',\n timestamp: '25 minutes ago',\n status: 'pending',\n user: 'Suresh Nair',\n amount: 450,\n },\n {\n id: 'ACT-006',\n type: 'user_registration',\n description: 'New investor registered: Fatima Ali',\n timestamp: '32 minutes ago',\n status: 'completed',\n user: 'Fatima Ali',\n },\n ]);\n\n setIsLoading(false);\n }, 1000);\n\n return () => clearTimeout(timer);\n }, []);\n\n const getActivityIcon = (type: RecentActivity['type']) => {\n const iconMap = {\n user_registration: UserPlus,\n cart_approval: Store,\n investment: IndianRupee,\n order: ShoppingBag,\n dispute: AlertTriangle,\n };\n const Icon = iconMap[type] ?? Activity;\n return <Icon className=\"h-4 w-4\" />;\n };\n\n const getActivityIconColor = (type: RecentActivity['type']) => {\n const colorMap: Record<string, string> = {\n user_registration: 'text-blue-600 dark:text-blue-400',\n cart_approval: 'text-purple-600 dark:text-purple-400',\n investment: 'text-emerald-600 dark:text-emerald-400',\n order: 'text-green-600 dark:text-green-400',\n dispute: 'text-yellow-600 dark:text-yellow-400',\n };\n return colorMap[type] ?? 'text-text-secondary';\n };\n\n const getStatusBadge = (status: RecentActivity['status']) => {\n const config = {\n completed: 'bg-green-500/20 text-green-600 dark:text-green-400',\n pending: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n failed: 'bg-red-500/20 text-red-600 dark:text-red-400',\n };\n return config[status] ?? 'bg-secondary text-secondary-foreground';\n };\n\n /* ---- Loading state ---- */\n if (isLoading) {\n return (\n <PageLayout title=\"Admin Dashboard\" description=\"Loading...\">\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 admin dashboard...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Admin Dashboard\"\n description={`Welcome, ${firstName}! Monitor and manage the platform.`}\n actions={\n metrics?.pendingApprovals && metrics.pendingApprovals > 0 ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2\">\n <AlertTriangle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n <span className=\"text-sm font-medium text-red-600 dark:text-red-400\">\n {metrics.pendingApprovals} pending approvals\n </span>\n </div>\n ) : undefined\n }\n >\n {/* Quick Actions */}\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">Quick Actions</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/carts')}\n className=\"flex items-center gap-3 rounded-lg bg-red-600 hover:bg-red-700 text-white p-3 text-sm font-medium transition-colors\"\n >\n <AlertTriangle className=\"h-5 w-5\" />\n Approve Carts ({metrics?.pendingApprovals})\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/carts')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <Store className=\"h-5 w-5 text-text-secondary\" />\n Manage Carts\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/users')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <Users className=\"h-5 w-5 text-text-secondary\" />\n User Management\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/orders')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <ShoppingBag className=\"h-5 w-5 text-text-secondary\" />\n Order Management\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/financial')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n Financial Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n Analytics\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/settings')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n Settings\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface hover:bg-accent p-3 text-sm font-medium text-text-primary transition-colors\"\n >\n <FileText className=\"h-5 w-5 text-text-secondary\" />\n Reports\n </button>\n </div>\n </div>\n\n {/* Platform Overview - 4 Primary Stats */}\n {metrics && (\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">Platform Overview</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={metrics.totalUsers.toLocaleString('en-IN')}\n label=\"Total Users\"\n trend=\"up\"\n trendValue=\"+15.7%\"\n />\n <MetricsCard\n icon={<Store className=\"h-5 w-5\" />}\n value={metrics.totalCarts.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trend=\"up\"\n trendValue=\"+8 this week\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={metrics.totalOrders.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue=\"+12.3%\"\n />\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={`₹${(metrics.totalRevenue / 100000).toFixed(1)}L`}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue=\"+8.5%\"\n />\n </div>\n\n {/* 4 Additional Metric Cards */}\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4 mt-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Active Users (24h)</p>\n <p className=\"text-xl font-bold text-green-600 dark:text-green-400\">\n {metrics.activeUsers.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Pending Approvals</p>\n <p className=\"text-xl font-bold text-red-600 dark:text-red-400\">\n {metrics.pendingApprovals}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Total Investments</p>\n <p className=\"text-xl font-bold text-blue-600 dark:text-blue-400\">\n {metrics.totalInvestments.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Platform Commission</p>\n <p className=\"text-xl font-bold text-purple-600 dark:text-purple-400\">\n ₹{(metrics.platformCommission / 1000).toFixed(0)}K\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* User Distribution */}\n {userStats && (\n <div className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">User Distribution</h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-6\">\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {userStats.customers.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-text-secondary\">Customers</div>\n <div className=\"text-xs text-text-secondary\">69.5%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-green-600 dark:text-green-400\">\n {userStats.cartOwners.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-text-secondary\">Cart Owners</div>\n <div className=\"text-xs text-text-secondary\">19.1%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-yellow-600 dark:text-yellow-400\">\n {userStats.workers.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-text-secondary\">Workers</div>\n <div className=\"text-xs text-text-secondary\">9.7%</div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-2xl sm:text-3xl font-bold text-purple-600 dark:text-purple-400\">\n {userStats.investors.toLocaleString('en-IN')}\n </div>\n <div className=\"text-sm text-text-secondary\">Investors</div>\n <div className=\"text-xs text-text-secondary\">1.7%</div>\n </div>\n </div>\n <div className=\"mt-4 pt-4 border-t border-border-subtle\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">User Growth (This Month)</span>\n <span className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n +{userStats.growth}%\n </span>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Recent Activity */}\n <div className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Recent Platform Activity</h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin/analytics')}\n className=\"flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n View all activities\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {activities.map((activity) => (\n <div key={activity.id} className=\"flex items-start gap-3 px-4 py-3\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken mt-0.5',\n getActivityIconColor(activity.type)\n )}\n >\n {getActivityIcon(activity.type)}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">{activity.description}</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize w-fit',\n getStatusBadge(activity.status)\n )}\n >\n {activity.status}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center mt-1 text-xs text-text-secondary gap-3\">\n <span>{activity.timestamp}</span>\n {activity.user && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {activity.user}\n </span>\n )}\n {activity.amount && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" />₹{activity.amount.toLocaleString('en-IN')}\n </span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* System Health & Financial Overview */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* System Health */}\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 <ShieldCheck className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">System Health</h3>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Server className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm text-text-secondary\">Server Status</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Healthy\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm text-text-secondary\">Database Performance</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Optimal\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm text-text-secondary\">Payment Gateway</span>\n </div>\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-green-500/20 px-3 py-1 text-xs font-medium text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Online\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Wifi className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm text-text-secondary\">API Response Time</span>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">145ms</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm text-text-secondary\">Uptime (30 days)</span>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">99.8%</span>\n </div>\n </div>\n </div>\n\n {/* Financial Overview */}\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 <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Financial Overview</h3>\n </div>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Today's Revenue</span>\n <span className=\"font-medium text-text-primary\">₹1,45,230</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">This Month</span>\n <span className=\"font-medium text-text-primary\">₹24,50,000</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Platform Commission</span>\n <span className=\"font-medium text-text-primary\">₹1,22,500</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Active Investments</span>\n <span className=\"font-medium text-text-primary\">₹1.52Cr</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Pending Payouts</span>\n <span className=\"font-medium text-text-primary\">₹45,600</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Management Links */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[\n {\n icon: Store,\n label: 'Cart Management',\n desc: 'Approve, manage, and monitor carts',\n path: '/admin/carts',\n },\n {\n icon: Users,\n label: 'User Management',\n desc: 'Manage users and permissions',\n path: '/admin/users',\n },\n {\n icon: BarChart3,\n label: 'Analytics & Reports',\n desc: 'View detailed platform analytics',\n path: '/admin/analytics',\n },\n {\n icon: IndianRupee,\n label: 'Financial Analytics',\n desc: 'View revenue, investments, and financial metrics',\n path: '/admin/financial',\n },\n {\n icon: AlertTriangle,\n label: 'Order & Dispute Management',\n desc: 'Handle orders, disputes, and customer issues',\n path: '/admin/orders',\n },\n {\n icon: Settings,\n label: 'Platform Settings',\n desc: 'Configure platform-wide settings',\n path: '/admin/settings',\n },\n ].map((link) => {\n const LinkIcon = link.icon;\n return (\n <button\n key={link.label}\n type=\"button\"\n onClick={() => navigateTo(link.path)}\n className={cn(\n 'flex items-center gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 text-left shadow-sm transition-all',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <LinkIcon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"font-semibold text-text-primary text-sm sm:text-base\">{link.label}</h3>\n <p className=\"text-xs sm:text-sm text-text-secondary\">{link.desc}</p>\n </div>\n </button>\n );\n })}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -129,7 +129,7 @@ function b() {
|
|
|
129
129
|
let D = (e) => r(e, { minimumFractionDigits: 0 }), O = () => {
|
|
130
130
|
alert("Financial report export initiated");
|
|
131
131
|
}, k = (e) => e === 0 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-yellow-500" }) : e === 1 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-gray-400" }) : e === 2 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-amber-700" }) : /* @__PURE__ */ v("span", {
|
|
132
|
-
className: "flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
132
|
+
className: "flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary",
|
|
133
133
|
children: e + 1
|
|
134
134
|
});
|
|
135
135
|
return x ? /* @__PURE__ */ v(t, {
|
|
@@ -137,8 +137,8 @@ function b() {
|
|
|
137
137
|
description: "Loading financial data...",
|
|
138
138
|
children: /* @__PURE__ */ y("div", {
|
|
139
139
|
className: "flex flex-col items-center justify-center py-20",
|
|
140
|
-
children: [/* @__PURE__ */ v(f, { className: "h-10 w-10 animate-spin text-
|
|
141
|
-
className: "text-
|
|
140
|
+
children: [/* @__PURE__ */ v(f, { className: "h-10 w-10 animate-spin text-text-secondary mb-4" }), /* @__PURE__ */ v("p", {
|
|
141
|
+
className: "text-text-secondary",
|
|
142
142
|
children: "Loading financial data..."
|
|
143
143
|
})]
|
|
144
144
|
})
|
|
@@ -151,13 +151,13 @@ function b() {
|
|
|
151
151
|
/* @__PURE__ */ y("button", {
|
|
152
152
|
type: "button",
|
|
153
153
|
onClick: () => b("/admin"),
|
|
154
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border px-3 py-2 text-sm font-medium text-
|
|
154
|
+
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",
|
|
155
155
|
children: [/* @__PURE__ */ v(o, { className: "h-4 w-4" }), " Back"]
|
|
156
156
|
}),
|
|
157
157
|
/* @__PURE__ */ y("select", {
|
|
158
158
|
value: C,
|
|
159
159
|
onChange: (e) => w(e.target.value),
|
|
160
|
-
className: "rounded-lg border border-border bg-
|
|
160
|
+
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)]",
|
|
161
161
|
children: [
|
|
162
162
|
/* @__PURE__ */ v("option", {
|
|
163
163
|
value: "7d",
|
|
@@ -180,7 +180,7 @@ function b() {
|
|
|
180
180
|
/* @__PURE__ */ y("button", {
|
|
181
181
|
type: "button",
|
|
182
182
|
onClick: O,
|
|
183
|
-
className: "flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
183
|
+
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",
|
|
184
184
|
children: [/* @__PURE__ */ v(u, { className: "h-4 w-4" }), " Export Report"]
|
|
185
185
|
})
|
|
186
186
|
]
|
|
@@ -219,38 +219,38 @@ function b() {
|
|
|
219
219
|
/* @__PURE__ */ y("div", {
|
|
220
220
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8",
|
|
221
221
|
children: [/* @__PURE__ */ y("div", {
|
|
222
|
-
className: "rounded-lg border border-border bg-
|
|
222
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
223
223
|
children: [/* @__PURE__ */ y("div", {
|
|
224
224
|
className: "flex items-center gap-2 mb-4",
|
|
225
|
-
children: [/* @__PURE__ */ v(h, { className: "h-5 w-5 text-
|
|
226
|
-
className: "text-lg font-semibold text-
|
|
225
|
+
children: [/* @__PURE__ */ v(h, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
226
|
+
className: "text-lg font-semibold text-text-primary",
|
|
227
227
|
children: "Top Performing Carts"
|
|
228
228
|
})]
|
|
229
229
|
}), /* @__PURE__ */ v("div", {
|
|
230
230
|
className: "space-y-3",
|
|
231
231
|
children: T.topPerformingCarts.map((e, t) => /* @__PURE__ */ y("div", {
|
|
232
|
-
className: "flex items-center justify-between rounded-lg bg-
|
|
232
|
+
className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
|
|
233
233
|
children: [/* @__PURE__ */ y("div", {
|
|
234
234
|
className: "flex items-center gap-3",
|
|
235
235
|
children: [k(t), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
236
|
-
className: "text-sm font-medium text-
|
|
236
|
+
className: "text-sm font-medium text-text-primary",
|
|
237
237
|
children: e.name
|
|
238
238
|
}), /* @__PURE__ */ y("p", {
|
|
239
|
-
className: "text-xs text-
|
|
239
|
+
className: "text-xs text-text-secondary",
|
|
240
240
|
children: [e.orders, " orders"]
|
|
241
241
|
})] })]
|
|
242
242
|
}), /* @__PURE__ */ v("p", {
|
|
243
|
-
className: "text-sm font-semibold text-
|
|
243
|
+
className: "text-sm font-semibold text-text-primary",
|
|
244
244
|
children: D(e.revenue)
|
|
245
245
|
})]
|
|
246
246
|
}, e.id))
|
|
247
247
|
})]
|
|
248
248
|
}), /* @__PURE__ */ y("div", {
|
|
249
|
-
className: "rounded-lg border border-border bg-
|
|
249
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
250
250
|
children: [/* @__PURE__ */ y("div", {
|
|
251
251
|
className: "flex items-center gap-2 mb-4",
|
|
252
|
-
children: [/* @__PURE__ */ v(c, { className: "h-5 w-5 text-
|
|
253
|
-
className: "text-lg font-semibold text-
|
|
252
|
+
children: [/* @__PURE__ */ v(c, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
253
|
+
className: "text-lg font-semibold text-text-primary",
|
|
254
254
|
children: "Revenue by Category"
|
|
255
255
|
})]
|
|
256
256
|
}), /* @__PURE__ */ v("div", {
|
|
@@ -259,24 +259,24 @@ function b() {
|
|
|
259
259
|
/* @__PURE__ */ y("div", {
|
|
260
260
|
className: "flex items-center justify-between mb-1",
|
|
261
261
|
children: [/* @__PURE__ */ v("span", {
|
|
262
|
-
className: "text-sm font-medium text-
|
|
262
|
+
className: "text-sm font-medium text-text-primary",
|
|
263
263
|
children: e.category
|
|
264
264
|
}), /* @__PURE__ */ y("span", {
|
|
265
|
-
className: "text-sm text-
|
|
265
|
+
className: "text-sm text-text-secondary",
|
|
266
266
|
children: [e.percentage, "%"]
|
|
267
267
|
})]
|
|
268
268
|
}),
|
|
269
269
|
/* @__PURE__ */ v("div", {
|
|
270
|
-
className: "w-full bg-
|
|
270
|
+
className: "w-full bg-bg-sunken rounded-full h-2",
|
|
271
271
|
children: /* @__PURE__ */ v("div", {
|
|
272
|
-
className: "bg-primary h-2 rounded-full transition-all duration-300",
|
|
272
|
+
className: "bg-action-primary-bg h-2 rounded-full transition-all duration-300",
|
|
273
273
|
style: { width: `${e.percentage}%` }
|
|
274
274
|
})
|
|
275
275
|
}),
|
|
276
276
|
/* @__PURE__ */ v("div", {
|
|
277
277
|
className: "text-right mt-1",
|
|
278
278
|
children: /* @__PURE__ */ v("span", {
|
|
279
|
-
className: "text-sm font-semibold text-
|
|
279
|
+
className: "text-sm font-semibold text-text-primary",
|
|
280
280
|
children: D(e.amount)
|
|
281
281
|
})
|
|
282
282
|
})
|
|
@@ -285,11 +285,11 @@ function b() {
|
|
|
285
285
|
})]
|
|
286
286
|
}),
|
|
287
287
|
/* @__PURE__ */ y("div", {
|
|
288
|
-
className: "rounded-lg border border-border bg-
|
|
288
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 mb-8",
|
|
289
289
|
children: [/* @__PURE__ */ y("div", {
|
|
290
290
|
className: "flex items-center gap-2 mb-4",
|
|
291
|
-
children: [/* @__PURE__ */ v(l, { className: "h-5 w-5 text-
|
|
292
|
-
className: "text-lg font-semibold text-
|
|
291
|
+
children: [/* @__PURE__ */ v(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
292
|
+
className: "text-lg font-semibold text-text-primary",
|
|
293
293
|
children: "Monthly Trends"
|
|
294
294
|
})]
|
|
295
295
|
}), /* @__PURE__ */ v("div", {
|
|
@@ -297,22 +297,22 @@ function b() {
|
|
|
297
297
|
children: /* @__PURE__ */ y("table", {
|
|
298
298
|
className: "w-full",
|
|
299
299
|
children: [/* @__PURE__ */ v("thead", { children: /* @__PURE__ */ y("tr", {
|
|
300
|
-
className: "border-b border-border bg-
|
|
300
|
+
className: "border-b border-border-subtle bg-bg-sunken/50",
|
|
301
301
|
children: [
|
|
302
302
|
/* @__PURE__ */ v("th", {
|
|
303
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
303
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
304
304
|
children: "Month"
|
|
305
305
|
}),
|
|
306
306
|
/* @__PURE__ */ v("th", {
|
|
307
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
307
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
308
308
|
children: "Revenue"
|
|
309
309
|
}),
|
|
310
310
|
/* @__PURE__ */ v("th", {
|
|
311
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
311
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
312
312
|
children: "Orders"
|
|
313
313
|
}),
|
|
314
314
|
/* @__PURE__ */ v("th", {
|
|
315
|
-
className: "px-4 py-3 text-right text-xs font-medium text-
|
|
315
|
+
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
316
316
|
children: "Commission"
|
|
317
317
|
})
|
|
318
318
|
]
|
|
@@ -322,19 +322,19 @@ function b() {
|
|
|
322
322
|
className: "hover:bg-accent/50 transition-colors",
|
|
323
323
|
children: [
|
|
324
324
|
/* @__PURE__ */ v("td", {
|
|
325
|
-
className: "px-4 py-3 text-sm font-medium text-
|
|
325
|
+
className: "px-4 py-3 text-sm font-medium text-text-primary",
|
|
326
326
|
children: e.month
|
|
327
327
|
}),
|
|
328
328
|
/* @__PURE__ */ v("td", {
|
|
329
|
-
className: "px-4 py-3 text-sm text-right text-
|
|
329
|
+
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
330
330
|
children: D(e.revenue)
|
|
331
331
|
}),
|
|
332
332
|
/* @__PURE__ */ v("td", {
|
|
333
|
-
className: "px-4 py-3 text-sm text-right text-
|
|
333
|
+
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
334
334
|
children: e.orders.toLocaleString("en-IN")
|
|
335
335
|
}),
|
|
336
336
|
/* @__PURE__ */ v("td", {
|
|
337
|
-
className: "px-4 py-3 text-sm text-right text-
|
|
337
|
+
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
338
338
|
children: D(e.commission)
|
|
339
339
|
})
|
|
340
340
|
]
|
|
@@ -347,11 +347,11 @@ function b() {
|
|
|
347
347
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
348
348
|
children: [
|
|
349
349
|
/* @__PURE__ */ y("div", {
|
|
350
|
-
className: "rounded-lg border border-border bg-
|
|
350
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
351
351
|
children: [
|
|
352
352
|
/* @__PURE__ */ v(m, { className: "h-8 w-8 text-primary mx-auto mb-3" }),
|
|
353
353
|
/* @__PURE__ */ v("h4", {
|
|
354
|
-
className: "text-lg font-semibold text-
|
|
354
|
+
className: "text-lg font-semibold text-text-primary mb-2",
|
|
355
355
|
children: "Total Orders"
|
|
356
356
|
}),
|
|
357
357
|
/* @__PURE__ */ v("p", {
|
|
@@ -359,17 +359,17 @@ function b() {
|
|
|
359
359
|
children: T.totalOrders.toLocaleString("en-IN")
|
|
360
360
|
}),
|
|
361
361
|
/* @__PURE__ */ v("p", {
|
|
362
|
-
className: "text-sm text-
|
|
362
|
+
className: "text-sm text-text-secondary mt-1",
|
|
363
363
|
children: "All time orders"
|
|
364
364
|
})
|
|
365
365
|
]
|
|
366
366
|
}),
|
|
367
367
|
/* @__PURE__ */ y("div", {
|
|
368
|
-
className: "rounded-lg border border-border bg-
|
|
368
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
369
369
|
children: [
|
|
370
370
|
/* @__PURE__ */ v(c, { className: "h-8 w-8 text-green-600 dark:text-green-400 mx-auto mb-3" }),
|
|
371
371
|
/* @__PURE__ */ v("h4", {
|
|
372
|
-
className: "text-lg font-semibold text-
|
|
372
|
+
className: "text-lg font-semibold text-text-primary mb-2",
|
|
373
373
|
children: "Average Order Value"
|
|
374
374
|
}),
|
|
375
375
|
/* @__PURE__ */ v("p", {
|
|
@@ -377,17 +377,17 @@ function b() {
|
|
|
377
377
|
children: D(T.averageOrderValue)
|
|
378
378
|
}),
|
|
379
379
|
/* @__PURE__ */ v("p", {
|
|
380
|
-
className: "text-sm text-
|
|
380
|
+
className: "text-sm text-text-secondary mt-1",
|
|
381
381
|
children: "Per order average"
|
|
382
382
|
})
|
|
383
383
|
]
|
|
384
384
|
}),
|
|
385
385
|
/* @__PURE__ */ y("div", {
|
|
386
|
-
className: "rounded-lg border border-border bg-
|
|
386
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
387
387
|
children: [
|
|
388
388
|
/* @__PURE__ */ v(d, { className: "h-8 w-8 text-blue-600 dark:text-blue-400 mx-auto mb-3" }),
|
|
389
389
|
/* @__PURE__ */ v("h4", {
|
|
390
|
-
className: "text-lg font-semibold text-
|
|
390
|
+
className: "text-lg font-semibold text-text-primary mb-2",
|
|
391
391
|
children: "Total Payouts"
|
|
392
392
|
}),
|
|
393
393
|
/* @__PURE__ */ v("p", {
|
|
@@ -395,7 +395,7 @@ function b() {
|
|
|
395
395
|
children: D(T.payouts)
|
|
396
396
|
}),
|
|
397
397
|
/* @__PURE__ */ v("p", {
|
|
398
|
-
className: "text-sm text-
|
|
398
|
+
className: "text-sm text-text-secondary mt-1",
|
|
399
399
|
children: "Paid to cart owners"
|
|
400
400
|
})
|
|
401
401
|
]
|
|
@@ -409,7 +409,7 @@ function b() {
|
|
|
409
409
|
children: /* @__PURE__ */ v("div", {
|
|
410
410
|
className: "flex flex-col items-center justify-center py-20",
|
|
411
411
|
children: /* @__PURE__ */ v("p", {
|
|
412
|
-
className: "text-
|
|
412
|
+
className: "text-text-secondary",
|
|
413
413
|
children: "Unable to load financial data"
|
|
414
414
|
})
|
|
415
415
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured financial reports with date range filter, export button,\n * 4 MetricsGrid cards, top performing carts with medals, revenue by\n * category with progress bars, monthly trends table, 3 additional\n * cards, loading state, and back navigation.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n TrendingDown,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Star,\n ShoppingBag,\n PieChart,\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\ninterface FinancialMetrics {\n totalRevenue: number;\n monthlyRevenue: number;\n revenueGrowth: number;\n totalOrders: number;\n averageOrderValue: number;\n commission: number;\n payouts: number;\n pendingPayouts: number;\n topPerformingCarts: Array<{ id: string; name: string; revenue: number; orders: number }>;\n revenueByCategory: Array<{ category: string; amount: number; percentage: number }>;\n monthlyTrends: Array<{ month: string; revenue: number; orders: number; commission: number }>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useAdapterCloud();\n const [loading, setLoading] = useState(true);\n const [dateRange, setDateRange] = useState('30d');\n const [metrics, setMetrics] = useState<FinancialMetrics | null>(null);\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setMetrics({\n totalRevenue: 2850000,\n monthlyRevenue: 425000,\n revenueGrowth: 12.5,\n totalOrders: 15420,\n averageOrderValue: 185,\n commission: 142500,\n payouts: 280000,\n pendingPayouts: 45000,\n topPerformingCarts: [\n { id: '1', name: 'South Indian Express', revenue: 125000, orders: 850 },\n { id: '2', name: 'Pizza Corner', revenue: 98000, orders: 620 },\n { id: '3', name: 'Biryani House', revenue: 87000, orders: 580 },\n { id: '4', name: 'Healthy Bites', revenue: 76000, orders: 490 },\n { id: '5', name: 'Street Food Junction', revenue: 65000, orders: 420 },\n ],\n revenueByCategory: [\n { category: 'South Indian', amount: 750000, percentage: 26.3 },\n { category: 'North Indian', amount: 620000, percentage: 21.8 },\n { category: 'Chinese', amount: 485000, percentage: 17.0 },\n { category: 'Fast Food', amount: 425000, percentage: 14.9 },\n { category: 'Beverages', amount: 320000, percentage: 11.2 },\n { category: 'Desserts', amount: 250000, percentage: 8.8 },\n ],\n monthlyTrends: [\n { month: 'Jan', revenue: 380000, orders: 1200, commission: 19000 },\n { month: 'Feb', revenue: 420000, orders: 1350, commission: 21000 },\n { month: 'Mar', revenue: 395000, orders: 1280, commission: 19750 },\n { month: 'Apr', revenue: 440000, orders: 1420, commission: 22000 },\n { month: 'May', revenue: 465000, orders: 1580, commission: 23250 },\n { month: 'Jun', revenue: 425000, orders: 1400, commission: 21250 },\n ],\n });\n setLoading(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const handleExportReport = () => {\n alert('Financial report export initiated');\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-yellow-500\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-gray-400\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-amber-700\" />;\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-xs font-bold text-muted-foreground\">\n {index + 1}\n </span>\n );\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Loading financial data...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-muted-foreground mb-4\" />\n <p className=\"text-muted-foreground\">Loading financial data...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!metrics) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <p className=\"text-muted-foreground\">Unable to load financial data</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, commissions, payouts, and financial trends\"\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border bg-card py-2 px-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"7d\">Last 7 days</option>\n <option value=\"30d\">Last 30 days</option>\n <option value=\"90d\">Last 3 months</option>\n <option value=\"1y\">Last year</option>\n </select>\n <button\n type=\"button\"\n onClick={handleExportReport}\n className=\"flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n <Download className=\"h-4 w-4\" /> Export Report\n </button>\n </div>\n }\n >\n {/* 4 Key Metrics */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(metrics.totalRevenue)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${metrics.revenueGrowth}% vs last period`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(metrics.monthlyRevenue)}\n label=\"Monthly Revenue\"\n trendValue=\"Current month\"\n />\n <MetricsCard\n icon={<PieChart className=\"h-5 w-5\" />}\n value={fmtCur(metrics.commission)}\n label=\"Commission Earned\"\n trendValue=\"Platform commission\"\n />\n <MetricsCard\n icon={<TrendingDown className=\"h-5 w-5\" />}\n value={fmtCur(metrics.pendingPayouts)}\n label=\"Pending Payouts\"\n trendValue=\"Amount pending\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* Top Performing Carts */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <ShoppingCart className=\"h-5 w-5 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold text-foreground\">Top Performing Carts</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.topPerformingCarts.map((cart, index) => (\n <div\n key={cart.id}\n className=\"flex items-center justify-between rounded-lg bg-muted/50 p-3\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(index)}\n <div>\n <p className=\"text-sm font-medium text-foreground\">{cart.name}</p>\n <p className=\"text-xs text-muted-foreground\">{cart.orders} orders</p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-foreground\">{fmtCur(cart.revenue)}</p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Revenue by Category */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <BarChart3 className=\"h-5 w-5 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold text-foreground\">Revenue by Category</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.revenueByCategory.map((category) => (\n <div key={category.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-foreground\">{category.category}</span>\n <span className=\"text-sm text-muted-foreground\">{category.percentage}%</span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"text-right mt-1\">\n <span className=\"text-sm font-semibold text-foreground\">\n {fmtCur(category.amount)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Monthly Trends Table */}\n <div className=\"rounded-lg border border-border bg-card p-6 mb-8\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Calendar className=\"h-5 w-5 text-muted-foreground\" />\n <h3 className=\"text-lg font-semibold text-foreground\">Monthly Trends</h3>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Month\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Commission\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {metrics.monthlyTrends.map((trend) => (\n <tr key={trend.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-foreground\">{trend.month}</td>\n <td className=\"px-4 py-3 text-sm text-right text-foreground\">\n {fmtCur(trend.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-foreground\">\n {trend.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-foreground\">\n {fmtCur(trend.commission)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* 3 Additional Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border bg-card p-6 text-center\">\n <ShoppingBag className=\"h-8 w-8 text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-foreground mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-primary\">\n {metrics.totalOrders.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">All time orders</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-6 text-center\">\n <BarChart3 className=\"h-8 w-8 text-green-600 dark:text-green-400 mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-foreground mb-2\">Average Order Value</h4>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(metrics.averageOrderValue)}\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">Per order average</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-6 text-center\">\n <IndianRupee className=\"h-8 w-8 text-blue-600 dark:text-blue-400 mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-foreground mb-2\">Total Payouts</h4>\n <p className=\"text-2xl font-bold text-blue-600 dark:text-blue-400\">\n {fmtCur(metrics.payouts)}\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">Paid to cart owners</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module adaptercloud/pages/admin\n *\n * Full-featured financial reports with date range filter, export button,\n * 4 MetricsGrid cards, top performing carts with medals, revenue by\n * category with progress bars, monthly trends table, 3 additional\n * cards, loading state, and back navigation.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n TrendingDown,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Star,\n ShoppingBag,\n PieChart,\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\ninterface FinancialMetrics {\n totalRevenue: number;\n monthlyRevenue: number;\n revenueGrowth: number;\n totalOrders: number;\n averageOrderValue: number;\n commission: number;\n payouts: number;\n pendingPayouts: number;\n topPerformingCarts: Array<{ id: string; name: string; revenue: number; orders: number }>;\n revenueByCategory: Array<{ category: string; amount: number; percentage: number }>;\n monthlyTrends: Array<{ month: string; revenue: number; orders: number; commission: number }>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useAdapterCloud();\n const [loading, setLoading] = useState(true);\n const [dateRange, setDateRange] = useState('30d');\n const [metrics, setMetrics] = useState<FinancialMetrics | null>(null);\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setMetrics({\n totalRevenue: 2850000,\n monthlyRevenue: 425000,\n revenueGrowth: 12.5,\n totalOrders: 15420,\n averageOrderValue: 185,\n commission: 142500,\n payouts: 280000,\n pendingPayouts: 45000,\n topPerformingCarts: [\n { id: '1', name: 'South Indian Express', revenue: 125000, orders: 850 },\n { id: '2', name: 'Pizza Corner', revenue: 98000, orders: 620 },\n { id: '3', name: 'Biryani House', revenue: 87000, orders: 580 },\n { id: '4', name: 'Healthy Bites', revenue: 76000, orders: 490 },\n { id: '5', name: 'Street Food Junction', revenue: 65000, orders: 420 },\n ],\n revenueByCategory: [\n { category: 'South Indian', amount: 750000, percentage: 26.3 },\n { category: 'North Indian', amount: 620000, percentage: 21.8 },\n { category: 'Chinese', amount: 485000, percentage: 17.0 },\n { category: 'Fast Food', amount: 425000, percentage: 14.9 },\n { category: 'Beverages', amount: 320000, percentage: 11.2 },\n { category: 'Desserts', amount: 250000, percentage: 8.8 },\n ],\n monthlyTrends: [\n { month: 'Jan', revenue: 380000, orders: 1200, commission: 19000 },\n { month: 'Feb', revenue: 420000, orders: 1350, commission: 21000 },\n { month: 'Mar', revenue: 395000, orders: 1280, commission: 19750 },\n { month: 'Apr', revenue: 440000, orders: 1420, commission: 22000 },\n { month: 'May', revenue: 465000, orders: 1580, commission: 23250 },\n { month: 'Jun', revenue: 425000, orders: 1400, commission: 21250 },\n ],\n });\n setLoading(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const handleExportReport = () => {\n alert('Financial report export initiated');\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-yellow-500\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-gray-400\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-amber-700\" />;\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary\">\n {index + 1}\n </span>\n );\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Loading financial data...\">\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 financial data...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!metrics) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <p className=\"text-text-secondary\">Unable to load financial data</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, commissions, payouts, and financial trends\"\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3\">\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\" /> Back\n </button>\n <select\n value={dateRange}\n onChange={(e) => setDateRange(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=\"7d\">Last 7 days</option>\n <option value=\"30d\">Last 30 days</option>\n <option value=\"90d\">Last 3 months</option>\n <option value=\"1y\">Last year</option>\n </select>\n <button\n type=\"button\"\n onClick={handleExportReport}\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 <Download className=\"h-4 w-4\" /> Export Report\n </button>\n </div>\n }\n >\n {/* 4 Key Metrics */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(metrics.totalRevenue)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${metrics.revenueGrowth}% vs last period`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(metrics.monthlyRevenue)}\n label=\"Monthly Revenue\"\n trendValue=\"Current month\"\n />\n <MetricsCard\n icon={<PieChart className=\"h-5 w-5\" />}\n value={fmtCur(metrics.commission)}\n label=\"Commission Earned\"\n trendValue=\"Platform commission\"\n />\n <MetricsCard\n icon={<TrendingDown className=\"h-5 w-5\" />}\n value={fmtCur(metrics.pendingPayouts)}\n label=\"Pending Payouts\"\n trendValue=\"Amount pending\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* Top Performing Carts */}\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 <ShoppingCart className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Top Performing Carts</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.topPerformingCarts.map((cart, index) => (\n <div\n key={cart.id}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(index)}\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.name}</p>\n <p className=\"text-xs text-text-secondary\">{cart.orders} orders</p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-text-primary\">{fmtCur(cart.revenue)}</p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Revenue by Category */}\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 <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Revenue by Category</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.revenueByCategory.map((category) => (\n <div key={category.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className=\"bg-action-primary-bg h-2 rounded-full transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"text-right mt-1\">\n <span className=\"text-sm font-semibold text-text-primary\">\n {fmtCur(category.amount)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Monthly Trends Table */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 mb-8\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Monthly Trends</h3>\n </div>\n <div className=\"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 Month\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Commission\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {metrics.monthlyTrends.map((trend) => (\n <tr key={trend.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">{trend.month}</td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(trend.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {trend.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(trend.commission)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* 3 Additional Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <ShoppingBag className=\"h-8 w-8 text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-primary\">\n {metrics.totalOrders.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">All time orders</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <BarChart3 className=\"h-8 w-8 text-green-600 dark:text-green-400 mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Average Order Value</h4>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {fmtCur(metrics.averageOrderValue)}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Per order average</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <IndianRupee className=\"h-8 w-8 text-blue-600 dark:text-blue-400 mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Total Payouts</h4>\n <p className=\"text-2xl font-bold text-blue-600 dark:text-blue-400\">\n {fmtCur(metrics.payouts)}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Paid to cart owners</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|