{/* Section 1: Basic Info */}
Basic Info
{/* Portfolio & Role */}
{/* Postal Code & Federal State */}
{/* Section: Organization & Classification */}
Organization & Classification
{/* Section 2: Cost & Chargeability */}
Cost & Chargeability
{/* Section 3: Weekly Availability */}
Weekly Availability (hours/day)
{(
[
["monday", "Mon"],
["tuesday", "Tue"],
["wednesday", "Wed"],
["thursday", "Thu"],
["friday", "Fri"],
] as const
).map(([day, label]) => (
setField(day, e.target.value)}
/>
))}
{/* Section 4: Skills */}
Skills
{form.skills.map((skillRow, idx) => {
const mainSkillCount = form.skills.filter((s) => s.isMainSkill).length;
const canToggleMain = skillRow.isMainSkill || mainSkillCount < 2;
return (
setSkillField(idx, "skill", e.target.value)}
/>
setSkillField(idx, "yearsExperience", e.target.value)}
/>
★ Main
setSkillField(idx, "isMainSkill", e.target.checked)}
className="rounded border-gray-300 disabled:opacity-40"
/>
);
})}
{/* Section 5: Roles */}
Roles
{(availableRoles ?? []).map((role) => {
const assignment = form.roles.find((r) => r.roleId === role.id);
const isChecked = Boolean(assignment);
return (
);
})}
{(availableRoles ?? []).length === 0 && (
No roles defined yet. Create roles on the Roles page.
)}
{/* Error message */}
{errorMsg && (
{errorMsg}
)}
{/* Footer */}