@burdenoff/microfe-crewfoundry 2026.704.3 → 2026.704.4

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 (89) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +76 -75
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +118 -117
  4. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +115 -114
  6. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +105 -104
  8. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +52 -51
  10. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +94 -93
  12. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +97 -96
  14. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +68 -67
  16. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +96 -95
  18. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +153 -152
  20. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +107 -106
  22. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +77 -76
  24. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +80 -79
  26. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +102 -101
  28. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +126 -125
  30. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/HiringJobsPagePage.js +64 -63
  32. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +96 -95
  34. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +127 -126
  36. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/HrPayrollPagePage.js +118 -117
  38. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +123 -122
  40. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  41. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +77 -76
  42. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +49 -48
  44. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +62 -61
  46. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/LearningLearningPagePage.js +72 -71
  48. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +70 -69
  50. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +57 -56
  52. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +58 -57
  54. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +122 -121
  56. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  57. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +70 -69
  58. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +41 -40
  60. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +65 -64
  62. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +75 -74
  64. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +60 -59
  66. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +53 -52
  68. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +37 -36
  70. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +126 -125
  72. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +62 -61
  74. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +50 -49
  76. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +72 -71
  78. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +40 -39
  80. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +130 -129
  82. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +60 -59
  84. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  85. package/dist/crewfoundry/store/crewfoundryStore.js +177 -146
  86. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  87. package/dist/crewfoundry/utils/formatEnumLabel.js +8 -0
  88. package/dist/crewfoundry/utils/formatEnumLabel.js.map +1 -0
  89. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TeamsTeamSettingsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamSettingsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n Label,\n NextSteps,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Separator,\n Switch,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n BarChart3,\n Bell,\n Lock,\n Save,\n Settings,\n Shield,\n Trash2,\n UserMinus,\n UserPlus,\n Users,\n} from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function TeamsTeamSettingsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const teams = useCrewFoundryStore((state) => state.teams);\n const employees = useCrewFoundryStore((state) => state.employees);\n const updateTeam = useCrewFoundryStore((state) => state.updateTeam);\n const removeTeam = useCrewFoundryStore((state) => state.removeTeam);\n const teamId = searchParams.get('id');\n const team = teams.find((t) => t.id === teamId) ?? teams[0];\n\n const [teamName, setTeamName] = useState(team?.name ?? '');\n const [description, setDescription] = useState(team?.description ?? '');\n const [saving, setSaving] = useState(false);\n const [confirmArchiveOpen, setConfirmArchiveOpen] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const addMemberModal = useFormModal();\n\n if (!team) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No team to configure\"\n description=\"Create a team first, then return here to manage its settings.\"\n />\n </div>\n );\n }\n\n const teamMembers = employees.filter((e) => team.members.includes(e.id));\n const availableEmployees = employees.filter((e) => !team.members.includes(e.id));\n\n const handleSave = async () => {\n if (saving) return;\n if (teamName.trim() === '') {\n showToast('Team Name is required', 'warning');\n return;\n }\n setSaving(true);\n try {\n await updateTeam(team.id, { name: teamName.trim(), description: description.trim() });\n showToast('Team settings saved', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to save team settings', 'error');\n } finally {\n setSaving(false);\n }\n };\n\n const addMemberFields: FieldConfig[] = [\n {\n name: 'employeeId',\n label: 'Employee',\n type: 'select',\n required: true,\n colSpan: 2,\n placeholder: 'Select an employee',\n options: availableEmployees.map((e) => ({\n label: `${e.firstName} ${e.lastName} — ${e.position}`,\n value: e.id,\n })),\n },\n ];\n\n const handleAddMember = async (values: FormValues) => {\n const employeeId = String(values.employeeId ?? '');\n if (!employeeId) return;\n await updateTeam(team.id, { members: [...team.members, employeeId] });\n showToast('Member added to team', 'success');\n };\n\n const handleRemoveMember = async (memberId: string) => {\n try {\n await updateTeam(team.id, { members: team.members.filter((id) => id !== memberId) });\n showToast('Member removed from team', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to remove member', 'error');\n }\n };\n\n const handleArchive = async () => {\n if (archiving) return;\n setArchiving(true);\n try {\n await removeTeam(team.id);\n showToast('Team archived', 'success');\n setConfirmArchiveOpen(false);\n navigate('../../teams/teams-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to archive team', 'error');\n } finally {\n setArchiving(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Team Settings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Configure settings for {team.name}</p>\n <PagePurpose className=\"mt-1\">\n Configure a team&apos;s settings — membership, permissions, and preferences that control\n how the team works in CrewFoundry.\n </PagePurpose>\n </div>\n <Button onClick={handleSave} disabled={saving}>\n <Save className=\"h-4 w-4 mr-1\" />\n {saving ? 'Saving…' : 'Save Changes'}\n </Button>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-team-settings\"\n steps={[\n {\n id: 'members',\n label: 'Manage members',\n description: 'Add or remove people and adjust their roles below.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-directory-page'),\n },\n {\n id: 'analytics',\n label: 'Review team analytics',\n description: 'See how this team is performing before you change settings.',\n icon: <BarChart3 className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-analytics-page'),\n },\n {\n id: 'detail',\n label: 'Open the team overview',\n description: 'See members and projects at a glance.',\n icon: <Settings className=\"h-4 w-4\" />,\n onClick: () =>\n navigate(`../../teams/team-detail-page?id=${encodeURIComponent(team.id)}`),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Users className=\"h-5 w-5 text-status-info-text\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Members</p>\n <p className=\"text-lg font-bold\">{team.memberCount}</p>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Settings className=\"h-5 w-5 text-action-primary-bg\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Active Projects</p>\n <p className=\"text-lg font-bold\">{team.projectCount}</p>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Shield className=\"h-5 w-5 text-status-success-text\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Status</p>\n <p className=\"text-lg font-bold capitalize\">{team.status}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n <EmphasisPanel>\n <div className=\"text-base font-semibold\">General Settings</div>\n <p className=\"mb-4 text-sm text-text-secondary\">Basic team information</p>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tsName\">Team Name</Label>\n <Input\n id=\"tsName\"\n value={teamName}\n disabled={saving}\n onChange={(e) => setTeamName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tsDesc\">Description</Label>\n <Textarea\n id=\"tsDesc\"\n className=\"min-h-[80px]\"\n value={description}\n disabled={saving}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input value={team.department} disabled className=\"bg-bg-sunken\" />\n </div>\n <div className=\"space-y-2\">\n <Label>Team Lead</Label>\n <Input value={team.leadName} disabled className=\"bg-bg-sunken\" />\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <CardTitle className=\"text-base\">Team Members</CardTitle>\n <CardDescription>{teamMembers.length} active members</CardDescription>\n </div>\n <Button\n size=\"sm\"\n onClick={() => addMemberModal.openModal()}\n disabled={availableEmployees.length === 0}\n >\n <UserPlus className=\"h-3 w-3 mr-1\" />\n Add Member\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"p-0\">\n {teamMembers.length === 0 ? (\n <p className=\"px-6 py-4 text-sm text-text-secondary\">\n No members yet. Use “Add Member” to build out this team.\n </p>\n ) : (\n teamMembers.map((member, i) => (\n <div\n key={member.id}\n className={`flex items-center justify-between px-6 py-3 ${i < teamMembers.length - 1 ? 'border-b' : ''}`}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium\">\n {member.firstName[0]}\n {member.lastName[0]}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">\n {member.firstName} {member.lastName}\n </p>\n {member.id === team.leadId && <Badge className=\"text-[10px]\">Lead</Badge>}\n </div>\n <p className=\"text-xs text-text-secondary\">{member.position}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge\n variant={member.status === 'active' ? 'secondary' : 'outline'}\n className=\"text-[10px]\"\n >\n {member.status}\n </Badge>\n {member.id !== team.leadId && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${member.firstName} ${member.lastName} from team`}\n className=\"h-7 w-7 p-0 text-text-secondary hover:text-status-error-text\"\n onClick={() => handleRemoveMember(member.id)}\n >\n <UserMinus className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n </div>\n ))\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Permissions & Access</CardTitle>\n <CardDescription>\n Visibility and join controls — coming soon on the CrewFoundry roadmap.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">Private Team</p>\n <p className=\"text-xs text-text-secondary\">\n Only invited members can see this team\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Lock className=\"h-4 w-4 text-text-secondary\" />\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Coming soon\n </Badge>\n <Switch checked={false} disabled aria-label=\"Private team (coming soon)\" />\n </div>\n </div>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">Auto-Approve Join Requests</p>\n <p className=\"text-xs text-text-secondary\">\n Automatically accept when employees request to join\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Coming soon\n </Badge>\n <Switch\n checked={false}\n disabled\n aria-label=\"Auto-approve join requests (coming soon)\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Notification Preferences</CardTitle>\n <CardDescription className=\"text-xs\">Coming soon on the roadmap.</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs font-medium\">New Member Alerts</p>\n <p className=\"text-[10px] text-text-secondary\">\n Notify when members join or leave\n </p>\n </div>\n </div>\n <Switch checked={false} disabled aria-label=\"New member alerts (coming soon)\" />\n </div>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs font-medium\">Weekly Digest</p>\n <p className=\"text-[10px] text-text-secondary\">Summary of team activity</p>\n </div>\n </div>\n <Switch checked={false} disabled aria-label=\"Weekly digest (coming soon)\" />\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Team Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n {[\n { label: 'Created', value: team.createdAt },\n { label: 'Department', value: team.department },\n { label: 'Status', value: team.status },\n { label: 'Projects', value: team.projectCount.toString() },\n { label: 'Members', value: team.memberCount.toString() },\n ].map((item) => (\n <div key={item.label} className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary text-xs\">{item.label}</span>\n <span className=\"text-xs font-medium\">{item.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"border-status-error-border/50\">\n <CardHeader>\n <CardTitle className=\"text-sm text-status-error-text\">Danger Zone</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-xs text-text-secondary\">\n Archiving a team removes it from the active roster and deactivates associated\n projects. This action can be reversed by an admin.\n </p>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n onClick={() => setConfirmArchiveOpen(true)}\n >\n <Trash2 className=\"h-3 w-3 mr-1\" />\n Archive Team\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n\n <FormModal\n open={addMemberModal.open}\n onOpenChange={addMemberModal.onOpenChange}\n title=\"Add Team Member\"\n description={`Add an employee to ${team.name}.`}\n fields={addMemberFields}\n submitLabel=\"Add Member\"\n onSubmit={handleAddMember}\n />\n\n <ResponsiveDialog open={confirmArchiveOpen} onOpenChange={setConfirmArchiveOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-[440px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Archive {team.name}?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes the team from the active roster. An admin can restore it later.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmArchiveOpen(false)}\n disabled={archiving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleArchive}\n disabled={archiving}\n >\n {archiving ? 'Archiving…' : 'Archive Team'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TeamsTeamSettingsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamSettingsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n Label,\n NextSteps,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Separator,\n Switch,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n BarChart3,\n Bell,\n Lock,\n Save,\n Settings,\n Shield,\n Trash2,\n UserMinus,\n UserPlus,\n Users,\n} from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function TeamsTeamSettingsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const teams = useCrewFoundryStore((state) => state.teams);\n const employees = useCrewFoundryStore((state) => state.employees);\n const updateTeam = useCrewFoundryStore((state) => state.updateTeam);\n const removeTeam = useCrewFoundryStore((state) => state.removeTeam);\n const teamId = searchParams.get('id');\n const team = teams.find((t) => t.id === teamId) ?? teams[0];\n\n const [teamName, setTeamName] = useState(team?.name ?? '');\n const [description, setDescription] = useState(team?.description ?? '');\n const [saving, setSaving] = useState(false);\n const [confirmArchiveOpen, setConfirmArchiveOpen] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const addMemberModal = useFormModal();\n\n if (!team) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No team to configure\"\n description=\"Create a team first, then return here to manage its settings.\"\n />\n </div>\n );\n }\n\n const teamMembers = employees.filter((e) => team.members.includes(e.id));\n const availableEmployees = employees.filter((e) => !team.members.includes(e.id));\n\n const handleSave = async () => {\n if (saving) return;\n if (teamName.trim() === '') {\n showToast('Team Name is required', 'warning');\n return;\n }\n setSaving(true);\n try {\n await updateTeam(team.id, { name: teamName.trim(), description: description.trim() });\n showToast('Team settings saved', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to save team settings', 'error');\n } finally {\n setSaving(false);\n }\n };\n\n const addMemberFields: FieldConfig[] = [\n {\n name: 'employeeId',\n label: 'Employee',\n type: 'select',\n required: true,\n colSpan: 2,\n placeholder: 'Select an employee',\n options: availableEmployees.map((e) => ({\n label: `${e.firstName} ${e.lastName} — ${e.position}`,\n value: e.id,\n })),\n },\n ];\n\n const handleAddMember = async (values: FormValues) => {\n const employeeId = String(values.employeeId ?? '');\n if (!employeeId) return;\n await updateTeam(team.id, { members: [...team.members, employeeId] });\n showToast('Member added to team', 'success');\n };\n\n const handleRemoveMember = async (memberId: string) => {\n try {\n await updateTeam(team.id, { members: team.members.filter((id) => id !== memberId) });\n showToast('Member removed from team', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to remove member', 'error');\n }\n };\n\n const handleArchive = async () => {\n if (archiving) return;\n setArchiving(true);\n try {\n await removeTeam(team.id);\n showToast('Team archived', 'success');\n setConfirmArchiveOpen(false);\n navigate('../../teams/teams-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to archive team', 'error');\n } finally {\n setArchiving(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Team Settings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Configure settings for {team.name}</p>\n <PagePurpose className=\"mt-1\">\n Configure a team&apos;s settings — membership, permissions, and preferences that control\n how the team works in CrewFoundry.\n </PagePurpose>\n </div>\n <Button onClick={handleSave} disabled={saving}>\n <Save className=\"h-4 w-4 mr-1\" />\n {saving ? 'Saving…' : 'Save Changes'}\n </Button>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-team-settings\"\n steps={[\n {\n id: 'members',\n label: 'Manage members',\n description: 'Add or remove people and adjust their roles below.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-directory-page'),\n },\n {\n id: 'analytics',\n label: 'Review team analytics',\n description: 'See how this team is performing before you change settings.',\n icon: <BarChart3 className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-analytics-page'),\n },\n {\n id: 'detail',\n label: 'Open the team overview',\n description: 'See members and projects at a glance.',\n icon: <Settings className=\"h-4 w-4\" />,\n onClick: () =>\n navigate(`../../teams/team-detail-page?id=${encodeURIComponent(team.id)}`),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Users className=\"h-5 w-5 text-status-info-text\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Members</p>\n <p className=\"text-lg font-bold\">{team.memberCount}</p>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Settings className=\"h-5 w-5 text-action-primary-bg\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Active Projects</p>\n <p className=\"text-lg font-bold\">{team.projectCount}</p>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <Shield className=\"h-5 w-5 text-status-success-text\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Status</p>\n <p className=\"text-lg font-bold capitalize\">{formatEnumLabel(team.status)}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n <EmphasisPanel>\n <div className=\"text-base font-semibold\">General Settings</div>\n <p className=\"mb-4 text-sm text-text-secondary\">Basic team information</p>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tsName\">Team Name</Label>\n <Input\n id=\"tsName\"\n value={teamName}\n disabled={saving}\n onChange={(e) => setTeamName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tsDesc\">Description</Label>\n <Textarea\n id=\"tsDesc\"\n className=\"min-h-[80px]\"\n value={description}\n disabled={saving}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input value={team.department} disabled className=\"bg-bg-sunken\" />\n </div>\n <div className=\"space-y-2\">\n <Label>Team Lead</Label>\n <Input value={team.leadName} disabled className=\"bg-bg-sunken\" />\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <CardTitle className=\"text-base\">Team Members</CardTitle>\n <CardDescription>{teamMembers.length} active members</CardDescription>\n </div>\n <Button\n size=\"sm\"\n onClick={() => addMemberModal.openModal()}\n disabled={availableEmployees.length === 0}\n >\n <UserPlus className=\"h-3 w-3 mr-1\" />\n Add Member\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"p-0\">\n {teamMembers.length === 0 ? (\n <p className=\"px-6 py-4 text-sm text-text-secondary\">\n No members yet. Use “Add Member” to build out this team.\n </p>\n ) : (\n teamMembers.map((member, i) => (\n <div\n key={member.id}\n className={`flex items-center justify-between px-6 py-3 ${i < teamMembers.length - 1 ? 'border-b' : ''}`}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium\">\n {member.firstName[0]}\n {member.lastName[0]}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">\n {member.firstName} {member.lastName}\n </p>\n {member.id === team.leadId && <Badge className=\"text-[10px]\">Lead</Badge>}\n </div>\n <p className=\"text-xs text-text-secondary\">{member.position}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge\n variant={member.status === 'active' ? 'secondary' : 'outline'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(member.status)}\n </Badge>\n {member.id !== team.leadId && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${member.firstName} ${member.lastName} from team`}\n className=\"h-7 w-7 p-0 text-text-secondary hover:text-status-error-text\"\n onClick={() => handleRemoveMember(member.id)}\n >\n <UserMinus className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n </div>\n ))\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Permissions & Access</CardTitle>\n <CardDescription>\n Visibility and join controls — coming soon on the CrewFoundry roadmap.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">Private Team</p>\n <p className=\"text-xs text-text-secondary\">\n Only invited members can see this team\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Lock className=\"h-4 w-4 text-text-secondary\" />\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Coming soon\n </Badge>\n <Switch checked={false} disabled aria-label=\"Private team (coming soon)\" />\n </div>\n </div>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">Auto-Approve Join Requests</p>\n <p className=\"text-xs text-text-secondary\">\n Automatically accept when employees request to join\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Coming soon\n </Badge>\n <Switch\n checked={false}\n disabled\n aria-label=\"Auto-approve join requests (coming soon)\"\n />\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Notification Preferences</CardTitle>\n <CardDescription className=\"text-xs\">Coming soon on the roadmap.</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs font-medium\">New Member Alerts</p>\n <p className=\"text-[10px] text-text-secondary\">\n Notify when members join or leave\n </p>\n </div>\n </div>\n <Switch checked={false} disabled aria-label=\"New member alerts (coming soon)\" />\n </div>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs font-medium\">Weekly Digest</p>\n <p className=\"text-[10px] text-text-secondary\">Summary of team activity</p>\n </div>\n </div>\n <Switch checked={false} disabled aria-label=\"Weekly digest (coming soon)\" />\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Team Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n {[\n { label: 'Created', value: team.createdAt },\n { label: 'Department', value: team.department },\n { label: 'Status', value: team.status },\n { label: 'Projects', value: team.projectCount.toString() },\n { label: 'Members', value: team.memberCount.toString() },\n ].map((item) => (\n <div key={item.label} className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary text-xs\">{item.label}</span>\n <span className=\"text-xs font-medium\">{item.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"border-status-error-border/50\">\n <CardHeader>\n <CardTitle className=\"text-sm text-status-error-text\">Danger Zone</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-xs text-text-secondary\">\n Archiving a team removes it from the active roster and deactivates associated\n projects. This action can be reversed by an admin.\n </p>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n onClick={() => setConfirmArchiveOpen(true)}\n >\n <Trash2 className=\"h-3 w-3 mr-1\" />\n Archive Team\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n\n <FormModal\n open={addMemberModal.open}\n onOpenChange={addMemberModal.onOpenChange}\n title=\"Add Team Member\"\n description={`Add an employee to ${team.name}.`}\n fields={addMemberFields}\n submitLabel=\"Add Member\"\n onSubmit={handleAddMember}\n />\n\n <ResponsiveDialog open={confirmArchiveOpen} onOpenChange={setConfirmArchiveOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-[440px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Archive {team.name}?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes the team from the active roster. An admin can restore it later.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmArchiveOpen(false)}\n disabled={archiving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleArchive}\n disabled={archiving}\n >\n {archiving ? 'Archiving…' : 'Archive Team'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
3
- import { FolderKanban as r, Plus as i, Users as a } from "lucide-react";
4
- import { useNavigate as o } from "react-router-dom";
5
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
- import { Badge as l, Button as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g, IllustratedEmptyState as _, PagePurpose as v, Pagination as y } from "@burdenoff/fe-libs/ui";
7
- import { usePagination as b } from "@burdenoff/fe-libs/shared/hooks";
8
- import { useI18n as x } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
2
+ import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
+ import { FormModal as n, useFormModal as r } from "../components/forms/FormModal.js";
4
+ import { FolderKanban as i, Plus as a, Users as o } from "lucide-react";
5
+ import { useNavigate as s } from "react-router-dom";
6
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
+ import { Badge as u, Button as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, IllustratedEmptyState as v, PagePurpose as y, Pagination as b } from "@burdenoff/fe-libs/ui";
8
+ import { usePagination as x } from "@burdenoff/fe-libs/shared/hooks";
9
+ import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
10
  //#region src/crewfoundry/pages/TeamsTeamsPagePage.tsx
10
- var S = [
11
+ var C = [
11
12
  {
12
13
  name: "name",
13
14
  label: "Team Name",
@@ -45,118 +46,118 @@ var S = [
45
46
  colSpan: 2
46
47
  }
47
48
  ];
48
- function C() {
49
- let { t: C } = x(), w = o(), { teams: T } = e(), E = e((e) => e.addTeam), D = n(), { page: O, pageSize: k, setPage: A } = b({ initialPageSize: 12 }), j = (e, t) => {
50
- let n = C(e);
49
+ function w() {
50
+ let { t: w } = S(), T = s(), { teams: E } = e(), D = e((e) => e.addTeam), O = r(), { page: k, pageSize: A, setPage: j } = x({ initialPageSize: 12 }), M = (e, t) => {
51
+ let n = w(e);
51
52
  return n === e ? t : n;
52
- }, M = T.slice((O - 1) * k, (O - 1) * k + k), N = (e) => w(`../../teams/team-detail-page?id=${encodeURIComponent(e.id)}`);
53
- return /* @__PURE__ */ c("div", {
53
+ }, N = E.slice((k - 1) * A, (k - 1) * A + A), P = (e) => T(`../../teams/team-detail-page?id=${encodeURIComponent(e.id)}`);
54
+ return /* @__PURE__ */ l("div", {
54
55
  className: "space-y-6 p-6",
55
56
  children: [
56
- /* @__PURE__ */ c("div", {
57
+ /* @__PURE__ */ l("div", {
57
58
  className: "flex items-start justify-between gap-4",
58
- children: [/* @__PURE__ */ c("div", { children: [
59
- /* @__PURE__ */ s("h1", {
59
+ children: [/* @__PURE__ */ l("div", { children: [
60
+ /* @__PURE__ */ c("h1", {
60
61
  className: "text-2xl font-semibold",
61
- children: /* @__PURE__ */ s(g, { children: j("crewfoundry.teams.title", "Teams") })
62
+ children: /* @__PURE__ */ c(_, { children: M("crewfoundry.teams.title", "Teams") })
62
63
  }),
63
- /* @__PURE__ */ c("p", {
64
+ /* @__PURE__ */ l("p", {
64
65
  className: "text-sm text-text-secondary",
65
66
  children: [
66
- T.length,
67
+ E.length,
67
68
  " ",
68
- j("crewfoundry.teams.summary.count", "teams across the organization")
69
+ M("crewfoundry.teams.summary.count", "teams across the organization")
69
70
  ]
70
71
  }),
71
- /* @__PURE__ */ s(v, {
72
+ /* @__PURE__ */ c(y, {
72
73
  className: "mt-1",
73
74
  children: "Manage your teams — create groups, assign members, and organize people around the work they do together."
74
75
  })
75
- ] }), /* @__PURE__ */ c(u, {
76
+ ] }), /* @__PURE__ */ l(d, {
76
77
  size: "sm",
77
- onClick: () => D.openModal(),
78
- children: [/* @__PURE__ */ s(i, { className: "h-4 w-4 mr-1" }), j("crewfoundry.teams.actions.createTeam", "Create Team")]
78
+ onClick: () => O.openModal(),
79
+ children: [/* @__PURE__ */ c(a, { className: "h-4 w-4 mr-1" }), M("crewfoundry.teams.actions.createTeam", "Create Team")]
79
80
  })]
80
81
  }),
81
- /* @__PURE__ */ s("div", {
82
+ /* @__PURE__ */ c("div", {
82
83
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
83
- children: T.length === 0 ? /* @__PURE__ */ s("div", {
84
+ children: E.length === 0 ? /* @__PURE__ */ c("div", {
84
85
  className: "col-span-full",
85
- children: /* @__PURE__ */ s(_, {
86
+ children: /* @__PURE__ */ c(v, {
86
87
  illustration: "empty-people",
87
88
  title: "No teams yet",
88
89
  description: "Create a team to organize people around their work."
89
90
  })
90
- }) : M.map((e, t) => /* @__PURE__ */ c(h, {
91
- treatment: t === 0 && O === 1 ? "glass" : "plain",
92
- glow: t === 0 && O === 1,
91
+ }) : N.map((e, n) => /* @__PURE__ */ l(g, {
92
+ treatment: n === 0 && k === 1 ? "glass" : "plain",
93
+ glow: n === 0 && k === 1,
93
94
  role: "button",
94
95
  tabIndex: 0,
95
96
  "aria-label": `Open ${e.name} team detail`,
96
- onClick: () => N(e),
97
+ onClick: () => P(e),
97
98
  onKeyDown: (t) => {
98
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), N(e));
99
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), P(e));
99
100
  },
100
101
  className: "hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
101
- children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ c("div", {
102
+ children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ l("div", {
102
103
  className: "flex items-center justify-between",
103
- children: [/* @__PURE__ */ s(m, {
104
+ children: [/* @__PURE__ */ c(h, {
104
105
  className: "text-base",
105
106
  children: e.name
106
- }), /* @__PURE__ */ s(l, {
107
+ }), /* @__PURE__ */ c(u, {
107
108
  variant: e.status === "active" ? "default" : "secondary",
108
109
  className: "text-[10px]",
109
- children: e.status
110
+ children: t(e.status)
110
111
  })]
111
- }), /* @__PURE__ */ s(f, { children: e.description })] }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
112
+ }), /* @__PURE__ */ c(p, { children: e.description })] }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
112
113
  className: "grid grid-cols-2 gap-2 text-sm text-text-secondary mb-2",
113
- children: [/* @__PURE__ */ c("span", {
114
+ children: [/* @__PURE__ */ l("span", {
114
115
  className: "flex items-center gap-1",
115
116
  children: [
116
- /* @__PURE__ */ s(a, { className: "h-3 w-3" }),
117
+ /* @__PURE__ */ c(o, { className: "h-3 w-3" }),
117
118
  e.memberCount,
118
119
  " ",
119
- j("crewfoundry.teams.card.members", "members")
120
+ M("crewfoundry.teams.card.members", "members")
120
121
  ]
121
- }), /* @__PURE__ */ c("span", {
122
+ }), /* @__PURE__ */ l("span", {
122
123
  className: "flex items-center gap-1",
123
124
  children: [
124
- /* @__PURE__ */ s(r, { className: "h-3 w-3" }),
125
+ /* @__PURE__ */ c(i, { className: "h-3 w-3" }),
125
126
  e.projectCount,
126
127
  " ",
127
- j("crewfoundry.teams.card.projects", "projects")
128
+ M("crewfoundry.teams.card.projects", "projects")
128
129
  ]
129
130
  })]
130
- }), /* @__PURE__ */ c("div", {
131
+ }), /* @__PURE__ */ l("div", {
131
132
  className: "text-xs text-text-secondary",
132
133
  children: [
133
- /* @__PURE__ */ c("span", { children: [
134
- j("crewfoundry.teams.card.lead", "Lead"),
134
+ /* @__PURE__ */ l("span", { children: [
135
+ M("crewfoundry.teams.card.lead", "Lead"),
135
136
  ": ",
136
137
  e.leadName
137
138
  ] }),
138
139
  " ",
139
140
  "· ",
140
- /* @__PURE__ */ s("span", { children: e.department })
141
+ /* @__PURE__ */ c("span", { children: e.department })
141
142
  ]
142
143
  })] })]
143
144
  }, e.id))
144
145
  }),
145
- T.length > k && /* @__PURE__ */ s(y, {
146
- page: O,
147
- pageSize: k,
148
- totalItems: T.length,
149
- onPageChange: A
146
+ E.length > A && /* @__PURE__ */ c(b, {
147
+ page: k,
148
+ pageSize: A,
149
+ totalItems: E.length,
150
+ onPageChange: j
150
151
  }),
151
- /* @__PURE__ */ s(t, {
152
- open: D.open,
153
- onOpenChange: D.onOpenChange,
154
- title: j("crewfoundry.teams.actions.createTeam", "Create Team"),
152
+ /* @__PURE__ */ c(n, {
153
+ open: O.open,
154
+ onOpenChange: O.onOpenChange,
155
+ title: M("crewfoundry.teams.actions.createTeam", "Create Team"),
155
156
  description: "Organize people around the work they do together.",
156
- fields: S,
157
+ fields: C,
157
158
  submitLabel: "Create Team",
158
159
  onSubmit: async (e) => {
159
- await E({
160
+ await D({
160
161
  name: String(e.name ?? "").trim(),
161
162
  description: String(e.description ?? "").trim(),
162
163
  department: String(e.department ?? "").trim() || "operations",
@@ -170,6 +171,6 @@ function C() {
170
171
  });
171
172
  }
172
173
  //#endregion
173
- export { C as TeamsTeamsPagePage };
174
+ export { w as TeamsTeamsPagePage };
174
175
 
175
176
  //# sourceMappingURL=TeamsTeamsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamsTeamsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { FolderKanban, Plus, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Team } from '../store/crewfoundryStore';\n\nconst TEAM_FIELDS: FieldConfig[] = [\n { name: 'name', label: 'Team Name', type: 'text', required: true },\n { name: 'department', label: 'Department', type: 'text', placeholder: 'e.g. Engineering' },\n { name: 'leadName', label: 'Team Lead', type: 'text', placeholder: 'Lead full name' },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Forming', value: 'forming' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n];\n\nexport function TeamsTeamsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { teams } = useCrewFoundryStore();\n const addTeam = useCrewFoundryStore((state) => state.addTeam);\n const createModal = useFormModal();\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageTeams = teams.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openTeam = (team: Team) =>\n navigate(`../../teams/team-detail-page?id=${encodeURIComponent(team.id)}`);\n\n const handleCreate = async (values: FormValues) => {\n // CreateCrewTeamInput accepts only this field subset; the store spreads the\n // object straight into `input`, so we send exactly the accepted shape and\n // let the server response replace the optimistic row.\n const payload: Partial<Team> = {\n name: String(values.name ?? '').trim(),\n description: String(values.description ?? '').trim(),\n department: String(values.department ?? '').trim() || 'operations',\n leadName: String(values.leadName ?? '').trim(),\n status: (String(values.status ?? 'forming') as Team['status']) || 'forming',\n members: [],\n };\n await addTeam(payload as Team);\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{t('crewfoundry.teams.title', 'Teams')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {teams.length} {t('crewfoundry.teams.summary.count', 'teams across the organization')}\n </p>\n <PagePurpose className=\"mt-1\">\n Manage your teams — create groups, assign members, and organize people around the work\n they do together.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => createModal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.teams.actions.createTeam', 'Create Team')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {teams.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No teams yet\"\n description=\"Create a team to organize people around their work.\"\n />\n </div>\n ) : (\n pageTeams.map((team, _idx) => (\n <GlassCard\n key={team.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${team.name} team detail`}\n onClick={() => openTeam(team)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openTeam(team);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{team.name}</CardTitle>\n <Badge\n variant={team.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {team.status}\n </Badge>\n </div>\n <CardDescription>{team.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-2 text-sm text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {team.memberCount} {t('crewfoundry.teams.card.members', 'members')}\n </span>\n <span className=\"flex items-center gap-1\">\n <FolderKanban className=\"h-3 w-3\" />\n {team.projectCount} {t('crewfoundry.teams.card.projects', 'projects')}\n </span>\n </div>\n <div className=\"text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.teams.card.lead', 'Lead')}: {team.leadName}\n </span>{' '}\n · <span>{team.department}</span>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {teams.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={teams.length}\n onPageChange={setPage}\n />\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title={t('crewfoundry.teams.actions.createTeam', 'Create Team')}\n description=\"Organize people around the work they do together.\"\n fields={TEAM_FIELDS}\n submitLabel=\"Create Team\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TeamsTeamsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { FolderKanban, Plus, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Team } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst TEAM_FIELDS: FieldConfig[] = [\n { name: 'name', label: 'Team Name', type: 'text', required: true },\n { name: 'department', label: 'Department', type: 'text', placeholder: 'e.g. Engineering' },\n { name: 'leadName', label: 'Team Lead', type: 'text', placeholder: 'Lead full name' },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Forming', value: 'forming' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n];\n\nexport function TeamsTeamsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { teams } = useCrewFoundryStore();\n const addTeam = useCrewFoundryStore((state) => state.addTeam);\n const createModal = useFormModal();\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageTeams = teams.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openTeam = (team: Team) =>\n navigate(`../../teams/team-detail-page?id=${encodeURIComponent(team.id)}`);\n\n const handleCreate = async (values: FormValues) => {\n // CreateCrewTeamInput accepts only this field subset; the store spreads the\n // object straight into `input`, so we send exactly the accepted shape and\n // let the server response replace the optimistic row.\n const payload: Partial<Team> = {\n name: String(values.name ?? '').trim(),\n description: String(values.description ?? '').trim(),\n department: String(values.department ?? '').trim() || 'operations',\n leadName: String(values.leadName ?? '').trim(),\n status: (String(values.status ?? 'forming') as Team['status']) || 'forming',\n members: [],\n };\n await addTeam(payload as Team);\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{t('crewfoundry.teams.title', 'Teams')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {teams.length} {t('crewfoundry.teams.summary.count', 'teams across the organization')}\n </p>\n <PagePurpose className=\"mt-1\">\n Manage your teams — create groups, assign members, and organize people around the work\n they do together.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => createModal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.teams.actions.createTeam', 'Create Team')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {teams.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No teams yet\"\n description=\"Create a team to organize people around their work.\"\n />\n </div>\n ) : (\n pageTeams.map((team, _idx) => (\n <GlassCard\n key={team.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${team.name} team detail`}\n onClick={() => openTeam(team)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openTeam(team);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{team.name}</CardTitle>\n <Badge\n variant={team.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(team.status)}\n </Badge>\n </div>\n <CardDescription>{team.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-2 text-sm text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {team.memberCount} {t('crewfoundry.teams.card.members', 'members')}\n </span>\n <span className=\"flex items-center gap-1\">\n <FolderKanban className=\"h-3 w-3\" />\n {team.projectCount} {t('crewfoundry.teams.card.projects', 'projects')}\n </span>\n </div>\n <div className=\"text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.teams.card.lead', 'Lead')}: {team.leadName}\n </span>{' '}\n · <span>{team.department}</span>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {teams.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={teams.length}\n onPageChange={setPage}\n />\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title={t('crewfoundry.teams.actions.createTeam', 'Create Team')}\n description=\"Organize people around the work they do together.\"\n fields={TEAM_FIELDS}\n submitLabel=\"Create Team\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}