diff --git a/src/components/frontend/roster/RosterView.tsx b/src/components/frontend/roster/RosterView.tsx
index 2b8a70e..935cea2 100644
--- a/src/components/frontend/roster/RosterView.tsx
+++ b/src/components/frontend/roster/RosterView.tsx
@@ -214,11 +214,12 @@ function UnitBox({
{leader && (
-
+
Commanding
+
)}
@@ -304,8 +305,21 @@ function ByRankView({ members }: { members: RosterMember[] }) {
list.push(m);
grouped.set(m.rank.name, list);
}
+ for (const list of grouped.values()) list.sort(rosterMemberOrder);
- const sorted = [...grouped.entries()].sort(([a], [b]) => a.localeCompare(b));
+ // `_order` is Payload's orderable fractional index: descending string
+ // compare = highest rank first (same convention as `rosterMemberOrder`).
+ // Ranks without `_order` sink to the bottom.
+ const sorted = [...grouped.entries()].sort(([, groupA], [, groupB]) => {
+ const aOrder = groupA[0].rank._order ?? null;
+ const bOrder = groupB[0].rank._order ?? null;
+ if (aOrder !== null && bOrder !== null && aOrder !== bOrder) {
+ return bOrder.localeCompare(aOrder);
+ }
+ if (aOrder === null && bOrder !== null) return 1;
+ if (aOrder !== null && bOrder === null) return -1;
+ return groupA[0].rank.name.localeCompare(groupB[0].rank.name);
+ });
return (