@burdenoff/microfe-crewfoundry 2026.704.3 → 2026.704.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +76 -75
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +118 -117
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +115 -114
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +105 -104
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +52 -51
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +94 -93
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +97 -96
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +68 -67
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +96 -95
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +153 -152
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +111 -110
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +77 -76
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +80 -79
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +102 -101
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +64 -63
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +96 -95
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +129 -127
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +118 -117
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +123 -122
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +77 -76
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +49 -48
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +62 -61
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +72 -71
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +70 -69
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +57 -56
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +58 -57
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +122 -121
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +2 -2
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +70 -69
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +41 -40
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +65 -64
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +75 -74
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +4 -4
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +60 -59
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +53 -52
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +37 -36
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +62 -61
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +50 -49
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +72 -71
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +40 -39
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +134 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +60 -59
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +177 -146
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/formatEnumLabel.js +8 -0
- package/dist/crewfoundry/utils/formatEnumLabel.js.map +1 -0
- 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'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'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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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
|
|
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
|
|
49
|
-
let { t:
|
|
50
|
-
let n =
|
|
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
|
-
},
|
|
53
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
57
|
+
/* @__PURE__ */ l("div", {
|
|
57
58
|
className: "flex items-start justify-between gap-4",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
59
|
-
/* @__PURE__ */
|
|
59
|
+
children: [/* @__PURE__ */ l("div", { children: [
|
|
60
|
+
/* @__PURE__ */ c("h1", {
|
|
60
61
|
className: "text-2xl font-semibold",
|
|
61
|
-
children: /* @__PURE__ */
|
|
62
|
+
children: /* @__PURE__ */ c(_, { children: M("crewfoundry.teams.title", "Teams") })
|
|
62
63
|
}),
|
|
63
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ l("p", {
|
|
64
65
|
className: "text-sm text-text-secondary",
|
|
65
66
|
children: [
|
|
66
|
-
|
|
67
|
+
E.length,
|
|
67
68
|
" ",
|
|
68
|
-
|
|
69
|
+
M("crewfoundry.teams.summary.count", "teams across the organization")
|
|
69
70
|
]
|
|
70
71
|
}),
|
|
71
|
-
/* @__PURE__ */
|
|
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__ */
|
|
76
|
+
] }), /* @__PURE__ */ l(d, {
|
|
76
77
|
size: "sm",
|
|
77
|
-
onClick: () =>
|
|
78
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
82
|
+
/* @__PURE__ */ c("div", {
|
|
82
83
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
83
|
-
children:
|
|
84
|
+
children: E.length === 0 ? /* @__PURE__ */ c("div", {
|
|
84
85
|
className: "col-span-full",
|
|
85
|
-
children: /* @__PURE__ */
|
|
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
|
-
}) :
|
|
91
|
-
treatment:
|
|
92
|
-
glow:
|
|
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: () =>
|
|
97
|
+
onClick: () => P(e),
|
|
97
98
|
onKeyDown: (t) => {
|
|
98
|
-
(t.key === "Enter" || t.key === " ") && (t.preventDefault(),
|
|
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__ */
|
|
102
|
+
children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ l("div", {
|
|
102
103
|
className: "flex items-center justify-between",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
104
|
+
children: [/* @__PURE__ */ c(h, {
|
|
104
105
|
className: "text-base",
|
|
105
106
|
children: e.name
|
|
106
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
114
|
+
children: [/* @__PURE__ */ l("span", {
|
|
114
115
|
className: "flex items-center gap-1",
|
|
115
116
|
children: [
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ c(o, { className: "h-3 w-3" }),
|
|
117
118
|
e.memberCount,
|
|
118
119
|
" ",
|
|
119
|
-
|
|
120
|
+
M("crewfoundry.teams.card.members", "members")
|
|
120
121
|
]
|
|
121
|
-
}), /* @__PURE__ */
|
|
122
|
+
}), /* @__PURE__ */ l("span", {
|
|
122
123
|
className: "flex items-center gap-1",
|
|
123
124
|
children: [
|
|
124
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ c(i, { className: "h-3 w-3" }),
|
|
125
126
|
e.projectCount,
|
|
126
127
|
" ",
|
|
127
|
-
|
|
128
|
+
M("crewfoundry.teams.card.projects", "projects")
|
|
128
129
|
]
|
|
129
130
|
})]
|
|
130
|
-
}), /* @__PURE__ */
|
|
131
|
+
}), /* @__PURE__ */ l("div", {
|
|
131
132
|
className: "text-xs text-text-secondary",
|
|
132
133
|
children: [
|
|
133
|
-
/* @__PURE__ */
|
|
134
|
-
|
|
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__ */
|
|
141
|
+
/* @__PURE__ */ c("span", { children: e.department })
|
|
141
142
|
]
|
|
142
143
|
})] })]
|
|
143
144
|
}, e.id))
|
|
144
145
|
}),
|
|
145
|
-
|
|
146
|
-
page:
|
|
147
|
-
pageSize:
|
|
148
|
-
totalItems:
|
|
149
|
-
onPageChange:
|
|
146
|
+
E.length > A && /* @__PURE__ */ c(b, {
|
|
147
|
+
page: k,
|
|
148
|
+
pageSize: A,
|
|
149
|
+
totalItems: E.length,
|
|
150
|
+
onPageChange: j
|
|
150
151
|
}),
|
|
151
|
-
/* @__PURE__ */
|
|
152
|
-
open:
|
|
153
|
-
onOpenChange:
|
|
154
|
-
title:
|
|
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:
|
|
157
|
+
fields: C,
|
|
157
158
|
submitLabel: "Create Team",
|
|
158
159
|
onSubmit: async (e) => {
|
|
159
|
-
await
|
|
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 {
|
|
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(
|
|
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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"}
|