@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":"WorkerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/worker/WorkerDashboard.tsx"],"sourcesContent":["/**\n * Worker Dashboard Page\n *\n * Full-featured worker dashboard with:\n * - Loading state with spinner\n * - Clock In/Out toggle with time tracking\n * - Quick Actions bar\n * - 6 stat cards (Completed, In Progress, Pending, Hours Worked, Efficiency, Rating)\n * - Current Task section with complete/pause buttons\n * - Assigned Tasks list sorted by priority\n * - Recently Completed section\n * - Performance Metrics grid\n * - Shift Information section\n *\n * @module kadaikodi/pages/worker\n */\n\nimport { useState } from 'react';\nimport {\n CheckCircle2,\n Star,\n ClipboardList,\n Clock,\n MapPin,\n ChevronRight,\n Package,\n Loader2,\n Timer,\n Pause,\n Play,\n Truck,\n ChefHat,\n Boxes,\n Sparkles,\n CalendarDays,\n User,\n TrendingUp,\n Zap,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useWorkerTasks,\n useWorkerStats,\n useUpdateWorkerTaskStatus,\n useWorkerClockInOut,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst priorityStyles: Record<string, string> = {\n high: 'bg-status-error-bg-subtle text-status-error-text',\n medium: 'bg-status-warning-bg-subtle text-status-warning-text',\n low: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-secondary text-secondary-foreground',\n in_progress: 'bg-[var(--color-accent-soft)] text-text-primary',\n completed: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nfunction getTaskIcon(type: string) {\n switch (type) {\n case 'delivery':\n return Truck;\n case 'preparation':\n return ChefHat;\n case 'inventory':\n return Boxes;\n case 'cleanup':\n return Sparkles;\n default:\n return ClipboardList;\n }\n}\n\nconst priorityOrder: Record<string, number> = { high: 3, medium: 2, low: 1 };\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerDashboard = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n const workerId = currentUser?.id || '';\n\n const { data: tasks = [], isLoading: isLoadingTasks } = useWorkerTasks(workerId);\n const { data: stats, isLoading: isLoadingStats } = useWorkerStats(workerId);\n const updateTaskStatus = useUpdateWorkerTaskStatus();\n const clockInOut = useWorkerClockInOut();\n\n const [activeTaskId, setActiveTaskId] = useState<string | null>(null);\n const [isClockedIn, setIsClockedIn] = useState(false);\n const [clockInTime, setClockInTime] = useState<string | null>(null);\n\n const handleTaskAction = async (taskId: string, action: 'start' | 'complete' | 'pause') => {\n let status = '';\n switch (action) {\n case 'start':\n status = 'IN_PROGRESS';\n setActiveTaskId(taskId);\n break;\n case 'complete':\n status = 'COMPLETED';\n if (activeTaskId === taskId) setActiveTaskId(null);\n break;\n case 'pause':\n status = 'PENDING';\n if (activeTaskId === taskId) setActiveTaskId(null);\n break;\n }\n\n try {\n await updateTaskStatus.mutateAsync({ taskId, status });\n } catch (error) {\n console.error('Failed to update task status:', error);\n alert('Failed to update task status. Please try again.');\n }\n };\n\n const handleClockToggle = async () => {\n const action = isClockedIn ? 'CLOCK_OUT' : 'CLOCK_IN';\n try {\n const result = await clockInOut.mutateAsync({ workerId, action });\n if (result.success) {\n if (isClockedIn) {\n setIsClockedIn(false);\n setClockInTime(null);\n } else {\n const now = new Date().toLocaleTimeString('en-IN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n });\n setIsClockedIn(true);\n setClockInTime(now);\n }\n alert(result.message || `${isClockedIn ? 'Clocked out' : 'Clocked in'} successfully`);\n }\n } catch (error) {\n console.error('Failed to clock in/out:', error);\n alert('Action failed. Please try again.');\n }\n };\n\n // Loading state\n if (isLoadingTasks || isLoadingStats) {\n return (\n <PageLayout title=\"Dashboard\" description=\"Your work overview for today\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading your dashboard...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const currentTask = activeTaskId ? tasks.find((t) => t.id === activeTaskId) : null;\n const assignedTasks = tasks\n .filter((t) => t.status !== 'completed')\n .sort((a, b) => (priorityOrder[b.priority] ?? 0) - (priorityOrder[a.priority] ?? 0));\n const completedTasks = tasks.filter((t) => t.status === 'completed');\n\n return (\n <PageLayout\n title=\"Dashboard\"\n description=\"Manage your tasks and assignments\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"space-y-6\">\n {/* Quick Actions */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Quick Actions</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Package className=\"h-4 w-4\" />\n My Orders\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/schedule')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <CalendarDays className=\"h-4 w-4\" />\n Schedule\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/profile')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <User className=\"h-4 w-4\" />\n Profile\n </button>\n <button\n type=\"button\"\n onClick={handleClockToggle}\n className={cn(\n 'flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors',\n isClockedIn\n ? 'bg-status-error-bg-subtle text-status-error-text border border-status-error-text/30 hover:bg-status-error-bg-subtle'\n : 'bg-status-success-bg-subtle text-status-success-text border border-status-success-text/30 hover:bg-status-success-bg-subtle'\n )}\n >\n <Timer className=\"h-4 w-4\" />\n {isClockedIn ? 'Clock Out' : 'Clock In'}\n </button>\n </div>\n </div>\n\n {/* Today's Overview + Clock-in status */}\n {stats && (\n <div>\n <div className=\"flex items-center justify-between mb-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">Today's Overview</h2>\n {isClockedIn && clockInTime && (\n <div className=\"flex items-center gap-2 rounded-lg bg-status-success-bg-subtle border border-status-success-text/20 px-3 py-1.5\">\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-status-success-text opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-status-success-text\" />\n </span>\n <span className=\"text-xs font-medium text-status-success-text\">\n Working since {clockInTime}\n </span>\n </div>\n )}\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-success-bg-subtle text-status-success-text\">\n <CheckCircle2 className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {stats.tasksCompleted}\n </p>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-[var(--color-accent-soft)] text-text-primary\">\n <Play className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.tasksInProgress}</p>\n <p className=\"text-xs text-text-secondary\">In Progress</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-warning-bg-subtle text-status-warning-text\">\n <Clock className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.tasksPending}</p>\n <p className=\"text-xs text-text-secondary\">Pending</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-accent-purple-subtle text-text-primary\">\n <Timer className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.hoursWorked}h</p>\n <p className=\"text-xs text-text-secondary\">Hours Worked</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-[var(--color-accent-soft)] text-text-primary\">\n <Zap className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.efficiency}%</p>\n <p className=\"text-xs text-text-secondary\">Efficiency</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-warning-bg-subtle text-status-warning-text\">\n <Star className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.rating}/5</p>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n </div>\n </div>\n )}\n\n {/* Current Task */}\n {currentTask && (\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Current Task</h2>\n <div className=\"rounded-lg border-2 border-border-focus/40 bg-[var(--color-accent-soft)] p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"flex items-start gap-3\">\n {(() => {\n const TaskIcon = getTaskIcon(currentTask.type);\n return (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--color-accent-soft)]\">\n <TaskIcon className=\"h-5 w-5 text-text-primary\" />\n </div>\n );\n })()}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">{currentTask.title}</h3>\n <p className=\"text-sm text-text-secondary mt-1\">{currentTask.description}</p>\n <div className=\"flex flex-wrap items-center gap-3 mt-2 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {currentTask.estimatedTime} min\n </span>\n {currentTask.dueTime && (\n <span className=\"flex items-center gap-1\">\n <Timer className=\"h-3.5 w-3.5\" />\n Due: {currentTask.dueTime}\n </span>\n )}\n {currentTask.location && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" />\n {currentTask.location}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 shrink-0\">\n <button\n type=\"button\"\n onClick={() => handleTaskAction(currentTask.id, 'complete')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-success-bg-subtle px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors\"\n >\n <CheckCircle2 className=\"h-4 w-4\" />\n Complete\n </button>\n <button\n type=\"button\"\n onClick={() => handleTaskAction(currentTask.id, 'pause')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Pause className=\"h-4 w-4\" />\n Pause\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Assigned Tasks */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Assigned Tasks</h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden\">\n {assignedTasks.length > 0 ? (\n <div className=\"divide-y divide-border\">\n {assignedTasks.map((task) => {\n const TaskIcon = getTaskIcon(task.type);\n return (\n <div key={task.id} className=\"p-4 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-bg-sunken\">\n <TaskIcon className=\"h-4.5 w-4.5 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm font-medium text-text-primary\">\n {task.title}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n priorityStyles[task.priority]\n )}\n >\n {task.priority}\n </span>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n statusStyles[task.status]\n )}\n >\n {task.status.replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary line-clamp-1\">\n {task.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 mt-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n {task.assignedBy}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {task.estimatedTime} min\n </span>\n {task.dueTime && (\n <span className=\"flex items-center gap-1\">\n <Timer className=\"h-3 w-3\" />\n Due: {task.dueTime}\n </span>\n )}\n {task.location && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {task.location}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 shrink-0\">\n {task.status === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleTaskAction(task.id, 'start')}\n disabled={activeTaskId !== null}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors',\n activeTaskId !== null\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-[var(--color-accent-soft)] text-text-primary hover:bg-[var(--color-accent-soft)]'\n )}\n >\n <Play className=\"h-3.5 w-3.5\" />\n Start\n </button>\n )}\n {task.status === 'in_progress' && task.id !== activeTaskId && (\n <button\n type=\"button\"\n onClick={() => setActiveTaskId(task.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Play className=\"h-3.5 w-3.5\" />\n Resume\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n Details\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"p-8 text-center\">\n <CheckCircle2 className=\"h-10 w-10 text-status-success-text opacity-40 mx-auto mb-2\" />\n <p className=\"text-sm text-text-secondary\">All tasks completed!</p>\n </div>\n )}\n </div>\n </div>\n\n {/* Recently Completed */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Recently Completed</h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n {completedTasks.length > 0 ? (\n <div className=\"space-y-3\">\n {completedTasks.slice(0, 3).map((task) => {\n const TaskIcon = getTaskIcon(task.type);\n return (\n <div\n key={task.id}\n className=\"flex items-center gap-3 p-3 rounded-lg bg-status-success-bg-subtle border border-status-success-text/10\"\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-status-success-bg-subtle\">\n <TaskIcon className=\"h-4 w-4 text-status-success-text\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{task.title}</p>\n <p className=\"text-xs text-text-secondary\">\n Completed at{' '}\n {new Date().toLocaleTimeString('en-IN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n })}\n </p>\n </div>\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n No completed tasks yet today\n </p>\n )}\n </div>\n </div>\n\n {/* Performance Metrics + Shift Information */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Performance This Week */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-4\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Performance This Week\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Tasks Completed</span>\n <span className=\"text-sm font-medium text-text-primary\">47</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Time per Task</span>\n <span className=\"text-sm font-medium text-text-primary\">23 min</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">On-time Completion</span>\n <span className=\"text-sm font-medium text-text-primary\">94%</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Customer Feedback</span>\n <span className=\"text-sm font-medium text-text-primary flex items-center gap-1\">\n 4.7/5\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n </span>\n </div>\n </div>\n </div>\n\n {/* Shift Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-4\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Shift Information\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Shift Start</span>\n <span className=\"text-sm font-medium text-text-primary\">9:00 AM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Shift End</span>\n <span className=\"text-sm font-medium text-text-primary\">6:00 PM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Break Time</span>\n <span className=\"text-sm font-medium text-text-primary\">1:00 PM - 2:00 PM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Supervisor</span>\n <span className=\"text-sm font-medium text-text-primary\">Rajesh Kumar</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Overall Stats */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Overall Performance</h2>\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Deliveries</p>\n <p className=\"text-lg font-bold text-text-primary\">{stats?.totalDeliveries || 0}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Total Earnings</p>\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(stats?.totalEarnings || 0, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Average Rating</p>\n <p className=\"text-lg font-bold text-text-primary flex items-center gap-1\">\n {stats?.averageRating || 0}\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completion Rate</p>\n <p className=\"text-lg font-bold text-text-primary\">{stats?.completionRate || 0}%</p>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/worker/WorkerDashboard.tsx"],"sourcesContent":["/**\n * Worker Dashboard Page\n *\n * Full-featured worker dashboard with:\n * - Loading state with spinner\n * - Clock In/Out toggle with time tracking\n * - Quick Actions bar\n * - 6 stat cards (Completed, In Progress, Pending, Hours Worked, Efficiency, Rating)\n * - Current Task section with complete/pause buttons\n * - Assigned Tasks list sorted by priority\n * - Recently Completed section\n * - Performance Metrics grid\n * - Shift Information section\n *\n * @module kadaikodi/pages/worker\n */\n\nimport { useState } from 'react';\nimport {\n CheckCircle2,\n Star,\n ClipboardList,\n Clock,\n MapPin,\n ChevronRight,\n Package,\n Loader2,\n Timer,\n Pause,\n Play,\n Truck,\n ChefHat,\n Boxes,\n Sparkles,\n CalendarDays,\n User,\n TrendingUp,\n Zap,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useWorkerTasks,\n useWorkerStats,\n useUpdateWorkerTaskStatus,\n useWorkerClockInOut,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst priorityStyles: Record<string, string> = {\n high: 'bg-status-error-bg-subtle text-status-error-text',\n medium: 'bg-status-warning-bg-subtle text-status-warning-text',\n low: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-secondary text-secondary-foreground',\n in_progress: 'bg-[var(--color-accent-soft)] text-text-primary',\n completed: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nfunction getTaskIcon(type: string) {\n switch (type) {\n case 'delivery':\n return Truck;\n case 'preparation':\n return ChefHat;\n case 'inventory':\n return Boxes;\n case 'cleanup':\n return Sparkles;\n default:\n return ClipboardList;\n }\n}\n\nconst priorityOrder: Record<string, number> = { high: 3, medium: 2, low: 1 };\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerDashboard = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n const workerId = currentUser?.id || '';\n\n const { data: tasks = [], isLoading: isLoadingTasks } = useWorkerTasks(workerId);\n const { data: stats, isLoading: isLoadingStats } = useWorkerStats(workerId);\n const updateTaskStatus = useUpdateWorkerTaskStatus();\n const clockInOut = useWorkerClockInOut();\n\n const [activeTaskId, setActiveTaskId] = useState<string | null>(null);\n const [isClockedIn, setIsClockedIn] = useState(false);\n const [clockInTime, setClockInTime] = useState<string | null>(null);\n\n const handleTaskAction = async (taskId: string, action: 'start' | 'complete' | 'pause') => {\n let status = '';\n switch (action) {\n case 'start':\n status = 'IN_PROGRESS';\n setActiveTaskId(taskId);\n break;\n case 'complete':\n status = 'COMPLETED';\n if (activeTaskId === taskId) setActiveTaskId(null);\n break;\n case 'pause':\n status = 'PENDING';\n if (activeTaskId === taskId) setActiveTaskId(null);\n break;\n }\n\n try {\n await updateTaskStatus.mutateAsync({ taskId, status });\n } catch (error) {\n console.error('Failed to update task status:', error);\n alert('Failed to update task status. Please try again.');\n }\n };\n\n const handleClockToggle = async () => {\n const action = isClockedIn ? 'CLOCK_OUT' : 'CLOCK_IN';\n try {\n const result = await clockInOut.mutateAsync({ workerId, action });\n if (result.success) {\n if (isClockedIn) {\n setIsClockedIn(false);\n setClockInTime(null);\n } else {\n const now = new Date().toLocaleTimeString('en-IN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n });\n setIsClockedIn(true);\n setClockInTime(now);\n }\n alert(result.message || `${isClockedIn ? 'Clocked out' : 'Clocked in'} successfully`);\n }\n } catch (error) {\n console.error('Failed to clock in/out:', error);\n alert('Action failed. Please try again.');\n }\n };\n\n // Loading state\n if (isLoadingTasks || isLoadingStats) {\n return (\n <PageLayout title=\"Dashboard\" description=\"Your work overview for today\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading your dashboard...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const currentTask = activeTaskId ? tasks.find((t) => t.id === activeTaskId) : null;\n const assignedTasks = tasks\n .filter((t) => t.status !== 'completed')\n .sort((a, b) => (priorityOrder[b.priority] ?? 0) - (priorityOrder[a.priority] ?? 0));\n const completedTasks = tasks.filter((t) => t.status === 'completed');\n\n return (\n <PageLayout\n title=\"Dashboard\"\n description=\"Manage your tasks and assignments\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose>\n Your shift command centre — see today's assigned deliveries and tasks at a glance, clock\n in/out, and jump straight into the order you're working on. Clock in first, then pick up\n your next task below.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-worker-dashboard\"\n steps={[\n {\n id: 'clock-in',\n label: 'Clock in to start your shift',\n description: 'Track your hours and let dispatch know you are available.',\n onClick: () => {\n if (!isClockedIn) handleClockToggle();\n },\n done: isClockedIn,\n },\n {\n id: 'orders',\n label: 'Review assigned orders',\n description: 'See what needs picking up and delivering today.',\n onClick: () => navigateTo('/worker/orders'),\n },\n {\n id: 'schedule',\n label: 'Check your schedule',\n description: 'Know your upcoming shifts and plan ahead.',\n onClick: () => navigateTo('/worker/schedule'),\n },\n ]}\n />\n\n {/* Quick Actions */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Quick Actions</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Package className=\"h-4 w-4\" />\n My Orders\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/schedule')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <CalendarDays className=\"h-4 w-4\" />\n Schedule\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/profile')}\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <User className=\"h-4 w-4\" />\n Profile\n </button>\n <button\n type=\"button\"\n onClick={handleClockToggle}\n className={cn(\n 'flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors',\n isClockedIn\n ? 'bg-status-error-bg-subtle text-status-error-text border border-status-error-text/30 hover:bg-status-error-bg-subtle'\n : 'bg-status-success-bg-subtle text-status-success-text border border-status-success-text/30 hover:bg-status-success-bg-subtle'\n )}\n >\n <Timer className=\"h-4 w-4\" />\n {isClockedIn ? 'Clock Out' : 'Clock In'}\n </button>\n </div>\n </div>\n\n {/* Today's Overview + Clock-in status — the one emphasis zone */}\n {stats && (\n <EmphasisPanel>\n <div className=\"flex items-center justify-between mb-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">Today's Overview</h2>\n {isClockedIn && clockInTime && (\n <div className=\"flex items-center gap-2 rounded-lg bg-status-success-bg-subtle border border-status-success-text/20 px-3 py-1.5\">\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-status-success-text opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-status-success-text\" />\n </span>\n <span className=\"text-xs font-medium text-status-success-text\">\n Working since {clockInTime}\n </span>\n </div>\n )}\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-success-bg-subtle text-status-success-text\">\n <CheckCircle2 className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {stats.tasksCompleted}\n </p>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-[var(--color-accent-soft)] text-text-primary\">\n <Play className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.tasksInProgress}</p>\n <p className=\"text-xs text-text-secondary\">In Progress</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-warning-bg-subtle text-status-warning-text\">\n <Clock className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.tasksPending}</p>\n <p className=\"text-xs text-text-secondary\">Pending</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-accent-purple-subtle text-text-primary\">\n <Timer className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.hoursWorked}h</p>\n <p className=\"text-xs text-text-secondary\">Hours Worked</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-[var(--color-accent-soft)] text-text-primary\">\n <Zap className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.efficiency}%</p>\n <p className=\"text-xs text-text-secondary\">Efficiency</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"inline-flex rounded-md p-1.5 bg-status-warning-bg-subtle text-status-warning-text\">\n <Star className=\"h-4 w-4\" />\n </div>\n </div>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.rating}/5</p>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </div>\n </div>\n </EmphasisPanel>\n )}\n\n {/* Current Task */}\n {currentTask && (\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Current Task</h2>\n <div className=\"rounded-lg border-2 border-border-focus/40 bg-[var(--color-accent-soft)] p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"flex items-start gap-3\">\n {(() => {\n const TaskIcon = getTaskIcon(currentTask.type);\n return (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--color-accent-soft)]\">\n <TaskIcon className=\"h-5 w-5 text-text-primary\" />\n </div>\n );\n })()}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary\">{currentTask.title}</h3>\n <p className=\"text-sm text-text-secondary mt-1\">{currentTask.description}</p>\n <div className=\"flex flex-wrap items-center gap-3 mt-2 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {currentTask.estimatedTime} min\n </span>\n {currentTask.dueTime && (\n <span className=\"flex items-center gap-1\">\n <Timer className=\"h-3.5 w-3.5\" />\n Due: {currentTask.dueTime}\n </span>\n )}\n {currentTask.location && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" />\n {currentTask.location}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 shrink-0\">\n <button\n type=\"button\"\n onClick={() => handleTaskAction(currentTask.id, 'complete')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-success-bg-subtle px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors\"\n >\n <CheckCircle2 className=\"h-4 w-4\" />\n Complete\n </button>\n <button\n type=\"button\"\n onClick={() => handleTaskAction(currentTask.id, 'pause')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Pause className=\"h-4 w-4\" />\n Pause\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Assigned Tasks */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Assigned Tasks</h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden\">\n {assignedTasks.length > 0 ? (\n <div className=\"divide-y divide-border\">\n {assignedTasks.map((task) => {\n const TaskIcon = getTaskIcon(task.type);\n return (\n <div key={task.id} className=\"p-4 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-bg-sunken\">\n <TaskIcon className=\"h-4.5 w-4.5 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm font-medium text-text-primary\">\n {task.title}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n priorityStyles[task.priority]\n )}\n >\n {task.priority}\n </span>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n statusStyles[task.status]\n )}\n >\n {task.status.replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary line-clamp-1\">\n {task.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 mt-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n {task.assignedBy}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {task.estimatedTime} min\n </span>\n {task.dueTime && (\n <span className=\"flex items-center gap-1\">\n <Timer className=\"h-3 w-3\" />\n Due: {task.dueTime}\n </span>\n )}\n {task.location && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {task.location}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 shrink-0\">\n {task.status === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleTaskAction(task.id, 'start')}\n disabled={activeTaskId !== null}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors',\n activeTaskId !== null\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-[var(--color-accent-soft)] text-text-primary hover:bg-[var(--color-accent-soft)]'\n )}\n >\n <Play className=\"h-3.5 w-3.5\" />\n Start\n </button>\n )}\n {task.status === 'in_progress' && task.id !== activeTaskId && (\n <button\n type=\"button\"\n onClick={() => setActiveTaskId(task.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Play className=\"h-3.5 w-3.5\" />\n Resume\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n Details\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"p-8 text-center\">\n <CheckCircle2 className=\"h-10 w-10 text-status-success-text opacity-40 mx-auto mb-2\" />\n <p className=\"text-sm text-text-secondary\">All tasks completed!</p>\n </div>\n )}\n </div>\n </div>\n\n {/* Recently Completed */}\n <div>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Recently Completed</h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n {completedTasks.length > 0 ? (\n <div className=\"space-y-3\">\n {completedTasks.slice(0, 3).map((task) => {\n const TaskIcon = getTaskIcon(task.type);\n return (\n <div\n key={task.id}\n className=\"flex items-center gap-3 p-3 rounded-lg bg-status-success-bg-subtle border border-status-success-text/10\"\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-status-success-bg-subtle\">\n <TaskIcon className=\"h-4 w-4 text-status-success-text\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{task.title}</p>\n <p className=\"text-xs text-text-secondary\">\n Completed at{' '}\n {new Date().toLocaleTimeString('en-IN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n })}\n </p>\n </div>\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary text-center py-4\">\n No completed tasks yet today\n </p>\n )}\n </div>\n </div>\n\n {/* Performance Metrics + Shift Information */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Performance This Week */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-4\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Performance This Week\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Tasks Completed</span>\n <span className=\"text-sm font-medium text-text-primary\">47</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Time per Task</span>\n <span className=\"text-sm font-medium text-text-primary\">23 min</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">On-time Completion</span>\n <span className=\"text-sm font-medium text-text-primary\">94%</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Customer Feedback</span>\n <span className=\"text-sm font-medium text-text-primary flex items-center gap-1\">\n 4.7/5\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n </span>\n </div>\n </div>\n </div>\n\n {/* Shift Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-4\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Shift Information\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Shift Start</span>\n <span className=\"text-sm font-medium text-text-primary\">9:00 AM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Shift End</span>\n <span className=\"text-sm font-medium text-text-primary\">6:00 PM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Break Time</span>\n <span className=\"text-sm font-medium text-text-primary\">1:00 PM - 2:00 PM</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">Supervisor</span>\n <span className=\"text-sm font-medium text-text-primary\">Rajesh Kumar</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Overall Stats */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Overall Performance</h2>\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Deliveries</p>\n <p className=\"text-lg font-bold text-text-primary\">{stats?.totalDeliveries || 0}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Total Earnings</p>\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(stats?.totalEarnings || 0, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Average Rating</p>\n <p className=\"text-lg font-bold text-text-primary flex items-center gap-1\">\n {stats?.averageRating || 0}\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completion Rate</p>\n <p className=\"text-lg font-bold text-text-primary\">{stats?.completionRate || 0}%</p>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -7,8 +7,9 @@ import { formatCurrency as a } from "../../utils/formatters.js";
|
|
|
7
7
|
import { useCallback as o, useEffect as s, useState as c } from "react";
|
|
8
8
|
import { AlertTriangle as l, ArrowRight as u, CheckCircle2 as d, ChefHat as f, ClipboardList as p, CreditCard as m, Loader2 as h, MapPin as g, Navigation as _, Package as v, Phone as y, PlayCircle as b, ShoppingBag as x, Star as S, Truck as C } from "lucide-react";
|
|
9
9
|
import { jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
10
|
+
import { EmphasisPanel as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
|
|
10
11
|
//#region src/kadaikodi/pages/worker/WorkerOrdersPage.tsx
|
|
11
|
-
var
|
|
12
|
+
var O = [
|
|
12
13
|
{
|
|
13
14
|
id: "task-001",
|
|
14
15
|
orderId: "ORD-2024-001",
|
|
@@ -124,11 +125,11 @@ var E = [
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
];
|
|
127
|
-
function
|
|
128
|
+
function k(e) {
|
|
128
129
|
let t = /* @__PURE__ */ new Date(), n = new Date(e), r = Math.floor((n.getTime() - t.getTime()) / (1e3 * 60));
|
|
129
130
|
return r < 0 ? "Overdue" : r < 60 ? `${r} min` : `${Math.floor(r / 60)}h ${r % 60}m`;
|
|
130
131
|
}
|
|
131
|
-
function
|
|
132
|
+
function A(e) {
|
|
132
133
|
switch (e) {
|
|
133
134
|
case "delivery": return {
|
|
134
135
|
icon: C,
|
|
@@ -152,7 +153,7 @@ function O(e) {
|
|
|
152
153
|
};
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
|
-
function
|
|
156
|
+
function j(e) {
|
|
156
157
|
switch (e) {
|
|
157
158
|
case "urgent": return "bg-status-error-bg-subtle text-status-error-text";
|
|
158
159
|
case "high": return "bg-status-warning-bg-subtle text-status-warning-text";
|
|
@@ -161,35 +162,35 @@ function k(e) {
|
|
|
161
162
|
default: return "bg-secondary text-secondary-foreground";
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
|
-
var
|
|
165
|
-
let { navigateTo: f } = e(), [v, x] = c(!0), [C,
|
|
165
|
+
var M = () => {
|
|
166
|
+
let { navigateTo: f } = e(), [v, x] = c(!0), [C, M] = c([]), [N, P] = c(null), [F, I] = c({
|
|
166
167
|
status: "",
|
|
167
168
|
type: "",
|
|
168
169
|
priority: "",
|
|
169
170
|
sortBy: "priority"
|
|
170
|
-
}), [
|
|
171
|
+
}), [L, R] = c({
|
|
171
172
|
totalTasks: 0,
|
|
172
173
|
completedToday: 0,
|
|
173
174
|
pendingTasks: 0,
|
|
174
175
|
averageTime: 0,
|
|
175
176
|
earnings: 0,
|
|
176
177
|
rating: 4.8
|
|
177
|
-
}), [,
|
|
178
|
+
}), [, z] = c(0);
|
|
178
179
|
s(() => {
|
|
179
|
-
let e = setInterval(() =>
|
|
180
|
+
let e = setInterval(() => z((e) => e + 1), 6e4);
|
|
180
181
|
return () => clearInterval(e);
|
|
181
182
|
}, []);
|
|
182
|
-
let
|
|
183
|
+
let B = o(() => {
|
|
183
184
|
x(!0), setTimeout(() => {
|
|
184
|
-
let e = [...
|
|
185
|
-
|
|
185
|
+
let e = [...O];
|
|
186
|
+
F.status && (e = e.filter((e) => e.status === F.status)), F.type && (e = e.filter((e) => e.type === F.type)), F.priority && (e = e.filter((e) => e.priority === F.priority));
|
|
186
187
|
let t = {
|
|
187
188
|
urgent: 0,
|
|
188
189
|
high: 1,
|
|
189
190
|
medium: 2,
|
|
190
191
|
low: 3
|
|
191
192
|
};
|
|
192
|
-
switch (
|
|
193
|
+
switch (F.sortBy) {
|
|
193
194
|
case "priority":
|
|
194
195
|
e.sort((e, n) => (t[e.priority] ?? 4) - (t[n.priority] ?? 4));
|
|
195
196
|
break;
|
|
@@ -200,7 +201,7 @@ var A = () => {
|
|
|
200
201
|
e.sort((e, t) => (e.distance ?? 999) - (t.distance ?? 999));
|
|
201
202
|
break;
|
|
202
203
|
}
|
|
203
|
-
|
|
204
|
+
M(e), P(O.find((e) => e.status === "in_progress") ?? null), R({
|
|
204
205
|
totalTasks: 45,
|
|
205
206
|
completedToday: 12,
|
|
206
207
|
pendingTasks: 3,
|
|
@@ -209,24 +210,24 @@ var A = () => {
|
|
|
209
210
|
rating: 4.8
|
|
210
211
|
}), x(!1);
|
|
211
212
|
}, 600);
|
|
212
|
-
}, [
|
|
213
|
+
}, [F]);
|
|
213
214
|
s(() => {
|
|
214
|
-
|
|
215
|
-
}, [
|
|
216
|
-
let
|
|
217
|
-
|
|
215
|
+
B();
|
|
216
|
+
}, [B]);
|
|
217
|
+
let V = (e, t) => {
|
|
218
|
+
I((n) => ({
|
|
218
219
|
...n,
|
|
219
220
|
[e]: t
|
|
220
221
|
}));
|
|
221
|
-
}, B = (e) => {
|
|
222
|
-
let t = E.find((t) => t.id === e);
|
|
223
|
-
t && (t.status = "in_progress", M(t), R());
|
|
224
|
-
}, V = (e) => {
|
|
225
|
-
let t = E.find((t) => t.id === e);
|
|
226
|
-
t && (t.status = "completed"), M(null), R(), alert("Task completed successfully");
|
|
227
222
|
}, H = (e) => {
|
|
228
|
-
|
|
223
|
+
let t = O.find((t) => t.id === e);
|
|
224
|
+
t && (t.status = "in_progress", P(t), B());
|
|
229
225
|
}, U = (e) => {
|
|
226
|
+
let t = O.find((t) => t.id === e);
|
|
227
|
+
t && (t.status = "completed"), P(null), B(), alert("Task completed successfully");
|
|
228
|
+
}, W = (e) => {
|
|
229
|
+
window.location.href = `tel:${e.replace(/\s/g, "")}`;
|
|
230
|
+
}, G = (e) => {
|
|
230
231
|
if (e.address) {
|
|
231
232
|
let t = encodeURIComponent(`${e.address.addressLine1}, ${e.address.city}`);
|
|
232
233
|
window.open(`https://maps.google.com?q=${t}`, "_blank");
|
|
@@ -245,13 +246,19 @@ var A = () => {
|
|
|
245
246
|
})]
|
|
246
247
|
})
|
|
247
248
|
})
|
|
248
|
-
}) : /* @__PURE__ */
|
|
249
|
+
}) : /* @__PURE__ */ T(n, {
|
|
249
250
|
title: "My Orders",
|
|
250
251
|
description: "Manage your assigned orders",
|
|
251
|
-
children: /* @__PURE__ */
|
|
252
|
+
children: [/* @__PURE__ */ w(D, {
|
|
253
|
+
className: "mb-6",
|
|
254
|
+
children: "Your work for the day, task by task. Use this page to see what's assigned to you, focus on your current task, and move jobs from pending to completed — while keeping an eye on your hours, earnings and rating. Open any task for full details and customer info so you can get it done right."
|
|
255
|
+
}), /* @__PURE__ */ T("div", {
|
|
252
256
|
className: "space-y-6",
|
|
253
257
|
children: [
|
|
254
|
-
/* @__PURE__ */ T("
|
|
258
|
+
/* @__PURE__ */ T(E, { children: [/* @__PURE__ */ w("h2", {
|
|
259
|
+
className: "mb-4 text-base font-semibold text-text-primary",
|
|
260
|
+
children: "Today at a Glance"
|
|
261
|
+
}), /* @__PURE__ */ T("div", {
|
|
255
262
|
className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",
|
|
256
263
|
children: [
|
|
257
264
|
/* @__PURE__ */ T("div", {
|
|
@@ -261,7 +268,7 @@ var A = () => {
|
|
|
261
268
|
children: "Today's Tasks"
|
|
262
269
|
}), /* @__PURE__ */ w("p", {
|
|
263
270
|
className: "text-2xl font-bold text-text-primary",
|
|
264
|
-
children:
|
|
271
|
+
children: L.totalTasks
|
|
265
272
|
})]
|
|
266
273
|
}),
|
|
267
274
|
/* @__PURE__ */ T("div", {
|
|
@@ -271,7 +278,7 @@ var A = () => {
|
|
|
271
278
|
children: "Completed"
|
|
272
279
|
}), /* @__PURE__ */ w("p", {
|
|
273
280
|
className: "text-2xl font-bold text-status-success-text",
|
|
274
|
-
children:
|
|
281
|
+
children: L.completedToday
|
|
275
282
|
})]
|
|
276
283
|
}),
|
|
277
284
|
/* @__PURE__ */ T("div", {
|
|
@@ -281,7 +288,7 @@ var A = () => {
|
|
|
281
288
|
children: "Pending"
|
|
282
289
|
}), /* @__PURE__ */ w("p", {
|
|
283
290
|
className: "text-2xl font-bold text-status-warning-text",
|
|
284
|
-
children:
|
|
291
|
+
children: L.pendingTasks
|
|
285
292
|
})]
|
|
286
293
|
}),
|
|
287
294
|
/* @__PURE__ */ T("div", {
|
|
@@ -291,7 +298,7 @@ var A = () => {
|
|
|
291
298
|
children: "Avg Time"
|
|
292
299
|
}), /* @__PURE__ */ T("p", {
|
|
293
300
|
className: "text-2xl font-bold text-text-primary",
|
|
294
|
-
children: [
|
|
301
|
+
children: [L.averageTime, " min"]
|
|
295
302
|
})]
|
|
296
303
|
}),
|
|
297
304
|
/* @__PURE__ */ T("div", {
|
|
@@ -301,7 +308,7 @@ var A = () => {
|
|
|
301
308
|
children: "Today's Earnings"
|
|
302
309
|
}), /* @__PURE__ */ w("p", {
|
|
303
310
|
className: "text-2xl font-bold text-text-primary",
|
|
304
|
-
children: a(
|
|
311
|
+
children: a(L.earnings, { minimumFractionDigits: 0 })
|
|
305
312
|
})]
|
|
306
313
|
}),
|
|
307
314
|
/* @__PURE__ */ T("div", {
|
|
@@ -311,12 +318,12 @@ var A = () => {
|
|
|
311
318
|
children: "Rating"
|
|
312
319
|
}), /* @__PURE__ */ T("p", {
|
|
313
320
|
className: "text-2xl font-bold text-text-primary flex items-center gap-1",
|
|
314
|
-
children: [/* @__PURE__ */ w(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }),
|
|
321
|
+
children: [/* @__PURE__ */ w(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" }), L.rating]
|
|
315
322
|
})]
|
|
316
323
|
})
|
|
317
324
|
]
|
|
318
|
-
}),
|
|
319
|
-
|
|
325
|
+
})] }),
|
|
326
|
+
N && /* @__PURE__ */ T("div", {
|
|
320
327
|
className: "rounded-lg border-2 border-border-focus/30 bg-[var(--color-accent-soft)] p-5",
|
|
321
328
|
children: [/* @__PURE__ */ w("h2", {
|
|
322
329
|
className: "text-base font-semibold text-text-primary mb-4",
|
|
@@ -330,28 +337,28 @@ var A = () => {
|
|
|
330
337
|
children: [
|
|
331
338
|
/* @__PURE__ */ T("h3", {
|
|
332
339
|
className: "text-sm font-semibold text-text-primary",
|
|
333
|
-
children: ["Order #",
|
|
340
|
+
children: ["Order #", N.orderId]
|
|
334
341
|
}),
|
|
335
342
|
(() => {
|
|
336
|
-
let e =
|
|
343
|
+
let e = A(N.type), n = e.icon;
|
|
337
344
|
return /* @__PURE__ */ T("span", {
|
|
338
345
|
className: t("inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium", e.style),
|
|
339
346
|
children: [/* @__PURE__ */ w(n, { className: "h-3 w-3" }), e.label]
|
|
340
347
|
});
|
|
341
348
|
})(),
|
|
342
349
|
/* @__PURE__ */ w("span", {
|
|
343
|
-
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize",
|
|
344
|
-
children:
|
|
350
|
+
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", j(N.priority)),
|
|
351
|
+
children: N.priority
|
|
345
352
|
})
|
|
346
353
|
]
|
|
347
354
|
}), /* @__PURE__ */ w("p", {
|
|
348
355
|
className: "text-xs text-text-secondary mt-1",
|
|
349
|
-
children:
|
|
356
|
+
children: N.cartName
|
|
350
357
|
})] }), /* @__PURE__ */ T("div", {
|
|
351
358
|
className: "text-right",
|
|
352
359
|
children: [/* @__PURE__ */ w("p", {
|
|
353
360
|
className: "text-xl font-bold text-text-primary",
|
|
354
|
-
children:
|
|
361
|
+
children: k(N.estimatedTime)
|
|
355
362
|
}), /* @__PURE__ */ w("p", {
|
|
356
363
|
className: "text-xs text-text-secondary",
|
|
357
364
|
children: "Time remaining"
|
|
@@ -369,14 +376,14 @@ var A = () => {
|
|
|
369
376
|
}),
|
|
370
377
|
/* @__PURE__ */ w("p", {
|
|
371
378
|
className: "text-sm font-medium text-text-primary",
|
|
372
|
-
children:
|
|
379
|
+
children: N.customerName
|
|
373
380
|
}),
|
|
374
|
-
|
|
381
|
+
N.address && /* @__PURE__ */ T("p", {
|
|
375
382
|
className: "text-xs text-text-secondary mt-1",
|
|
376
383
|
children: [
|
|
377
|
-
|
|
384
|
+
N.address.addressLine1,
|
|
378
385
|
", ",
|
|
379
|
-
|
|
386
|
+
N.address.city
|
|
380
387
|
]
|
|
381
388
|
})
|
|
382
389
|
] }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
|
|
@@ -384,7 +391,7 @@ var A = () => {
|
|
|
384
391
|
children: "Items"
|
|
385
392
|
}), /* @__PURE__ */ w("div", {
|
|
386
393
|
className: "space-y-0.5",
|
|
387
|
-
children:
|
|
394
|
+
children: N.items.map((e, t) => /* @__PURE__ */ T("p", {
|
|
388
395
|
className: "text-xs text-text-primary",
|
|
389
396
|
children: [
|
|
390
397
|
e.quantity,
|
|
@@ -394,14 +401,14 @@ var A = () => {
|
|
|
394
401
|
}, t))
|
|
395
402
|
})] })]
|
|
396
403
|
}),
|
|
397
|
-
|
|
404
|
+
N.specialInstructions && /* @__PURE__ */ T("div", {
|
|
398
405
|
className: "mt-3 p-3 rounded-md bg-status-warning-bg-subtle border border-status-warning-text/20",
|
|
399
406
|
children: [/* @__PURE__ */ T("p", {
|
|
400
407
|
className: "text-xs font-medium text-status-warning-text flex items-center gap-1",
|
|
401
408
|
children: [/* @__PURE__ */ w(l, { className: "h-3 w-3" }), "Special Instructions:"]
|
|
402
409
|
}), /* @__PURE__ */ w("p", {
|
|
403
410
|
className: "text-xs text-status-warning-text mt-0.5",
|
|
404
|
-
children:
|
|
411
|
+
children: N.specialInstructions
|
|
405
412
|
})]
|
|
406
413
|
}),
|
|
407
414
|
/* @__PURE__ */ T("div", {
|
|
@@ -409,19 +416,19 @@ var A = () => {
|
|
|
409
416
|
children: [
|
|
410
417
|
/* @__PURE__ */ T("button", {
|
|
411
418
|
type: "button",
|
|
412
|
-
onClick: () =>
|
|
419
|
+
onClick: () => W(N.customerPhone),
|
|
413
420
|
className: "inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors",
|
|
414
421
|
children: [/* @__PURE__ */ w(y, { className: "h-3.5 w-3.5" }), "Call Customer"]
|
|
415
422
|
}),
|
|
416
|
-
|
|
423
|
+
N.type === "delivery" && N.address && /* @__PURE__ */ T("button", {
|
|
417
424
|
type: "button",
|
|
418
|
-
onClick: () =>
|
|
425
|
+
onClick: () => G(N),
|
|
419
426
|
className: "inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors",
|
|
420
427
|
children: [/* @__PURE__ */ w(_, { className: "h-3.5 w-3.5" }), "Navigate"]
|
|
421
428
|
}),
|
|
422
429
|
/* @__PURE__ */ T("button", {
|
|
423
430
|
type: "button",
|
|
424
|
-
onClick: () =>
|
|
431
|
+
onClick: () => U(N.id),
|
|
425
432
|
className: "ml-auto inline-flex items-center gap-1.5 rounded-md bg-status-success-bg-subtle px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors",
|
|
426
433
|
children: [/* @__PURE__ */ w(d, { className: "h-3.5 w-3.5" }), "Complete Task"]
|
|
427
434
|
})
|
|
@@ -437,8 +444,8 @@ var A = () => {
|
|
|
437
444
|
className: "grid grid-cols-1 md:grid-cols-4 gap-3",
|
|
438
445
|
children: [
|
|
439
446
|
/* @__PURE__ */ T("select", {
|
|
440
|
-
value:
|
|
441
|
-
onChange: (e) =>
|
|
447
|
+
value: F.status,
|
|
448
|
+
onChange: (e) => V("status", e.target.value),
|
|
442
449
|
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-border-focus/40",
|
|
443
450
|
children: [
|
|
444
451
|
/* @__PURE__ */ w("option", {
|
|
@@ -460,8 +467,8 @@ var A = () => {
|
|
|
460
467
|
]
|
|
461
468
|
}),
|
|
462
469
|
/* @__PURE__ */ T("select", {
|
|
463
|
-
value:
|
|
464
|
-
onChange: (e) =>
|
|
470
|
+
value: F.type,
|
|
471
|
+
onChange: (e) => V("type", e.target.value),
|
|
465
472
|
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-border-focus/40",
|
|
466
473
|
children: [
|
|
467
474
|
/* @__PURE__ */ w("option", {
|
|
@@ -483,8 +490,8 @@ var A = () => {
|
|
|
483
490
|
]
|
|
484
491
|
}),
|
|
485
492
|
/* @__PURE__ */ T("select", {
|
|
486
|
-
value:
|
|
487
|
-
onChange: (e) =>
|
|
493
|
+
value: F.priority,
|
|
494
|
+
onChange: (e) => V("priority", e.target.value),
|
|
488
495
|
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-border-focus/40",
|
|
489
496
|
children: [
|
|
490
497
|
/* @__PURE__ */ w("option", {
|
|
@@ -510,8 +517,8 @@ var A = () => {
|
|
|
510
517
|
]
|
|
511
518
|
}),
|
|
512
519
|
/* @__PURE__ */ T("select", {
|
|
513
|
-
value:
|
|
514
|
-
onChange: (e) =>
|
|
520
|
+
value: F.sortBy,
|
|
521
|
+
onChange: (e) => V("sortBy", e.target.value),
|
|
515
522
|
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-border-focus/40",
|
|
516
523
|
children: [
|
|
517
524
|
/* @__PURE__ */ w("option", {
|
|
@@ -538,7 +545,7 @@ var A = () => {
|
|
|
538
545
|
}) : /* @__PURE__ */ w("div", {
|
|
539
546
|
className: "space-y-3",
|
|
540
547
|
children: C.map((e) => {
|
|
541
|
-
let n =
|
|
548
|
+
let n = A(e.type), i = n.icon;
|
|
542
549
|
return /* @__PURE__ */ T("div", {
|
|
543
550
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm hover:shadow-md transition-shadow",
|
|
544
551
|
children: [
|
|
@@ -556,7 +563,7 @@ var A = () => {
|
|
|
556
563
|
children: [/* @__PURE__ */ w(i, { className: "h-3 w-3" }), n.label]
|
|
557
564
|
}),
|
|
558
565
|
/* @__PURE__ */ w("span", {
|
|
559
|
-
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize",
|
|
566
|
+
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", j(e.priority)),
|
|
560
567
|
children: e.priority
|
|
561
568
|
})
|
|
562
569
|
]
|
|
@@ -607,8 +614,8 @@ var A = () => {
|
|
|
607
614
|
className: "text-xs text-text-secondary",
|
|
608
615
|
children: "Time"
|
|
609
616
|
}), /* @__PURE__ */ w("p", {
|
|
610
|
-
className: t("text-xs font-medium",
|
|
611
|
-
children:
|
|
617
|
+
className: t("text-xs font-medium", k(e.estimatedTime) === "Overdue" ? "text-status-error-text" : "text-text-primary"),
|
|
618
|
+
children: k(e.estimatedTime)
|
|
612
619
|
})] })
|
|
613
620
|
]
|
|
614
621
|
}),
|
|
@@ -617,14 +624,14 @@ var A = () => {
|
|
|
617
624
|
children: [
|
|
618
625
|
/* @__PURE__ */ T("button", {
|
|
619
626
|
type: "button",
|
|
620
|
-
onClick: () =>
|
|
621
|
-
disabled:
|
|
622
|
-
className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
|
|
623
|
-
children: [/* @__PURE__ */ w(b, { className: "h-3.5 w-3.5" }),
|
|
627
|
+
onClick: () => H(e.id),
|
|
628
|
+
disabled: N !== null,
|
|
629
|
+
className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", N === null ? "bg-[var(--color-accent-soft)] text-text-primary hover:bg-[var(--color-accent-soft)]" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
|
|
630
|
+
children: [/* @__PURE__ */ w(b, { className: "h-3.5 w-3.5" }), N ? "Complete current first" : "Start Task"]
|
|
624
631
|
}),
|
|
625
632
|
/* @__PURE__ */ T("button", {
|
|
626
633
|
type: "button",
|
|
627
|
-
onClick: () =>
|
|
634
|
+
onClick: () => W(e.customerPhone),
|
|
628
635
|
className: "inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors",
|
|
629
636
|
children: [/* @__PURE__ */ w(y, { className: "h-3.5 w-3.5" }), "Call"]
|
|
630
637
|
}),
|
|
@@ -638,11 +645,11 @@ var A = () => {
|
|
|
638
645
|
})
|
|
639
646
|
]
|
|
640
647
|
}),
|
|
641
|
-
e.status === "in_progress" && e.id !==
|
|
648
|
+
e.status === "in_progress" && e.id !== N?.id && /* @__PURE__ */ T("div", {
|
|
642
649
|
className: "flex items-center gap-2 border-t border-border-subtle pt-3",
|
|
643
650
|
children: [/* @__PURE__ */ T("button", {
|
|
644
651
|
type: "button",
|
|
645
|
-
onClick: () =>
|
|
652
|
+
onClick: () => U(e.id),
|
|
646
653
|
className: "inline-flex items-center gap-1.5 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",
|
|
647
654
|
children: [/* @__PURE__ */ w(d, { className: "h-3.5 w-3.5" }), "Complete"]
|
|
648
655
|
}), /* @__PURE__ */ T("button", {
|
|
@@ -666,10 +673,10 @@ var A = () => {
|
|
|
666
673
|
})
|
|
667
674
|
})
|
|
668
675
|
]
|
|
669
|
-
})
|
|
676
|
+
})]
|
|
670
677
|
});
|
|
671
678
|
};
|
|
672
679
|
//#endregion
|
|
673
|
-
export {
|
|
680
|
+
export { M as WorkerOrdersPage };
|
|
674
681
|
|
|
675
682
|
//# sourceMappingURL=WorkerOrdersPage.js.map
|