[feat] 管理者画面: 問題を検索・画面遷移なしでグレーディングできるように改修しましょう
priority middle
## 概要
`/vote_management` の機能は基本的にそのままに、ルート名の整理と検索・表示の改善を加えて `/tasks/grade` に移行する。
主な変更点:
- 「投票統計が存在する問題のみ」から「全問題」を対象とした一覧表示に変更
- 問題名・問題ID・コンテスト名による検索バーを追加(votes ページと同じ動作)
- 表示順を `compareByContestIdAndTaskId`(新しいコンテストが上)に統一
- 票数列を削除(検索で絞れるため不要)
- DBグレードの編集 UI は現行のまま(常時 `<select>` 表示 + `use:enhance` で非遷移更新)
- problems ページの `/tasks/[task_id]` リンクを削除
## 設計判断
### 既存サービス関数の再利用
`getAllTasksWithVoteInfo()`(`src/features/votes/services/vote_statistics.ts`)は:
- `prisma.task.findMany()` で**全タスク**を取得済み
- `estimatedGrade: TaskGrade | null`(VotedGradeStatistics 未存在なら null)を含む
- `task_id`, `title`, `contest_id` を持つため `SearchableTask` 型と互換
このため**新規サービス関数は不要**。
### ルート配置
`(admin)` はルートグループ(URL に影響しない)のため、`src/routes/(admin)/tasks/grade/` が `/tasks/grade` になる。既存の `(admin)/tasks/[task_id]`(静的 `grade` セグメントが動的ルートより優先)と競合しない。
### 検索動作
votes ページと揃え、検索ワード入力前は結果を表示しない。管理者向けだが、全件表示するとパフォーマンスが読みにくくなるため。上限は votes と同じ 20 件。
## 却下した代替案
| 案 | 却下理由 |
| ------------------------------------------------------- | ---------------------------------------- |
| `src/features/tasks_grade/` として feature スコープ新設 | 新規サービス/型が不要なため YAGNI 違反 |
| `getAllTasksWithVoteInfo()` を拡張して全件対応 | すでに全件返している。修正不要 |
| クリックでドロップダウン表示(popover型) | 現行の常時 select で十分。複雑化を避ける |
| 検索なしで全件初期表示 | 問題数が多く、意図せず重い表示になる恐れ |
## 調査済み事項
> **注意:** `TagForm.svelte:113` にも同様のリンクがあるが、こちらはタグ管理画面のみで使用されるため今回の対象外。
## 今回のスコープ外(将来の検討事項)
- **`src/routes/(admin)/tasks/[task_id]/` の削除**: 現時点で一部利用があるため今回は対象外。リンクが完全になくなったことを確認後に削除する
- **管理者グレード管理ページへのキャッシュ付与**: 全問題データをロードするため、サーバ側でのレスポンスキャッシュが望ましいが、今回は対象外
- **グレード別タブの全面的な UI 刷新**: `problems` ページのグレード別タブ全体の再設計は別タスク
- **サーバ側フィルタリングへの移行**: 現状は全問ロード後にクライアント側で検索・絞り込みを行うが、コンテストやグレードでのサーバ側フィルタリングに切り替えることでパフォーマンスを改善できる可能性がある
## キャッシュ計画との関係(docs/dev-notes/2026-06-13/sveltekit-caching/plan.md)
`/tasks/grade` ページは admin 限定・低頻度であるため、キャッシュ計画では明示的にスコープ外(L149)とされており、今回のスコープで取り込める項目はない。
- **CDN キャッシュ(Phase 3 型)**: admin 認証必須のため共有キャッシュ不可
- **server-side キャッシュ(Phase 4)**: `cache.ts` 新設が必要な別タスク。`getAllTasksWithVoteInfo` はターゲット候補に挙がっているが今回は対象外
ただし **votes 修正方針(A/B)の前提「vote UI 改修の完了」は今回の作業で満たされる**。本 PR マージ後に `docs/dev-notes/2026-06-13/sveltekit-caching/plan.md` の votes 修正方針 A/B の着手可否を再評価すること。
关闭于 2026-06-18 0 条评论