Build

問い合わせ管理

ステータス・優先度・カテゴリで絞り込める問い合わせ一覧。URL クエリで状態を管理し、詳細から元の絞り込み結果へ戻れる実務向けミニシステム。

searchable-listquery-paramsfilternext.js

この Build で見せるもの

「検索付き一覧画面を作る」Playbook の設計をそのまま実務ドメインに転用した完成例です。

機能概要
キーワード検索subject・body・requester を横断してフリーテキスト検索
ステータスフィルタ未対応 / 対応中 / 解決済み / クローズ
優先度フィルタ高 / 中 / 低
カテゴリフィルタバグ / 機能要望 / 使い方 / その他
ソート更新が新しい順 / 作成が新しい順 / 優先度が高い順
アクティブチップ絞り込み中の条件をチップ表示、個別に解除できる
EmptyState0 件時に条件の種類に応じた解除ボタンを表示
詳細復帰詳細から元の絞り込み一覧へ from パラメータで戻れる
open redirect 対策/contact-requests プレフィックス以外の from は弾く

ファイル構成

ファイル役割
src/app/contact-requests/page.tsx一覧ページ(サーバーコンポーネント)
src/app/contact-requests/[id]/page.tsx詳細ページ(from パラメータ対応)
src/components/contact-requests/ContactFilterPanel.tsxサイドバーフィルタ(クライアント)
src/lib/contact-requests/data.tsデータ定義・型・取得関数
src/lib/contact-requests/filters.tsフィルタ・ソート純粋関数
src/lib/contact-requests/query.tsURL クエリのパース・ビルド・open redirect 検証

設計のポイント

フィルタ状態は URL クエリで管理しています。ブラウザの戻る・シェア・リロードで同じ絞り込み状態を再現できます。

filterContactRequestssortContactRequests は UI から完全に分離した純粋関数です。入力・出力が明確で、テストが書きやすい構造になっています。

parseContactReturnHref はサーバー側で from パラメータを検証します。/contact-requests または /contact-requests?... 以外は /contact-requests にフォールバックするため、open redirect になりません。

転用のしかた

他のドメイン(タスク管理・商品一覧・ユーザー一覧)へ転用するときは data.ts の型とデータを差し替えるだけです。filters.tsquery.ts の構造・page.tsx のレイアウトはほぼそのまま使えます。

実装の詳細な手順は関連 Playbook 「検索付き一覧画面を作る」 で段階的に説明しています。

関連 Playbook

デモを見る →