fix: keep Holo-work rows stable until sorting is reapplied
Publish GitHub Pages output / publish (push) Successful in 31s
Publish GitHub Pages output / publish (push) Successful in 31s
This commit is contained in:
@@ -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']);
|
||||
});
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user