@burdenoff/microfe-kadaikodi 2026.704.4 → 2026.710.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/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +23527 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +57851 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -1
- package/dist/kadaikodi/KadaikodiRoot.d.ts +5 -0
- package/dist/kadaikodi/KadaikodiRoot.d.ts.map +1 -0
- package/dist/kadaikodi/KadaikodiRoutes.d.ts +4 -0
- package/dist/kadaikodi/KadaikodiRoutes.d.ts.map +1 -0
- package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
- package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
- package/dist/kadaikodi/components/CartCard.d.ts +18 -0
- package/dist/kadaikodi/components/CartCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/EmptyState.d.ts +17 -0
- package/dist/kadaikodi/components/EmptyState.d.ts.map +1 -0
- package/dist/kadaikodi/components/InvestmentCard.d.ts +18 -0
- package/dist/kadaikodi/components/InvestmentCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/MetricsCard.d.ts +16 -0
- package/dist/kadaikodi/components/MetricsCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/OrderCard.d.ts +18 -0
- package/dist/kadaikodi/components/OrderCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/PageLayout.d.ts +12 -0
- package/dist/kadaikodi/components/PageLayout.d.ts.map +1 -0
- package/dist/kadaikodi/components/RatingDisplay.d.ts +12 -0
- package/dist/kadaikodi/components/RatingDisplay.d.ts.map +1 -0
- package/dist/kadaikodi/components/StatusBadge.d.ts +9 -0
- package/dist/kadaikodi/components/StatusBadge.d.ts.map +1 -0
- package/dist/kadaikodi/components/index.d.ts +13 -0
- package/dist/kadaikodi/components/index.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/AllocationBar.d.ts +21 -0
- package/dist/kadaikodi/components/viz/AllocationBar.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
- package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
- package/dist/kadaikodi/components/viz/AreaChart.d.ts +18 -0
- package/dist/kadaikodi/components/viz/AreaChart.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
- package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/AvatarStack.d.ts +13 -0
- package/dist/kadaikodi/components/viz/AvatarStack.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
- package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
- package/dist/kadaikodi/components/viz/BarChart.d.ts +17 -0
- package/dist/kadaikodi/components/viz/BarChart.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/BarChart.js +83 -0
- package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/CertificateCard.d.ts +14 -0
- package/dist/kadaikodi/components/viz/CertificateCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
- package/dist/kadaikodi/components/viz/DonutChart.d.ts +20 -0
- package/dist/kadaikodi/components/viz/DonutChart.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
- package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.d.ts +17 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
- package/dist/kadaikodi/components/viz/Heatmap.d.ts +26 -0
- package/dist/kadaikodi/components/viz/Heatmap.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.d.ts +17 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
- package/dist/kadaikodi/components/viz/LineChart.d.ts +20 -0
- package/dist/kadaikodi/components/viz/LineChart.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/LineChart.js +4 -0
- package/dist/kadaikodi/components/viz/OrgTree.d.ts +14 -0
- package/dist/kadaikodi/components/viz/OrgTree.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
- package/dist/kadaikodi/components/viz/PathSteps.d.ts +17 -0
- package/dist/kadaikodi/components/viz/PathSteps.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
- package/dist/kadaikodi/components/viz/ProgressRing.d.ts +20 -0
- package/dist/kadaikodi/components/viz/ProgressRing.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
- package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
- package/dist/kadaikodi/components/viz/RatingStars.d.ts +14 -0
- package/dist/kadaikodi/components/viz/RatingStars.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
- package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.d.ts +26 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
- package/dist/kadaikodi/components/viz/SkillBar.d.ts +17 -0
- package/dist/kadaikodi/components/viz/SkillBar.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
- package/dist/kadaikodi/components/viz/Sparkline.d.ts +16 -0
- package/dist/kadaikodi/components/viz/Sparkline.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
- package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
- package/dist/kadaikodi/components/viz/StatCard.d.ts +22 -0
- package/dist/kadaikodi/components/viz/StatCard.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/StatCard.js +60 -0
- package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
- package/dist/kadaikodi/components/viz/StepProgress.d.ts +17 -0
- package/dist/kadaikodi/components/viz/StepProgress.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
- package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
- package/dist/kadaikodi/components/viz/Timeline.d.ts +21 -0
- package/dist/kadaikodi/components/viz/Timeline.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/Timeline.js +66 -0
- package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
- package/dist/kadaikodi/components/viz/index.d.ts +35 -0
- package/dist/kadaikodi/components/viz/index.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/index.js +23 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.d.ts +15 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.d.ts +44 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.d.ts +27 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/format.d.ts +10 -0
- package/dist/kadaikodi/components/viz/lib/format.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/format.js +21 -0
- package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/geometry.d.ts +41 -0
- package/dist/kadaikodi/components/viz/lib/geometry.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
- package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/hooks.d.ts +18 -0
- package/dist/kadaikodi/components/viz/lib/hooks.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
- package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/palette.d.ts +31 -0
- package/dist/kadaikodi/components/viz/lib/palette.d.ts.map +1 -0
- package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
- package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/types.d.ts +27 -0
- package/dist/kadaikodi/components/viz/lib/types.d.ts.map +1 -0
- package/dist/kadaikodi/context/KadaikodiContext.d.ts +16 -0
- package/dist/kadaikodi/context/KadaikodiContext.d.ts.map +1 -0
- package/dist/kadaikodi/context/index.d.ts +6 -0
- package/dist/kadaikodi/context/index.d.ts.map +1 -0
- package/dist/kadaikodi/hooks/index.d.ts +2 -0
- package/dist/kadaikodi/hooks/index.d.ts.map +1 -0
- package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts +169 -0
- package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts.map +1 -0
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -10
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/index.d.ts +11 -0
- package/dist/kadaikodi/index.d.ts.map +1 -0
- package/dist/kadaikodi/pages/HomePage.d.ts +14 -0
- package/dist/kadaikodi/pages/HomePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/HomePage.js +373 -631
- package/dist/kadaikodi/pages/HomePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts +13 -0
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.d.ts +13 -0
- package/dist/kadaikodi/pages/admin/AdminDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.d.ts +12 -0
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.d.ts +11 -0
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.d.ts +11 -0
- package/dist/kadaikodi/pages/admin/AdminProfilePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.d.ts +10 -0
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts +13 -0
- package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +558 -718
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.d.ts +10 -0
- package/dist/kadaikodi/pages/admin/UserManagementPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.d.ts +13 -0
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +142 -55
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.d.ts +11 -0
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.d.ts +12 -0
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +129 -164
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.d.ts +12 -0
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.d.ts +11 -0
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.d.ts +11 -0
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +379 -361
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.d.ts +2 -0
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +266 -166
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.d.ts +2 -0
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.d.ts +10 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +288 -161
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts +12 -0
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.d.ts +11 -0
- package/dist/kadaikodi/pages/common/HelpSupportPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.d.ts +10 -0
- package/dist/kadaikodi/pages/common/NotificationCenterPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/common/SettingsPage.d.ts +19 -0
- package/dist/kadaikodi/pages/common/SettingsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.d.ts +12 -0
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +17 -34
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.d.ts +13 -0
- package/dist/kadaikodi/pages/customer/CartDetailPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts +11 -0
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.d.ts +9 -0
- package/dist/kadaikodi/pages/customer/CheckoutPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.d.ts +10 -0
- package/dist/kadaikodi/pages/customer/CustomerDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.d.ts +10 -0
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.d.ts +12 -0
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +270 -230
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.d.ts +11 -0
- package/dist/kadaikodi/pages/customer/FavoritesPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +149 -412
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.d.ts +9 -0
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.d.ts +9 -0
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +176 -175
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.d.ts +11 -0
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/ReviewsPage.d.ts +12 -0
- package/dist/kadaikodi/pages/customer/ReviewsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +295 -438
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.d.ts +10 -0
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/shared.d.ts +41 -0
- package/dist/kadaikodi/pages/customer/shared.d.ts.map +1 -0
- package/dist/kadaikodi/pages/customer/shared.js +181 -0
- package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.d.ts +13 -0
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.d.ts +10 -0
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.d.ts +11 -0
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorDashboard.d.ts +10 -0
- package/dist/kadaikodi/pages/investor/InvestorDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.d.ts +10 -0
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.d.ts +11 -0
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.d.ts +20 -0
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts +18 -0
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +424 -448
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerDashboard.d.ts +14 -0
- package/dist/kadaikodi/pages/worker/WorkerDashboard.d.ts.map +1 -0
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.d.ts +18 -0
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.d.ts +18 -0
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +300 -296
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.d.ts +16 -0
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.d.ts.map +1 -0
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +284 -309
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/kadaikodi/store/index.d.ts +6 -0
- package/dist/kadaikodi/store/index.d.ts.map +1 -0
- package/dist/kadaikodi/store/kadaikodiStore.d.ts +60 -0
- package/dist/kadaikodi/store/kadaikodiStore.d.ts.map +1 -0
- package/dist/kadaikodi/types/index.d.ts +464 -0
- package/dist/kadaikodi/types/index.d.ts.map +1 -0
- package/dist/kadaikodi/utils/cn.d.ts +4 -0
- package/dist/kadaikodi/utils/cn.d.ts.map +1 -0
- package/dist/kadaikodi/utils/formatters.d.ts +78 -0
- package/dist/kadaikodi/utils/formatters.d.ts.map +1 -0
- package/dist/kadaikodi/utils/index.d.ts +8 -0
- package/dist/kadaikodi/utils/index.d.ts.map +1 -0
- package/dist/kadaikodi/utils/navigation.d.ts +20 -0
- package/dist/kadaikodi/utils/navigation.d.ts.map +1 -0
- package/dist/services/createSandboxAssistantTransport.d.ts +43 -0
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/services/createSandboxAssistantTransport.js +15 -0
- package/dist/services/createSandboxAssistantTransport.js.map +1 -0
- package/package.json +5 -1
|
@@ -1,169 +1,229 @@
|
|
|
1
1
|
import { useKadaikodi as e } from "../../context/KadaikodiContext.js";
|
|
2
2
|
import { PageLayout as t } from "../../components/PageLayout.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
3
|
+
import { EmptyState as n } from "../../components/EmptyState.js";
|
|
4
|
+
import { useAdminAnalytics as r, useDashboardStats as i } from "../../hooks/useKadaikodiApi.js";
|
|
5
|
+
import { formatCurrency as a } from "../../utils/formatters.js";
|
|
6
|
+
import { AreaChart as o } from "../../components/viz/AreaChart.js";
|
|
7
|
+
import { DonutChart as s } from "../../components/viz/DonutChart.js";
|
|
8
|
+
import { StatCard as c } from "../../components/viz/StatCard.js";
|
|
9
|
+
import "../../components/viz/index.js";
|
|
10
|
+
import { useMemo as l } from "react";
|
|
11
|
+
import { ArrowLeft as u, Award as d, BarChart3 as f, Calendar as p, Clock as m, Download as h, IndianRupee as g, Loader2 as _, ShoppingBag as v, ShoppingCart as y, Star as b, Store as x, TrendingUp as S } from "lucide-react";
|
|
12
|
+
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
13
|
+
import { GlassCard as T, PagePurpose as E } from "@burdenoff/fe-libs/ui";
|
|
11
14
|
//#region src/kadaikodi/pages/admin/AdminFinancialPage.tsx
|
|
12
|
-
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
+
var D = (e) => {
|
|
16
|
+
let t = new Date(e);
|
|
17
|
+
return t.setHours(0, 0, 0, 0), t.getTime();
|
|
18
|
+
}, O = (e) => new Date(e).toLocaleDateString("en-IN", {
|
|
19
|
+
day: "numeric",
|
|
20
|
+
month: "short"
|
|
21
|
+
}), k = (e) => e.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (e) => e.toUpperCase());
|
|
22
|
+
function A() {
|
|
23
|
+
let { navigateTo: A } = e(), { data: j, isLoading: M } = i(), { data: N, isLoading: P } = r(), F = M || P, I = (e) => a(e, { minimumFractionDigits: 0 }), L = l(() => j && j.totalOrders > 0 ? j.totalRevenue / j.totalOrders : 0, [j]), R = l(() => {
|
|
24
|
+
let e = Object.entries(N?.categoryDistribution ?? {}), t = e.reduce((e, [, t]) => e + t, 0);
|
|
15
25
|
return e.map(([e, n]) => ({
|
|
16
26
|
category: e,
|
|
17
27
|
count: n,
|
|
18
28
|
percentage: t > 0 ? n / t * 100 : 0
|
|
19
29
|
})).sort((e, t) => t.count - e.count);
|
|
20
|
-
}, [
|
|
30
|
+
}, [N]), z = N?.topProviders ?? [], B = N?.orderTrends ?? [], V = l(() => {
|
|
31
|
+
if (B.length === 0) return [];
|
|
32
|
+
let e = /* @__PURE__ */ new Map();
|
|
33
|
+
for (let t of B) {
|
|
34
|
+
let n = D(new Date(t.createdAt));
|
|
35
|
+
e.set(n, (e.get(n) ?? 0) + (t.total ?? 0));
|
|
36
|
+
}
|
|
37
|
+
return [...e.entries()].sort((e, t) => e[0] - t[0]).map(([e, t]) => ({
|
|
38
|
+
label: O(e),
|
|
39
|
+
value: t
|
|
40
|
+
}));
|
|
41
|
+
}, [B]), H = l(() => Object.entries(N?.categoryDistribution ?? {}).sort((e, t) => t[1] - e[1]).map(([e, t]) => ({
|
|
42
|
+
label: k(e),
|
|
43
|
+
value: t
|
|
44
|
+
})), [N]), U = l(() => H.reduce((e, t) => e + t.value, 0), [H]), W = (e) => e.replace(/_/g, " ").toLowerCase(), G = (e) => e === "delivered" ? "bg-status-success-bg-subtle text-status-success-text" : e === "cancelled" ? "bg-status-error-bg-subtle text-status-error-text" : "bg-status-warning-bg-subtle text-status-warning-text", K = () => {
|
|
21
45
|
let e = [];
|
|
22
|
-
e.push("Kadaikodi Financial Report"), e.push(""), e.push("Metric,Value"), e.push(`Total Revenue,${
|
|
46
|
+
e.push("Kadaikodi Financial Report"), e.push(""), e.push("Metric,Value"), e.push(`Total Revenue,${j?.totalRevenue ?? 0}`), e.push(`Total Orders,${j?.totalOrders ?? 0}`), e.push(`Average Order Value,${Math.round(L)}`), e.push(`Pending Orders,${j?.pendingOrders ?? 0}`), e.push(""), e.push("Cart Category Distribution"), e.push("Category,Carts,Share %"), R.forEach((t) => {
|
|
23
47
|
e.push(`${t.category},${t.count},${(t.percentage ?? 0).toFixed(1)}`);
|
|
24
|
-
}), e.push(""), e.push("Top Performing Carts"), e.push("Cart,Category,Rating"),
|
|
48
|
+
}), e.push(""), e.push("Top Performing Carts"), e.push("Cart,Category,Rating"), z.forEach((t) => {
|
|
25
49
|
e.push(`${t.name},${t.category},${t.rating ?? 0}`);
|
|
26
|
-
}), e.push(""), e.push("Recent Orders"), e.push("Date,Status,Amount"),
|
|
50
|
+
}), e.push(""), e.push("Recent Orders"), e.push("Date,Status,Amount"), B.forEach((t) => {
|
|
27
51
|
e.push(`${new Date(t.createdAt).toISOString().slice(0, 10)},${t.status},${t.total ?? 0}`);
|
|
28
52
|
});
|
|
29
53
|
let t = new Blob([e.join("\n")], { type: "text/csv;charset=utf-8;" }), n = URL.createObjectURL(t), r = document.createElement("a");
|
|
30
54
|
r.href = n, r.download = `kadaikodi-financial-report-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, r.click(), URL.revokeObjectURL(n);
|
|
31
|
-
},
|
|
55
|
+
}, q = (e) => e < 3 ? /* @__PURE__ */ C(d, { className: "h-5 w-5 text-status-warning-text" }) : /* @__PURE__ */ C("span", {
|
|
32
56
|
className: "flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary",
|
|
33
57
|
children: e + 1
|
|
34
58
|
});
|
|
35
|
-
return
|
|
59
|
+
return F ? /* @__PURE__ */ C(t, {
|
|
36
60
|
title: "Financial Reports",
|
|
37
61
|
description: "Loading financial data...",
|
|
38
|
-
children: /* @__PURE__ */
|
|
62
|
+
children: /* @__PURE__ */ w("div", {
|
|
39
63
|
className: "flex flex-col items-center justify-center py-20",
|
|
40
|
-
children: [/* @__PURE__ */
|
|
64
|
+
children: [/* @__PURE__ */ C(_, { className: "h-10 w-10 animate-spin text-text-secondary mb-4" }), /* @__PURE__ */ C("p", {
|
|
41
65
|
className: "text-text-secondary",
|
|
42
66
|
children: "Loading financial data..."
|
|
43
67
|
})]
|
|
44
68
|
})
|
|
45
|
-
}) :
|
|
69
|
+
}) : j ? /* @__PURE__ */ w(t, {
|
|
46
70
|
title: "Financial Reports",
|
|
47
71
|
description: "Revenue, top carts and financial trends",
|
|
48
|
-
actions: /* @__PURE__ */
|
|
72
|
+
actions: /* @__PURE__ */ w("div", {
|
|
49
73
|
className: "flex flex-col sm:flex-row items-stretch sm:items-center gap-3",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ w("button", {
|
|
51
75
|
type: "button",
|
|
52
|
-
onClick: () =>
|
|
76
|
+
onClick: () => A("/admin"),
|
|
53
77
|
className: "flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
55
|
-
}), /* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ C(u, { className: "h-4 w-4" }), " Back"]
|
|
79
|
+
}), /* @__PURE__ */ w("button", {
|
|
56
80
|
type: "button",
|
|
57
|
-
onClick:
|
|
81
|
+
onClick: K,
|
|
58
82
|
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",
|
|
59
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), " Export Report"]
|
|
60
84
|
})]
|
|
61
85
|
}),
|
|
62
86
|
children: [
|
|
63
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ C(E, {
|
|
64
88
|
className: "mb-6",
|
|
65
89
|
children: "The money view of Kadaikodi. Track total revenue and order volume, see which carts and categories drive the most business, and watch how orders trend over time — then export a CSV for accounting or investor updates."
|
|
66
90
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
68
|
-
className: "mb-8",
|
|
69
|
-
children: [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
/* @__PURE__ */ w("div", {
|
|
92
|
+
className: "mb-8 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ C(c, {
|
|
95
|
+
label: "Total Revenue",
|
|
96
|
+
value: I(j.totalRevenue),
|
|
97
|
+
icon: /* @__PURE__ */ C(g, { className: "h-4 w-4" }),
|
|
98
|
+
sparkline: V.map((e) => e.value),
|
|
99
|
+
sparklineVariant: "area"
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ C(c, {
|
|
102
|
+
label: "Total Orders",
|
|
103
|
+
value: (j.totalOrders ?? 0).toLocaleString("en-IN"),
|
|
104
|
+
icon: /* @__PURE__ */ C(v, { className: "h-4 w-4" })
|
|
105
|
+
}),
|
|
106
|
+
/* @__PURE__ */ C(c, {
|
|
107
|
+
label: "Avg Order Value",
|
|
108
|
+
value: I(L),
|
|
109
|
+
icon: /* @__PURE__ */ C(S, { className: "h-4 w-4" })
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ C(c, {
|
|
112
|
+
label: "Pending Orders",
|
|
113
|
+
value: (j.pendingOrders ?? 0).toLocaleString("en-IN"),
|
|
114
|
+
icon: /* @__PURE__ */ C(m, { className: "h-4 w-4" })
|
|
115
|
+
})
|
|
116
|
+
]
|
|
117
|
+
}),
|
|
118
|
+
/* @__PURE__ */ w("div", {
|
|
119
|
+
className: "mb-8 grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
120
|
+
children: [/* @__PURE__ */ w(T, {
|
|
121
|
+
treatment: "plain",
|
|
122
|
+
className: "p-6 lg:col-span-2",
|
|
123
|
+
children: [/* @__PURE__ */ w("div", {
|
|
124
|
+
className: "mb-4 flex items-center justify-between gap-2",
|
|
125
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
126
|
+
className: "text-base font-semibold text-text-primary",
|
|
127
|
+
children: "GMV over time"
|
|
128
|
+
}), /* @__PURE__ */ C("span", {
|
|
129
|
+
className: "text-xs text-text-muted",
|
|
130
|
+
children: "Recent orders"
|
|
131
|
+
})]
|
|
132
|
+
}), V.length > 0 ? /* @__PURE__ */ C(o, {
|
|
133
|
+
series: V,
|
|
134
|
+
height: 220,
|
|
135
|
+
valueFormatter: (e) => I(e),
|
|
136
|
+
title: "Gross merchandise value over recent orders"
|
|
137
|
+
}) : /* @__PURE__ */ C("p", {
|
|
138
|
+
className: "text-sm text-text-secondary",
|
|
139
|
+
children: "GMV will chart here once orders are placed."
|
|
140
|
+
})]
|
|
141
|
+
}), /* @__PURE__ */ w(T, {
|
|
142
|
+
treatment: "plain",
|
|
143
|
+
className: "p-6",
|
|
144
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
145
|
+
className: "mb-4 text-base font-semibold text-text-primary",
|
|
146
|
+
children: "Carts by Category"
|
|
147
|
+
}), H.length > 0 ? /* @__PURE__ */ C(s, {
|
|
148
|
+
segments: H,
|
|
149
|
+
size: 150,
|
|
150
|
+
centerLabel: U.toLocaleString("en-IN"),
|
|
151
|
+
centerCaption: "carts",
|
|
152
|
+
valueFormatter: (e) => e.toLocaleString("en-IN")
|
|
153
|
+
}) : /* @__PURE__ */ C("p", {
|
|
154
|
+
className: "text-sm text-text-secondary",
|
|
155
|
+
children: "Categories will appear here as carts are onboarded."
|
|
156
|
+
})]
|
|
97
157
|
})]
|
|
98
158
|
}),
|
|
99
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ w("div", {
|
|
100
160
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8",
|
|
101
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ w("div", {
|
|
102
162
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ w("div", {
|
|
104
164
|
className: "flex items-center gap-2 mb-4",
|
|
105
|
-
children: [/* @__PURE__ */
|
|
165
|
+
children: [/* @__PURE__ */ C(y, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ C("h3", {
|
|
106
166
|
className: "text-lg font-semibold text-text-primary",
|
|
107
167
|
children: "Top Performing Carts"
|
|
108
168
|
})]
|
|
109
|
-
}),
|
|
169
|
+
}), z.length > 0 ? /* @__PURE__ */ C("div", {
|
|
110
170
|
className: "space-y-3",
|
|
111
|
-
children:
|
|
171
|
+
children: z.map((e, t) => /* @__PURE__ */ w("div", {
|
|
112
172
|
className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
|
|
113
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ w("div", {
|
|
114
174
|
className: "flex items-center gap-3",
|
|
115
|
-
children: [
|
|
175
|
+
children: [q(t), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
116
176
|
className: "text-sm font-medium text-text-primary",
|
|
117
177
|
children: e.name
|
|
118
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), /* @__PURE__ */ C("p", {
|
|
119
179
|
className: "text-xs text-text-secondary capitalize",
|
|
120
|
-
children:
|
|
180
|
+
children: W(e.category)
|
|
121
181
|
})] })]
|
|
122
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ w("p", {
|
|
123
183
|
className: "text-sm font-semibold text-text-primary flex items-center gap-1",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
184
|
+
children: [/* @__PURE__ */ C(b, { className: "h-3.5 w-3.5 fill-status-warning-text text-status-warning-text" }), (e.rating ?? 0).toFixed(1)]
|
|
125
185
|
})]
|
|
126
186
|
}, e.id))
|
|
127
|
-
}) : /* @__PURE__ */
|
|
187
|
+
}) : /* @__PURE__ */ C("p", {
|
|
128
188
|
className: "text-sm text-text-secondary",
|
|
129
189
|
children: "Top-performing carts will be ranked here once orders start flowing."
|
|
130
190
|
})]
|
|
131
|
-
}), /* @__PURE__ */
|
|
191
|
+
}), /* @__PURE__ */ w("div", {
|
|
132
192
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
|
|
133
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ w("div", {
|
|
134
194
|
className: "flex items-center gap-2 mb-4",
|
|
135
|
-
children: [/* @__PURE__ */
|
|
195
|
+
children: [/* @__PURE__ */ C(f, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ C("h3", {
|
|
136
196
|
className: "text-lg font-semibold text-text-primary",
|
|
137
197
|
children: "Cart Category Distribution"
|
|
138
198
|
})]
|
|
139
|
-
}),
|
|
199
|
+
}), R.length > 0 ? /* @__PURE__ */ C("div", {
|
|
140
200
|
className: "space-y-3",
|
|
141
|
-
children:
|
|
142
|
-
/* @__PURE__ */
|
|
201
|
+
children: R.map((e) => /* @__PURE__ */ w("div", { children: [
|
|
202
|
+
/* @__PURE__ */ w("div", {
|
|
143
203
|
className: "flex items-center justify-between mb-1",
|
|
144
|
-
children: [/* @__PURE__ */
|
|
204
|
+
children: [/* @__PURE__ */ C("span", {
|
|
145
205
|
className: "text-sm font-medium text-text-primary capitalize",
|
|
146
|
-
children:
|
|
147
|
-
}), /* @__PURE__ */
|
|
206
|
+
children: W(e.category)
|
|
207
|
+
}), /* @__PURE__ */ w("span", {
|
|
148
208
|
className: "text-sm text-text-secondary",
|
|
149
209
|
children: [(e.percentage ?? 0).toFixed(1), "%"]
|
|
150
210
|
})]
|
|
151
211
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ C("div", {
|
|
153
213
|
className: "w-full bg-bg-sunken rounded-full h-2",
|
|
154
|
-
children: /* @__PURE__ */
|
|
214
|
+
children: /* @__PURE__ */ C("div", {
|
|
155
215
|
className: "bg-action-primary-bg h-2 rounded-full transition-all duration-300",
|
|
156
216
|
style: { width: `${e.percentage}%` }
|
|
157
217
|
})
|
|
158
218
|
}),
|
|
159
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ C("div", {
|
|
160
220
|
className: "text-right mt-1",
|
|
161
|
-
children: /* @__PURE__ */
|
|
221
|
+
children: /* @__PURE__ */ w("span", {
|
|
162
222
|
className: "text-sm font-semibold text-text-primary",
|
|
163
223
|
children: [
|
|
164
224
|
(e.count ?? 0).toLocaleString("en-IN"),
|
|
165
225
|
" ",
|
|
166
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ C("span", {
|
|
167
227
|
className: "text-xs font-normal text-text-secondary",
|
|
168
228
|
children: e.count === 1 ? "cart" : "carts"
|
|
169
229
|
})
|
|
@@ -171,46 +231,46 @@ function T() {
|
|
|
171
231
|
})
|
|
172
232
|
})
|
|
173
233
|
] }, e.category))
|
|
174
|
-
}) : /* @__PURE__ */
|
|
234
|
+
}) : /* @__PURE__ */ C("p", {
|
|
175
235
|
className: "text-sm text-text-secondary",
|
|
176
236
|
children: "Cart categories will appear here as carts are onboarded."
|
|
177
237
|
})]
|
|
178
238
|
})]
|
|
179
239
|
}),
|
|
180
|
-
|
|
240
|
+
B.length > 0 && /* @__PURE__ */ w("div", {
|
|
181
241
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 mb-8",
|
|
182
|
-
children: [/* @__PURE__ */
|
|
242
|
+
children: [/* @__PURE__ */ w("div", {
|
|
183
243
|
className: "flex items-center gap-2 mb-4",
|
|
184
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ C(p, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ C("h3", {
|
|
185
245
|
className: "text-lg font-semibold text-text-primary",
|
|
186
246
|
children: "Recent Orders"
|
|
187
247
|
})]
|
|
188
|
-
}), /* @__PURE__ */
|
|
248
|
+
}), /* @__PURE__ */ C("div", {
|
|
189
249
|
className: "overflow-x-auto",
|
|
190
|
-
children: /* @__PURE__ */
|
|
250
|
+
children: /* @__PURE__ */ w("table", {
|
|
191
251
|
className: "w-full",
|
|
192
|
-
children: [/* @__PURE__ */
|
|
252
|
+
children: [/* @__PURE__ */ C("thead", { children: /* @__PURE__ */ w("tr", {
|
|
193
253
|
className: "border-b border-border-subtle bg-bg-sunken/50",
|
|
194
254
|
children: [
|
|
195
|
-
/* @__PURE__ */
|
|
255
|
+
/* @__PURE__ */ C("th", {
|
|
196
256
|
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
197
257
|
children: "Date"
|
|
198
258
|
}),
|
|
199
|
-
/* @__PURE__ */
|
|
259
|
+
/* @__PURE__ */ C("th", {
|
|
200
260
|
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
201
261
|
children: "Status"
|
|
202
262
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
263
|
+
/* @__PURE__ */ C("th", {
|
|
204
264
|
className: "px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
205
265
|
children: "Amount"
|
|
206
266
|
})
|
|
207
267
|
]
|
|
208
|
-
}) }), /* @__PURE__ */
|
|
268
|
+
}) }), /* @__PURE__ */ C("tbody", {
|
|
209
269
|
className: "divide-y divide-border",
|
|
210
|
-
children:
|
|
270
|
+
children: B.map((e) => /* @__PURE__ */ w("tr", {
|
|
211
271
|
className: "hover:bg-accent/50 transition-colors",
|
|
212
272
|
children: [
|
|
213
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ C("td", {
|
|
214
274
|
className: "px-4 py-3 text-sm font-medium text-text-primary",
|
|
215
275
|
children: new Date(e.createdAt).toLocaleDateString("en-IN", {
|
|
216
276
|
day: "2-digit",
|
|
@@ -218,16 +278,16 @@ function T() {
|
|
|
218
278
|
year: "numeric"
|
|
219
279
|
})
|
|
220
280
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
281
|
+
/* @__PURE__ */ C("td", {
|
|
222
282
|
className: "px-4 py-3 text-sm",
|
|
223
|
-
children: /* @__PURE__ */
|
|
224
|
-
className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize ${
|
|
283
|
+
children: /* @__PURE__ */ C("span", {
|
|
284
|
+
className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize ${G(e.status)}`,
|
|
225
285
|
children: e.status.replace(/_/g, " ")
|
|
226
286
|
})
|
|
227
287
|
}),
|
|
228
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ C("td", {
|
|
229
289
|
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
230
|
-
children:
|
|
290
|
+
children: I(e.total ?? 0)
|
|
231
291
|
})
|
|
232
292
|
]
|
|
233
293
|
}, e.id))
|
|
@@ -235,58 +295,58 @@ function T() {
|
|
|
235
295
|
})
|
|
236
296
|
})]
|
|
237
297
|
}),
|
|
238
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ w("div", {
|
|
239
299
|
className: "grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
240
300
|
children: [
|
|
241
|
-
/* @__PURE__ */
|
|
301
|
+
/* @__PURE__ */ w("div", {
|
|
242
302
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
243
303
|
children: [
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
-
/* @__PURE__ */
|
|
304
|
+
/* @__PURE__ */ C(v, { className: "h-8 w-8 text-primary mx-auto mb-3" }),
|
|
305
|
+
/* @__PURE__ */ C("h4", {
|
|
246
306
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
247
307
|
children: "Total Orders"
|
|
248
308
|
}),
|
|
249
|
-
/* @__PURE__ */
|
|
309
|
+
/* @__PURE__ */ C("p", {
|
|
250
310
|
className: "text-2xl font-bold text-primary",
|
|
251
|
-
children: (
|
|
311
|
+
children: (j.totalOrders ?? 0).toLocaleString("en-IN")
|
|
252
312
|
}),
|
|
253
|
-
/* @__PURE__ */
|
|
313
|
+
/* @__PURE__ */ C("p", {
|
|
254
314
|
className: "text-sm text-text-secondary mt-1",
|
|
255
315
|
children: "All-time orders"
|
|
256
316
|
})
|
|
257
317
|
]
|
|
258
318
|
}),
|
|
259
|
-
/* @__PURE__ */
|
|
319
|
+
/* @__PURE__ */ w("div", {
|
|
260
320
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
261
321
|
children: [
|
|
262
|
-
/* @__PURE__ */
|
|
263
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ C(f, { className: "h-8 w-8 text-status-success-text mx-auto mb-3" }),
|
|
323
|
+
/* @__PURE__ */ C("h4", {
|
|
264
324
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
265
325
|
children: "Average Order Value"
|
|
266
326
|
}),
|
|
267
|
-
/* @__PURE__ */
|
|
327
|
+
/* @__PURE__ */ C("p", {
|
|
268
328
|
className: "text-2xl font-bold text-status-success-text",
|
|
269
|
-
children:
|
|
329
|
+
children: I(L)
|
|
270
330
|
}),
|
|
271
|
-
/* @__PURE__ */
|
|
331
|
+
/* @__PURE__ */ C("p", {
|
|
272
332
|
className: "text-sm text-text-secondary mt-1",
|
|
273
333
|
children: "Per order average"
|
|
274
334
|
})
|
|
275
335
|
]
|
|
276
336
|
}),
|
|
277
|
-
/* @__PURE__ */
|
|
337
|
+
/* @__PURE__ */ w("div", {
|
|
278
338
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-6 text-center",
|
|
279
339
|
children: [
|
|
280
|
-
/* @__PURE__ */ x
|
|
281
|
-
/* @__PURE__ */
|
|
340
|
+
/* @__PURE__ */ C(x, { className: "h-8 w-8 text-text-primary mx-auto mb-3" }),
|
|
341
|
+
/* @__PURE__ */ C("h4", {
|
|
282
342
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
283
343
|
children: "Active Carts"
|
|
284
344
|
}),
|
|
285
|
-
/* @__PURE__ */
|
|
345
|
+
/* @__PURE__ */ C("p", {
|
|
286
346
|
className: "text-2xl font-bold text-text-primary",
|
|
287
|
-
children: (
|
|
347
|
+
children: (j.activeProviders ?? 0).toLocaleString("en-IN")
|
|
288
348
|
}),
|
|
289
|
-
/* @__PURE__ */
|
|
349
|
+
/* @__PURE__ */ C("p", {
|
|
290
350
|
className: "text-sm text-text-secondary mt-1",
|
|
291
351
|
children: "Currently live on the platform"
|
|
292
352
|
})
|
|
@@ -295,10 +355,10 @@ function T() {
|
|
|
295
355
|
]
|
|
296
356
|
})
|
|
297
357
|
]
|
|
298
|
-
}) : /* @__PURE__ */
|
|
358
|
+
}) : /* @__PURE__ */ C(t, {
|
|
299
359
|
title: "Financial Reports",
|
|
300
360
|
description: "Unable to load financial data",
|
|
301
|
-
children: /* @__PURE__ */
|
|
361
|
+
children: /* @__PURE__ */ C(n, {
|
|
302
362
|
illustration: "empty-data",
|
|
303
363
|
title: "No financial data available",
|
|
304
364
|
description: "We couldn't load the financial figures right now. Please check back shortly."
|
|
@@ -306,6 +366,6 @@ function T() {
|
|
|
306
366
|
});
|
|
307
367
|
}
|
|
308
368
|
//#endregion
|
|
309
|
-
export {
|
|
369
|
+
export { A as AdminFinancialPage };
|
|
310
370
|
|
|
311
371
|
//# sourceMappingURL=AdminFinancialPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module kadaikodi/pages/admin\n *\n * Financial reporting wired to the live backend (useDashboardStats +\n * useAdminAnalytics). Revenue, top carts, category breakdown and order\n * trends are all real; the export produces a CSV of the real figures.\n * Metrics with no honest backend source (commission, payouts) are omitted\n * rather than fabricated.\n */\n\nimport { useMemo } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Store,\n ShoppingBag,\n Clock,\n Star,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useDashboardStats, useAdminAnalytics } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useKadaikodi();\n const { data: stats, isLoading: statsLoading } = useDashboardStats();\n const { data: analytics, isLoading: analyticsLoading } = useAdminAnalytics();\n\n const loading = statsLoading || analyticsLoading;\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const averageOrderValue = useMemo(() => {\n if (stats && stats.totalOrders > 0) return stats.totalRevenue / stats.totalOrders;\n return 0;\n }, [stats]);\n\n // Cart distribution per category with a real, derived share percentage.\n // The backend exposes counts per category, not revenue per category.\n const categoryRows = useMemo(() => {\n const entries = Object.entries(analytics?.categoryDistribution ?? {});\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\n return entries\n .map(([category, count]) => ({\n category,\n count,\n percentage: total > 0 ? (count / total) * 100 : 0,\n }))\n .sort((a, b) => b.count - a.count);\n }, [analytics]);\n\n const topCarts = analytics?.topProviders ?? [];\n const orderTrends = analytics?.orderTrends ?? [];\n\n const prettyCategory = (c: string) => c.replace(/_/g, ' ').toLowerCase();\n\n const orderStatusBadge = (status: string) => {\n if (status === 'delivered') return 'bg-status-success-bg-subtle text-status-success-text';\n if (status === 'cancelled') return 'bg-status-error-bg-subtle text-status-error-text';\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n };\n\n const handleExportReport = () => {\n const lines: string[] = [];\n lines.push('Kadaikodi Financial Report');\n lines.push('');\n lines.push('Metric,Value');\n lines.push(`Total Revenue,${stats?.totalRevenue ?? 0}`);\n lines.push(`Total Orders,${stats?.totalOrders ?? 0}`);\n lines.push(`Average Order Value,${Math.round(averageOrderValue)}`);\n lines.push(`Pending Orders,${stats?.pendingOrders ?? 0}`);\n lines.push('');\n lines.push('Cart Category Distribution');\n lines.push('Category,Carts,Share %');\n categoryRows.forEach((r) => {\n lines.push(`${r.category},${r.count},${(r.percentage ?? 0).toFixed(1)}`);\n });\n lines.push('');\n lines.push('Top Performing Carts');\n lines.push('Cart,Category,Rating');\n topCarts.forEach((c) => {\n lines.push(`${c.name},${c.category},${c.rating ?? 0}`);\n });\n lines.push('');\n lines.push('Recent Orders');\n lines.push('Date,Status,Amount');\n orderTrends.forEach((o) => {\n lines.push(`${new Date(o.createdAt).toISOString().slice(0, 10)},${o.status},${o.total ?? 0}`);\n });\n\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `kadaikodi-financial-report-${new Date().toISOString().slice(0, 10)}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const medalIcon = (index: number) => {\n if (index < 3) 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 (!stats) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <EmptyState\n illustration=\"empty-data\"\n title=\"No financial data available\"\n description=\"We couldn't load the financial figures right now. Please check back shortly.\"\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, top carts 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 <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\">\n The money view of Kadaikodi. Track total revenue and order volume, see which carts and\n categories drive the most business, and watch how orders trend over time — then export a CSV\n for accounting or investor updates.\n </PagePurpose>\n\n {/* Key Metrics — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Financial Summary</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n featured\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Total Revenue\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n label=\"Total Orders\"\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(averageOrderValue)}\n label=\"Avg Order Value\"\n />\n <MetricsCard\n icon={<Clock className=\"h-5 w-5\" />}\n value={(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n label=\"Pending Orders\"\n />\n </div>\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-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 {topCarts.length > 0 ? (\n <div className=\"space-y-3\">\n {topCarts.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 capitalize\">\n {prettyCategory(cart.category)}\n </p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-text-primary flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {(cart.rating ?? 0).toFixed(1)}\n </p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Top-performing carts will be ranked here once orders start flowing.\n </p>\n )}\n </div>\n\n {/* Cart Category Distribution */}\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\">Cart Category Distribution</h3>\n </div>\n {categoryRows.length > 0 ? (\n <div className=\"space-y-3\">\n {categoryRows.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 capitalize\">\n {prettyCategory(category.category)}\n </span>\n <span className=\"text-sm text-text-secondary\">\n {(category.percentage ?? 0).toFixed(1)}%\n </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 {(category.count ?? 0).toLocaleString('en-IN')}{' '}\n <span className=\"text-xs font-normal text-text-secondary\">\n {category.count === 1 ? 'cart' : 'carts'}\n </span>\n </span>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Cart categories will appear here as carts are onboarded.\n </p>\n )}\n </div>\n </div>\n\n {/* Recent Orders Table */}\n {orderTrends.length > 0 && (\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\">Recent Orders</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 Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Amount\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {orderTrends.map((order) => (\n <tr key={order.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">\n {new Date(order.createdAt).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-sm\">\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize ${orderStatusBadge(\n order.status\n )}`}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(order.total ?? 0)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* 3 Additional Cards — all real */}\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 {(stats.totalOrders ?? 0).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-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\">{fmtCur(averageOrderValue)}</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 <Store className=\"h-8 w-8 text-text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Active Carts</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Currently live on the platform</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAuCA,SAAgB,IAAqB;CACnC,IAAM,EAAE,kBAAe,GAAc,EAC/B,EAAE,MAAM,GAAO,WAAW,MAAiB,GAAmB,EAC9D,EAAE,MAAM,GAAW,WAAW,MAAqB,GAAmB,EAEtE,IAAU,KAAgB,GAE1B,KAAU,MAAmB,EAAe,GAAQ,EAAE,uBAAuB,GAAG,CAAC,EAEjF,IAAoB,QACpB,KAAS,EAAM,cAAc,IAAU,EAAM,eAAe,EAAM,cAC/D,GACN,CAAC,EAAM,CAAC,EAIL,IAAe,QAAc;EACjC,IAAM,IAAU,OAAO,QAAQ,GAAW,wBAAwB,EAAE,CAAC,EAC/D,IAAQ,EAAQ,QAAQ,GAAK,GAAG,OAAW,IAAM,GAAO,EAAE;AAChE,SAAO,EACJ,KAAK,CAAC,GAAU,QAAY;GAC3B;GACA;GACA,YAAY,IAAQ,IAAK,IAAQ,IAAS,MAAM;GACjD,EAAE,CACF,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;IACnC,CAAC,EAAU,CAAC,EAET,IAAW,GAAW,gBAAgB,EAAE,EACxC,IAAc,GAAW,eAAe,EAAE,EAE1C,KAAkB,MAAc,EAAE,QAAQ,MAAM,IAAI,CAAC,aAAa,EAElE,KAAoB,MACpB,MAAW,cAAoB,yDAC/B,MAAW,cAAoB,qDAC5B,wDAGH,UAA2B;EAC/B,IAAM,IAAkB,EAAE;AAuB1B,EAtBA,EAAM,KAAK,6BAA6B,EACxC,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,eAAe,EAC1B,EAAM,KAAK,iBAAiB,GAAO,gBAAgB,IAAI,EACvD,EAAM,KAAK,gBAAgB,GAAO,eAAe,IAAI,EACrD,EAAM,KAAK,uBAAuB,KAAK,MAAM,EAAkB,GAAG,EAClE,EAAM,KAAK,kBAAkB,GAAO,iBAAiB,IAAI,EACzD,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,6BAA6B,EACxC,EAAM,KAAK,yBAAyB,EACpC,EAAa,SAAS,MAAM;AAC1B,KAAM,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,cAAc,GAAG,QAAQ,EAAE,GAAG;IACxE,EACF,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,uBAAuB,EAClC,EAAM,KAAK,uBAAuB,EAClC,EAAS,SAAS,MAAM;AACtB,KAAM,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,UAAU,IAAI;IACtD,EACF,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,gBAAgB,EAC3B,EAAM,KAAK,qBAAqB,EAChC,EAAY,SAAS,MAAM;AACzB,KAAM,KAAK,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,SAAS,IAAI;IAC7F;EAEF,IAAM,IAAO,IAAI,KAAK,CAAC,EAAM,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM,2BAA2B,CAAC,EACxE,IAAM,IAAI,gBAAgB,EAAK,EAC/B,IAAI,SAAS,cAAc,IAAI;AAIrC,EAHA,EAAE,OAAO,GACT,EAAE,WAAW,+CAA8B,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,OACjF,EAAE,OAAO,EACT,IAAI,gBAAgB,EAAI;IAGpB,KAAa,MACb,IAAQ,IAAU,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,GAE1E,kBAAC,QAAD;EAAM,WAAU;YACb,IAAQ;EACJ,CAAA;AA2BX,QAvBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAS,WAAU,mDAAoD,CAAA,EACvE,kBAAC,KAAD;IAAG,WAAU;cAAsB;IAA6B,CAAA,CAC5D;;EACK,CAAA,GAIZ,IAaH,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,SAAS;IACnC,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,QAC1B;OACT,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,iBACzB;MACL;;YAnBV;GAsBE,kBAAC,GAAD;IAAa,WAAU;cAAO;IAIhB,CAAA;GAGd,kBAAC,GAAD;IAAe,WAAU;cAAzB,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAsB,CAAA,EACnF,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,UAAA;OACA,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,OAAO,EAAO,EAAM,aAAa;OACjC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,QAAQ,EAAM,eAAe,GAAG,eAAe,QAAQ;OACvD,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;OACxC,OAAO,EAAO,EAAkB;OAChC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;OACnC,QAAQ,EAAM,iBAAiB,GAAG,eAAe,QAAQ;OACzD,OAAM;OACN,CAAA;MACE;OACQ;;GAEhB,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EACxD,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAAyB,CAAA,CAC7E;SACL,EAAS,SAAS,IACjB,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAS,KAAK,GAAM,MACnB,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAU,EAAM,EACjB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAyC,EAAK;SAAS,CAAA,EACpE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAe,EAAK,SAAS;SAC5B,CAAA,CACA,EAAA,CAAA,CACF;WACN,kBAAC,KAAD;QAAG,WAAU;kBAAb,CACE,kBAAC,GAAD,EAAM,WAAU,iEAAkE,CAAA,GAChF,EAAK,UAAU,GAAG,QAAQ,EAAE,CAC5B;UACA;SAhBC,EAAK,GAgBN,CACN;MACE,CAAA,GAEN,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,CAEF;QAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,EACrD,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAA+B,CAAA,CACnF;SACL,EAAa,SAAS,IACrB,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAa,KAAK,MACjB,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAe,EAAS,SAAS;SAC7B,CAAA,EACP,kBAAC,QAAD;SAAM,WAAU;mBAAhB,EACI,EAAS,cAAc,GAAG,QAAQ,EAAE,EAAC,IAClC;WACH;;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAS,WAAW,IAAI;SAC3C,CAAA;QACE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,QAAD;SAAM,WAAU;mBAAhB;WACI,EAAS,SAAS,GAAG,eAAe,QAAQ;UAAE;UAChD,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAS,UAAU,IAAI,SAAS;WAC5B,CAAA;UACF;;QACH,CAAA;OACF,EAAA,EAvBI,EAAS,SAuBb,CACN;MACE,CAAA,GAEN,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,CAEF;OACF;;GAGL,EAAY,SAAS,KACpB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAkB,CAAA,CACtE;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAuF;SAEhG,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAuF;SAEhG,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAwF;SAEjG,CAAA;QACF;UACC,CAAA,EACR,kBAAC,SAAD;OAAO,WAAU;iBACd,EAAY,KAAK,MAChB,kBAAC,MAAD;QAAmB,WAAU;kBAA7B;SACE,kBAAC,MAAD;UAAI,WAAU;oBACX,IAAI,KAAK,EAAM,UAAU,CAAC,mBAAmB,SAAS;WACrD,KAAK;WACL,OAAO;WACP,MAAM;WACP,CAAC;UACC,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBACZ,kBAAC,QAAD;WACE,WAAW,oFAAoF,EAC7F,EAAM,OACP;qBAEA,EAAM,OAAO,QAAQ,MAAM,IAAI;WAC3B,CAAA;UACJ,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAO,EAAM,SAAS,EAAE;UACtB,CAAA;SACF;UApBI,EAAM,GAoBV,CACL;OACI,CAAA,CACF;;KACJ,CAAA,CACF;;GAIR,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAa,WAAU,qCAAsC,CAAA;OAC7D,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAiB,CAAA;OAC9E,kBAAC,KAAD;QAAG,WAAU;mBACT,EAAM,eAAe,GAAG,eAAe,QAAQ;QAC/C,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAmB,CAAA;OAC/D;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAW,WAAU,iDAAkD,CAAA;OACvE,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAwB,CAAA;OACrF,kBAAC,KAAD;QAAG,WAAU;kBAA+C,EAAO,EAAkB;QAAK,CAAA;OAC1F,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAqB,CAAA;OACjE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAO,WAAU,0CAA2C,CAAA;OAC5D,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAiB,CAAA;OAC9E,kBAAC,KAAD;QAAG,WAAU;mBACT,EAAM,mBAAmB,GAAG,eAAe,QAAQ;QACnD,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAkC,CAAA;OAC9E;;KACF;;GACK;MAhOX,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA;EACS,CAAA"}
|
|
1
|
+
{"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module kadaikodi/pages/admin\n *\n * Financial reporting wired to the live backend (useDashboardStats +\n * useAdminAnalytics). Revenue, top carts, category breakdown and order\n * trends are all real; the export produces a CSV of the real figures.\n * Metrics with no honest backend source (commission, payouts) are omitted\n * rather than fabricated.\n */\n\nimport { useMemo } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Store,\n ShoppingBag,\n Clock,\n Star,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { StatCard, DonutChart, AreaChart } from '../../components/viz';\nimport type { LabeledValue, Segment } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useDashboardStats, useAdminAnalytics } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst dayKeyOf = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x.getTime();\n};\nconst dayLbl = (t: number) =>\n new Date(t).toLocaleDateString('en-IN', { day: 'numeric', month: 'short' });\nconst titleCaseFin = (s: string) =>\n s\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useKadaikodi();\n const { data: stats, isLoading: statsLoading } = useDashboardStats();\n const { data: analytics, isLoading: analyticsLoading } = useAdminAnalytics();\n\n const loading = statsLoading || analyticsLoading;\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const averageOrderValue = useMemo(() => {\n if (stats && stats.totalOrders > 0) return stats.totalRevenue / stats.totalOrders;\n return 0;\n }, [stats]);\n\n // Cart distribution per category with a real, derived share percentage.\n // The backend exposes counts per category, not revenue per category.\n const categoryRows = useMemo(() => {\n const entries = Object.entries(analytics?.categoryDistribution ?? {});\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\n return entries\n .map(([category, count]) => ({\n category,\n count,\n percentage: total > 0 ? (count / total) * 100 : 0,\n }))\n .sort((a, b) => b.count - a.count);\n }, [analytics]);\n\n const topCarts = analytics?.topProviders ?? [];\n const orderTrends = analytics?.orderTrends ?? [];\n\n // Real GMV over time — bucket the backend's recent-order list by day.\n const gmvTrend = useMemo<LabeledValue[]>(() => {\n if (orderTrends.length === 0) return [];\n const g = new Map<number, number>();\n for (const o of orderTrends) {\n const t = dayKeyOf(new Date(o.createdAt));\n g.set(t, (g.get(t) ?? 0) + (o.total ?? 0));\n }\n return [...g.entries()].sort((a, b) => a[0] - b[0]).map(([t, v]) => ({ label: dayLbl(t), value: v }));\n }, [orderTrends]);\n\n // Real category-count donut.\n const categorySegments = useMemo<Segment[]>(\n () =>\n Object.entries(analytics?.categoryDistribution ?? {})\n .sort((a, b) => b[1] - a[1])\n .map(([c, count]) => ({ label: titleCaseFin(c), value: count })),\n [analytics]\n );\n const totalCarts = useMemo(\n () => categorySegments.reduce((s, seg) => s + seg.value, 0),\n [categorySegments]\n );\n\n const prettyCategory = (c: string) => c.replace(/_/g, ' ').toLowerCase();\n\n const orderStatusBadge = (status: string) => {\n if (status === 'delivered') return 'bg-status-success-bg-subtle text-status-success-text';\n if (status === 'cancelled') return 'bg-status-error-bg-subtle text-status-error-text';\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n };\n\n const handleExportReport = () => {\n const lines: string[] = [];\n lines.push('Kadaikodi Financial Report');\n lines.push('');\n lines.push('Metric,Value');\n lines.push(`Total Revenue,${stats?.totalRevenue ?? 0}`);\n lines.push(`Total Orders,${stats?.totalOrders ?? 0}`);\n lines.push(`Average Order Value,${Math.round(averageOrderValue)}`);\n lines.push(`Pending Orders,${stats?.pendingOrders ?? 0}`);\n lines.push('');\n lines.push('Cart Category Distribution');\n lines.push('Category,Carts,Share %');\n categoryRows.forEach((r) => {\n lines.push(`${r.category},${r.count},${(r.percentage ?? 0).toFixed(1)}`);\n });\n lines.push('');\n lines.push('Top Performing Carts');\n lines.push('Cart,Category,Rating');\n topCarts.forEach((c) => {\n lines.push(`${c.name},${c.category},${c.rating ?? 0}`);\n });\n lines.push('');\n lines.push('Recent Orders');\n lines.push('Date,Status,Amount');\n orderTrends.forEach((o) => {\n lines.push(`${new Date(o.createdAt).toISOString().slice(0, 10)},${o.status},${o.total ?? 0}`);\n });\n\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `kadaikodi-financial-report-${new Date().toISOString().slice(0, 10)}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const medalIcon = (index: number) => {\n if (index < 3) 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 (!stats) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <EmptyState\n illustration=\"empty-data\"\n title=\"No financial data available\"\n description=\"We couldn't load the financial figures right now. Please check back shortly.\"\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, top carts 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 <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\">\n The money view of Kadaikodi. Track total revenue and order volume, see which carts and\n categories drive the most business, and watch how orders trend over time — then export a CSV\n for accounting or investor updates.\n </PagePurpose>\n\n {/* Key Metrics */}\n <div className=\"mb-8 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label=\"Total Revenue\"\n value={fmtCur(stats.totalRevenue)}\n icon={<IndianRupee className=\"h-4 w-4\" />}\n sparkline={gmvTrend.map((d) => d.value)}\n sparklineVariant=\"area\"\n />\n <StatCard\n label=\"Total Orders\"\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n icon={<ShoppingBag className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Avg Order Value\"\n value={fmtCur(averageOrderValue)}\n icon={<TrendingUp className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Pending Orders\"\n value={(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n icon={<Clock className=\"h-4 w-4\" />}\n />\n </div>\n\n {/* GMV over time + Category mix — real charts */}\n <div className=\"mb-8 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <GlassCard treatment=\"plain\" className=\"p-6 lg:col-span-2\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">GMV over time</h3>\n <span className=\"text-xs text-text-muted\">Recent orders</span>\n </div>\n {gmvTrend.length > 0 ? (\n <AreaChart\n series={gmvTrend}\n height={220}\n valueFormatter={(v) => fmtCur(v)}\n title=\"Gross merchandise value over recent orders\"\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n GMV will chart here once orders are placed.\n </p>\n )}\n </GlassCard>\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Carts by Category</h3>\n {categorySegments.length > 0 ? (\n <DonutChart\n segments={categorySegments}\n size={150}\n centerLabel={totalCarts.toLocaleString('en-IN')}\n centerCaption=\"carts\"\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Categories will appear here as carts are onboarded.\n </p>\n )}\n </GlassCard>\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 {topCarts.length > 0 ? (\n <div className=\"space-y-3\">\n {topCarts.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 capitalize\">\n {prettyCategory(cart.category)}\n </p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-text-primary flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {(cart.rating ?? 0).toFixed(1)}\n </p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Top-performing carts will be ranked here once orders start flowing.\n </p>\n )}\n </div>\n\n {/* Cart Category Distribution */}\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\">Cart Category Distribution</h3>\n </div>\n {categoryRows.length > 0 ? (\n <div className=\"space-y-3\">\n {categoryRows.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 capitalize\">\n {prettyCategory(category.category)}\n </span>\n <span className=\"text-sm text-text-secondary\">\n {(category.percentage ?? 0).toFixed(1)}%\n </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 {(category.count ?? 0).toLocaleString('en-IN')}{' '}\n <span className=\"text-xs font-normal text-text-secondary\">\n {category.count === 1 ? 'cart' : 'carts'}\n </span>\n </span>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Cart categories will appear here as carts are onboarded.\n </p>\n )}\n </div>\n </div>\n\n {/* Recent Orders Table */}\n {orderTrends.length > 0 && (\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\">Recent Orders</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 Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Amount\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {orderTrends.map((order) => (\n <tr key={order.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">\n {new Date(order.createdAt).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-sm\">\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize ${orderStatusBadge(\n order.status\n )}`}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(order.total ?? 0)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* 3 Additional Cards — all real */}\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 {(stats.totalOrders ?? 0).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-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\">{fmtCur(averageOrderValue)}</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 <Store className=\"h-8 w-8 text-text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Active Carts</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Currently live on the platform</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|