@burdenoff/microfe-kadaikodi 2026.625.1 → 2026.626.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/kadaikodi/pages/HomePage.js +19 -14
- package/dist/kadaikodi/pages/HomePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +118 -83
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +75 -46
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +144 -128
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +255 -237
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js +129 -128
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +178 -150
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +182 -159
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js +325 -303
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +500 -469
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +534 -503
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +73 -48
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +103 -96
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +130 -129
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +673 -670
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +517 -514
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +140 -125
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js +302 -311
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js +102 -91
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js +766 -734
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +366 -356
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +243 -213
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +200 -195
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +95 -89
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js +430 -387
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +488 -478
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +523 -512
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +83 -75
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +116 -108
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +67 -61
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +90 -73
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +80 -72
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +70 -53
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +289 -255
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +92 -84
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +63 -55
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js +339 -311
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +40 -32
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +174 -150
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +385 -381
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +302 -273
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js +87 -59
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +82 -75
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +81 -77
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +78 -71
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BusinessSettingsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/BusinessSettingsPage.tsx"],"sourcesContent":["/**\n * Business Settings Page\n *\n * Tabbed interface (general/contact/location/operating/policies/notifications/integrations),\n * all form fields per tab including social media, coordinates, delivery charges,\n * payment methods, policy textareas, notification toggles, payment gateway config.\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useState } from 'react';\nimport {\n Store,\n FileText,\n CreditCard,\n Building2,\n Save,\n AlertCircle,\n MapPin,\n Clock,\n Shield,\n Bell,\n Link2,\n CheckCircle2,\n Globe,\n Phone,\n Mail,\n Instagram,\n Twitter,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype TabId =\n | 'general'\n | 'contact'\n | 'location'\n | 'operating'\n | 'policies'\n | 'notifications'\n | 'integration';\n\ninterface Tab {\n id: TabId;\n label: string;\n icon: typeof Store;\n}\n\ninterface GeneralSettings {\n businessName: string;\n description: string;\n category: string;\n gstNumber: string;\n panNumber: string;\n fssaiLicense: string;\n establishedYear: string;\n}\n\ninterface ContactSettings {\n phone: string;\n email: string;\n website: string;\n whatsapp: string;\n instagram: string;\n twitter: string;\n facebook: string;\n}\n\ninterface LocationSettings {\n address: string;\n city: string;\n state: string;\n pincode: string;\n latitude: string;\n longitude: string;\n deliveryRadius: number;\n deliveryCharge: number;\n freeDeliveryAbove: number;\n}\n\ninterface OperatingSettings {\n autoAcceptOrders: boolean;\n preparationTime: number;\n maxConcurrentOrders: number;\n advanceBookingDays: number;\n}\n\ninterface PolicySettings {\n returnPolicy: string;\n cancellationPolicy: string;\n privacyPolicy: string;\n termsOfService: string;\n}\n\ninterface NotificationSettings {\n newOrderEmail: boolean;\n newOrderSms: boolean;\n newOrderPush: boolean;\n orderUpdateEmail: boolean;\n orderUpdatePush: boolean;\n dailySummaryEmail: boolean;\n weeklySummaryEmail: boolean;\n lowStockAlert: boolean;\n reviewNotification: boolean;\n marketingEmails: boolean;\n}\n\ninterface IntegrationSettings {\n paymentGateway: string;\n paymentGatewayKey: string;\n smsProvider: string;\n smsApiKey: string;\n analyticsId: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst tabs: Tab[] = [\n { id: 'general', label: 'General', icon: Store },\n { id: 'contact', label: 'Contact', icon: Phone },\n { id: 'location', label: 'Location', icon: MapPin },\n { id: 'operating', label: 'Operating', icon: Clock },\n { id: 'policies', label: 'Policies', icon: Shield },\n { id: 'notifications', label: 'Notifications', icon: Bell },\n { id: 'integration', label: 'Integrations', icon: Link2 },\n];\n\nconst categories = [\n 'Food & Beverage',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Clothing & Fashion',\n 'Health & Wellness',\n 'Education & Skills',\n 'Retail & Merchandise',\n 'Grocery & Essentials',\n];\n\n// ============================================================================\n// Form Field Component\n// ============================================================================\n\ninterface FormFieldProps {\n label: string;\n value: string | number;\n onChange: (value: string) => void;\n type?: 'text' | 'email' | 'tel' | 'url' | 'number' | 'textarea' | 'select';\n options?: string[];\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\nconst FormField = ({\n label,\n value,\n onChange,\n type = 'text',\n options,\n placeholder,\n hint,\n rows = 3,\n}: FormFieldProps) => {\n const id = label.toLowerCase().replace(/\\s+/g, '-');\n return (\n <div>\n <label htmlFor={id} className=\"block text-sm font-medium text-text-primary mb-1.5\">\n {label}\n </label>\n {type === 'textarea' ? (\n <textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n ) : type === 'select' ? (\n <select\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {options?.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n )}\n {hint && <p className=\"mt-1 text-xs text-text-secondary\">{hint}</p>}\n </div>\n );\n};\n\n// ============================================================================\n// Toggle Component\n// ============================================================================\n\nconst Toggle = ({\n label,\n description,\n checked,\n onChange,\n}: {\n label: string;\n description?: string;\n checked: boolean;\n onChange: (v: boolean) => void;\n}) => (\n <div className=\"flex items-center justify-between py-3\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{label}</p>\n {description && <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onChange(!checked)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n checked ? 'bg-action-primary-bg' : 'bg-muted-foreground/30'\n )}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n </div>\n);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const BusinessSettingsPage = () => {\n const { navigateTo } = useKadaikodi();\n const [activeTab, setActiveTab] = useState<TabId>('general');\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n // Form state\n const [general, setGeneral] = useState<GeneralSettings>({\n businessName: 'Dosa Express',\n description:\n 'Authentic South Indian street food with a modern twist. Serving crispy dosas, filter coffee, and more since 2020.',\n category: 'Food & Beverage',\n gstNumber: '29ABCDE1234F1Z5',\n panNumber: 'ABCDE1234F',\n fssaiLicense: '12345678',\n establishedYear: '2020',\n });\n\n const [contact, setContact] = useState<ContactSettings>({\n phone: '+91-9876543210',\n email: 'ravi@dosaexpress.in',\n website: 'https://dosaexpress.in',\n whatsapp: '+91-9876543210',\n instagram: '@dosaexpress',\n twitter: '@dosaexpress',\n facebook: 'dosaexpress',\n });\n\n const [location, setLocation] = useState<LocationSettings>({\n address: 'Koramangala 5th Block',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560034',\n latitude: '12.9352',\n longitude: '77.6245',\n deliveryRadius: 5,\n deliveryCharge: 30,\n freeDeliveryAbove: 300,\n });\n\n const [operating, setOperating] = useState<OperatingSettings>({\n autoAcceptOrders: true,\n preparationTime: 15,\n maxConcurrentOrders: 10,\n advanceBookingDays: 3,\n });\n\n const [policies, setPolicies] = useState<PolicySettings>({\n returnPolicy:\n 'Items can be returned within 30 minutes of delivery if there are quality issues. Refund will be processed within 2-3 business days.',\n cancellationPolicy:\n 'Orders can be cancelled within 2 minutes of placing. After preparation starts, cancellation is not allowed.',\n privacyPolicy:\n 'We collect and process your data in accordance with applicable privacy laws. Your data is never shared with third parties without consent.',\n termsOfService:\n 'By using our services, you agree to our terms. All prices are inclusive of taxes unless stated otherwise.',\n });\n\n const [notifications, setNotifications] = useState<NotificationSettings>({\n newOrderEmail: true,\n newOrderSms: true,\n newOrderPush: true,\n orderUpdateEmail: true,\n orderUpdatePush: true,\n dailySummaryEmail: true,\n weeklySummaryEmail: false,\n lowStockAlert: true,\n reviewNotification: true,\n marketingEmails: false,\n });\n\n const [integration, setIntegration] = useState<IntegrationSettings>({\n paymentGateway: 'razorpay',\n paymentGatewayKey: 'rzp_live_xxxxxxxx',\n smsProvider: 'twilio',\n smsApiKey: '',\n analyticsId: '',\n });\n\n const handleSave = () => {\n setSaving(true);\n setTimeout(() => {\n setSaving(false);\n setSaved(true);\n setTimeout(() => setSaved(false), 3000);\n }, 1000);\n };\n\n const updateGeneral = (field: keyof GeneralSettings) => (value: string) =>\n setGeneral((p) => ({ ...p, [field]: value }));\n const updateContact = (field: keyof ContactSettings) => (value: string) =>\n setContact((p) => ({ ...p, [field]: value }));\n const updateLocation = (field: keyof LocationSettings) => (value: string) =>\n setLocation((p) => ({\n ...p,\n [field]:\n field === 'deliveryRadius' || field === 'deliveryCharge' || field === 'freeDeliveryAbove'\n ? parseInt(value) || 0\n : value,\n }));\n const updatePolicies = (field: keyof PolicySettings) => (value: string) =>\n setPolicies((p) => ({ ...p, [field]: value }));\n const updateNotification = (field: keyof NotificationSettings) => (value: boolean) =>\n setNotifications((p) => ({ ...p, [field]: value }));\n const updateIntegration = (field: keyof IntegrationSettings) => (value: string) =>\n setIntegration((p) => ({ ...p, [field]: value }));\n\n // ---- Tab content renderers ----\n\n const renderGeneralTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Business Name\"\n value={general.businessName}\n onChange={updateGeneral('businessName')}\n />\n <FormField\n label=\"Description\"\n value={general.description}\n onChange={updateGeneral('description')}\n type=\"textarea\"\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Category\"\n value={general.category}\n onChange={updateGeneral('category')}\n type=\"select\"\n options={categories}\n />\n <FormField\n label=\"Established Year\"\n value={general.establishedYear}\n onChange={updateGeneral('establishedYear')}\n />\n </div>\n <div className=\"flex items-start gap-3 rounded-md bg-[var(--color-accent-soft)] border border-border-focus/20 p-3\">\n <AlertCircle className=\"h-4 w-4 text-text-primary shrink-0 mt-0.5\" />\n <p className=\"text-xs text-text-primary\">\n GST, PAN, and FSSAI details are used for invoicing and compliance. Changes require\n verification.\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"GST Number\"\n value={general.gstNumber}\n onChange={updateGeneral('gstNumber')}\n hint=\"15-digit GST ID\"\n />\n <FormField\n label=\"PAN Number\"\n value={general.panNumber}\n onChange={updateGeneral('panNumber')}\n hint=\"10-digit PAN\"\n />\n <FormField\n label=\"FSSAI License\"\n value={general.fssaiLicense}\n onChange={updateGeneral('fssaiLicense')}\n hint=\"FSSAI license number\"\n />\n </div>\n </div>\n );\n\n const renderContactTab = () => (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Phone\"\n value={contact.phone}\n onChange={updateContact('phone')}\n type=\"tel\"\n />\n <FormField\n label=\"Email\"\n value={contact.email}\n onChange={updateContact('email')}\n type=\"email\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Website\"\n value={contact.website}\n onChange={updateContact('website')}\n type=\"url\"\n placeholder=\"https://\"\n />\n <FormField\n label=\"WhatsApp\"\n value={contact.whatsapp}\n onChange={updateContact('whatsapp')}\n type=\"tel\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Social Media</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Instagram\"\n value={contact.instagram}\n onChange={updateContact('instagram')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Twitter / X\"\n value={contact.twitter}\n onChange={updateContact('twitter')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Facebook\"\n value={contact.facebook}\n onChange={updateContact('facebook')}\n placeholder=\"Page name\"\n />\n </div>\n </div>\n );\n\n const renderLocationTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Address\"\n value={location.address}\n onChange={updateLocation('address')}\n type=\"textarea\"\n rows={2}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField label=\"City\" value={location.city} onChange={updateLocation('city')} />\n <FormField label=\"State\" value={location.state} onChange={updateLocation('state')} />\n <FormField label=\"Pincode\" value={location.pincode} onChange={updateLocation('pincode')} />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Latitude\"\n value={location.latitude}\n onChange={updateLocation('latitude')}\n hint=\"e.g., 12.9352\"\n />\n <FormField\n label=\"Longitude\"\n value={location.longitude}\n onChange={updateLocation('longitude')}\n hint=\"e.g., 77.6245\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Delivery Settings</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Delivery Radius (km)\"\n value={location.deliveryRadius}\n onChange={updateLocation('deliveryRadius')}\n type=\"number\"\n />\n <FormField\n label=\"Delivery Charge (₹)\"\n value={location.deliveryCharge}\n onChange={updateLocation('deliveryCharge')}\n type=\"number\"\n />\n <FormField\n label=\"Free Delivery Above (₹)\"\n value={location.freeDeliveryAbove}\n onChange={updateLocation('freeDeliveryAbove')}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderOperatingTab = () => (\n <div className=\"space-y-5\">\n <Toggle\n label=\"Auto-Accept Orders\"\n description=\"Automatically accept incoming orders without manual confirmation\"\n checked={operating.autoAcceptOrders}\n onChange={(v) => setOperating((p) => ({ ...p, autoAcceptOrders: v }))}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Default Preparation Time (min)\"\n value={operating.preparationTime}\n onChange={(v) => setOperating((p) => ({ ...p, preparationTime: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Max Concurrent Orders\"\n value={operating.maxConcurrentOrders}\n onChange={(v) => setOperating((p) => ({ ...p, maxConcurrentOrders: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Advance Booking (days)\"\n value={operating.advanceBookingDays}\n onChange={(v) => setOperating((p) => ({ ...p, advanceBookingDays: parseInt(v) || 0 }))}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderPoliciesTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Return Policy\"\n value={policies.returnPolicy}\n onChange={updatePolicies('returnPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Cancellation Policy\"\n value={policies.cancellationPolicy}\n onChange={updatePolicies('cancellationPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Privacy Policy\"\n value={policies.privacyPolicy}\n onChange={updatePolicies('privacyPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Terms of Service\"\n value={policies.termsOfService}\n onChange={updatePolicies('termsOfService')}\n type=\"textarea\"\n rows={4}\n />\n </div>\n );\n\n const renderNotificationsTab = () => (\n <div className=\"space-y-1 divide-y divide-border\">\n <h3 className=\"text-sm font-semibold text-text-primary pb-2\">New Orders</h3>\n <Toggle\n label=\"Email Notification\"\n description=\"Receive email for new orders\"\n checked={notifications.newOrderEmail}\n onChange={updateNotification('newOrderEmail')}\n />\n <Toggle\n label=\"SMS Notification\"\n description=\"Receive SMS for new orders\"\n checked={notifications.newOrderSms}\n onChange={updateNotification('newOrderSms')}\n />\n <Toggle\n label=\"Push Notification\"\n description=\"Receive push notifications for new orders\"\n checked={notifications.newOrderPush}\n onChange={updateNotification('newOrderPush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Order Updates</h3>\n <Toggle\n label=\"Email Updates\"\n description=\"Get email when order status changes\"\n checked={notifications.orderUpdateEmail}\n onChange={updateNotification('orderUpdateEmail')}\n />\n <Toggle\n label=\"Push Updates\"\n description=\"Get push notifications for order updates\"\n checked={notifications.orderUpdatePush}\n onChange={updateNotification('orderUpdatePush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Reports & Alerts</h3>\n <Toggle\n label=\"Daily Summary\"\n description=\"Receive daily business summary email\"\n checked={notifications.dailySummaryEmail}\n onChange={updateNotification('dailySummaryEmail')}\n />\n <Toggle\n label=\"Weekly Summary\"\n description=\"Receive weekly performance report\"\n checked={notifications.weeklySummaryEmail}\n onChange={updateNotification('weeklySummaryEmail')}\n />\n <Toggle\n label=\"Low Stock Alert\"\n description=\"Get alerted when items are low on stock\"\n checked={notifications.lowStockAlert}\n onChange={updateNotification('lowStockAlert')}\n />\n <Toggle\n label=\"Review Notifications\"\n description=\"Get notified for new customer reviews\"\n checked={notifications.reviewNotification}\n onChange={updateNotification('reviewNotification')}\n />\n <Toggle\n label=\"Marketing Emails\"\n description=\"Receive tips and promotional content\"\n checked={notifications.marketingEmails}\n onChange={updateNotification('marketingEmails')}\n />\n </div>\n );\n\n const renderIntegrationTab = () => (\n <div className=\"space-y-5\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Payment Gateway</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.paymentGateway}\n onChange={(e) => updateIntegration('paymentGateway')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"razorpay\">Razorpay</option>\n <option value=\"paytm\">Paytm</option>\n <option value=\"stripe\">Stripe</option>\n <option value=\"phonepe\">PhonePe</option>\n </select>\n </div>\n <FormField\n label=\"API Key\"\n value={integration.paymentGatewayKey}\n onChange={updateIntegration('paymentGatewayKey')}\n placeholder=\"Enter API key\"\n hint=\"Keep this secret\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">SMS Provider</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.smsProvider}\n onChange={(e) => updateIntegration('smsProvider')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"twilio\">Twilio</option>\n <option value=\"msg91\">MSG91</option>\n <option value=\"textlocal\">Textlocal</option>\n </select>\n </div>\n <FormField\n label=\"SMS API Key\"\n value={integration.smsApiKey}\n onChange={updateIntegration('smsApiKey')}\n placeholder=\"Enter SMS API key\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Analytics</h3>\n <FormField\n label=\"Google Analytics ID\"\n value={integration.analyticsId}\n onChange={updateIntegration('analyticsId')}\n placeholder=\"GA-XXXXXXXXX\"\n />\n </div>\n );\n\n const ActiveIcon = tabs.find((t) => t.id === activeTab)?.icon || Store;\n\n return (\n <PageLayout\n title=\"Business Settings\"\n description=\"Manage your business profile and configuration\"\n actions={\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n }\n >\n <div className=\"flex flex-col lg:flex-row gap-6\">\n {/* Mobile Tab Navigation */}\n <div className=\"lg:hidden\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 shadow-sm\">\n <div className=\"grid grid-cols-4 gap-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-md px-2 py-2 text-xs font-medium transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Desktop Sidebar */}\n <div className=\"hidden lg:block lg:w-56 shrink-0\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm sticky top-24\">\n <div className=\"p-4 border-b border-border-subtle\">\n <h2 className=\"font-semibold text-text-primary text-sm\">Settings</h2>\n </div>\n <nav className=\"p-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full text-left px-3 py-2 rounded-md mb-1 flex items-center gap-3 text-sm transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary font-medium'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 sm:p-6 shadow-sm\">\n {activeTab === 'general' && renderGeneralTab()}\n {activeTab === 'contact' && renderContactTab()}\n {activeTab === 'location' && renderLocationTab()}\n {activeTab === 'operating' && renderOperatingTab()}\n {activeTab === 'policies' && renderPoliciesTab()}\n {activeTab === 'notifications' && renderNotificationsTab()}\n {activeTab === 'integration' && renderIntegrationTab()}\n\n {/* Save Button (bottom) */}\n <div className=\"flex justify-end mt-8 pt-6 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-6 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BusinessSettingsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/BusinessSettingsPage.tsx"],"sourcesContent":["/**\n * Business Settings Page\n *\n * Tabbed interface (general/contact/location/operating/policies/notifications/integrations),\n * all form fields per tab including social media, coordinates, delivery charges,\n * payment methods, policy textareas, notification toggles, payment gateway config.\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useState } from 'react';\nimport {\n Store,\n FileText,\n CreditCard,\n Building2,\n Save,\n AlertCircle,\n MapPin,\n Clock,\n Shield,\n Bell,\n Link2,\n CheckCircle2,\n Globe,\n Phone,\n Mail,\n Instagram,\n Twitter,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype TabId =\n | 'general'\n | 'contact'\n | 'location'\n | 'operating'\n | 'policies'\n | 'notifications'\n | 'integration';\n\ninterface Tab {\n id: TabId;\n label: string;\n icon: typeof Store;\n}\n\ninterface GeneralSettings {\n businessName: string;\n description: string;\n category: string;\n gstNumber: string;\n panNumber: string;\n fssaiLicense: string;\n establishedYear: string;\n}\n\ninterface ContactSettings {\n phone: string;\n email: string;\n website: string;\n whatsapp: string;\n instagram: string;\n twitter: string;\n facebook: string;\n}\n\ninterface LocationSettings {\n address: string;\n city: string;\n state: string;\n pincode: string;\n latitude: string;\n longitude: string;\n deliveryRadius: number;\n deliveryCharge: number;\n freeDeliveryAbove: number;\n}\n\ninterface OperatingSettings {\n autoAcceptOrders: boolean;\n preparationTime: number;\n maxConcurrentOrders: number;\n advanceBookingDays: number;\n}\n\ninterface PolicySettings {\n returnPolicy: string;\n cancellationPolicy: string;\n privacyPolicy: string;\n termsOfService: string;\n}\n\ninterface NotificationSettings {\n newOrderEmail: boolean;\n newOrderSms: boolean;\n newOrderPush: boolean;\n orderUpdateEmail: boolean;\n orderUpdatePush: boolean;\n dailySummaryEmail: boolean;\n weeklySummaryEmail: boolean;\n lowStockAlert: boolean;\n reviewNotification: boolean;\n marketingEmails: boolean;\n}\n\ninterface IntegrationSettings {\n paymentGateway: string;\n paymentGatewayKey: string;\n smsProvider: string;\n smsApiKey: string;\n analyticsId: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst tabs: Tab[] = [\n { id: 'general', label: 'General', icon: Store },\n { id: 'contact', label: 'Contact', icon: Phone },\n { id: 'location', label: 'Location', icon: MapPin },\n { id: 'operating', label: 'Operating', icon: Clock },\n { id: 'policies', label: 'Policies', icon: Shield },\n { id: 'notifications', label: 'Notifications', icon: Bell },\n { id: 'integration', label: 'Integrations', icon: Link2 },\n];\n\nconst categories = [\n 'Food & Beverage',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Clothing & Fashion',\n 'Health & Wellness',\n 'Education & Skills',\n 'Retail & Merchandise',\n 'Grocery & Essentials',\n];\n\n// ============================================================================\n// Form Field Component\n// ============================================================================\n\ninterface FormFieldProps {\n label: string;\n value: string | number;\n onChange: (value: string) => void;\n type?: 'text' | 'email' | 'tel' | 'url' | 'number' | 'textarea' | 'select';\n options?: string[];\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\nconst FormField = ({\n label,\n value,\n onChange,\n type = 'text',\n options,\n placeholder,\n hint,\n rows = 3,\n}: FormFieldProps) => {\n const id = label.toLowerCase().replace(/\\s+/g, '-');\n return (\n <div>\n <label htmlFor={id} className=\"block text-sm font-medium text-text-primary mb-1.5\">\n {label}\n </label>\n {type === 'textarea' ? (\n <textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n ) : type === 'select' ? (\n <select\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {options?.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n )}\n {hint && <p className=\"mt-1 text-xs text-text-secondary\">{hint}</p>}\n </div>\n );\n};\n\n// ============================================================================\n// Toggle Component\n// ============================================================================\n\nconst Toggle = ({\n label,\n description,\n checked,\n onChange,\n}: {\n label: string;\n description?: string;\n checked: boolean;\n onChange: (v: boolean) => void;\n}) => (\n <div className=\"flex items-center justify-between py-3\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{label}</p>\n {description && <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onChange(!checked)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n checked ? 'bg-action-primary-bg' : 'bg-muted-foreground/30'\n )}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n </div>\n);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const BusinessSettingsPage = () => {\n const { navigateTo } = useKadaikodi();\n const [activeTab, setActiveTab] = useState<TabId>('general');\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n // Form state\n const [general, setGeneral] = useState<GeneralSettings>({\n businessName: 'Dosa Express',\n description:\n 'Authentic South Indian street food with a modern twist. Serving crispy dosas, filter coffee, and more since 2020.',\n category: 'Food & Beverage',\n gstNumber: '29ABCDE1234F1Z5',\n panNumber: 'ABCDE1234F',\n fssaiLicense: '12345678',\n establishedYear: '2020',\n });\n\n const [contact, setContact] = useState<ContactSettings>({\n phone: '+91-9876543210',\n email: 'ravi@dosaexpress.in',\n website: 'https://dosaexpress.in',\n whatsapp: '+91-9876543210',\n instagram: '@dosaexpress',\n twitter: '@dosaexpress',\n facebook: 'dosaexpress',\n });\n\n const [location, setLocation] = useState<LocationSettings>({\n address: 'Koramangala 5th Block',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560034',\n latitude: '12.9352',\n longitude: '77.6245',\n deliveryRadius: 5,\n deliveryCharge: 30,\n freeDeliveryAbove: 300,\n });\n\n const [operating, setOperating] = useState<OperatingSettings>({\n autoAcceptOrders: true,\n preparationTime: 15,\n maxConcurrentOrders: 10,\n advanceBookingDays: 3,\n });\n\n const [policies, setPolicies] = useState<PolicySettings>({\n returnPolicy:\n 'Items can be returned within 30 minutes of delivery if there are quality issues. Refund will be processed within 2-3 business days.',\n cancellationPolicy:\n 'Orders can be cancelled within 2 minutes of placing. After preparation starts, cancellation is not allowed.',\n privacyPolicy:\n 'We collect and process your data in accordance with applicable privacy laws. Your data is never shared with third parties without consent.',\n termsOfService:\n 'By using our services, you agree to our terms. All prices are inclusive of taxes unless stated otherwise.',\n });\n\n const [notifications, setNotifications] = useState<NotificationSettings>({\n newOrderEmail: true,\n newOrderSms: true,\n newOrderPush: true,\n orderUpdateEmail: true,\n orderUpdatePush: true,\n dailySummaryEmail: true,\n weeklySummaryEmail: false,\n lowStockAlert: true,\n reviewNotification: true,\n marketingEmails: false,\n });\n\n const [integration, setIntegration] = useState<IntegrationSettings>({\n paymentGateway: 'razorpay',\n paymentGatewayKey: 'rzp_live_xxxxxxxx',\n smsProvider: 'twilio',\n smsApiKey: '',\n analyticsId: '',\n });\n\n const handleSave = () => {\n setSaving(true);\n setTimeout(() => {\n setSaving(false);\n setSaved(true);\n setTimeout(() => setSaved(false), 3000);\n }, 1000);\n };\n\n const updateGeneral = (field: keyof GeneralSettings) => (value: string) =>\n setGeneral((p) => ({ ...p, [field]: value }));\n const updateContact = (field: keyof ContactSettings) => (value: string) =>\n setContact((p) => ({ ...p, [field]: value }));\n const updateLocation = (field: keyof LocationSettings) => (value: string) =>\n setLocation((p) => ({\n ...p,\n [field]:\n field === 'deliveryRadius' || field === 'deliveryCharge' || field === 'freeDeliveryAbove'\n ? parseInt(value) || 0\n : value,\n }));\n const updatePolicies = (field: keyof PolicySettings) => (value: string) =>\n setPolicies((p) => ({ ...p, [field]: value }));\n const updateNotification = (field: keyof NotificationSettings) => (value: boolean) =>\n setNotifications((p) => ({ ...p, [field]: value }));\n const updateIntegration = (field: keyof IntegrationSettings) => (value: string) =>\n setIntegration((p) => ({ ...p, [field]: value }));\n\n // ---- Tab content renderers ----\n\n const renderGeneralTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Business Name\"\n value={general.businessName}\n onChange={updateGeneral('businessName')}\n />\n <FormField\n label=\"Description\"\n value={general.description}\n onChange={updateGeneral('description')}\n type=\"textarea\"\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Category\"\n value={general.category}\n onChange={updateGeneral('category')}\n type=\"select\"\n options={categories}\n />\n <FormField\n label=\"Established Year\"\n value={general.establishedYear}\n onChange={updateGeneral('establishedYear')}\n />\n </div>\n <div className=\"flex items-start gap-3 rounded-md bg-[var(--color-accent-soft)] border border-border-focus/20 p-3\">\n <AlertCircle className=\"h-4 w-4 text-text-primary shrink-0 mt-0.5\" />\n <p className=\"text-xs text-text-primary\">\n GST, PAN, and FSSAI details are used for invoicing and compliance. Changes require\n verification.\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"GST Number\"\n value={general.gstNumber}\n onChange={updateGeneral('gstNumber')}\n hint=\"15-digit GST ID\"\n />\n <FormField\n label=\"PAN Number\"\n value={general.panNumber}\n onChange={updateGeneral('panNumber')}\n hint=\"10-digit PAN\"\n />\n <FormField\n label=\"FSSAI License\"\n value={general.fssaiLicense}\n onChange={updateGeneral('fssaiLicense')}\n hint=\"FSSAI license number\"\n />\n </div>\n </div>\n );\n\n const renderContactTab = () => (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Phone\"\n value={contact.phone}\n onChange={updateContact('phone')}\n type=\"tel\"\n />\n <FormField\n label=\"Email\"\n value={contact.email}\n onChange={updateContact('email')}\n type=\"email\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Website\"\n value={contact.website}\n onChange={updateContact('website')}\n type=\"url\"\n placeholder=\"https://\"\n />\n <FormField\n label=\"WhatsApp\"\n value={contact.whatsapp}\n onChange={updateContact('whatsapp')}\n type=\"tel\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Social Media</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Instagram\"\n value={contact.instagram}\n onChange={updateContact('instagram')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Twitter / X\"\n value={contact.twitter}\n onChange={updateContact('twitter')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Facebook\"\n value={contact.facebook}\n onChange={updateContact('facebook')}\n placeholder=\"Page name\"\n />\n </div>\n </div>\n );\n\n const renderLocationTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Address\"\n value={location.address}\n onChange={updateLocation('address')}\n type=\"textarea\"\n rows={2}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField label=\"City\" value={location.city} onChange={updateLocation('city')} />\n <FormField label=\"State\" value={location.state} onChange={updateLocation('state')} />\n <FormField label=\"Pincode\" value={location.pincode} onChange={updateLocation('pincode')} />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Latitude\"\n value={location.latitude}\n onChange={updateLocation('latitude')}\n hint=\"e.g., 12.9352\"\n />\n <FormField\n label=\"Longitude\"\n value={location.longitude}\n onChange={updateLocation('longitude')}\n hint=\"e.g., 77.6245\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Delivery Settings</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Delivery Radius (km)\"\n value={location.deliveryRadius}\n onChange={updateLocation('deliveryRadius')}\n type=\"number\"\n />\n <FormField\n label=\"Delivery Charge (₹)\"\n value={location.deliveryCharge}\n onChange={updateLocation('deliveryCharge')}\n type=\"number\"\n />\n <FormField\n label=\"Free Delivery Above (₹)\"\n value={location.freeDeliveryAbove}\n onChange={updateLocation('freeDeliveryAbove')}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderOperatingTab = () => (\n <div className=\"space-y-5\">\n <Toggle\n label=\"Auto-Accept Orders\"\n description=\"Automatically accept incoming orders without manual confirmation\"\n checked={operating.autoAcceptOrders}\n onChange={(v) => setOperating((p) => ({ ...p, autoAcceptOrders: v }))}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Default Preparation Time (min)\"\n value={operating.preparationTime}\n onChange={(v) => setOperating((p) => ({ ...p, preparationTime: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Max Concurrent Orders\"\n value={operating.maxConcurrentOrders}\n onChange={(v) => setOperating((p) => ({ ...p, maxConcurrentOrders: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Advance Booking (days)\"\n value={operating.advanceBookingDays}\n onChange={(v) => setOperating((p) => ({ ...p, advanceBookingDays: parseInt(v) || 0 }))}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderPoliciesTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Return Policy\"\n value={policies.returnPolicy}\n onChange={updatePolicies('returnPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Cancellation Policy\"\n value={policies.cancellationPolicy}\n onChange={updatePolicies('cancellationPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Privacy Policy\"\n value={policies.privacyPolicy}\n onChange={updatePolicies('privacyPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Terms of Service\"\n value={policies.termsOfService}\n onChange={updatePolicies('termsOfService')}\n type=\"textarea\"\n rows={4}\n />\n </div>\n );\n\n const renderNotificationsTab = () => (\n <div className=\"space-y-1 divide-y divide-border\">\n <h3 className=\"text-sm font-semibold text-text-primary pb-2\">New Orders</h3>\n <Toggle\n label=\"Email Notification\"\n description=\"Receive email for new orders\"\n checked={notifications.newOrderEmail}\n onChange={updateNotification('newOrderEmail')}\n />\n <Toggle\n label=\"SMS Notification\"\n description=\"Receive SMS for new orders\"\n checked={notifications.newOrderSms}\n onChange={updateNotification('newOrderSms')}\n />\n <Toggle\n label=\"Push Notification\"\n description=\"Receive push notifications for new orders\"\n checked={notifications.newOrderPush}\n onChange={updateNotification('newOrderPush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Order Updates</h3>\n <Toggle\n label=\"Email Updates\"\n description=\"Get email when order status changes\"\n checked={notifications.orderUpdateEmail}\n onChange={updateNotification('orderUpdateEmail')}\n />\n <Toggle\n label=\"Push Updates\"\n description=\"Get push notifications for order updates\"\n checked={notifications.orderUpdatePush}\n onChange={updateNotification('orderUpdatePush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Reports & Alerts</h3>\n <Toggle\n label=\"Daily Summary\"\n description=\"Receive daily business summary email\"\n checked={notifications.dailySummaryEmail}\n onChange={updateNotification('dailySummaryEmail')}\n />\n <Toggle\n label=\"Weekly Summary\"\n description=\"Receive weekly performance report\"\n checked={notifications.weeklySummaryEmail}\n onChange={updateNotification('weeklySummaryEmail')}\n />\n <Toggle\n label=\"Low Stock Alert\"\n description=\"Get alerted when items are low on stock\"\n checked={notifications.lowStockAlert}\n onChange={updateNotification('lowStockAlert')}\n />\n <Toggle\n label=\"Review Notifications\"\n description=\"Get notified for new customer reviews\"\n checked={notifications.reviewNotification}\n onChange={updateNotification('reviewNotification')}\n />\n <Toggle\n label=\"Marketing Emails\"\n description=\"Receive tips and promotional content\"\n checked={notifications.marketingEmails}\n onChange={updateNotification('marketingEmails')}\n />\n </div>\n );\n\n const renderIntegrationTab = () => (\n <div className=\"space-y-5\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Payment Gateway</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.paymentGateway}\n onChange={(e) => updateIntegration('paymentGateway')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"razorpay\">Razorpay</option>\n <option value=\"paytm\">Paytm</option>\n <option value=\"stripe\">Stripe</option>\n <option value=\"phonepe\">PhonePe</option>\n </select>\n </div>\n <FormField\n label=\"API Key\"\n value={integration.paymentGatewayKey}\n onChange={updateIntegration('paymentGatewayKey')}\n placeholder=\"Enter API key\"\n hint=\"Keep this secret\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">SMS Provider</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.smsProvider}\n onChange={(e) => updateIntegration('smsProvider')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"twilio\">Twilio</option>\n <option value=\"msg91\">MSG91</option>\n <option value=\"textlocal\">Textlocal</option>\n </select>\n </div>\n <FormField\n label=\"SMS API Key\"\n value={integration.smsApiKey}\n onChange={updateIntegration('smsApiKey')}\n placeholder=\"Enter SMS API key\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Analytics</h3>\n <FormField\n label=\"Google Analytics ID\"\n value={integration.analyticsId}\n onChange={updateIntegration('analyticsId')}\n placeholder=\"GA-XXXXXXXXX\"\n />\n </div>\n );\n\n const ActiveIcon = tabs.find((t) => t.id === activeTab)?.icon || Store;\n\n return (\n <PageLayout\n title=\"Business Settings\"\n description=\"Manage your business profile and configuration\"\n actions={\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n Your business's public identity and ground rules. Use this page to set your business name\n and branding, contact details and location, operating hours, and the policies (refunds,\n delivery radius, taxes) customers agree to — plus the alerts you receive and any integrations\n you connect. These details shape how customers find and trust your cart.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-owner-business-settings\"\n className=\"mb-6\"\n steps={[\n {\n id: 'location',\n label: 'Confirm your location & hours',\n description: 'So customers know where and when to find you.',\n onClick: () => setActiveTab('location'),\n },\n {\n id: 'policies',\n label: 'Set your policies',\n description: 'Refunds, delivery radius and taxes.',\n onClick: () => setActiveTab('policies'),\n },\n {\n id: 'config',\n label: 'Configure your service types',\n description: 'Pickup, delivery and scheduled stops.',\n onClick: () => navigateTo('/cart-owner/service-config'),\n },\n ]}\n />\n\n <div className=\"flex flex-col lg:flex-row gap-6\">\n {/* Mobile Tab Navigation */}\n <div className=\"lg:hidden\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 shadow-sm\">\n <div className=\"grid grid-cols-4 gap-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-md px-2 py-2 text-xs font-medium transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Desktop Sidebar */}\n <div className=\"hidden lg:block lg:w-56 shrink-0\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm sticky top-24\">\n <div className=\"p-4 border-b border-border-subtle\">\n <h2 className=\"font-semibold text-text-primary text-sm\">Settings</h2>\n </div>\n <nav className=\"p-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full text-left px-3 py-2 rounded-md mb-1 flex items-center gap-3 text-sm transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary font-medium'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content — the one emphasis zone for this page */}\n <div className=\"flex-1 min-w-0\">\n <EmphasisPanel className=\"p-5 sm:p-6\">\n {activeTab === 'general' && renderGeneralTab()}\n {activeTab === 'contact' && renderContactTab()}\n {activeTab === 'location' && renderLocationTab()}\n {activeTab === 'operating' && renderOperatingTab()}\n {activeTab === 'policies' && renderPoliciesTab()}\n {activeTab === 'notifications' && renderNotificationsTab()}\n {activeTab === 'integration' && renderIntegrationTab()}\n\n {/* Save Button (bottom) */}\n <div className=\"flex justify-end mt-8 pt-6 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-6 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n </div>\n </EmphasisPanel>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -6,8 +6,9 @@ import { mockAdminAnalytics as i } from "../../mocks/data.js";
|
|
|
6
6
|
import { useState as a } from "react";
|
|
7
7
|
import { Activity as o, AlertCircle as s, ArrowRight as c, BarChart3 as l, Bell as u, CheckCircle as d, ChevronRight as f, Clock as p, Edit as m, Eye as h, Flame as g, IndianRupee as _, MapPin as v, Package as y, Plus as b, Settings as x, ShoppingCart as S, Star as C, TrendingDown as w, TrendingUp as T, UserCheck as E, Users as D } from "lucide-react";
|
|
8
8
|
import { jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
9
|
+
import { EmphasisPanel as A, NextSteps as j, PagePurpose as M } from "@burdenoff/fe-libs/ui";
|
|
9
10
|
//#region src/kadaikodi/pages/cart-owner/CartOwnerDashboard.tsx
|
|
10
|
-
var
|
|
11
|
+
var N = {
|
|
11
12
|
totalRevenue: 45230,
|
|
12
13
|
dailyRevenue: 1850,
|
|
13
14
|
ordersToday: 23,
|
|
@@ -16,7 +17,7 @@ var A = {
|
|
|
16
17
|
averageOrderValue: 80,
|
|
17
18
|
customerCount: 342,
|
|
18
19
|
rating: 4.2
|
|
19
|
-
},
|
|
20
|
+
}, P = [
|
|
20
21
|
{
|
|
21
22
|
id: "ORD-001",
|
|
22
23
|
customerName: "Rahul Sharma",
|
|
@@ -61,7 +62,7 @@ var A = {
|
|
|
61
62
|
timestamp: "2 mins ago",
|
|
62
63
|
priority: "urgent"
|
|
63
64
|
}
|
|
64
|
-
],
|
|
65
|
+
], F = [
|
|
65
66
|
{
|
|
66
67
|
name: "Masala Dosa",
|
|
67
68
|
quantity: 245,
|
|
@@ -87,7 +88,7 @@ var A = {
|
|
|
87
88
|
quantity: 98,
|
|
88
89
|
revenue: 8820
|
|
89
90
|
}
|
|
90
|
-
],
|
|
91
|
+
], I = [
|
|
91
92
|
{
|
|
92
93
|
name: "Ramesh Kumar",
|
|
93
94
|
role: "Chef",
|
|
@@ -108,7 +109,7 @@ var A = {
|
|
|
108
109
|
role: "Manager",
|
|
109
110
|
status: "active"
|
|
110
111
|
}
|
|
111
|
-
],
|
|
112
|
+
], L = [
|
|
112
113
|
{
|
|
113
114
|
id: "1",
|
|
114
115
|
message: "New order #ORD-004 received",
|
|
@@ -139,43 +140,43 @@ var A = {
|
|
|
139
140
|
type: "warning",
|
|
140
141
|
time: "1 hr ago"
|
|
141
142
|
}
|
|
142
|
-
],
|
|
143
|
+
], R = i.orderTrends.slice(0, 7), z = () => {
|
|
143
144
|
let e = (/* @__PURE__ */ new Date()).getHours();
|
|
144
145
|
return e < 12 ? "Good Morning" : e < 17 ? "Good Afternoon" : "Good Evening";
|
|
145
|
-
},
|
|
146
|
+
}, B = {
|
|
146
147
|
pending: "bg-status-error-bg-subtle text-status-error-text",
|
|
147
148
|
preparing: "bg-status-warning-bg-subtle text-status-warning-text",
|
|
148
149
|
ready: "bg-[var(--color-accent-soft)] text-text-primary",
|
|
149
150
|
delivered: "bg-status-success-bg-subtle text-status-success-text",
|
|
150
151
|
cancelled: "bg-bg-sunken text-text-secondary"
|
|
151
|
-
},
|
|
152
|
+
}, V = {
|
|
152
153
|
active: "bg-status-success-text",
|
|
153
154
|
"on-break": "bg-status-warning-text",
|
|
154
155
|
"off-duty": "bg-muted-foreground"
|
|
155
|
-
},
|
|
156
|
+
}, H = {
|
|
156
157
|
info: "text-text-primary",
|
|
157
158
|
warning: "text-status-warning-text",
|
|
158
159
|
success: "text-status-success-text"
|
|
159
|
-
},
|
|
160
|
-
let { navigateTo: i } = e(), [
|
|
160
|
+
}, U = () => {
|
|
161
|
+
let { navigateTo: i } = e(), [U, W] = a(P), [G, K] = a({
|
|
161
162
|
isOpen: !0,
|
|
162
163
|
currentLocation: "Koramangala 5th Block, Near BDA Complex",
|
|
163
164
|
lastUpdate: (/* @__PURE__ */ new Date()).toLocaleTimeString(),
|
|
164
165
|
operatingHours: "9:00 AM - 9:00 PM"
|
|
165
|
-
}),
|
|
166
|
-
|
|
166
|
+
}), q = (e) => {
|
|
167
|
+
W((t) => t.map((t) => t.id === e ? {
|
|
167
168
|
...t,
|
|
168
169
|
status: "preparing"
|
|
169
170
|
} : t));
|
|
170
|
-
},
|
|
171
|
-
|
|
171
|
+
}, J = (e) => {
|
|
172
|
+
W((t) => t.map((t) => t.id === e ? {
|
|
172
173
|
...t,
|
|
173
174
|
status: "ready"
|
|
174
175
|
} : t));
|
|
175
176
|
};
|
|
176
177
|
return /* @__PURE__ */ O(n, {
|
|
177
178
|
title: /* @__PURE__ */ k("span", { children: [
|
|
178
|
-
|
|
179
|
+
z(),
|
|
179
180
|
", ",
|
|
180
181
|
/* @__PURE__ */ O("span", {
|
|
181
182
|
className: "text-text-secondary font-normal",
|
|
@@ -192,23 +193,47 @@ var A = {
|
|
|
192
193
|
children: /* @__PURE__ */ k("div", {
|
|
193
194
|
className: "space-y-6",
|
|
194
195
|
children: [
|
|
196
|
+
/* @__PURE__ */ O(M, { children: "Run your mobile cart business from one screen — flip your service open or closed, watch today's revenue and orders roll in, and jump to your menu, staff, or order queue. Open your service and set up your offerings to start taking orders." }),
|
|
197
|
+
/* @__PURE__ */ O(j, {
|
|
198
|
+
storageKey: "kadaikodi-cartowner-dashboard",
|
|
199
|
+
steps: [
|
|
200
|
+
{
|
|
201
|
+
id: "offerings",
|
|
202
|
+
label: "Set up your offerings",
|
|
203
|
+
description: "Add the dishes and items customers can order from your cart.",
|
|
204
|
+
onClick: () => i("/cart-owner/inventory")
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: "service-config",
|
|
208
|
+
label: "Configure service & hours",
|
|
209
|
+
description: "Define your operating hours, location and service area.",
|
|
210
|
+
onClick: () => i("/cart-owner/service-config")
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
id: "orders",
|
|
214
|
+
label: "Manage incoming orders",
|
|
215
|
+
description: "Accept, prepare and fulfil customer orders in real time.",
|
|
216
|
+
onClick: () => i("/cart-owner/orders")
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}),
|
|
195
220
|
/* @__PURE__ */ O("div", {
|
|
196
|
-
className: t("p-4 rounded-lg border-l-4",
|
|
221
|
+
className: t("p-4 rounded-lg border-l-4", G.isOpen ? "border-status-success-text bg-status-success-bg-subtle" : "border-status-error-text bg-status-error-bg-subtle"),
|
|
197
222
|
children: /* @__PURE__ */ k("div", {
|
|
198
223
|
className: "flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4",
|
|
199
224
|
children: [/* @__PURE__ */ k("div", {
|
|
200
225
|
className: "flex items-start gap-3",
|
|
201
|
-
children: [/* @__PURE__ */ O("div", { className: t("w-3 h-3 rounded-full mt-1 shrink-0",
|
|
226
|
+
children: [/* @__PURE__ */ O("div", { className: t("w-3 h-3 rounded-full mt-1 shrink-0", G.isOpen ? "bg-status-success-text" : "bg-status-error-text") }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("h3", {
|
|
202
227
|
className: "font-semibold text-text-primary text-sm",
|
|
203
|
-
children: ["Service Status: ",
|
|
228
|
+
children: ["Service Status: ", G.isOpen ? "Open" : "Closed"]
|
|
204
229
|
}), /* @__PURE__ */ k("div", {
|
|
205
230
|
className: "flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-1 text-xs text-text-secondary",
|
|
206
231
|
children: [/* @__PURE__ */ k("span", {
|
|
207
232
|
className: "flex items-center gap-1",
|
|
208
|
-
children: [/* @__PURE__ */ O(v, { className: "h-3 w-3 shrink-0" }),
|
|
233
|
+
children: [/* @__PURE__ */ O(v, { className: "h-3 w-3 shrink-0" }), G.currentLocation]
|
|
209
234
|
}), /* @__PURE__ */ k("span", {
|
|
210
235
|
className: "flex items-center gap-1",
|
|
211
|
-
children: [/* @__PURE__ */ O(p, { className: "h-3 w-3 shrink-0" }),
|
|
236
|
+
children: [/* @__PURE__ */ O(p, { className: "h-3 w-3 shrink-0" }), G.operatingHours]
|
|
212
237
|
})]
|
|
213
238
|
})] })]
|
|
214
239
|
}), /* @__PURE__ */ k("div", {
|
|
@@ -221,18 +246,18 @@ var A = {
|
|
|
221
246
|
}), /* @__PURE__ */ O("button", {
|
|
222
247
|
type: "button",
|
|
223
248
|
onClick: () => {
|
|
224
|
-
|
|
249
|
+
K((e) => e && {
|
|
225
250
|
...e,
|
|
226
251
|
isOpen: !e.isOpen
|
|
227
252
|
});
|
|
228
253
|
},
|
|
229
|
-
className: t("inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
|
|
230
|
-
children:
|
|
254
|
+
className: t("inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", G.isOpen ? "bg-status-error-bg-subtle text-status-error-text hover:bg-status-error-bg-subtle" : "bg-status-success-bg-subtle text-status-success-text hover:bg-status-success-bg-subtle"),
|
|
255
|
+
children: G.isOpen ? "Close Service" : "Open Service"
|
|
231
256
|
})]
|
|
232
257
|
})]
|
|
233
258
|
})
|
|
234
259
|
}),
|
|
235
|
-
/* @__PURE__ */ k(
|
|
260
|
+
/* @__PURE__ */ k(A, { children: [/* @__PURE__ */ O("h2", {
|
|
236
261
|
className: "text-base font-semibold text-text-primary mb-3",
|
|
237
262
|
children: "Today's Performance"
|
|
238
263
|
}), /* @__PURE__ */ O("div", {
|
|
@@ -240,28 +265,28 @@ var A = {
|
|
|
240
265
|
children: [
|
|
241
266
|
{
|
|
242
267
|
label: "Daily Revenue",
|
|
243
|
-
value: r(
|
|
268
|
+
value: r(N.dailyRevenue, { minimumFractionDigits: 0 }),
|
|
244
269
|
icon: _,
|
|
245
270
|
trend: "+15.2% vs yesterday",
|
|
246
271
|
trendUp: !0
|
|
247
272
|
},
|
|
248
273
|
{
|
|
249
274
|
label: "Orders Today",
|
|
250
|
-
value: String(
|
|
275
|
+
value: String(N.ordersToday),
|
|
251
276
|
icon: S,
|
|
252
277
|
trend: "+8.5% vs yesterday",
|
|
253
278
|
trendUp: !0
|
|
254
279
|
},
|
|
255
280
|
{
|
|
256
281
|
label: "Avg Order Value",
|
|
257
|
-
value: r(
|
|
282
|
+
value: r(N.averageOrderValue, { minimumFractionDigits: 0 }),
|
|
258
283
|
icon: T,
|
|
259
284
|
trend: "+3.2% vs last week",
|
|
260
285
|
trendUp: !0
|
|
261
286
|
},
|
|
262
287
|
{
|
|
263
288
|
label: "Service Rating",
|
|
264
|
-
value:
|
|
289
|
+
value: N.rating.toFixed(1),
|
|
265
290
|
icon: C,
|
|
266
291
|
trend: "Based on 342 reviews",
|
|
267
292
|
trendUp: !0
|
|
@@ -360,7 +385,7 @@ var A = {
|
|
|
360
385
|
})]
|
|
361
386
|
}), /* @__PURE__ */ O("div", {
|
|
362
387
|
className: "space-y-3",
|
|
363
|
-
children:
|
|
388
|
+
children: U.map((e) => /* @__PURE__ */ O("div", {
|
|
364
389
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
|
|
365
390
|
children: /* @__PURE__ */ k("div", {
|
|
366
391
|
className: "flex flex-col lg:flex-row lg:items-start lg:justify-between gap-3",
|
|
@@ -375,7 +400,7 @@ var A = {
|
|
|
375
400
|
children: ["#", e.id]
|
|
376
401
|
}),
|
|
377
402
|
/* @__PURE__ */ O("span", {
|
|
378
|
-
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize",
|
|
403
|
+
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize", B[e.status] || "bg-bg-sunken text-text-secondary"),
|
|
379
404
|
children: e.status
|
|
380
405
|
}),
|
|
381
406
|
e.priority === "urgent" && /* @__PURE__ */ O(s, { className: "h-4 w-4 text-status-error-text" })
|
|
@@ -411,13 +436,13 @@ var A = {
|
|
|
411
436
|
}),
|
|
412
437
|
e.status === "pending" && /* @__PURE__ */ k("button", {
|
|
413
438
|
type: "button",
|
|
414
|
-
onClick: () =>
|
|
439
|
+
onClick: () => q(e.id),
|
|
415
440
|
className: "inline-flex items-center gap-1 rounded-md bg-status-success-bg-subtle px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors",
|
|
416
441
|
children: [/* @__PURE__ */ O(d, { className: "h-3 w-3" }), "Accept"]
|
|
417
442
|
}),
|
|
418
443
|
e.status === "preparing" && /* @__PURE__ */ k("button", {
|
|
419
444
|
type: "button",
|
|
420
|
-
onClick: () =>
|
|
445
|
+
onClick: () => J(e.id),
|
|
421
446
|
className: "inline-flex items-center gap-1 rounded-md bg-[var(--color-accent-soft)] px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors",
|
|
422
447
|
children: [/* @__PURE__ */ O(d, { className: "h-3 w-3" }), "Mark Ready"]
|
|
423
448
|
})
|
|
@@ -463,8 +488,8 @@ var A = {
|
|
|
463
488
|
children: "Trend"
|
|
464
489
|
})
|
|
465
490
|
]
|
|
466
|
-
}) }), /* @__PURE__ */ O("tbody", { children:
|
|
467
|
-
let n = Math.max(...
|
|
491
|
+
}) }), /* @__PURE__ */ O("tbody", { children: R.map((e, t) => {
|
|
492
|
+
let n = Math.max(...R.map((e) => e.revenue)), i = e.revenue / n * 100;
|
|
468
493
|
return /* @__PURE__ */ k("tr", {
|
|
469
494
|
className: "border-b border-border-subtle last:border-0",
|
|
470
495
|
children: [
|
|
@@ -512,7 +537,7 @@ var A = {
|
|
|
512
537
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
513
538
|
children: [/* @__PURE__ */ O("div", {
|
|
514
539
|
className: "text-xl font-bold text-text-primary",
|
|
515
|
-
children: r(
|
|
540
|
+
children: r(N.totalRevenue, { minimumFractionDigits: 0 })
|
|
516
541
|
}), /* @__PURE__ */ O("div", {
|
|
517
542
|
className: "text-xs text-text-secondary mt-1",
|
|
518
543
|
children: "Total Revenue"
|
|
@@ -522,7 +547,7 @@ var A = {
|
|
|
522
547
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
523
548
|
children: [/* @__PURE__ */ O("div", {
|
|
524
549
|
className: "text-xl font-bold text-text-primary",
|
|
525
|
-
children:
|
|
550
|
+
children: N.totalOrders
|
|
526
551
|
}), /* @__PURE__ */ O("div", {
|
|
527
552
|
className: "text-xs text-text-secondary mt-1",
|
|
528
553
|
children: "Total Orders"
|
|
@@ -532,7 +557,7 @@ var A = {
|
|
|
532
557
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
533
558
|
children: [/* @__PURE__ */ O("div", {
|
|
534
559
|
className: "text-xl font-bold text-text-primary",
|
|
535
|
-
children:
|
|
560
|
+
children: N.customerCount
|
|
536
561
|
}), /* @__PURE__ */ O("div", {
|
|
537
562
|
className: "text-xs text-text-secondary mt-1",
|
|
538
563
|
children: "Unique Customers"
|
|
@@ -554,13 +579,13 @@ var A = {
|
|
|
554
579
|
children: [/* @__PURE__ */ O(u, { className: "h-4 w-4" }), "Notifications"]
|
|
555
580
|
}), /* @__PURE__ */ O("span", {
|
|
556
581
|
className: "inline-flex items-center justify-center rounded-full bg-status-error-text text-white text-[10px] font-bold h-5 w-5",
|
|
557
|
-
children:
|
|
582
|
+
children: L.length
|
|
558
583
|
})]
|
|
559
584
|
}), /* @__PURE__ */ O("div", {
|
|
560
585
|
className: "space-y-3",
|
|
561
|
-
children:
|
|
586
|
+
children: L.map((e) => /* @__PURE__ */ k("div", {
|
|
562
587
|
className: "flex items-start gap-2",
|
|
563
|
-
children: [/* @__PURE__ */ O(o, { className: t("h-4 w-4 mt-0.5 shrink-0",
|
|
588
|
+
children: [/* @__PURE__ */ O(o, { className: t("h-4 w-4 mt-0.5 shrink-0", H[e.type]) }), /* @__PURE__ */ k("div", {
|
|
564
589
|
className: "min-w-0",
|
|
565
590
|
children: [/* @__PURE__ */ O("p", {
|
|
566
591
|
className: "text-xs text-text-primary leading-tight",
|
|
@@ -580,7 +605,7 @@ var A = {
|
|
|
580
605
|
children: [/* @__PURE__ */ O(g, { className: "h-4 w-4 text-status-warning-text" }), "Top Selling Items"]
|
|
581
606
|
}), /* @__PURE__ */ O("div", {
|
|
582
607
|
className: "space-y-3",
|
|
583
|
-
children:
|
|
608
|
+
children: F.map((e, t) => /* @__PURE__ */ k("div", {
|
|
584
609
|
className: "flex items-center justify-between",
|
|
585
610
|
children: [/* @__PURE__ */ k("div", {
|
|
586
611
|
className: "flex items-center gap-2 min-w-0",
|
|
@@ -619,11 +644,11 @@ var A = {
|
|
|
619
644
|
})]
|
|
620
645
|
}), /* @__PURE__ */ O("div", {
|
|
621
646
|
className: "space-y-3",
|
|
622
|
-
children:
|
|
647
|
+
children: I.map((e) => /* @__PURE__ */ k("div", {
|
|
623
648
|
className: "flex items-center justify-between",
|
|
624
649
|
children: [/* @__PURE__ */ k("div", {
|
|
625
650
|
className: "flex items-center gap-2",
|
|
626
|
-
children: [/* @__PURE__ */ O("div", { className: t("w-2 h-2 rounded-full",
|
|
651
|
+
children: [/* @__PURE__ */ O("div", { className: t("w-2 h-2 rounded-full", V[e.status]) }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
627
652
|
className: "text-xs font-medium text-text-primary",
|
|
628
653
|
children: e.name
|
|
629
654
|
}), /* @__PURE__ */ O("p", {
|
|
@@ -652,7 +677,7 @@ var A = {
|
|
|
652
677
|
children: "Active Offerings"
|
|
653
678
|
}), /* @__PURE__ */ O("span", {
|
|
654
679
|
className: "text-sm font-semibold text-text-primary",
|
|
655
|
-
children:
|
|
680
|
+
children: N.activeOfferings
|
|
656
681
|
})]
|
|
657
682
|
}),
|
|
658
683
|
/* @__PURE__ */ k("div", {
|
|
@@ -662,7 +687,7 @@ var A = {
|
|
|
662
687
|
children: "Customer Rating"
|
|
663
688
|
}), /* @__PURE__ */ k("span", {
|
|
664
689
|
className: "text-sm font-semibold text-text-primary flex items-center gap-1",
|
|
665
|
-
children: [/* @__PURE__ */ O(C, { className: "h-3 w-3 text-status-warning-text fill-status-warning-text" }),
|
|
690
|
+
children: [/* @__PURE__ */ O(C, { className: "h-3 w-3 text-status-warning-text fill-status-warning-text" }), N.rating]
|
|
666
691
|
})]
|
|
667
692
|
}),
|
|
668
693
|
/* @__PURE__ */ k("div", {
|
|
@@ -672,7 +697,7 @@ var A = {
|
|
|
672
697
|
children: "Total Customers"
|
|
673
698
|
}), /* @__PURE__ */ O("span", {
|
|
674
699
|
className: "text-sm font-semibold text-text-primary",
|
|
675
|
-
children:
|
|
700
|
+
children: N.customerCount
|
|
676
701
|
})]
|
|
677
702
|
})
|
|
678
703
|
]
|
|
@@ -755,6 +780,6 @@ var A = {
|
|
|
755
780
|
});
|
|
756
781
|
};
|
|
757
782
|
//#endregion
|
|
758
|
-
export {
|
|
783
|
+
export { U as CartOwnerDashboard };
|
|
759
784
|
|
|
760
785
|
//# sourceMappingURL=CartOwnerDashboard.js.map
|