@burdenoff/microfe-coolandlovely 2026.624.1 → 2026.625.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/coolandlovely/components/EmptyState.js +17 -21
- package/dist/coolandlovely/components/EmptyState.js.map +1 -1
- package/dist/coolandlovely/components/InvestmentCard.js +25 -23
- package/dist/coolandlovely/components/InvestmentCard.js.map +1 -1
- package/dist/coolandlovely/components/MetricsCard.js +18 -12
- package/dist/coolandlovely/components/MetricsCard.js.map +1 -1
- package/dist/coolandlovely/components/PageLayout.js +38 -19
- package/dist/coolandlovely/components/PageLayout.js.map +1 -1
- package/dist/coolandlovely/components/RatingDisplay.js +3 -3
- package/dist/coolandlovely/components/RatingDisplay.js.map +1 -1
- package/dist/coolandlovely/components/StatusBadge.js +36 -16
- package/dist/coolandlovely/components/StatusBadge.js.map +1 -1
- package/dist/coolandlovely/pages/HomePage.js +219 -204
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +98 -92
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminDashboard.js +111 -77
- package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +49 -43
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +234 -229
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js +67 -62
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/CartManagementPage.js +291 -286
- package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/UserManagementPage.js +287 -282
- package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +108 -100
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +260 -255
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +596 -554
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +187 -182
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +229 -221
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +675 -674
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +525 -524
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +264 -266
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/HelpSupportPage.js +137 -137
- package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js +81 -75
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
- package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CartDetailPage.js +189 -186
- package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +222 -211
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CheckoutPage.js +219 -222
- package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js +446 -404
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/FavoritesPage.js +94 -84
- package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +121 -112
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +90 -84
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/ReviewsPage.js +99 -89
- package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +74 -68
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +317 -279
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +249 -243
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +87 -81
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js +359 -323
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +115 -109
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +179 -146
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +397 -392
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +364 -327
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js +580 -543
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +114 -109
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +115 -110
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +100 -95
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminDashboard.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminDashboard.tsx"],"sourcesContent":["/**\n * Admin Dashboard Page\n * @module coolandlovely/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 { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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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"}
|
|
1
|
+
{"version":3,"file":"AdminDashboard.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminDashboard.tsx"],"sourcesContent":["/**\n * Admin Dashboard Page\n * @module coolandlovely/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 { EmphasisPanel, PagePurpose, NextSteps } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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-accent-blue',\n cart_approval: 'text-accent-purple',\n investment: 'text-status-success-text',\n order: 'text-status-success-text',\n dispute: 'text-status-warning-text',\n };\n return colorMap[type] ?? 'text-text-secondary';\n };\n\n const getStatusBadge = (status: RecentActivity['status']) => {\n const config = {\n completed: 'bg-status-success-bg-subtle/20 text-status-success-text',\n pending: 'bg-status-warning-bg-subtle/20 text-status-warning-text',\n failed: 'bg-status-error-bg-subtle/20 text-status-error-text',\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-status-error-border/30 bg-status-error-bg-subtle/10 px-3 py-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n <span className=\"text-sm font-medium text-status-error-text\">\n {metrics.pendingApprovals} pending approvals\n </span>\n </div>\n ) : undefined\n }\n >\n <PagePurpose className=\"mb-6\" icon={<BarChart3 className=\"h-4 w-4\" />}>\n The platform-wide command centre. Keep the marketplace healthy: approve\n new carts, watch users, orders and revenue across every business, and jump\n straight to the area that needs attention — so issues get caught before\n they reach customers.\n </PagePurpose>\n\n <NextSteps\n className=\"mb-6\"\n storageKey=\"coolandlovely-admin-dashboard\"\n steps={[\n {\n id: 'approvals',\n label: 'Clear pending cart approvals',\n description: 'Review and approve carts waiting to go live.',\n icon: <Store className=\"h-4 w-4\" />,\n onClick: () => navigateTo('/admin/carts'),\n done: !metrics?.pendingApprovals,\n },\n {\n id: 'users',\n label: 'Check user accounts',\n description: 'Manage members, roles and flagged accounts.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigateTo('/admin/users'),\n },\n {\n id: 'analytics',\n label: 'Review platform analytics',\n description: 'Track growth, revenue and order trends platform-wide.',\n icon: <BarChart3 className=\"h-4 w-4\" />,\n onClick: () => navigateTo('/admin/analytics'),\n },\n ]}\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-status-error-bg-subtle hover:bg-status-error-bg-subtle 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 — primary emphasis zone */}\n {metrics && (\n <EmphasisPanel className=\"mb-8 p-5\">\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-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-xs text-text-secondary\">Active Users (24h)</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {metrics.activeUsers.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-xs text-text-secondary\">Pending Approvals</p>\n <p className=\"text-xl font-bold text-status-error-text\">\n {metrics.pendingApprovals}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-xs text-text-secondary\">Total Investments</p>\n <p className=\"text-xl font-bold text-accent-blue\">\n {metrics.totalInvestments.toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-xs text-text-secondary\">Platform Commission</p>\n <p className=\"text-xl font-bold text-accent-purple\">\n ₹{(metrics.platformCommission / 1000).toFixed(0)}K\n </p>\n </div>\n </div>\n </EmphasisPanel>\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-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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-accent-blue\">\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-status-success-text\">\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-status-warning-text\">\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-accent-purple\">\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-status-success-text\">\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-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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-status-success-bg-subtle/20 px-3 py-1 text-xs font-medium text-status-success-text\">\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-status-success-bg-subtle/20 px-3 py-1 text-xs font-medium text-status-success-text\">\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-status-success-bg-subtle/20 px-3 py-1 text-xs font-medium text-status-success-text\">\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-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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-seam bg-bg-surface p-4 sm:p-6 text-left transition-all bg-gloss-card shadow-pop',\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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"}
|
|
@@ -5,13 +5,14 @@ import { formatCurrency as r } from "../../utils/formatters.js";
|
|
|
5
5
|
import { useEffect as i, useState as a } from "react";
|
|
6
6
|
import { ArrowLeft as o, Award as s, BarChart3 as c, Calendar as l, Download as u, IndianRupee as d, Loader2 as f, PieChart as p, ShoppingBag as m, ShoppingCart as h, TrendingDown as g, TrendingUp as _ } from "lucide-react";
|
|
7
7
|
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
8
|
+
import { EmphasisPanel as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
|
|
8
9
|
//#region src/coolandlovely/pages/admin/AdminFinancialPage.tsx
|
|
9
|
-
function
|
|
10
|
-
let { navigateTo:
|
|
10
|
+
function S() {
|
|
11
|
+
let { navigateTo: S } = e(), [C, w] = a(!0), [T, E] = a("30d"), [D, O] = a(null);
|
|
11
12
|
i(() => {
|
|
12
|
-
|
|
13
|
+
w(!0);
|
|
13
14
|
let e = setTimeout(() => {
|
|
14
|
-
|
|
15
|
+
O({
|
|
15
16
|
totalRevenue: 285e4,
|
|
16
17
|
monthlyRevenue: 425e3,
|
|
17
18
|
revenueGrowth: 12.5,
|
|
@@ -122,17 +123,17 @@ function b() {
|
|
|
122
123
|
commission: 21250
|
|
123
124
|
}
|
|
124
125
|
]
|
|
125
|
-
}),
|
|
126
|
+
}), w(!1);
|
|
126
127
|
}, 1e3);
|
|
127
128
|
return () => clearTimeout(e);
|
|
128
|
-
}, [
|
|
129
|
-
let
|
|
129
|
+
}, [T]);
|
|
130
|
+
let k = (e) => r(e, { minimumFractionDigits: 0 }), A = () => {
|
|
130
131
|
alert("Financial report export initiated");
|
|
131
|
-
},
|
|
132
|
+
}, j = (e) => e === 0 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-status-warning-text" }) : e === 1 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-text-secondary" }) : e === 2 ? /* @__PURE__ */ v(s, { className: "h-5 w-5 text-status-warning-text" }) : /* @__PURE__ */ v("span", {
|
|
132
133
|
className: "flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary",
|
|
133
134
|
children: e + 1
|
|
134
135
|
});
|
|
135
|
-
return
|
|
136
|
+
return C ? /* @__PURE__ */ v(t, {
|
|
136
137
|
title: "Financial Reports",
|
|
137
138
|
description: "Loading financial data...",
|
|
138
139
|
children: /* @__PURE__ */ y("div", {
|
|
@@ -142,7 +143,7 @@ function b() {
|
|
|
142
143
|
children: "Loading financial data..."
|
|
143
144
|
})]
|
|
144
145
|
})
|
|
145
|
-
}) :
|
|
146
|
+
}) : D ? /* @__PURE__ */ y(t, {
|
|
146
147
|
title: "Financial Reports",
|
|
147
148
|
description: "Revenue, commissions, payouts, and financial trends",
|
|
148
149
|
actions: /* @__PURE__ */ y("div", {
|
|
@@ -150,13 +151,13 @@ function b() {
|
|
|
150
151
|
children: [
|
|
151
152
|
/* @__PURE__ */ y("button", {
|
|
152
153
|
type: "button",
|
|
153
|
-
onClick: () =>
|
|
154
|
+
onClick: () => S("/admin"),
|
|
154
155
|
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
156
|
children: [/* @__PURE__ */ v(o, { className: "h-4 w-4" }), " Back"]
|
|
156
157
|
}),
|
|
157
158
|
/* @__PURE__ */ y("select", {
|
|
158
|
-
value:
|
|
159
|
-
onChange: (e) =>
|
|
159
|
+
value: T,
|
|
160
|
+
onChange: (e) => E(e.target.value),
|
|
160
161
|
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
162
|
children: [
|
|
162
163
|
/* @__PURE__ */ v("option", {
|
|
@@ -179,38 +180,43 @@ function b() {
|
|
|
179
180
|
}),
|
|
180
181
|
/* @__PURE__ */ y("button", {
|
|
181
182
|
type: "button",
|
|
182
|
-
onClick:
|
|
183
|
+
onClick: A,
|
|
183
184
|
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
185
|
children: [/* @__PURE__ */ v(u, { className: "h-4 w-4" }), " Export Report"]
|
|
185
186
|
})
|
|
186
187
|
]
|
|
187
188
|
}),
|
|
188
189
|
children: [
|
|
189
|
-
/* @__PURE__ */
|
|
190
|
-
className: "
|
|
190
|
+
/* @__PURE__ */ v(x, {
|
|
191
|
+
className: "mb-6",
|
|
192
|
+
icon: /* @__PURE__ */ v(d, { className: "h-4 w-4" }),
|
|
193
|
+
children: "The money view of the platform. Track total and monthly revenue, commission earned and payouts owed to carts, see which businesses drive the most value, and export financial reports for any period — keeping the marketplace's books clear and payouts on time."
|
|
194
|
+
}),
|
|
195
|
+
/* @__PURE__ */ y(b, {
|
|
196
|
+
className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8 p-4",
|
|
191
197
|
children: [
|
|
192
198
|
/* @__PURE__ */ v(n, {
|
|
193
199
|
icon: /* @__PURE__ */ v(d, { className: "h-5 w-5" }),
|
|
194
|
-
value: D
|
|
200
|
+
value: k(D.totalRevenue),
|
|
195
201
|
label: "Total Revenue",
|
|
196
202
|
trend: "up",
|
|
197
|
-
trendValue: `+${
|
|
203
|
+
trendValue: `+${D.revenueGrowth}% vs last period`
|
|
198
204
|
}),
|
|
199
205
|
/* @__PURE__ */ v(n, {
|
|
200
206
|
icon: /* @__PURE__ */ v(_, { className: "h-5 w-5" }),
|
|
201
|
-
value: D
|
|
207
|
+
value: k(D.monthlyRevenue),
|
|
202
208
|
label: "Monthly Revenue",
|
|
203
209
|
trendValue: "Current month"
|
|
204
210
|
}),
|
|
205
211
|
/* @__PURE__ */ v(n, {
|
|
206
212
|
icon: /* @__PURE__ */ v(p, { className: "h-5 w-5" }),
|
|
207
|
-
value: D
|
|
213
|
+
value: k(D.commission),
|
|
208
214
|
label: "Commission Earned",
|
|
209
215
|
trendValue: "Platform commission"
|
|
210
216
|
}),
|
|
211
217
|
/* @__PURE__ */ v(n, {
|
|
212
218
|
icon: /* @__PURE__ */ v(g, { className: "h-5 w-5" }),
|
|
213
|
-
value: D
|
|
219
|
+
value: k(D.pendingPayouts),
|
|
214
220
|
label: "Pending Payouts",
|
|
215
221
|
trendValue: "Amount pending"
|
|
216
222
|
})
|
|
@@ -219,7 +225,7 @@ function b() {
|
|
|
219
225
|
/* @__PURE__ */ y("div", {
|
|
220
226
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8",
|
|
221
227
|
children: [/* @__PURE__ */ y("div", {
|
|
222
|
-
className: "rounded-lg border border-border-
|
|
228
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
|
|
223
229
|
children: [/* @__PURE__ */ y("div", {
|
|
224
230
|
className: "flex items-center gap-2 mb-4",
|
|
225
231
|
children: [/* @__PURE__ */ v(h, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
@@ -228,11 +234,11 @@ function b() {
|
|
|
228
234
|
})]
|
|
229
235
|
}), /* @__PURE__ */ v("div", {
|
|
230
236
|
className: "space-y-3",
|
|
231
|
-
children:
|
|
237
|
+
children: D.topPerformingCarts.map((e, t) => /* @__PURE__ */ y("div", {
|
|
232
238
|
className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
|
|
233
239
|
children: [/* @__PURE__ */ y("div", {
|
|
234
240
|
className: "flex items-center gap-3",
|
|
235
|
-
children: [
|
|
241
|
+
children: [j(t), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
236
242
|
className: "text-sm font-medium text-text-primary",
|
|
237
243
|
children: e.name
|
|
238
244
|
}), /* @__PURE__ */ y("p", {
|
|
@@ -241,12 +247,12 @@ function b() {
|
|
|
241
247
|
})] })]
|
|
242
248
|
}), /* @__PURE__ */ v("p", {
|
|
243
249
|
className: "text-sm font-semibold text-text-primary",
|
|
244
|
-
children:
|
|
250
|
+
children: k(e.revenue)
|
|
245
251
|
})]
|
|
246
252
|
}, e.id))
|
|
247
253
|
})]
|
|
248
254
|
}), /* @__PURE__ */ y("div", {
|
|
249
|
-
className: "rounded-lg border border-border-
|
|
255
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
|
|
250
256
|
children: [/* @__PURE__ */ y("div", {
|
|
251
257
|
className: "flex items-center gap-2 mb-4",
|
|
252
258
|
children: [/* @__PURE__ */ v(c, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
@@ -255,7 +261,7 @@ function b() {
|
|
|
255
261
|
})]
|
|
256
262
|
}), /* @__PURE__ */ v("div", {
|
|
257
263
|
className: "space-y-3",
|
|
258
|
-
children:
|
|
264
|
+
children: D.revenueByCategory.map((e) => /* @__PURE__ */ y("div", { children: [
|
|
259
265
|
/* @__PURE__ */ y("div", {
|
|
260
266
|
className: "flex items-center justify-between mb-1",
|
|
261
267
|
children: [/* @__PURE__ */ v("span", {
|
|
@@ -277,7 +283,7 @@ function b() {
|
|
|
277
283
|
className: "text-right mt-1",
|
|
278
284
|
children: /* @__PURE__ */ v("span", {
|
|
279
285
|
className: "text-sm font-semibold text-text-primary",
|
|
280
|
-
children:
|
|
286
|
+
children: k(e.amount)
|
|
281
287
|
})
|
|
282
288
|
})
|
|
283
289
|
] }, e.category))
|
|
@@ -285,7 +291,7 @@ function b() {
|
|
|
285
291
|
})]
|
|
286
292
|
}),
|
|
287
293
|
/* @__PURE__ */ y("div", {
|
|
288
|
-
className: "rounded-lg border border-border-
|
|
294
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 mb-8 bg-gloss-card shadow-pop",
|
|
289
295
|
children: [/* @__PURE__ */ y("div", {
|
|
290
296
|
className: "flex items-center gap-2 mb-4",
|
|
291
297
|
children: [/* @__PURE__ */ v(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v("h3", {
|
|
@@ -318,7 +324,7 @@ function b() {
|
|
|
318
324
|
]
|
|
319
325
|
}) }), /* @__PURE__ */ v("tbody", {
|
|
320
326
|
className: "divide-y divide-border",
|
|
321
|
-
children:
|
|
327
|
+
children: D.monthlyTrends.map((e) => /* @__PURE__ */ y("tr", {
|
|
322
328
|
className: "hover:bg-accent/50 transition-colors",
|
|
323
329
|
children: [
|
|
324
330
|
/* @__PURE__ */ v("td", {
|
|
@@ -327,7 +333,7 @@ function b() {
|
|
|
327
333
|
}),
|
|
328
334
|
/* @__PURE__ */ v("td", {
|
|
329
335
|
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
330
|
-
children:
|
|
336
|
+
children: k(e.revenue)
|
|
331
337
|
}),
|
|
332
338
|
/* @__PURE__ */ v("td", {
|
|
333
339
|
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
@@ -335,7 +341,7 @@ function b() {
|
|
|
335
341
|
}),
|
|
336
342
|
/* @__PURE__ */ v("td", {
|
|
337
343
|
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
338
|
-
children:
|
|
344
|
+
children: k(e.commission)
|
|
339
345
|
})
|
|
340
346
|
]
|
|
341
347
|
}, e.month))
|
|
@@ -347,7 +353,7 @@ function b() {
|
|
|
347
353
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
348
354
|
children: [
|
|
349
355
|
/* @__PURE__ */ y("div", {
|
|
350
|
-
className: "rounded-lg border border-border-
|
|
356
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop",
|
|
351
357
|
children: [
|
|
352
358
|
/* @__PURE__ */ v(m, { className: "h-8 w-8 text-primary mx-auto mb-3" }),
|
|
353
359
|
/* @__PURE__ */ v("h4", {
|
|
@@ -356,7 +362,7 @@ function b() {
|
|
|
356
362
|
}),
|
|
357
363
|
/* @__PURE__ */ v("p", {
|
|
358
364
|
className: "text-2xl font-bold text-primary",
|
|
359
|
-
children:
|
|
365
|
+
children: D.totalOrders.toLocaleString("en-IN")
|
|
360
366
|
}),
|
|
361
367
|
/* @__PURE__ */ v("p", {
|
|
362
368
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -365,16 +371,16 @@ function b() {
|
|
|
365
371
|
]
|
|
366
372
|
}),
|
|
367
373
|
/* @__PURE__ */ y("div", {
|
|
368
|
-
className: "rounded-lg border border-border-
|
|
374
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop",
|
|
369
375
|
children: [
|
|
370
|
-
/* @__PURE__ */ v(c, { className: "h-8 w-8 text-
|
|
376
|
+
/* @__PURE__ */ v(c, { className: "h-8 w-8 text-status-success-text mx-auto mb-3" }),
|
|
371
377
|
/* @__PURE__ */ v("h4", {
|
|
372
378
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
373
379
|
children: "Average Order Value"
|
|
374
380
|
}),
|
|
375
381
|
/* @__PURE__ */ v("p", {
|
|
376
|
-
className: "text-2xl font-bold text-
|
|
377
|
-
children: D
|
|
382
|
+
className: "text-2xl font-bold text-status-success-text",
|
|
383
|
+
children: k(D.averageOrderValue)
|
|
378
384
|
}),
|
|
379
385
|
/* @__PURE__ */ v("p", {
|
|
380
386
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -383,16 +389,16 @@ function b() {
|
|
|
383
389
|
]
|
|
384
390
|
}),
|
|
385
391
|
/* @__PURE__ */ y("div", {
|
|
386
|
-
className: "rounded-lg border border-border-
|
|
392
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop",
|
|
387
393
|
children: [
|
|
388
|
-
/* @__PURE__ */ v(d, { className: "h-8 w-8 text-
|
|
394
|
+
/* @__PURE__ */ v(d, { className: "h-8 w-8 text-accent-blue mx-auto mb-3" }),
|
|
389
395
|
/* @__PURE__ */ v("h4", {
|
|
390
396
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
391
397
|
children: "Total Payouts"
|
|
392
398
|
}),
|
|
393
399
|
/* @__PURE__ */ v("p", {
|
|
394
|
-
className: "text-2xl font-bold text-
|
|
395
|
-
children: D
|
|
400
|
+
className: "text-2xl font-bold text-accent-blue",
|
|
401
|
+
children: k(D.payouts)
|
|
396
402
|
}),
|
|
397
403
|
/* @__PURE__ */ v("p", {
|
|
398
404
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -416,6 +422,6 @@ function b() {
|
|
|
416
422
|
});
|
|
417
423
|
}
|
|
418
424
|
//#endregion
|
|
419
|
-
export {
|
|
425
|
+
export { S as AdminFinancialPage };
|
|
420
426
|
|
|
421
427
|
//# sourceMappingURL=AdminFinancialPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module coolandlovely/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 { useCoolAndLovely } from '../../context/CoolAndLovelyContext';\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 } = useCoolAndLovely();\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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"}
|
|
1
|
+
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module coolandlovely/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 { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\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 } = useCoolAndLovely();\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-status-warning-text\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-text-secondary\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\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 <PagePurpose className=\"mb-6\" icon={<IndianRupee className=\"h-4 w-4\" />}>\n The money view of the platform. Track total and monthly revenue,\n commission earned and payouts owed to carts, see which businesses drive the\n most value, and export financial reports for any period — keeping the\n marketplace's books clear and payouts on time.\n </PagePurpose>\n\n {/* 4 Key Metrics — primary emphasis zone */}\n <EmphasisPanel className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8 p-4\">\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 </EmphasisPanel>\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-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\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-seam bg-bg-surface p-6 mb-8 bg-gloss-card shadow-pop\">\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-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop\">\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-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop\">\n <BarChart3 className=\"h-8 w-8 text-status-success-text 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-status-success-text\">\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-seam bg-bg-surface p-6 text-center bg-gloss-card shadow-pop\">\n <IndianRupee className=\"h-8 w-8 text-accent-blue 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-accent-blue\">\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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"}
|