@burdenoff/microfe-kadaikodi 2026.626.2 → 2026.704.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 (96) hide show
  1. package/dist/kadaikodi/hooks/useKadaikodiApi.js +260 -105
  2. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  3. package/dist/kadaikodi/pages/HomePage.js +4 -4
  4. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +341 -461
  6. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminDashboard.js +115 -399
  8. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +140 -283
  10. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +282 -453
  12. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminProfilePage.js +115 -242
  14. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  15. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +2 -2
  16. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  17. package/dist/kadaikodi/pages/admin/CartManagementPage.js +279 -333
  18. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  19. package/dist/kadaikodi/pages/admin/UserManagementPage.js +299 -372
  20. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  21. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +503 -627
  22. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  23. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +339 -282
  24. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  25. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +329 -432
  26. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  27. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +374 -384
  28. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +249 -208
  30. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +276 -279
  32. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  33. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +229 -447
  34. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +171 -627
  36. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/HelpSupportPage.js +331 -415
  38. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/kadaikodi/pages/common/NotificationCenterPage.js +18 -670
  40. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  41. package/dist/kadaikodi/pages/common/SettingsPage.js +34 -46
  42. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  43. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +193 -447
  44. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  45. package/dist/kadaikodi/pages/customer/CartDetailPage.js +6 -6
  46. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  47. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
  48. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  49. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -2
  50. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  51. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +191 -369
  52. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  53. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +233 -389
  54. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  55. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +255 -215
  56. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  57. package/dist/kadaikodi/pages/customer/FavoritesPage.js +141 -178
  58. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  59. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  60. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +155 -161
  61. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +76 -118
  63. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/customer/ReviewsPage.js +14 -140
  65. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +135 -213
  67. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +272 -774
  69. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  70. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +258 -523
  71. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +112 -600
  73. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  74. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +128 -295
  75. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  76. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +205 -291
  77. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  78. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +159 -500
  79. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  80. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +426 -514
  81. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  82. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +231 -225
  83. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  84. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +197 -301
  85. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  86. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +247 -399
  87. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  88. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +294 -327
  89. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  90. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +179 -397
  91. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/kadaikodi/mocks/data.js +0 -1517
  94. package/dist/kadaikodi/mocks/data.js.map +0 -1
  95. package/dist/kadaikodi/mocks/users.js +0 -34
  96. package/dist/kadaikodi/mocks/users.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"StaffManagementPage.js","names":[],"sources":["../../../../src/kadaikodi/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 kadaikodi/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 { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\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-status-success-text', dot: 'bg-status-success-text' },\n inactive: { label: 'Inactive', color: 'text-text-secondary', dot: 'bg-muted-foreground' },\n 'on-leave': {\n label: 'On Leave',\n color: 'text-status-warning-text',\n dot: 'bg-status-warning-text',\n },\n terminated: { label: 'Terminated', color: 'text-status-error-text', dot: 'bg-status-error-text' },\n};\n\nconst roleConfig: Record<StaffRole, { label: string; color: string }> = {\n manager: { label: 'Manager', color: 'bg-accent-purple-subtle text-text-primary' },\n chef: { label: 'Chef', color: 'bg-status-warning-bg-subtle text-status-warning-text' },\n server: { label: 'Server', color: 'bg-[var(--color-accent-soft)] text-text-primary' },\n delivery: { label: 'Delivery', color: 'bg-status-success-bg-subtle text-status-success-text' },\n cashier: { label: 'Cashier', color: 'bg-[var(--color-accent-soft)] text-text-primary' },\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 } = useKadaikodi();\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 <PagePurpose className=\"mb-6\">\n Your team in one place. Use this page to invite workers and delivery partners, see who&apos;s\n active or on leave right now, manage roles and ratings, and keep shifts covered so orders go\n out on time. Invite new staff and review performance to build a reliable crew around your\n cart.\n </PagePurpose>\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-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-status-error-text/30 bg-status-error-bg-subtle'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Summary Stats — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Team Overview</h2>\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-status-success-text\">{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-status-warning-text\">{onLeaveCount}</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 <EmptyState\n illustration={searchQuery || roleFilter || statusFilter ? 'empty-search' : 'empty-people'}\n title=\"No staff members found\"\n description={\n searchQuery || roleFilter || statusFilter\n ? 'No team members match your current filters. Try clearing them or searching for a different name.'\n : 'You have no staff yet. Invite your first worker or delivery partner to start building your team.'\n }\n action={\n searchQuery || roleFilter || statusFilter ? (\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('');\n setRoleFilter('');\n setStatusFilter('');\n setSortBy('name');\n }}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n Clear filters\n </button>\n ) : (\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\"\n >\n <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n )\n }\n />\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-status-warning-text text-status-warning-text\" />\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'\n ? 'bg-status-success-text'\n : '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-status-error-bg-subtle hover:text-status-error-text 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-status-warning-text text-status-warning-text\" />\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\">\n Email *\n </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\">\n Status\n </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/kadaikodi/pages/cart-owner/StaffManagementPage.tsx"],"sourcesContent":["/**\n * Staff Management Page\n *\n * Team overview and roster for the signed-in owner's own service provider (cart).\n * Lists the provider's real workers (useProviderWorkers) with role/status filters\n * and search, and invites new workers (useCreateProviderWorker). No fabricated\n * staff, performance metrics, or earnings.\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n UserPlus,\n Phone,\n Search,\n X,\n Mail,\n CheckCircle2,\n AlertCircle,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useProviders,\n useProviderWorkers,\n useCreateProviderWorker,\n type KadaikodiProviderWorkerRow,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface InviteForm {\n name: string;\n email: string;\n phone: string;\n role: string;\n}\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\ninterface WorkerMetadata {\n email?: string;\n phone?: string;\n}\n\n// ============================================================================\n// Constants & helpers\n// ============================================================================\n\nconst ROLE_OPTIONS = ['MANAGER', 'CHEF', 'SERVER', 'DELIVERY', 'CASHIER'] as const;\n\nconst prettify = (s: string): string =>\n s\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nconst statusColor = (status: string): { label: string; color: string; dot: string } => {\n const s = status.toUpperCase();\n if (s === 'ACTIVE')\n return { label: prettify(status), color: 'text-status-success-text', dot: 'bg-status-success-text' };\n if (s === 'ON_LEAVE' || s === 'ON-LEAVE')\n return { label: prettify(status), color: 'text-status-warning-text', dot: 'bg-status-warning-text' };\n return { label: prettify(status), color: 'text-text-secondary', dot: 'bg-muted-foreground' };\n};\n\nconst readMetadata = (metadata: Record<string, unknown> | null | undefined): WorkerMetadata => {\n if (!metadata || typeof metadata !== 'object') return {};\n const m = metadata as Record<string, unknown>;\n return {\n email: typeof m.email === 'string' ? m.email : undefined,\n phone: typeof m.phone === 'string' ? m.phone : undefined,\n };\n};\n\nconst emptyInviteForm: InviteForm = {\n name: '',\n email: '',\n phone: '',\n role: 'SERVER',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const StaffManagementPage = () => {\n const { currentUser } = useKadaikodi();\n\n // Resolve the signed-in owner's provider (\"my cart\"), then load its workers.\n const { data: providers = [], isLoading: providersLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const providerId = myProvider?.id;\n const { data: workers = [], isLoading: workersLoading } = useProviderWorkers(providerId);\n const createWorker = useCreateProviderWorker();\n\n // Filters\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState('');\n const [statusFilter, setStatusFilter] = useState('');\n\n // Invite modal\n const [showInviteModal, setShowInviteModal] = useState(false);\n const [inviteForm, setInviteForm] = useState<InviteForm>(emptyInviteForm);\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 // ---- Derived ----\n const roles = useMemo(() => [...new Set(workers.map((w) => w.role))].sort(), [workers]);\n const statuses = useMemo(() => [...new Set(workers.map((w) => w.status))].sort(), [workers]);\n\n const activeCount = workers.filter((w) => w.status.toUpperCase() === 'ACTIVE').length;\n const onLeaveCount = workers.filter((w) => {\n const s = w.status.toUpperCase();\n return s === 'ON_LEAVE' || s === 'ON-LEAVE';\n }).length;\n\n const filteredStaff = useMemo(() => {\n let result = [...workers];\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n result = result.filter((w) => {\n const meta = readMetadata(w.metadata);\n return (\n w.name.toLowerCase().includes(q) ||\n w.role.toLowerCase().includes(q) ||\n (meta.email ?? '').toLowerCase().includes(q) ||\n (meta.phone ?? '').includes(q)\n );\n });\n }\n if (roleFilter) result = result.filter((w) => w.role === roleFilter);\n if (statusFilter) result = result.filter((w) => w.status === statusFilter);\n result.sort((a, b) => a.name.localeCompare(b.name));\n return result;\n }, [workers, searchQuery, roleFilter, statusFilter]);\n\n const hasActiveFilters = Boolean(searchQuery || roleFilter || statusFilter);\n\n // ---- Handlers ----\n const handleInvite = () => {\n if (!inviteForm.name.trim() || !inviteForm.role) {\n showStatus('Please provide a name and role', 'error');\n return;\n }\n if (!providerId) {\n showStatus('No cart found to add staff to', 'error');\n return;\n }\n createWorker.mutate(\n {\n providerId,\n name: inviteForm.name.trim(),\n role: inviteForm.role,\n workerId: inviteForm.email.trim() || inviteForm.name.trim(),\n metadata: {\n email: inviteForm.email.trim() || undefined,\n phone: inviteForm.phone.trim() || undefined,\n },\n },\n {\n onSuccess: () => {\n setShowInviteModal(false);\n setInviteForm(emptyInviteForm);\n showStatus('Staff member added successfully', 'success');\n },\n onError: () => showStatus('Could not add staff member. Please try again.', 'error'),\n }\n );\n };\n\n const renderWorkerRow = (member: KadaikodiProviderWorkerRow) => {\n const status = statusColor(member.status);\n const meta = readMetadata(member.metadata);\n const initials = member.name\n .split(' ')\n .map((p) => p[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase();\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 <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\">{member.name}</p>\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-[var(--color-accent-soft)] text-text-primary\">\n {prettify(member.role)}\n </span>\n <span className={cn('text-xs', status.color)}>{status.label}</span>\n </div>\n {(meta.email || meta.phone) && (\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary flex-wrap\">\n {meta.email && (\n <span className=\"flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {meta.email}\n </span>\n )}\n {meta.phone && (\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {meta.phone}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <PageLayout\n title=\"Staff Management\"\n description=\"Manage your workers and delivery partners\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\n disabled={!providerId}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n providerId\n ? 'bg-accent text-text-primary hover:bg-accent/80'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n <UserPlus className=\"h-4 w-4\" />\n Add Staff\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n Your team in one place. Use this page to add workers and delivery partners to your cart, see\n who&apos;s active, and keep your roster organised so orders go out on time. Build a reliable\n crew around your cart.\n </PagePurpose>\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-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-status-error-text/30 bg-status-error-bg-subtle'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {providersLoading ? (\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n ) : !myProvider ? (\n <EmptyState\n illustration=\"empty-people\"\n title=\"Create your cart first\"\n description=\"You need a service provider before you can add staff. Set up your cart to get started.\"\n />\n ) : (\n <>\n {/* Summary Stats — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Team Overview</h2>\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\">{workers.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-status-success-text\">{activeCount}</p>\n <p className=\"text-xs text-text-secondary\">Active</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-status-warning-text\">{onLeaveCount}</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\">{roles.length}</p>\n <p className=\"text-xs text-text-secondary\">Roles</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-3 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 {roles.map((r) => (\n <option key={r} value={r}>\n {prettify(r)}\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 {statuses.map((s) => (\n <option key={s} value={s}>\n {prettify(s)}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n {/* Staff List */}\n {workersLoading ? (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n ) : filteredStaff.length === 0 ? (\n <EmptyState\n illustration={hasActiveFilters ? 'empty-search' : 'empty-people'}\n title=\"No staff members found\"\n description={\n hasActiveFilters\n ? 'No team members match your current filters. Try clearing them or searching for a different name.'\n : 'You have no staff yet. Add your first worker or delivery partner to start building your team.'\n }\n action={\n hasActiveFilters ? (\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('');\n setRoleFilter('');\n setStatusFilter('');\n }}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm text-text-primary hover:bg-bg-sunken\"\n >\n Clear filters\n </button>\n ) : (\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\"\n >\n <UserPlus className=\"h-4 w-4\" />\n Add Staff\n </button>\n )\n }\n />\n ) : (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm divide-y divide-border\">\n {filteredStaff.map(renderWorkerRow)}\n </div>\n )}\n </>\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\">Add 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>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Full Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.name}\n onChange={(e) => setInviteForm((p) => ({ ...p, name: 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\">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 className=\"grid grid-cols-2 gap-4\">\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>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role *</label>\n <select\n value={inviteForm.role}\n onChange={(e) => setInviteForm((p) => ({ ...p, role: 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 {ROLE_OPTIONS.map((r) => (\n <option key={r} value={r}>\n {prettify(r)}\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={() => 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={handleInvite}\n disabled={createWorker.isPending}\n className={cn(\n 'flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n createWorker.isPending\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {createWorker.isPending ? 'Adding...' : 'Add Staff'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}