@burdenoff/microfe-crewfoundry 2026.1030.3 → 2026.1102.1

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 (55) hide show
  1. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoutes.js +18 -14
  3. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  4. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts +9 -0
  5. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts.map +1 -1
  6. package/dist/crewfoundry/components/EmployeeSkillsPanel.js +111 -77
  7. package/dist/crewfoundry/components/EmployeeSkillsPanel.js.map +1 -1
  8. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.d.ts +13 -0
  9. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.d.ts.map +1 -0
  10. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.js +128 -0
  11. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.js.map +1 -0
  12. package/dist/crewfoundry/components/skills/MergeSkillDialog.d.ts +15 -0
  13. package/dist/crewfoundry/components/skills/MergeSkillDialog.d.ts.map +1 -0
  14. package/dist/crewfoundry/components/skills/MergeSkillDialog.js +58 -0
  15. package/dist/crewfoundry/components/skills/MergeSkillDialog.js.map +1 -0
  16. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.d.ts +15 -0
  17. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.d.ts.map +1 -0
  18. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.js +163 -0
  19. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.js.map +1 -0
  20. package/dist/crewfoundry/components/skills/SkillPicker.d.ts +20 -0
  21. package/dist/crewfoundry/components/skills/SkillPicker.d.ts.map +1 -0
  22. package/dist/crewfoundry/components/skills/SkillPicker.js +73 -0
  23. package/dist/crewfoundry/components/skills/SkillPicker.js.map +1 -0
  24. package/dist/crewfoundry/components/skills/SkillRelationsDialog.d.ts +13 -0
  25. package/dist/crewfoundry/components/skills/SkillRelationsDialog.d.ts.map +1 -0
  26. package/dist/crewfoundry/components/skills/SkillRelationsDialog.js +156 -0
  27. package/dist/crewfoundry/components/skills/SkillRelationsDialog.js.map +1 -0
  28. package/dist/crewfoundry/lib/analytics.d.ts +1 -29
  29. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  30. package/dist/crewfoundry/lib/analytics.js +3 -48
  31. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  32. package/dist/crewfoundry/lib/skillMatching.d.ts +70 -0
  33. package/dist/crewfoundry/lib/skillMatching.d.ts.map +1 -0
  34. package/dist/crewfoundry/lib/skillMatching.js +73 -0
  35. package/dist/crewfoundry/lib/skillMatching.js.map +1 -0
  36. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.d.ts +8 -0
  37. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.d.ts.map +1 -1
  38. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +468 -212
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  40. package/dist/crewfoundry/pages/HiringCandidatesPagePage.d.ts.map +1 -1
  41. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +210 -177
  42. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +6 -6
  44. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.d.ts +9 -0
  45. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.d.ts.map +1 -0
  46. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.js +456 -0
  47. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.js.map +1 -0
  48. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.d.ts.map +1 -1
  49. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +50 -102
  50. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -1
  51. package/dist/crewfoundry/store/crewfoundryStore.d.ts +145 -0
  52. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  53. package/dist/crewfoundry/store/crewfoundryStore.js +188 -57
  54. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardExecutiveDashboardPage.js","names":[],"sources":["../../../src/crewfoundry/pages/DashboardExecutiveDashboardPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, Percent, Target } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore, type Department } from '../store/crewfoundryStore';\n\nexport function DashboardExecutiveDashboardPage() {\n const { employees, departments, projects, jobPostings } = useCrewFoundryStore();\n\n const riskIndicators = useMemo(\n () => [\n {\n metric: 'Flight Risk Employees',\n value: employees.filter((employee) => employee.performanceScore < 3.6).length,\n severity: 'warning' as const,\n detail: `${Math.round((employees.filter((employee) => employee.performanceScore < 3.6).length / Math.max(employees.length, 1)) * 100)}% of workforce`,\n },\n {\n metric: 'Employees On Leave',\n value: employees.filter((employee) => employee.status === 'on_leave').length,\n severity: 'error' as const,\n detail: 'Coverage follow-ups required',\n },\n {\n metric: 'Unfilled Lead Roles',\n value: jobPostings.filter(\n (posting) => posting.status === 'active' && posting.experienceLevel === 'lead'\n ).length,\n severity: 'warning' as const,\n detail: 'Open lead-level positions',\n },\n {\n metric: 'Contract Employees',\n value: employees.filter((employee) => employee.type === 'contract').length,\n severity: 'info' as const,\n detail: 'Contract renewals in focus',\n },\n ],\n [employees, jobPostings]\n );\n\n const totalSalaryBudget = employees.reduce((sum, e) => sum + e.salary, 0);\n const totalDeptBudget = departments.reduce((sum, d) => sum + d.budget, 0);\n const totalProjectBudget = projects.reduce((sum, p) => sum + p.budget, 0);\n const totalProjectSpent = projects.reduce((sum, p) => sum + p.spent, 0);\n const budgetUtilization =\n totalProjectBudget > 0 ? Math.round((totalProjectSpent / totalProjectBudget) * 100) : 0;\n\n const terminatedCount = employees.filter((e) => e.status === 'terminated').length;\n const retentionRate =\n employees.length > 0 ? Math.round((1 - terminatedCount / employees.length) * 100) : 0;\n\n const totalHeadcount = departments.reduce((sum, d) => sum + d.employeeCount, 0);\n const avgCostPerEmployee = totalHeadcount > 0 ? totalDeptBudget / totalHeadcount : 0;\n\n const departmentColumns: ResponsiveTableColumn<Department>[] = [\n {\n key: 'name',\n header: 'Department',\n priority: 'primary',\n cell: (dept) => <span className=\"font-medium\">{dept.name}</span>,\n },\n {\n key: 'head',\n header: 'Head',\n priority: 'secondary',\n cell: (dept) => <span className=\"text-text-secondary\">{dept.headName}</span>,\n },\n {\n key: 'headcount',\n header: 'Headcount',\n priority: 'secondary',\n cell: (dept) => <span className=\"md:block md:text-right\">{dept.employeeCount}</span>,\n },\n {\n key: 'budget',\n header: 'Budget',\n priority: 'secondary',\n cell: (dept) => (\n <span className=\"md:block md:text-right\">${(dept.budget / 1000000).toFixed(1)}M</span>\n ),\n },\n {\n key: 'costPerEmployee',\n header: 'Cost/Employee',\n priority: 'primary',\n cell: (dept) => {\n const costPerEmp =\n dept.employeeCount > 0 ? Math.round(dept.budget / dept.employeeCount) : 0;\n return <span className=\"md:block md:text-right\">${(costPerEmp / 1000).toFixed(0)}K</span>;\n },\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>Executive Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Strategic workforce insights for leadership</p>\n <PagePurpose className=\"mt-1\">\n The executive snapshot — top-line workforce, financial, and hiring KPIs in one view so\n leaders can make decisions fast.\n </PagePurpose>\n </div>\n <Badge variant=\"outline\">Q1 2026</Badge>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Workforce Cost</CardTitle>\n <Building2 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalSalaryBudget / 1000000).toFixed(1)}M\n </div>\n <p className=\"text-xs text-text-secondary\">Annual salary expenditure</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Budget Utilization</CardTitle>\n <Percent className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{budgetUtilization}%</div>\n <p className=\"text-xs text-text-secondary\">\n ${(totalProjectSpent / 1000000).toFixed(1)}M of $\n {(totalProjectBudget / 1000000).toFixed(1)}M project budget\n </p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Retention Rate</CardTitle>\n <Target className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{retentionRate}%</div>\n <p className=\"text-xs text-text-secondary\">\n {terminatedCount} of {employees.length} employees no longer active\n </p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Risk Indicators</CardTitle>\n <CardDescription>Items requiring executive attention</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3 md:grid-cols-2\">\n {riskIndicators.map((risk) => (\n <div key={risk.metric} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`h-3 w-3 rounded-full ${\n risk.severity === 'error'\n ? 'bg-status-error-text'\n : risk.severity === 'warning'\n ? 'bg-status-warning-text'\n : 'bg-status-info-text'\n }`}\n />\n <div>\n <p className=\"text-sm font-medium\">{risk.metric}</p>\n <p className=\"text-xs text-text-secondary\">{risk.detail}</p>\n </div>\n </div>\n <span className=\"text-lg font-bold\">{risk.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Department Budget Status</CardTitle>\n <CardDescription>Annual budget allocation and headcount</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable\n columns={departmentColumns}\n data={departments}\n rowKey={(dept) => dept.id}\n />\n <Separator className=\"my-3\" />\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm font-bold\">\n <span>Total</span>\n <span>{totalHeadcount} employees</span>\n <span>${(totalDeptBudget / 1000000).toFixed(1)}M budget</span>\n <span>${(avgCostPerEmployee / 1000).toFixed(0)}K / employee</span>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DashboardExecutiveDashboardPage.js","names":[],"sources":["../../../src/crewfoundry/pages/DashboardExecutiveDashboardPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n Separator,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, Percent, RefreshCw, Target, UserPlus, Users } from 'lucide-react';\nimport { type ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport {\n useCrewFoundryStore,\n type CrewAttritionRisk,\n type CrewAttritionRiskLevel,\n type CrewCostProjectionRow,\n type CrewExecutiveDashboard,\n type CrewHeadcountGapRow,\n type CrewSkillsGapRow,\n type Department,\n} from '../store/crewfoundryStore';\n\nconst MAX_SKILL_SHORTAGE_ROWS = 8;\n\nconst RISK_BADGE_VARIANT: Record<CrewAttritionRiskLevel, 'destructive' | 'warning' | 'secondary'> =\n {\n HIGH: 'destructive',\n MEDIUM: 'warning',\n LOW: 'secondary',\n };\n\nfunction formatMoney(value: number): string {\n if (Math.abs(value) >= 1_000_000) return `$${(value / 1_000_000).toFixed(1)}M`;\n if (Math.abs(value) >= 1_000) return `$${(value / 1_000).toFixed(0)}K`;\n return `$${Math.round(value)}`;\n}\n\nfunction formatGeneratedAt(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return '';\n return date.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nconst attritionColumns: ResponsiveTableColumn<CrewAttritionRisk>[] = [\n {\n key: 'employee',\n header: 'Employee',\n priority: 'primary',\n cell: (risk) => (\n <div>\n <p className=\"font-medium\">{risk.employeeName}</p>\n <p className=\"text-xs text-text-secondary\">{risk.department}</p>\n </div>\n ),\n },\n {\n key: 'level',\n header: 'Risk',\n priority: 'primary',\n cell: (risk) => (\n <Badge variant={RISK_BADGE_VARIANT[risk.riskLevel]}>\n {risk.riskLevel.charAt(0)}\n {risk.riskLevel.slice(1).toLowerCase()} · {risk.riskScore.toFixed(2)}\n </Badge>\n ),\n },\n {\n key: 'drivers',\n header: 'Drivers',\n priority: 'secondary',\n cell: (risk) => (\n <span className=\"text-sm text-text-secondary\">\n {risk.drivers.length > 0 ? risk.drivers.join(', ') : 'No risk signals'}\n </span>\n ),\n },\n];\n\nconst headcountColumns: ResponsiveTableColumn<CrewHeadcountGapRow>[] = [\n {\n key: 'department',\n header: 'Department',\n priority: 'primary',\n cell: (row) => <span className=\"font-medium\">{row.department}</span>,\n },\n {\n key: 'current',\n header: 'Active',\n priority: 'secondary',\n cell: (row) => <span className=\"tabular-nums md:block md:text-right\">{row.current}</span>,\n },\n {\n key: 'open',\n header: 'Open roles',\n priority: 'primary',\n cell: (row) => <span className=\"tabular-nums md:block md:text-right\">{row.openPostings}</span>,\n },\n {\n key: 'projected',\n header: 'Projected',\n priority: 'secondary',\n cell: (row) => (\n <span className=\"tabular-nums md:block md:text-right\">{row.projectedHeadcount}</span>\n ),\n },\n];\n\nconst skillShortageColumns: ResponsiveTableColumn<CrewSkillsGapRow>[] = [\n {\n key: 'skill',\n header: 'Skill',\n priority: 'primary',\n cell: (row) => <span className=\"font-medium\">{row.skill}</span>,\n },\n {\n key: 'supply',\n header: 'People',\n priority: 'secondary',\n cell: (row) => (\n <span className=\"tabular-nums md:block md:text-right\">{row.employeesWithSkill}</span>\n ),\n },\n {\n key: 'demand',\n header: 'Open roles',\n priority: 'secondary',\n cell: (row) => (\n <span className=\"tabular-nums md:block md:text-right\">{row.openJobsRequiringSkill}</span>\n ),\n },\n {\n key: 'shortage',\n header: 'Shortage',\n priority: 'primary',\n cell: (row) => (\n <span className=\"font-semibold tabular-nums text-status-warning-text md:block md:text-right\">\n {row.shortage}\n </span>\n ),\n },\n];\n\nconst costColumns: ResponsiveTableColumn<CrewCostProjectionRow>[] = [\n {\n key: 'department',\n header: 'Department',\n priority: 'primary',\n cell: (row) => <span className=\"font-medium\">{row.department}</span>,\n },\n {\n key: 'headcount',\n header: 'Active',\n priority: 'secondary',\n cell: (row) => <span className=\"tabular-nums md:block md:text-right\">{row.headcount}</span>,\n },\n {\n key: 'monthly',\n header: 'Monthly',\n priority: 'secondary',\n cell: (row) => (\n <span className=\"tabular-nums md:block md:text-right\">{formatMoney(row.monthly)}</span>\n ),\n },\n {\n key: 'annual',\n header: 'Annual',\n priority: 'primary',\n cell: (row) => (\n <span className=\"tabular-nums md:block md:text-right\">{formatMoney(row.annual)}</span>\n ),\n },\n];\n\nconst departmentColumns: ResponsiveTableColumn<Department>[] = [\n {\n key: 'name',\n header: 'Department',\n priority: 'primary',\n cell: (dept) => <span className=\"font-medium\">{dept.name}</span>,\n },\n {\n key: 'head',\n header: 'Head',\n priority: 'secondary',\n cell: (dept) => <span className=\"text-text-secondary\">{dept.headName}</span>,\n },\n {\n key: 'headcount',\n header: 'Headcount',\n priority: 'secondary',\n cell: (dept) => <span className=\"md:block md:text-right\">{dept.employeeCount}</span>,\n },\n {\n key: 'budget',\n header: 'Budget',\n priority: 'secondary',\n cell: (dept) => <span className=\"md:block md:text-right\">{formatMoney(dept.budget)}</span>,\n },\n {\n key: 'costPerEmployee',\n header: 'Cost/Employee',\n priority: 'primary',\n cell: (dept) => {\n const costPerEmp = dept.employeeCount > 0 ? Math.round(dept.budget / dept.employeeCount) : 0;\n return <span className=\"md:block md:text-right\">{formatMoney(costPerEmp)}</span>;\n },\n },\n];\n\ninterface KpiTileProps {\n label: string;\n value: ReactNode;\n caption: string;\n icon?: ReactNode;\n testId?: string;\n}\n\n/** Metric tile whose caption always renders (StatCard hides it without a delta). */\nfunction KpiTile({ label, value, caption, icon, testId }: KpiTileProps) {\n return (\n <GlassCard treatment=\"metric\" className=\"border-border-seam\" data-testid={testId}>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">{label}</CardTitle>\n {icon}\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{value}</div>\n <p className=\"text-xs text-text-secondary\">{caption}</p>\n </CardContent>\n </GlassCard>\n );\n}\n\nfunction WorkforceKpis({\n analytics,\n budget,\n retention,\n}: {\n analytics: CrewExecutiveDashboard;\n budget: { spent: number; total: number };\n retention: { retained: number; total: number };\n}) {\n const annualRunRate = analytics.costProjection.reduce((sum, row) => sum + row.annual, 0);\n const openRoles = analytics.headcountGap.reduce((sum, row) => sum + row.openPostings, 0);\n const budgetUtilization = budget.total > 0 ? Math.round((budget.spent / budget.total) * 100) : 0;\n // Retention counts everyone still employed (on leave and inactive\n // included); only terminated people have left.\n const retentionRate =\n retention.total > 0 ? `${Math.round((retention.retained / retention.total) * 100)}%` : '—';\n const iconClass = 'h-4 w-4 text-text-secondary';\n\n return (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <KpiTile\n label=\"Active headcount\"\n value={analytics.activeHeadcount}\n caption={`${analytics.totalHeadcount} people on record`}\n icon={<Users className={iconClass} />}\n testId=\"kpi-active-headcount\"\n />\n <KpiTile\n label=\"Hires and exits (90 days)\"\n value={`${analytics.newHiresLast90Days} / ${analytics.exitsLast90Days}`}\n caption={`${analytics.newHiresLast90Days} joined, ${analytics.exitsLast90Days} left`}\n icon={<UserPlus className={iconClass} />}\n />\n <KpiTile\n label=\"Average tenure\"\n value={`${analytics.averageTenureMonths.toFixed(1)} mo`}\n caption={`Average performance ${analytics.averagePerformanceScore.toFixed(2)} of 5`}\n icon={<Target className={iconClass} />}\n />\n <KpiTile\n label=\"Retention rate\"\n value={retentionRate}\n caption={`${retention.total - retention.retained} of ${retention.total} people on record have left`}\n icon={<Target className={iconClass} />}\n />\n <KpiTile\n label=\"Payroll run-rate\"\n value={formatMoney(annualRunRate)}\n caption={`Annual salary of active employees; ${openRoles} open role${openRoles === 1 ? '' : 's'} not included`}\n icon={<Building2 className={iconClass} />}\n testId=\"kpi-payroll-run-rate\"\n />\n <KpiTile\n label=\"Budget utilization\"\n value={`${budgetUtilization}%`}\n caption={`${formatMoney(budget.spent)} of ${formatMoney(budget.total)} project budget`}\n icon={<Percent className={iconClass} />}\n />\n </div>\n );\n}\n\nconst RISK_BANDS = [\n { key: 'high', label: 'High', dot: 'bg-status-error-text' },\n { key: 'medium', label: 'Medium', dot: 'bg-status-warning-text' },\n { key: 'low', label: 'Low', dot: 'bg-status-success-text' },\n] as const;\n\nfunction AttritionRiskCard({ risk }: { risk: CrewExecutiveDashboard['attritionRisk'] }) {\n const counts = { high: risk.highCount, medium: risk.mediumCount, low: risk.lowCount };\n return (\n <Card>\n <CardHeader>\n <CardTitle>Attrition risk</CardTitle>\n <CardDescription>\n Heuristic risk bands from performance, tenure, contract type and recent leave. A signal to\n start a conversation, not a prediction.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-3 sm:grid-cols-3\">\n {RISK_BANDS.map((band) => (\n <div\n key={band.key}\n className=\"flex items-center justify-between rounded border p-3\"\n data-testid={`attrition-${band.key}`}\n >\n <div className=\"flex items-center gap-3\">\n <div className={`h-3 w-3 rounded-full ${band.dot}`} />\n <p className=\"text-sm font-medium\">{band.label} risk</p>\n </div>\n <span className=\"text-lg font-bold tabular-nums\">{counts[band.key]}</span>\n </div>\n ))}\n </div>\n {risk.totalAssessed === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No active employees to assess\"\n description=\"Add employees to see where retention attention is needed.\"\n />\n ) : (\n <ResponsiveTable\n columns={attritionColumns}\n data={risk.topRisks}\n rowKey={(row) => row.employeeId}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n\ninterface TableCardProps<T> {\n title: string;\n description: string;\n columns: ResponsiveTableColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n emptyTitle: string;\n emptyDescription: string;\n}\n\nfunction TableCard<T>({\n title,\n description,\n columns,\n rows,\n rowKey,\n emptyTitle,\n emptyDescription,\n}: TableCardProps<T>) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardContent>\n {rows.length > 0 ? (\n <ResponsiveTable columns={columns} data={rows} rowKey={rowKey} />\n ) : (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={emptyTitle}\n description={emptyDescription}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction WorkforceAnalyticsSections({\n analytics,\n budget,\n retention,\n}: {\n analytics: CrewExecutiveDashboard;\n budget: { spent: number; total: number };\n retention: { retained: number; total: number };\n}) {\n const skillShortages = analytics.skillsGap\n .filter((row) => row.shortage > 0)\n .slice(0, MAX_SKILL_SHORTAGE_ROWS);\n return (\n <>\n <WorkforceKpis analytics={analytics} budget={budget} retention={retention} />\n <AttritionRiskCard risk={analytics.attritionRisk} />\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <TableCard\n title=\"Headcount plan\"\n description=\"Active people per department plus open (active or paused) roles.\"\n columns={headcountColumns}\n rows={analytics.headcountGap}\n rowKey={(row) => row.department}\n emptyTitle=\"No headcount yet\"\n emptyDescription=\"Departments appear here once they have active people or open roles.\"\n />\n <TableCard\n title=\"Skills shortages\"\n description=\"Skills open roles ask for that more roles need than people have.\"\n columns={skillShortageColumns}\n rows={skillShortages}\n rowKey={(row) => row.skill}\n emptyTitle=\"No skills shortages\"\n emptyDescription=\"Every skill listed on an open role is covered by at least as many active employees.\"\n />\n </div>\n <TableCard\n title=\"Payroll run-rate by department\"\n description=\"Annualised salary of active employees\"\n columns={costColumns}\n rows={analytics.costProjection}\n rowKey={(row) => row.department}\n emptyTitle=\"No salaried employees yet\"\n emptyDescription=\"Record salaries on active employees to see the run-rate.\"\n />\n </>\n );\n}\n\nfunction DepartmentBudgetCard({ departments }: { departments: Department[] }) {\n const totalDeptBudget = departments.reduce((sum, d) => sum + d.budget, 0);\n const totalHeadcount = departments.reduce((sum, d) => sum + d.employeeCount, 0);\n const avgCostPerEmployee = totalHeadcount > 0 ? totalDeptBudget / totalHeadcount : 0;\n return (\n <Card>\n <CardHeader>\n <CardTitle>Department Budget Status</CardTitle>\n <CardDescription>Annual budget allocation and headcount</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable\n columns={departmentColumns}\n data={departments}\n rowKey={(dept) => dept.id}\n />\n <Separator className=\"my-3\" />\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm font-bold\">\n <span>Total</span>\n <span>{totalHeadcount} employees</span>\n <span>{formatMoney(totalDeptBudget)} budget</span>\n <span>{formatMoney(avgCostPerEmployee)} / employee</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n\n/**\n * Executive dashboard (BOFF-4208). Workforce KPIs, attrition risk, headcount\n * plan, skills shortages and payroll run-rate come from the server-side\n * `crewExecutiveDashboard` rollup, so every figure is computed from the\n * workspace's real rows by one deterministic implementation rather than\n * re-derived in the browser. Project budget and department budget figures\n * still come from the bootstrap store, which already owns those rows.\n */\nexport function DashboardExecutiveDashboardPage() {\n const initialized = useCrewFoundryStore((state) => state.initialized);\n const workspaceId = useCrewFoundryStore((state) => state.initParams.workspaceId);\n const departments = useCrewFoundryStore((state) => state.departments);\n const projects = useCrewFoundryStore((state) => state.projects);\n const employees = useCrewFoundryStore((state) => state.employees);\n const analytics = useCrewFoundryStore((state) => state.executiveDashboard);\n const analyticsLoading = useCrewFoundryStore((state) => state.executiveDashboardLoading);\n const analyticsError = useCrewFoundryStore((state) => state.executiveDashboardError);\n const fetchExecutiveDashboard = useCrewFoundryStore((state) => state.fetchExecutiveDashboard);\n\n const loadAnalytics = useCallback(() => {\n void fetchExecutiveDashboard();\n }, [fetchExecutiveDashboard]);\n\n // Refresh on every visit and on every workspace switch: the rollup reflects\n // writes made elsewhere in the module, so a cached copy would go stale.\n useEffect(() => {\n if (!initialized || !workspaceId) return;\n loadAnalytics();\n }, [initialized, workspaceId, loadAnalytics]);\n\n const budget = useMemo(\n () => ({\n spent: projects.reduce((sum, p) => sum + p.spent, 0),\n total: projects.reduce((sum, p) => sum + p.budget, 0),\n }),\n [projects]\n );\n const retention = useMemo(\n () => ({\n retained: employees.filter((employee) => employee.status !== 'terminated').length,\n total: employees.length,\n }),\n [employees]\n );\n\n if (!initialized) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Executive Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Strategic workforce insights for leadership</p>\n <PagePurpose className=\"mt-1\">\n The executive snapshot — headcount, attrition risk, hiring plan, skills shortages and\n payroll run-rate in one view, computed from your workspace&apos;s own records.\n </PagePurpose>\n </div>\n <div className=\"flex items-center gap-2\">\n {analytics ? (\n <Badge variant=\"outline\">Updated {formatGeneratedAt(analytics.generatedAt)}</Badge>\n ) : null}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={loadAnalytics}\n disabled={analyticsLoading}\n aria-label=\"Refresh workforce analytics\"\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${analyticsLoading ? 'animate-spin' : ''}`} />\n Refresh\n </Button>\n </div>\n </div>\n\n {analyticsError ? (\n <Card className=\"border-status-error-border\">\n <CardContent className=\"flex flex-wrap items-center justify-between gap-3 py-4\">\n <p className=\"text-sm text-status-error-text\">{analyticsError}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={loadAnalytics}>\n Try again\n </Button>\n </CardContent>\n </Card>\n ) : null}\n\n {analytics ? (\n <WorkforceAnalyticsSections analytics={analytics} budget={budget} retention={retention} />\n ) : analyticsLoading ? (\n <div className=\"flex min-h-[12rem] items-center justify-center\">\n <Spinner size=\"md\" />\n </div>\n ) : null}\n\n <DepartmentBudgetCard departments={departments} />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HiringCandidatesPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"names":[],"mappings":"AAwMA,wBAAgB,wBAAwB,gCA4QvC"}
1
+ {"version":3,"file":"HiringCandidatesPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"names":[],"mappings":"AAuNA,wBAAgB,wBAAwB,gCA8SvC"}