担当の目安: Cursor でよい。ただし§5(3画面で共通の下書き)と§6(保存前の検証)は取りこぼしやすいので、 Grok / Composer で進めるなら、§9 の画面確認を省略しないこと。
前提: 指示書BD(API)の実装が develop に入っていること。
GET /api/error-listsErrorReportItem の error_list_id / error_list / error_list_selectablePATCH /api/errors/{error_id}/status の error_list_id契約の正は d-watch-api.yaml。決定の記録は D-185(案は §11)。
/errors)でエラー内容を選択リストから選べるようにする
error_lists(決定稿 131件)error_list_id)NOT_STARTED)の行でも選べるD-S_CONTROL_FAILURE)とセキュリティ(SECURITY_ON)の行では選べないerror_type を見ない。error_list_selectable だけを見る★note_required: true の選択肢。いまは id 131)を選んだら、備考の入力を必須にするlib/i18n.ts に JP と EN の両方を入れるErrorsScreen.tsx:45 の「新しい共通部品は作らない」。今回の選択用の窓は、この画面専用の部品として作る。共通部品にはしないnpx tsc --noEmit・npm run lint・npx vitest run の件数と、§9 の画面確認の結果を報告するt() に通さない★
lib/i18n.ts)useTheme() の lang を見て _ja / _en の列を出し分けるErrorsScreen.tsx:534)と同じ文字列で紛らわしいnote_required の選択肢は、セルに大分類名(「その他(該当なし)」/ "OTHER ERROR")を出すErrorsScreen.module.css:254)。列を足すと、D-180 項10 で直した横スクロールが戻るCOLUMN_COUNT = 8 と <colgroup> は変えないCOLUMN_COUNT = 9.tableWrap { overflow-x: auto } と .card { overflow: hidden } の中にあるので、浮かせたパネルは端で切れるcomponents/features/detail-log/AreaModal.tsx(role="dialog"・aria-modal・Escape で閉じる)/alerts)と D-Sec アラート(/ds-alerts)の画面から error_list_id を送る経路を作らない(§5)git add -A 禁止docs/decisions.md に他人の未コミット差分があれば、上書きせずに止まる「種類」のセルを2行にする。
error_type(今のまま。生値)title2行目に出す文字(★判定は1つの純粋関数にまとめ、テストする★。例 lib/errors/error-content-label.ts):
| 行の状態 | 出す文字 | title |
|---|---|---|
error_list_selectable が false |
- |
なし |
error_list_id が null |
「未選択」(t() を通す。薄い色) |
なし |
error_list_id はあるが error_list が null |
「不明({id})」(t() を通し、{id} を置き換える) |
なし |
error_list.note_required が true |
大分類名(error_category_main_ja / _en) |
「大分類 / 小分類」 |
| それ以外 | 詳細(error_detail_ja / _en) |
「大分類 / 小分類 / 詳細」 |
GET /error-lists の選択肢から引いて同じ規則で出すerror_list_selectable が true)では、2行目を★固定幅のボタン★にする
saving)は押せない- のまま(ボタンを置かない)GET /api/error-lists)の取り方:
.editNotice)に「エラー内容の選択肢を読み込めませんでした」を出し、ボタンを押せなくするcomponents/features/errors/ErrorContentPicker.tsx)窓の作り
role="dialog"・aria-modal="true"・aria-labelledby(見出し「エラー内容を選ぶ」)上段
_ja / _en。t() に通さない)下段の一覧
<button>。文字は詳細(_ja / _en)note_required の項目には「備考必須」の小さな印を付けるaria-current="true" を付ける表示の作法
app/globals.css)lib/prechecks/edit-drafts.ts は、エラー一覧・アラート・D-Sec アラートの3画面が使っている。期待値表は P / D / S / H。
ResolutionDraft と patchRequestFromDraft() の型と挙動は変えない
PrecheckStatusUpdateRequest のままerror_list_id を送らないことを、既存のテストが守っているlib/errors/edit-drafts.ts を作る
ErrorResolutionDraft = ResolutionDraft & { error_list_id?: number }error_list_id と同じなら消す。項目が0になったらエントリごと消すErrorStatusUpdateRequest を返す
error_list_id も変えたときだけ入れるsaveDrafts() は、型引数で下書きと本文の型を受け取れるように広げてよい
lib/errors/edit-drafts.ts に作ってもよいlib/errors/__tests__/edit-drafts.test.ts に作る。最低限、次の行を入れる:
rowChanged)は、エラー内容の変更でも付くことnote_requiredrowErrors)に「その他を選んだときは備考を入力してください」を出すnote_required の行は、備考欄の placeholder を「備考を入力(必須)」にするcomponents/features/errors/ErrorsScreen.tsx / ErrorsScreen.module.csscomponents/features/errors/ErrorContentPicker.tsx(+ CSS)lib/errors/edit-drafts.tslib/errors/error-content-label.ts(§3)lib/prechecks/edit-drafts.ts: 型引数を広げる場合だけlib/i18n.tsdocs/code-map.md(画面の表と「エラー一覧」の節)、docs/spec.md(該当の機能の行があれば)手順:
USE_FIXTURES=true npm run buildUSE_FIXTURES=true npx next start -p 3100★:3000 のサーバーは止めない★。
fixtures の行:
| 行 | 期待 |
|---|---|
| FX-ERR-01 | 「非常停止スイッチが作動しました」 |
| FX-ERR-05 | 「不明(9999)」 |
| FX-ERR-11(清掃開始失敗・その他) | 「その他(該当なし)」 |
D-S_CONTROL_FAILURE / SECURITY_ON の行 |
- |
| ほか | 「未選択」 |
確かめること:
ローカルDB(dwatch_local)で実DBモードを確かめるなら:
scripts/local-db/ の手順で error_lists の表と error_list_id の列を入れるt() に通さず、言語で列を出し分ける<select> やグループ分けしたネイティブの select: キーワードで絞れない。分類で絞っても「清掃ロボット状態エラー」だけで51件残るCOLUMN_COUNT = 9)error_type だけに戻すtitle は §3 の表のまま(errorContentView()。t() に通さない)。「-」「未選択」「不明(id)」は薄い色overflow-wrap: anywhere で列の中で切る
ErrorsScreen.module.css の .table。値は言語によらず同じ。文字幅は 2026-10-27 にブラウザで測った値):| 列 | 幅 | 旧 | |---|---|---| | 検知時刻 | 120px | 120px | | 施設名 | 表の 9%(最小幅のとき ≒102px) | 残りの半分(最小 150px) | | シリアル | 140px(「8111R5628060033」≒111px + padding 24) | 160px | | 種類 | 表の 9%(最小幅のとき ≒102px) | 残りの半分(最小 150px) | | レベル | 90px | 90px | | 紐づく予定 | 110px(「事前チェック」/「(30分前)」の2行) | 150px | | 対応状況 | 150px(D-165。変えない) | 150px | | ★詳細★ | ★残りの幅すべて(最小幅のとき 196px 以上)★ | (なし) | | 備考 | 120px | 160px |