fix: keep Holo-work rows stable until sorting is reapplied
Publish GitHub Pages output / publish (push) Successful in 31s

This commit is contained in:
2026-09-14 11:26:02 +09:00
parent dd37f59565
commit 238b9a9913
4 changed files with 56 additions and 5 deletions
+23
View File
@@ -0,0 +1,23 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { sortHoloWorkMembers } from '../models/holo-work-sort.ts';
const members = [{ id: 'a', order: 1 }, { id: 'b', order: 2 }, { id: 'c', order: 3 }];
const ids = (rows: typeof members) => rows.map((row) => row.id);
test('횟수 변경은 기존 순서를 유지하고 다시 정렬할 때 최신 횟수를 반영한다', () => {
const counts = { a: 1, b: 2, c: 3 };
const snapshot = sortHoloWorkMembers(members, counts, 'asc');
counts.a = 5;
assert.deepEqual(ids(snapshot), ['a', 'b', 'c']);
assert.deepEqual(ids(sortHoloWorkMembers(members, counts, 'asc')), ['b', 'c', 'a']);
assert.deepEqual(ids(sortHoloWorkMembers(members, counts, 'desc')), ['a', 'c', 'b']);
assert.deepEqual(ids(members), ['a', 'b', 'c']);
});
test('미등록 횟수는 0이며 동률은 멤버순, 기준 변경은 전체 목록에 적용한다', () => {
const counts = { a: 2, b: 2 };
assert.deepEqual(ids(sortHoloWorkMembers(members, counts, 'asc')), ['c', 'a', 'b']);
assert.deepEqual(ids(sortHoloWorkMembers(members, counts, 'desc')), ['a', 'b', 'c']);
assert.deepEqual(ids(sortHoloWorkMembers([...members].reverse(), counts, 'member')), ['a', 'b', 'c']);
});
+11
View File
@@ -0,0 +1,11 @@
export type HoloWorkSort = 'member' | 'asc' | 'desc';
/** A fresh ordering snapshot; subsequent count edits do not move its rows. */
export function sortHoloWorkMembers<T extends { id: string; order: number }>(
members: readonly T[], counts: Readonly<Record<string, number>>, sort: HoloWorkSort
): T[] {
return [...members].sort((a, b) => {
const difference = (counts[a.id] ?? 0) - (counts[b.id] ?? 0);
return (sort === 'asc' ? difference : sort === 'desc' ? -difference : 0) || a.order - b.order;
});
}