/**
* エラー一覧の「詳細」の列に出すエラー内容(指示書BE §3。D-185。2026-10-27 に「種類」セルの2行目から独立した列へ移した。§12)。
*
* ★分類名・詳細は `t()` に通さない★ — 辞書に同じ綴りがあると誤訳される。
* 日英は `lang` で `_ja` / `_en` を出し分ける。
* 「未選択」「不明({id})」「選択」だけは画面側が `t()` に通す(この関数は kind を返す)。
*/
import type { Lang } from "@/lib/i18n";
import type { ErrorListItem } from "@/lib/types";
export type ErrorContentView =
| { kind: "dash" }
| { kind: "unselected" }
| { kind: "unknown"; id: number }
| { kind: "category"; text: string; title: string }
| { kind: "detail"; text: string; title: string };
function categoryTitle(lang: Lang, item: ErrorListItem): string {
const main = lang === "ja" ? item.error_category_main_ja : item.error_category_main_en;
const sub = lang === "ja" ? item.error_category_sub_ja : item.error_category_sub_en;
return `${main} / ${sub}`;
}
/** 解決済みの1件から、セルに出す文字を決める(選べない行・未選択・不明は呼び出し側) */
export function errorContentViewFromItem(lang: Lang, item: ErrorListItem): ErrorContentView {
const title = categoryTitle(lang, item);
if (item.note_required) {
const text = lang === "ja" ? item.error_category_main_ja : item.error_category_main_en;
return { kind: "category", text, title };
}
const text = lang === "ja" ? item.error_detail_ja : item.error_detail_en;
return { kind: "detail", text, title: `${title} / ${text}` };
}
/**
* 行(下書き優先)の「詳細」の列の中身。
* `draftId === undefined` は「エラー内容の下書きが無い」(保存済みを見る)。
* 下書きの id は選択肢(`catalog`)から引く。選択肢に無ければ「不明」。
*/
export function errorContentView(input: {
lang: Lang;
selectable: boolean;
savedId: number | null;
savedList: ErrorListItem | null;
draftId: number | undefined;
catalog: readonly ErrorListItem[];
}): ErrorContentView {
if (!input.selectable) return { kind: "dash" };
const id = input.draftId !== undefined ? input.draftId : input.savedId;
if (id === null) return { kind: "unselected" };
const list =
input.draftId !== undefined
? (input.catalog.find((item) => item.id === id) ?? null)
: input.savedList?.id === id
? input.savedList
: (input.catalog.find((item) => item.id === id) ?? null);
if (!list) return { kind: "unknown", id };
return errorContentViewFromItem(input.lang, list);
}