@burdenoff/microfe-atheletebridge 2026.624.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/atheletebridge/components/EmptyState.js +18 -11
  2. package/dist/atheletebridge/components/EmptyState.js.map +1 -1
  3. package/dist/atheletebridge/components/InvestmentCard.js +7 -7
  4. package/dist/atheletebridge/components/InvestmentCard.js.map +1 -1
  5. package/dist/atheletebridge/components/MetricsCard.js +20 -14
  6. package/dist/atheletebridge/components/MetricsCard.js.map +1 -1
  7. package/dist/atheletebridge/components/PageLayout.js +30 -19
  8. package/dist/atheletebridge/components/PageLayout.js.map +1 -1
  9. package/dist/atheletebridge/pages/HomePage.js +210 -195
  10. package/dist/atheletebridge/pages/HomePage.js.map +1 -1
  11. package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js +90 -82
  12. package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js.map +1 -1
  13. package/dist/atheletebridge/pages/admin/AdminDashboard.js +76 -44
  14. package/dist/atheletebridge/pages/admin/AdminDashboard.js.map +1 -1
  15. package/dist/atheletebridge/pages/admin/AdminFinancialPage.js +63 -55
  16. package/dist/atheletebridge/pages/admin/AdminFinancialPage.js.map +1 -1
  17. package/dist/atheletebridge/pages/admin/AdminOrdersPage.js +244 -237
  18. package/dist/atheletebridge/pages/admin/AdminOrdersPage.js.map +1 -1
  19. package/dist/atheletebridge/pages/admin/AdminProfilePage.js +59 -57
  20. package/dist/atheletebridge/pages/admin/AdminProfilePage.js.map +1 -1
  21. package/dist/atheletebridge/pages/admin/AdminSettingsPage.js +110 -106
  22. package/dist/atheletebridge/pages/admin/AdminSettingsPage.js.map +1 -1
  23. package/dist/atheletebridge/pages/admin/CartManagementPage.js +166 -159
  24. package/dist/atheletebridge/pages/admin/CartManagementPage.js.map +1 -1
  25. package/dist/atheletebridge/pages/admin/UserManagementPage.js +310 -303
  26. package/dist/atheletebridge/pages/admin/UserManagementPage.js.map +1 -1
  27. package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js +86 -81
  28. package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  29. package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js +170 -166
  30. package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  31. package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js +141 -109
  32. package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  33. package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js +139 -134
  34. package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  35. package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js +109 -107
  36. package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  37. package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js +318 -318
  38. package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  39. package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js +262 -262
  40. package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js.map +1 -1
  41. package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js +170 -162
  42. package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js.map +1 -1
  43. package/dist/atheletebridge/pages/common/HelpSupportPage.js +292 -298
  44. package/dist/atheletebridge/pages/common/HelpSupportPage.js.map +1 -1
  45. package/dist/atheletebridge/pages/common/NotificationCenterPage.js +100 -91
  46. package/dist/atheletebridge/pages/common/NotificationCenterPage.js.map +1 -1
  47. package/dist/atheletebridge/pages/common/SettingsPage.js +742 -734
  48. package/dist/atheletebridge/pages/common/SettingsPage.js.map +1 -1
  49. package/dist/atheletebridge/pages/customer/BookingDetailsPage.js +365 -356
  50. package/dist/atheletebridge/pages/customer/BookingDetailsPage.js.map +1 -1
  51. package/dist/atheletebridge/pages/customer/CartDetailPage.js +277 -241
  52. package/dist/atheletebridge/pages/customer/CartDetailPage.js.map +1 -1
  53. package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js +261 -250
  54. package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js.map +1 -1
  55. package/dist/atheletebridge/pages/customer/CheckoutPage.js +93 -89
  56. package/dist/atheletebridge/pages/customer/CheckoutPage.js.map +1 -1
  57. package/dist/atheletebridge/pages/customer/CustomerDashboard.js +430 -387
  58. package/dist/atheletebridge/pages/customer/CustomerDashboard.js.map +1 -1
  59. package/dist/atheletebridge/pages/customer/CustomerProfilePage.js +526 -490
  60. package/dist/atheletebridge/pages/customer/CustomerProfilePage.js.map +1 -1
  61. package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js +524 -512
  62. package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js.map +1 -1
  63. package/dist/atheletebridge/pages/customer/FavoritesPage.js +84 -75
  64. package/dist/atheletebridge/pages/customer/FavoritesPage.js.map +1 -1
  65. package/dist/atheletebridge/pages/customer/OrderHistoryPage.js +117 -108
  66. package/dist/atheletebridge/pages/customer/OrderHistoryPage.js.map +1 -1
  67. package/dist/atheletebridge/pages/customer/OrderTrackingPage.js +66 -61
  68. package/dist/atheletebridge/pages/customer/OrderTrackingPage.js.map +1 -1
  69. package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js +81 -75
  70. package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js.map +1 -1
  71. package/dist/atheletebridge/pages/customer/ReviewsPage.js +81 -72
  72. package/dist/atheletebridge/pages/customer/ReviewsPage.js.map +1 -1
  73. package/dist/atheletebridge/pages/customer/SavedAddressesPage.js +63 -55
  74. package/dist/atheletebridge/pages/customer/SavedAddressesPage.js.map +1 -1
  75. package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js +93 -61
  76. package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js.map +1 -1
  77. package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js +90 -84
  78. package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  79. package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js +60 -55
  80. package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  81. package/dist/atheletebridge/pages/investor/InvestorDashboard.js +345 -311
  82. package/dist/atheletebridge/pages/investor/InvestorDashboard.js.map +1 -1
  83. package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js +38 -32
  84. package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  85. package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js +75 -67
  86. package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js.map +1 -1
  87. package/dist/atheletebridge/pages/investor/InvestorProfilePage.js +385 -381
  88. package/dist/atheletebridge/pages/investor/InvestorProfilePage.js.map +1 -1
  89. package/dist/atheletebridge/pages/worker/TaskDetailsPage.js +353 -319
  90. package/dist/atheletebridge/pages/worker/TaskDetailsPage.js.map +1 -1
  91. package/dist/atheletebridge/pages/worker/WorkerDashboard.js +353 -318
  92. package/dist/atheletebridge/pages/worker/WorkerDashboard.js.map +1 -1
  93. package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js +134 -128
  94. package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js.map +1 -1
  95. package/dist/atheletebridge/pages/worker/WorkerProfilePage.js +81 -77
  96. package/dist/atheletebridge/pages/worker/WorkerProfilePage.js.map +1 -1
  97. package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js +352 -342
  98. package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js.map +1 -1
  99. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"StaffManagementPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/cart-owner/StaffManagementPage.tsx"],"sourcesContent":["/**\n * Staff Management Page\n *\n * Stats overview, staff list with filters (role/status/search/sort),\n * invite staff modal, edit staff modal, performance metrics per staff,\n * status toggle (activate/deactivate), role badges, schedule info.\n *\n * @module atheletebridge/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Users,\n Plus,\n Trash2,\n Calendar,\n Clock,\n UserPlus,\n Phone,\n Star,\n Search,\n Edit2,\n X,\n Mail,\n CheckCircle2,\n AlertCircle,\n Shield,\n Target,\n Award,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype StaffRole = 'manager' | 'chef' | 'server' | 'delivery' | 'cashier';\ntype StaffStatus = 'active' | 'inactive' | 'on-leave' | 'terminated';\n\ninterface StaffMember {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n status: StaffStatus;\n dateJoined: string;\n lastActive?: string;\n hourlyRate: number;\n hoursWorked: number;\n totalEarnings: number;\n performance: {\n rating: number;\n tasksCompleted: number;\n customerRating: number;\n punctuality: number;\n };\n currentShift?: string;\n shiftsThisWeek: number;\n}\n\ninterface InviteForm {\n email: string;\n firstName: string;\n lastName: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n}\n\ninterface EditForm {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n status: StaffStatus;\n}\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst initialStaff: StaffMember[] = [\n {\n id: 'staff-001',\n firstName: 'Ravi',\n lastName: 'Kumar',\n email: 'ravi@dosaexpress.in',\n phone: '+91-9876543210',\n role: 'delivery',\n status: 'active',\n dateJoined: '2023-06-15',\n lastActive: '2024-01-16T10:00:00Z',\n hourlyRate: 200,\n hoursWorked: 160,\n totalEarnings: 32000,\n performance: { rating: 4.8, tasksCompleted: 245, customerRating: 4.7, punctuality: 95 },\n currentShift: '09:00 - 17:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-002',\n firstName: 'Suresh',\n lastName: 'Worker',\n email: 'suresh@dosaexpress.in',\n phone: '+91-9876543211',\n role: 'chef',\n status: 'active',\n dateJoined: '2023-08-20',\n lastActive: '2024-01-16T09:30:00Z',\n hourlyRate: 250,\n hoursWorked: 148,\n totalEarnings: 37000,\n performance: { rating: 4.6, tasksCompleted: 312, customerRating: 4.5, punctuality: 90 },\n currentShift: '10:00 - 18:00',\n shiftsThisWeek: 4,\n },\n {\n id: 'staff-003',\n firstName: 'Amit',\n lastName: 'Sharma',\n email: 'amit@dosaexpress.in',\n phone: '+91-9876543212',\n role: 'delivery',\n status: 'on-leave',\n dateJoined: '2023-10-01',\n hourlyRate: 180,\n hoursWorked: 120,\n totalEarnings: 21600,\n performance: { rating: 4.4, tasksCompleted: 178, customerRating: 4.3, punctuality: 85 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-004',\n firstName: 'Priya',\n lastName: 'Helper',\n email: 'priya@dosaexpress.in',\n phone: '+91-9876543213',\n role: 'server',\n status: 'inactive',\n dateJoined: '2024-01-05',\n hourlyRate: 150,\n hoursWorked: 40,\n totalEarnings: 6000,\n performance: { rating: 4.7, tasksCompleted: 56, customerRating: 4.8, punctuality: 98 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-005',\n firstName: 'Kiran',\n lastName: 'B.',\n email: 'kiran@dosaexpress.in',\n phone: '+91-9876543214',\n role: 'cashier',\n status: 'active',\n dateJoined: '2023-12-10',\n lastActive: '2024-01-16T11:00:00Z',\n hourlyRate: 175,\n hoursWorked: 80,\n totalEarnings: 14000,\n performance: { rating: 4.3, tasksCompleted: 134, customerRating: 4.2, punctuality: 88 },\n currentShift: '11:00 - 19:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-006',\n firstName: 'Meera',\n lastName: 'Devi',\n email: 'meera@dosaexpress.in',\n phone: '+91-9876543215',\n role: 'manager',\n status: 'active',\n dateJoined: '2023-04-01',\n lastActive: '2024-01-16T08:00:00Z',\n hourlyRate: 350,\n hoursWorked: 168,\n totalEarnings: 58800,\n performance: { rating: 4.9, tasksCompleted: 420, customerRating: 4.9, punctuality: 99 },\n currentShift: '08:00 - 16:00',\n shiftsThisWeek: 6,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<StaffStatus, { label: string; color: string; dot: string }> = {\n active: { label: 'Active', color: 'text-green-600 dark:text-green-400', dot: 'bg-green-500' },\n inactive: { label: 'Inactive', color: 'text-text-secondary', dot: 'bg-muted-foreground' },\n 'on-leave': {\n label: 'On Leave',\n color: 'text-yellow-600 dark:text-yellow-400',\n dot: 'bg-yellow-500',\n },\n terminated: { label: 'Terminated', color: 'text-red-600 dark:text-red-400', dot: 'bg-red-500' },\n};\n\nconst roleConfig: Record<StaffRole, { label: string; color: string }> = {\n manager: { label: 'Manager', color: 'bg-purple-500/20 text-purple-600 dark:text-purple-400' },\n chef: { label: 'Chef', color: 'bg-orange-500/20 text-orange-600 dark:text-orange-400' },\n server: { label: 'Server', color: 'bg-blue-500/20 text-blue-600 dark:text-blue-400' },\n delivery: { label: 'Delivery', color: 'bg-green-500/20 text-green-600 dark:text-green-400' },\n cashier: { label: 'Cashier', color: 'bg-cyan-500/20 text-cyan-600 dark:text-cyan-400' },\n};\n\nconst emptyInviteForm: InviteForm = {\n email: '',\n firstName: '',\n lastName: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const StaffManagementPage = () => {\n const { navigateTo } = useAthleteBridge();\n\n // Data\n const [staff, setStaff] = useState<StaffMember[]>(initialStaff);\n\n // Filters\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState('');\n const [statusFilter, setStatusFilter] = useState('');\n const [sortBy, setSortBy] = useState('name');\n\n // Modals\n const [showInviteModal, setShowInviteModal] = useState(false);\n const [showEditModal, setShowEditModal] = useState(false);\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null);\n const [inviteForm, setInviteForm] = useState<InviteForm>(emptyInviteForm);\n const [editForm, setEditForm] = useState<EditForm>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n status: 'active',\n });\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const activeCount = staff.filter((s) => s.status === 'active').length;\n const onLeaveCount = staff.filter((s) => s.status === 'on-leave').length;\n const avgRating =\n staff.length > 0\n ? (staff.reduce((a, s) => a + s.performance.rating, 0) / staff.length).toFixed(1)\n : '0';\n const totalEarnings = staff.reduce((a, s) => a + s.totalEarnings, 0);\n\n // ---- Filtered staff ----\n const filteredStaff = useMemo(() => {\n let result = [...staff];\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (s) =>\n `${s.firstName} ${s.lastName}`.toLowerCase().includes(q) ||\n s.email.toLowerCase().includes(q) ||\n s.phone.includes(q)\n );\n }\n if (roleFilter) result = result.filter((s) => s.role === roleFilter);\n if (statusFilter) result = result.filter((s) => s.status === statusFilter);\n\n switch (sortBy) {\n case 'name':\n result.sort((a, b) =>\n `${a.firstName} ${a.lastName}`.localeCompare(`${b.firstName} ${b.lastName}`)\n );\n break;\n case 'rating':\n result.sort((a, b) => b.performance.rating - a.performance.rating);\n break;\n case 'hours':\n result.sort((a, b) => b.hoursWorked - a.hoursWorked);\n break;\n case 'joined':\n result.sort((a, b) => new Date(b.dateJoined).getTime() - new Date(a.dateJoined).getTime());\n break;\n }\n\n return result;\n }, [staff, searchQuery, roleFilter, statusFilter, sortBy]);\n\n // ---- Handlers ----\n const handleInviteStaff = () => {\n if (!inviteForm.email || !inviteForm.firstName || !inviteForm.lastName) {\n showStatus('Please fill in all required fields', 'error');\n return;\n }\n const newStaff: StaffMember = {\n id: `staff-${Date.now()}`,\n ...inviteForm,\n status: 'active',\n dateJoined: new Date().toISOString().split('T')[0],\n hoursWorked: 0,\n totalEarnings: 0,\n performance: { rating: 0, tasksCompleted: 0, customerRating: 0, punctuality: 0 },\n shiftsThisWeek: 0,\n };\n setStaff((prev) => [...prev, newStaff]);\n setShowInviteModal(false);\n setInviteForm(emptyInviteForm);\n showStatus('Staff member invited successfully', 'success');\n };\n\n const handleEditStaff = (member: StaffMember) => {\n setSelectedStaff(member);\n setEditForm({\n firstName: member.firstName,\n lastName: member.lastName,\n email: member.email,\n phone: member.phone,\n role: member.role,\n hourlyRate: member.hourlyRate,\n status: member.status,\n });\n setShowEditModal(true);\n };\n\n const handleSaveEdit = () => {\n if (!selectedStaff) return;\n setStaff((prev) => prev.map((s) => (s.id === selectedStaff.id ? { ...s, ...editForm } : s)));\n setShowEditModal(false);\n showStatus('Staff member updated successfully', 'success');\n };\n\n const handleToggleStatus = (id: string) => {\n setStaff((prev) =>\n prev.map((s) => {\n if (s.id === id) {\n const newStatus: StaffStatus = s.status === 'active' ? 'inactive' : 'active';\n return { ...s, status: newStatus };\n }\n return s;\n })\n );\n showStatus('Staff status updated', 'success');\n };\n\n const handleRemoveStaff = (id: string) => {\n if (!confirm('Are you sure you want to remove this staff member?')) return;\n setStaff((prev) => prev.filter((s) => s.id !== id));\n showStatus('Staff member removed', 'success');\n };\n\n return (\n <PageLayout\n title=\"Staff Management\"\n description=\"Manage your workers, delivery partners, and shifts\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\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 <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n }\n >\n <div className=\"space-y-4\">\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-green-500/30 bg-green-500/10'\n : 'border-red-500/30 bg-red-500/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Summary Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{staff.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Staff</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">{activeCount}</p>\n <p className=\"text-xs text-text-secondary\">Active Now</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {onLeaveCount}\n </p>\n <p className=\"text-xs text-text-secondary\">On Leave</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{avgRating}</p>\n <p className=\"text-xs text-text-secondary\">Avg. Rating</p>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search staff...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface pl-10 pr-4 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 </div>\n <select\n value={roleFilter}\n onChange={(e) => setRoleFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Roles</option>\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Status</option>\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Rating: High to Low</option>\n <option value=\"hours\">Hours: Most Worked</option>\n <option value=\"joined\">Recently Joined</option>\n </select>\n </div>\n </div>\n\n {/* Staff List */}\n {filteredStaff.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 rounded-lg border border-border-subtle bg-bg-surface shadow-sm text-center\">\n <Users className=\"h-12 w-12 text-text-secondary opacity-40 mb-3\" />\n <p className=\"text-sm font-medium text-text-primary\">No staff members found</p>\n <p className=\"text-xs text-text-secondary mt-1\">Try adjusting your filters</p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm divide-y divide-border\">\n {filteredStaff.map((member) => {\n const status = statusConfig[member.status];\n const role = roleConfig[member.role];\n const initials = `${member.firstName[0]}${member.lastName[0]}`;\n\n return (\n <div key={member.id} className=\"p-4 sm:p-5 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Avatar + Info */}\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n <div className=\"relative shrink-0\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-primary\">\n {initials}\n </div>\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full border-2 border-card',\n status.dot\n )}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-sm font-medium text-text-primary\">\n {member.firstName} {member.lastName}\n </p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n role.color\n )}\n >\n {role.label}\n </span>\n <span className={cn('text-xs', status.color)}>{status.label}</span>\n </div>\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary flex-wrap\">\n <span className=\"flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {member.email}\n </span>\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {member.phone}\n </span>\n </div>\n </div>\n </div>\n\n {/* Performance + Actions */}\n <div className=\"flex items-center gap-4 sm:gap-6\">\n {/* Performance metrics */}\n <div className=\"hidden md:flex items-center gap-4 text-xs\">\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </p>\n <p className=\"text-text-secondary\">Rating</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.tasksCompleted}\n </p>\n <p className=\"text-text-secondary\">Tasks</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.punctuality}%\n </p>\n <p className=\"text-text-secondary\">On Time</p>\n </div>\n {member.currentShift && (\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Clock className=\"h-3 w-3 text-text-secondary\" />\n {member.currentShift}\n </p>\n <p className=\"text-text-secondary\">Shift</p>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleToggleStatus(member.id)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n member.status === 'active' ? 'bg-green-500' : 'bg-muted-foreground/30'\n )}\n title={member.status === 'active' ? 'Deactivate' : 'Activate'}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n member.status === 'active' ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleEditStaff(member)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStaff(member.id)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-red-500/10 hover:text-red-600 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Mobile performance row */}\n <div className=\"md:hidden flex items-center gap-4 mt-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </span>\n <span>{member.performance.tasksCompleted} tasks</span>\n <span>{member.performance.punctuality}% on time</span>\n {member.currentShift && (\n <span className=\"flex items-center gap-0.5\">\n <Clock className=\"h-3 w-3\" />\n {member.currentShift}\n </span>\n )}\n <span>{member.shiftsThisWeek} shifts/wk</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Invite Staff Modal */}\n {showInviteModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Invite Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.firstName}\n onChange={(e) => setInviteForm((p) => ({ ...p, firstName: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.lastName}\n onChange={(e) => setInviteForm((p) => ({ ...p, lastName: 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 </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email *</label>\n <input\n type=\"email\"\n value={inviteForm.email}\n onChange={(e) => setInviteForm((p) => ({ ...p, email: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={inviteForm.phone}\n onChange={(e) => setInviteForm((p) => ({ ...p, phone: 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 </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={inviteForm.role}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Hourly Rate (₹)\n </label>\n <input\n type=\"number\"\n value={inviteForm.hourlyRate}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInviteStaff}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Send Invite\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Staff Modal */}\n {showEditModal && selectedStaff && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Edit Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name\n </label>\n <input\n type=\"text\"\n value={editForm.firstName}\n onChange={(e) => setEditForm((p) => ({ ...p, firstName: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={editForm.lastName}\n onChange={(e) => setEditForm((p) => ({ ...p, lastName: 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 </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email</label>\n <input\n type=\"email\"\n value={editForm.email}\n onChange={(e) => setEditForm((p) => ({ ...p, email: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={editForm.phone}\n onChange={(e) => setEditForm((p) => ({ ...p, phone: 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 </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={editForm.role}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Rate (₹/hr)\n </label>\n <input\n type=\"number\"\n value={editForm.hourlyRate}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Status</label>\n <select\n value={editForm.status}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, status: e.target.value as StaffStatus }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSaveEdit}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"StaffManagementPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/cart-owner/StaffManagementPage.tsx"],"sourcesContent":["/**\n * Staff Management Page\n *\n * Stats overview, staff list with filters (role/status/search/sort),\n * invite staff modal, edit staff modal, performance metrics per staff,\n * status toggle (activate/deactivate), role badges, schedule info.\n *\n * @module atheletebridge/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Plus,\n Trash2,\n Calendar,\n Clock,\n UserPlus,\n Phone,\n Star,\n Search,\n Edit2,\n X,\n Mail,\n CheckCircle2,\n AlertCircle,\n Shield,\n Target,\n Award,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype StaffRole = 'manager' | 'chef' | 'server' | 'delivery' | 'cashier';\ntype StaffStatus = 'active' | 'inactive' | 'on-leave' | 'terminated';\n\ninterface StaffMember {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n status: StaffStatus;\n dateJoined: string;\n lastActive?: string;\n hourlyRate: number;\n hoursWorked: number;\n totalEarnings: number;\n performance: {\n rating: number;\n tasksCompleted: number;\n customerRating: number;\n punctuality: number;\n };\n currentShift?: string;\n shiftsThisWeek: number;\n}\n\ninterface InviteForm {\n email: string;\n firstName: string;\n lastName: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n}\n\ninterface EditForm {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n status: StaffStatus;\n}\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst initialStaff: StaffMember[] = [\n {\n id: 'staff-001',\n firstName: 'Ravi',\n lastName: 'Kumar',\n email: 'ravi@dosaexpress.in',\n phone: '+91-9876543210',\n role: 'delivery',\n status: 'active',\n dateJoined: '2023-06-15',\n lastActive: '2024-01-16T10:00:00Z',\n hourlyRate: 200,\n hoursWorked: 160,\n totalEarnings: 32000,\n performance: { rating: 4.8, tasksCompleted: 245, customerRating: 4.7, punctuality: 95 },\n currentShift: '09:00 - 17:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-002',\n firstName: 'Suresh',\n lastName: 'Worker',\n email: 'suresh@dosaexpress.in',\n phone: '+91-9876543211',\n role: 'chef',\n status: 'active',\n dateJoined: '2023-08-20',\n lastActive: '2024-01-16T09:30:00Z',\n hourlyRate: 250,\n hoursWorked: 148,\n totalEarnings: 37000,\n performance: { rating: 4.6, tasksCompleted: 312, customerRating: 4.5, punctuality: 90 },\n currentShift: '10:00 - 18:00',\n shiftsThisWeek: 4,\n },\n {\n id: 'staff-003',\n firstName: 'Amit',\n lastName: 'Sharma',\n email: 'amit@dosaexpress.in',\n phone: '+91-9876543212',\n role: 'delivery',\n status: 'on-leave',\n dateJoined: '2023-10-01',\n hourlyRate: 180,\n hoursWorked: 120,\n totalEarnings: 21600,\n performance: { rating: 4.4, tasksCompleted: 178, customerRating: 4.3, punctuality: 85 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-004',\n firstName: 'Priya',\n lastName: 'Helper',\n email: 'priya@dosaexpress.in',\n phone: '+91-9876543213',\n role: 'server',\n status: 'inactive',\n dateJoined: '2024-01-05',\n hourlyRate: 150,\n hoursWorked: 40,\n totalEarnings: 6000,\n performance: { rating: 4.7, tasksCompleted: 56, customerRating: 4.8, punctuality: 98 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-005',\n firstName: 'Kiran',\n lastName: 'B.',\n email: 'kiran@dosaexpress.in',\n phone: '+91-9876543214',\n role: 'cashier',\n status: 'active',\n dateJoined: '2023-12-10',\n lastActive: '2024-01-16T11:00:00Z',\n hourlyRate: 175,\n hoursWorked: 80,\n totalEarnings: 14000,\n performance: { rating: 4.3, tasksCompleted: 134, customerRating: 4.2, punctuality: 88 },\n currentShift: '11:00 - 19:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-006',\n firstName: 'Meera',\n lastName: 'Devi',\n email: 'meera@dosaexpress.in',\n phone: '+91-9876543215',\n role: 'manager',\n status: 'active',\n dateJoined: '2023-04-01',\n lastActive: '2024-01-16T08:00:00Z',\n hourlyRate: 350,\n hoursWorked: 168,\n totalEarnings: 58800,\n performance: { rating: 4.9, tasksCompleted: 420, customerRating: 4.9, punctuality: 99 },\n currentShift: '08:00 - 16:00',\n shiftsThisWeek: 6,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<StaffStatus, { label: string; color: string; dot: string }> = {\n active: { label: 'Active', color: 'text-green-600 dark:text-green-400', dot: 'bg-green-500' },\n inactive: { label: 'Inactive', color: 'text-text-secondary', dot: 'bg-muted-foreground' },\n 'on-leave': {\n label: 'On Leave',\n color: 'text-yellow-600 dark:text-yellow-400',\n dot: 'bg-yellow-500',\n },\n terminated: { label: 'Terminated', color: 'text-red-600 dark:text-red-400', dot: 'bg-red-500' },\n};\n\nconst roleConfig: Record<StaffRole, { label: string; color: string }> = {\n manager: { label: 'Manager', color: 'bg-purple-500/20 text-purple-600 dark:text-purple-400' },\n chef: { label: 'Chef', color: 'bg-orange-500/20 text-orange-600 dark:text-orange-400' },\n server: { label: 'Server', color: 'bg-blue-500/20 text-blue-600 dark:text-blue-400' },\n delivery: { label: 'Delivery', color: 'bg-green-500/20 text-green-600 dark:text-green-400' },\n cashier: { label: 'Cashier', color: 'bg-cyan-500/20 text-cyan-600 dark:text-cyan-400' },\n};\n\nconst emptyInviteForm: InviteForm = {\n email: '',\n firstName: '',\n lastName: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const StaffManagementPage = () => {\n const { navigateTo } = useAthleteBridge();\n\n // Data\n const [staff, setStaff] = useState<StaffMember[]>(initialStaff);\n\n // Filters\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState('');\n const [statusFilter, setStatusFilter] = useState('');\n const [sortBy, setSortBy] = useState('name');\n\n // Modals\n const [showInviteModal, setShowInviteModal] = useState(false);\n const [showEditModal, setShowEditModal] = useState(false);\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null);\n const [inviteForm, setInviteForm] = useState<InviteForm>(emptyInviteForm);\n const [editForm, setEditForm] = useState<EditForm>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n status: 'active',\n });\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const activeCount = staff.filter((s) => s.status === 'active').length;\n const onLeaveCount = staff.filter((s) => s.status === 'on-leave').length;\n const avgRating =\n staff.length > 0\n ? (staff.reduce((a, s) => a + s.performance.rating, 0) / staff.length).toFixed(1)\n : '0';\n const totalEarnings = staff.reduce((a, s) => a + s.totalEarnings, 0);\n\n // ---- Filtered staff ----\n const filteredStaff = useMemo(() => {\n let result = [...staff];\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (s) =>\n `${s.firstName} ${s.lastName}`.toLowerCase().includes(q) ||\n s.email.toLowerCase().includes(q) ||\n s.phone.includes(q)\n );\n }\n if (roleFilter) result = result.filter((s) => s.role === roleFilter);\n if (statusFilter) result = result.filter((s) => s.status === statusFilter);\n\n switch (sortBy) {\n case 'name':\n result.sort((a, b) =>\n `${a.firstName} ${a.lastName}`.localeCompare(`${b.firstName} ${b.lastName}`)\n );\n break;\n case 'rating':\n result.sort((a, b) => b.performance.rating - a.performance.rating);\n break;\n case 'hours':\n result.sort((a, b) => b.hoursWorked - a.hoursWorked);\n break;\n case 'joined':\n result.sort((a, b) => new Date(b.dateJoined).getTime() - new Date(a.dateJoined).getTime());\n break;\n }\n\n return result;\n }, [staff, searchQuery, roleFilter, statusFilter, sortBy]);\n\n // ---- Handlers ----\n const handleInviteStaff = () => {\n if (!inviteForm.email || !inviteForm.firstName || !inviteForm.lastName) {\n showStatus('Please fill in all required fields', 'error');\n return;\n }\n const newStaff: StaffMember = {\n id: `staff-${Date.now()}`,\n ...inviteForm,\n status: 'active',\n dateJoined: new Date().toISOString().split('T')[0],\n hoursWorked: 0,\n totalEarnings: 0,\n performance: { rating: 0, tasksCompleted: 0, customerRating: 0, punctuality: 0 },\n shiftsThisWeek: 0,\n };\n setStaff((prev) => [...prev, newStaff]);\n setShowInviteModal(false);\n setInviteForm(emptyInviteForm);\n showStatus('Staff member invited successfully', 'success');\n };\n\n const handleEditStaff = (member: StaffMember) => {\n setSelectedStaff(member);\n setEditForm({\n firstName: member.firstName,\n lastName: member.lastName,\n email: member.email,\n phone: member.phone,\n role: member.role,\n hourlyRate: member.hourlyRate,\n status: member.status,\n });\n setShowEditModal(true);\n };\n\n const handleSaveEdit = () => {\n if (!selectedStaff) return;\n setStaff((prev) => prev.map((s) => (s.id === selectedStaff.id ? { ...s, ...editForm } : s)));\n setShowEditModal(false);\n showStatus('Staff member updated successfully', 'success');\n };\n\n const handleToggleStatus = (id: string) => {\n setStaff((prev) =>\n prev.map((s) => {\n if (s.id === id) {\n const newStatus: StaffStatus = s.status === 'active' ? 'inactive' : 'active';\n return { ...s, status: newStatus };\n }\n return s;\n })\n );\n showStatus('Staff status updated', 'success');\n };\n\n const handleRemoveStaff = (id: string) => {\n if (!confirm('Are you sure you want to remove this staff member?')) return;\n setStaff((prev) => prev.filter((s) => s.id !== id));\n showStatus('Staff member removed', 'success');\n };\n\n return (\n <PageLayout\n title=\"Staff Management\"\n description=\"Manage your workers, delivery partners, and shifts\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\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 <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n }\n >\n <div className=\"space-y-4\">\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-green-500/30 bg-green-500/10'\n : 'border-red-500/30 bg-red-500/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n <PagePurpose>\n Build and manage your team. Invite workers and delivery partners, see who&apos;s active or\n on leave, track ratings, and manage shifts. A well-staffed, well-rated team keeps orders\n flowing and customers happy.\n </PagePurpose>\n\n {/* Summary Stats */}\n <EmphasisPanel className=\"p-5\">\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{staff.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Staff</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">{activeCount}</p>\n <p className=\"text-xs text-text-secondary\">Active Now</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {onLeaveCount}\n </p>\n <p className=\"text-xs text-text-secondary\">On Leave</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{avgRating}</p>\n <p className=\"text-xs text-text-secondary\">Avg. Rating</p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search staff...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface pl-10 pr-4 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 </div>\n <select\n value={roleFilter}\n onChange={(e) => setRoleFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Roles</option>\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Status</option>\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Rating: High to Low</option>\n <option value=\"hours\">Hours: Most Worked</option>\n <option value=\"joined\">Recently Joined</option>\n </select>\n </div>\n </div>\n\n {/* Staff List */}\n {filteredStaff.length === 0 ? (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"No staff members found\"\n description=\"No team members match your filters. Adjust your search, or invite your first staff member to get started.\"\n action={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n }\n />\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm divide-y divide-border\">\n {filteredStaff.map((member) => {\n const status = statusConfig[member.status];\n const role = roleConfig[member.role];\n const initials = `${member.firstName[0]}${member.lastName[0]}`;\n\n return (\n <div key={member.id} className=\"p-4 sm:p-5 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Avatar + Info */}\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n <div className=\"relative shrink-0\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-primary\">\n {initials}\n </div>\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full border-2 border-card',\n status.dot\n )}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-sm font-medium text-text-primary\">\n {member.firstName} {member.lastName}\n </p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n role.color\n )}\n >\n {role.label}\n </span>\n <span className={cn('text-xs', status.color)}>{status.label}</span>\n </div>\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary flex-wrap\">\n <span className=\"flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {member.email}\n </span>\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {member.phone}\n </span>\n </div>\n </div>\n </div>\n\n {/* Performance + Actions */}\n <div className=\"flex items-center gap-4 sm:gap-6\">\n {/* Performance metrics */}\n <div className=\"hidden md:flex items-center gap-4 text-xs\">\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </p>\n <p className=\"text-text-secondary\">Rating</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.tasksCompleted}\n </p>\n <p className=\"text-text-secondary\">Tasks</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.punctuality}%\n </p>\n <p className=\"text-text-secondary\">On Time</p>\n </div>\n {member.currentShift && (\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Clock className=\"h-3 w-3 text-text-secondary\" />\n {member.currentShift}\n </p>\n <p className=\"text-text-secondary\">Shift</p>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleToggleStatus(member.id)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n member.status === 'active' ? 'bg-green-500' : 'bg-muted-foreground/30'\n )}\n title={member.status === 'active' ? 'Deactivate' : 'Activate'}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n member.status === 'active' ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleEditStaff(member)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStaff(member.id)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-red-500/10 hover:text-red-600 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Mobile performance row */}\n <div className=\"md:hidden flex items-center gap-4 mt-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </span>\n <span>{member.performance.tasksCompleted} tasks</span>\n <span>{member.performance.punctuality}% on time</span>\n {member.currentShift && (\n <span className=\"flex items-center gap-0.5\">\n <Clock className=\"h-3 w-3\" />\n {member.currentShift}\n </span>\n )}\n <span>{member.shiftsThisWeek} shifts/wk</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Invite Staff Modal */}\n {showInviteModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Invite Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.firstName}\n onChange={(e) => setInviteForm((p) => ({ ...p, firstName: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.lastName}\n onChange={(e) => setInviteForm((p) => ({ ...p, lastName: 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 </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email *</label>\n <input\n type=\"email\"\n value={inviteForm.email}\n onChange={(e) => setInviteForm((p) => ({ ...p, email: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={inviteForm.phone}\n onChange={(e) => setInviteForm((p) => ({ ...p, phone: 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 </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={inviteForm.role}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Hourly Rate (₹)\n </label>\n <input\n type=\"number\"\n value={inviteForm.hourlyRate}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInviteStaff}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Send Invite\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Staff Modal */}\n {showEditModal && selectedStaff && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Edit Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name\n </label>\n <input\n type=\"text\"\n value={editForm.firstName}\n onChange={(e) => setEditForm((p) => ({ ...p, firstName: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={editForm.lastName}\n onChange={(e) => setEditForm((p) => ({ ...p, lastName: 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 </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email</label>\n <input\n type=\"email\"\n value={editForm.email}\n onChange={(e) => setEditForm((p) => ({ ...p, email: 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 </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={editForm.phone}\n onChange={(e) => setEditForm((p) => ({ ...p, phone: 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 </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={editForm.role}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Rate (₹/hr)\n </label>\n <input\n type=\"number\"\n value={editForm.hourlyRate}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Status</label>\n <select\n value={editForm.status}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, status: e.target.value as StaffStatus }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSaveEdit}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}