AdminTableコンポーネントと関連API
AdminTable
は、管理画面で表形式のデータを表示・管理するための多機能なVueコンポーネントです。ページネーション、ソート、フィルタリング、カラム表示切替、行選択などの機能を備えています。
AdminTableコンポーネント
app/components/AdminTable/index.vue
このコアコンポーネントは、テーブルの表示と操作を統括します。
主な機能:
- データ取得:
fetchData
プロップを受け取り、ページネーション・ソート・フィルタリングのパラメータに基づいてデータを取得します。 - カラム定義:
columns
プロップでテーブル構造(ヘッダーやデータアクセサ)を定義します。 - フィルタリング:
filters
プロップで定義された様々なフィルタータイプ(input
、checkbox
、tabs
、daterange
)に対応。フィルター変更時にデータを再取得します。 - ページネーション: ページ番号や1ページあたりの件数をURLクエリパラメータと同期するコンポーネントを統合。
- ソート: ソートオプションもURLクエリパラメータと同期します。
- カラム表示切替: カラムの表示・非表示をユーザーが切り替えられるよう、コンポーザブルやコンポーネントを活用。
- 行選択:
canSelect
がtrueの場合、行選択機能を有効化し、コンポーザブルで管理します。 - 状態管理: ページ・リミット・ソートオプションなどの状態はリアクティブで、URLクエリパラメータと同期され、ユーザー体験や共有性を向上させます。
- エラーハンドリング: データ取得時の基本的なエラー処理を含み、失敗時にはトースト通知を表示します。
- リフレッシュ機能:
handleRefresh
メソッドで手動でテーブルデータを再取得できます。
バックエンドAPI
AdminTable
コンポーネントを支える主なAPIエンドポイントは2つあります。
リストAPI(
/api/admin/list/[tableName].get.ts
)- この動的GETエンドポイントは、指定した
tableName
のレコード一覧をページネーション・フィルタリング付きで取得します。 - パスパラメータ:
tableName
(string)- クエリ対象のデータベーステーブル名。 - クエリパラメータ:
page
(number, 任意, デフォルト: 1): ページ番号。limit
(number, 任意, デフォルト: 20, 最大: 100): 1ページあたりの件数。filter
(string, 任意): フィルター条件の配列を表すJSON文字列(例:[{ "col": "name", "op": "like", "v": "test" }]
)。sort
(string, 任意): ソート条件の配列を表すJSON文字列(例:[[ "createdAt", "desc" ]]
)。
- 機能:
tableName
のバリデーション。filter
とsort
のクエリパラメータを解析・適用。page
とlimit
によるページネーション適用。data
(レコード配列)、total
(総件数)、page
、limit
を含むオブジェクトを返却。- データベース操作にはDrizzle ORMを使用。
- この動的GETエンドポイントは、指定した
カウントAPI(
/api/admin/count/[tableName]/[columnName].get.ts
)- この動的GETエンドポイントは、指定した
tableName
内のcolumnName
のユニーク値ごとの件数を、必要に応じてフィルタリングして取得します。 - パスパラメータ:
tableName
(string): データベーステーブル名。columnName
(string): カウント対象のカラム名。
- クエリパラメータ:
filter
(string, 任意): リストAPIと同様のフィルター条件配列のJSON文字列。
- 機能:
tableName
とcolumnName
のバリデーション。filter
クエリパラメータの解析・適用。- 各ユニークなカラム値とその件数を含むオブジェクト配列を返却。
- 統計情報やフィルターオプション(例: 件数付きチェックボックス)の生成に便利。
- この動的GETエンドポイントは、指定した
柔軟なフロントエンドコンポーネントと堅牢なバックエンドAPIの組み合わせにより、管理画面でのデータ管理を強力にサポートします。