/**
* 表見出しの並べ替え状態(清掃詳細ログ・エラー一覧・施設マスタ共通)。
* ★Prisma の `SortOrder` と名前がぶつからないよう `TableSortOrder`★(指示書BH §2-1)
*/
export type TableSortOrder = "asc" | "desc";
export type SortState<K extends string> = { key: K; order: TableSortOrder } | null;
export type NextSortOptions = {
/** 別列/既定からその列を選んだときの1回目の向き(施設マスタは `"desc"`、両画面は `"asc"`) */
first: TableSortOrder;
/** 日付・検知時刻など asc ↔ 既定の2状態列 */
twoState: boolean;
};
/**
* 見出しクリックで次に送る並べ替え状態(指示書BH §1-3)
*
* - 普通の列: 既定/別列 → first → 反対向き → 既定
* - 2状態列: 既定/別列 → asc → 既定(desc なし)
*/
export function nextSortState<K extends string>(
current: SortState<K>,
key: K,
options: NextSortOptions
): SortState<K> {
const { first, twoState } = options;
if (current === null || current.key !== key) {
return { key, order: twoState ? "asc" : first };
}
if (twoState) {
return null;
}
if (current.order === first) {
return { key, order: first === "asc" ? "desc" : "asc" };
}
return null;
}
/**
* 見出しに出す向き(▲▼△)。`defaultKey` は既定順のとき ▼ を出す2状態列用(日付・検知時刻)
*/
export function displayOrder<K extends string>(
state: SortState<K>,
key: K,
defaultKey?: K
): TableSortOrder | null {
if (state === null) {
return defaultKey !== undefined && key === defaultKey ? "desc" : null;
}
return state.key === key ? state.order : null;
}