feat: Pane2にD&Dとアーカイブを追加

- Pane2 の候補者カードを D&D で並び替え・アーカイブできるように
- README のサンプル画面スクリーンショットを最新版に差し替え
This commit is contained in:
snc777
2026-05-09 16:12:21 +09:00
parent f6a781c47e
commit 7cb2209735
12 changed files with 887 additions and 142 deletions
+4
View File
@@ -32,6 +32,10 @@ export const STAGE_LABELS: Record<StageKey, string> = {
final: "最終面接",
};
// Pane 2 末尾の「アーカイブ済み」グループの見出しラベル。
// archived === true の候補者を束ねる仮想グループで、ステージとは直交した概念。
export const ARCHIVED_GROUP_LABEL = "アーカイブ済み";
// ===== Pane 3 ダッシュボードのセクション見出し(ADR-0014) =====
export const PANE3_SECTION = {
+14 -8
View File
@@ -164,6 +164,11 @@ export const candidateSchema = z.object({
profile: profileSchema,
scorecards: z.array(scorecardSchema),
stage: stageKeySchema,
// 論理削除フラグ。`stage` とは直交する。アーカイブされた候補者は通常のステージ
// グループから外れ、Pane 2 末尾の「アーカイブ済み」グループに表示される。
// 復元時は `stage` をそのまま使って元のステージへ戻る。JSON シードでは省略可
// (`.default(false)` で読み込み時に補完)。
archived: z.boolean().default(false),
});
export type Candidate = z.infer<typeof candidateSchema>;
@@ -203,14 +208,15 @@ export type CandidateRow = {
averageScore: number | null;
};
// Pane 2 のグループ表示単位(ステージごとに候補者行を束ねる)。
// Pane 2 のグループ表示単位(ステージ or アーカイブ済み)。
// 候補者データは `INITIAL_CANDIDATES` を SSoT とし、`candidateGroups` で
// 派生計算して CandidateListPane に props で渡す(Workspace 内で計算)。
//
// stage: StageKey は「+ ボタン」から `addCandidate(stage)` を呼ぶときの
// 引数に使う(型安全に StageKey を渡すため)。日本語ラベルは label に分離。
export type Group = {
stage: StageKey;
label: string;
items: CandidateRow[];
};
// `kind: "stage"` は通常の選考ステージグループ。`stage: StageKey` は
// 「+ ボタン」から `addCandidate(stage)` を呼ぶときの引数に使う。
// `kind: "archived"` は archived === true の候補者を集めた末尾の仮想グループで、
// 「+ 追加」操作は持たず、復元のみ可能。並び順は `kind: "stage"` を STAGE_ORDER で
// 並べた後、最後に `kind: "archived"` を 1 つだけ置く(要素があるときのみ表示)。
export type Group =
| { kind: "stage"; stage: StageKey; label: string; items: CandidateRow[] }
| { kind: "archived"; label: string; items: CandidateRow[] };