diff --git a/frontend/src/components/users/ProfileSections.tsx b/frontend/src/components/users/ProfileSections.tsx index 74b350e1..dd1508b6 100644 --- a/frontend/src/components/users/ProfileSections.tsx +++ b/frontend/src/components/users/ProfileSections.tsx @@ -67,6 +67,45 @@ const skillRarityStyles: Record = { legendary: "border-amber-400/80", }; +const skillRarityBadgeStyles: Record = { + unrated: "bg-slate-500/10 text-slate-400", + common: "bg-slate-500/15 text-slate-300", + uncommon: "bg-emerald-500/15 text-emerald-300", + rare: "bg-sky-500/15 text-sky-300", + epic: "bg-violet-500/15 text-violet-300", + legendary: "bg-amber-400/15 text-amber-300", +}; + +const skillRankOrder: Record = { + none: 0, + bronze: 1, + silver: 2, + gold: 3, + ruby: 4, + diamond: 5, +}; + +const skillRarityOrder: Record = { + unrated: 0, + common: 1, + uncommon: 2, + rare: 3, + epic: 4, + legendary: 5, +}; + +function sortProfileSkills(skills: Skill[]) { + return [...skills].sort((left, right) => { + const rankDifference = skillRankOrder[right.rank || "none"] - skillRankOrder[left.rank || "none"]; + if (rankDifference) return rankDifference; + const experienceDifference = (right.experience || 0) - (left.experience || 0); + if (experienceDifference) return experienceDifference; + const rarityDifference = skillRarityOrder[right.rarity || "unrated"] - skillRarityOrder[left.rarity || "unrated"]; + if (rarityDifference) return rarityDifference; + return left.name.localeCompare(right.name, "ru"); + }); +} + function SkillRankMark({ rank = "none", size = 14 }: { rank?: SkillRank; size?: number }) { const props = { size, strokeWidth: 2.2, "aria-hidden": true }; if (rank === "bronze") return ; @@ -787,6 +826,7 @@ export function ProfileSkillsInline({ const [endorsementSaving, setEndorsementSaving] = useState(false); const listId = `${title.toLowerCase().replace(/\s+/g, "-")}-skills-list`; const helpId = `${listId}-help`; + const sortedSkills = sortProfileSkills(skills); const openSkillProgress = async (skill: Skill) => { setProgressOpen(true); @@ -832,12 +872,15 @@ export function ProfileSkillsInline({
`${skill.id}:${skill.rank}:${skill.experience}:${skill.rarity}`) + .join("|")} className="min-w-0 flex-1" ariaLabel="Навыки сотрудника" fadeColor="var(--surface-primary)" > - {skills.length ? ( - skills.map((skill) => ( + {sortedSkills.length ? ( + sortedSkills.map((skill) => ( )) ) : (