Skip to content

コンポーネント例 ​

ログイン後、「コンポーネント例」メニューの下には 36 個のサンプルページがあり、「ページテンプレート」「コンポーネント」「データ可視化」「AI アプリ」「エディター / ローコード」「開発ツール」の 6 つのグループに分かれています。コンポーネント例は、開発者と AI エージェントがそのまま手本にするためのものです。どのページもプロジェクトのフロントエンド規約に厳密に従っています。ページパターンごとに参考実装となるページが 1 つずつあり、共通コンポーネントのグループごとに使い方を示すページが 1 つずつあります。カード一覧やカンバンを作るときは対応するページテンプレートから始め、DataTable やアップロードのフィールドを使うときはコンポーネントで調べてください。

ページのソースは apps/web/src/modules/component_center/pages/<グループのディレクトリ>/<ページ>/index.tsx にあり、各ページ冒頭のドキュメントコメントに、そのパターンを使う場面と手本にすべき書き方がまとめてあります。バックエンド API を持つサンプルは apps/api/src/modules/component-center/ 配下のモジュールに対応しています。

ページテンプレート ​

グループのディレクトリは patterns/ です。10 個のページはすべて、1 つの共有 API を通じて同じデモデータを操作します(後述)。

パターンルート内容参考ディレクトリ
標準リスト/component-center/patterns/standard-list一般的な CRUD リソース:カテゴリ / 状態 / 有効のフィルター、ページングと行選択付きのテーブル、追加 / 編集ダイアログ、削除、インポート / エクスポート(選択した行またはすべて)。pnpm scaffold の生成結果にフィルターを加えたもので、構成はユーザー管理ページと同じpatterns/demo_record_page
カード一覧/component-center/patterns/card-list標準リストのテーブルをレスポンシブなカードのグリッドに置き換えたもの:カバー画像(ファイルセンターにアップロード。ない場合はプレースホルダー)、カテゴリ / 状態のバッジ、タグ、担当者。読み込み中はスケルトンのカード、データがないときは空の状態を表示patterns/card_list_page
ツリー一覧/component-center/patterns/tree-listparent_id で入れ子になったレコード:左にツリー全体(サーバー側で検索し、一致した項目の上位を残す)、右に選択したレコードの子をパンくず付きのテーブルで表示。兄弟間での上下移動、自身の子孫を除外する親の選択patterns/tree_list_page
集計一覧/component-center/patterns/stats-listテーブルの上に指標カード(件数、金額、数量、完了率)、カテゴリのドーナツグラフ、状態の積み上げバー。集計とテーブルは同じフィルターを使い、書き込みのたびに両方を再読み込みpatterns/stats_list_page
詳細ページ/component-center/patterns/detail1 件のレコードの詳細:左でレコードを選び、右に主要な情報と編集 / 削除を載せたヘッダー、その下にタブ(概要、子レコード、タグと拡張フィールド)。表示中のレコードは URL(?id=)に入るpatterns/detail_page
ステップフォーム/component-center/patterns/step-formページ全体を使った新規作成ウィザード:全ステップで 1 つのフォームを共有し、「次へ」で現在のステップを検証、最後に確認ステップ(各ステップに戻って修正可能)、送信後に完了状態を表示patterns/step_form_page
動的フォーム/component-center/patterns/dynamic-form固定のフィールドに加え、ユーザーが追加・削除できる拡張フィールド(テキスト / 数値 / 真偽値 / 日付)。レコードの jsonb フィールド extra に保存patterns/dynamic_form_page
カンバン/component-center/patterns/kanban列は状態の値(未着手 / 進行中 / 完了 / アーカイブ済み)。カードは列内でも列をまたいでもドラッグでき(dnd-kit)、楽観的に更新して並べ替えのリクエストを 1 回だけ送り、失敗したら元に戻す。「アーカイブ済み」の列は細いレールに折りたたまれるpatterns/kanban_page
ガントチャート/component-center/patterns/gantt作業分解の順(parent_id の階層、折りたたみ可能)でレコードをタイムラインに配置:日 / 週の目盛り、週末の網掛け、今日の線。親は集約バー、末端は進捗バーで表示し、バーをクリックすると編集patterns/gantt_page
高度なテーブル/component-center/patterns/advanced-tableテーブル上で直接作業するためのもの:サーバー側の並べ替え、行内編集(元に戻せる)、選択した行の一括更新(状態 / 担当者 / 有効)と一括削除、列の表示設定patterns/advanced_table_page

各ページで共有する選択肢(カテゴリと状態の名前、バッジの色調)は patterns/demo-record-options.ts にあります。個々の共通コンポーネントの使い方はコンポーネントを参照してください。

ページテンプレートから機能を作る ​

pnpm scaffold が生成するページは常に標準リストです。別の見せ方が合う機能では、いつも通りモジュール(バックエンド、メニュー、マイグレーション、型付きの API ファイル)を生成してから、対応するテンプレートページに倣ってページを作り直し、そのパターンが使うバックエンド部分を追加します。

機能に必要なもの参照追加するバックエンド(共有のデモ API を参照)
行の代わりにカードカード一覧スキャフォールドのエンドポイント以外は不要
親子で入れ子になるレコードツリー一覧ツリー API、parent_id の絞り込み、sort_order での並べ替え、削除 / 移動のチェック
リストの上に集計集計一覧リストと同じ絞り込み条件を読む集計 API
レコードごとのタブ付きページ詳細ページスキャフォールドのエンドポイント以外は不要
ステップに分けた長いフォームステップフォームスキャフォールドのエンドポイント以外は不要
ユーザー定義の追加項目動的フォームjsonb 列 1 つ
状態の間でカードを動かすカンバン専用の並び順列を持つ並べ替え API
タイムライン上の期間ガントチャート期間と進捗の列
ソート、インライン編集、一括操作高度なテーブルソート可能な項目、一括更新 / 削除 API

AGENTS.md の「Page patterns (which page to copy)」に同じ表があり、参照すべき service と repository の関数も載っているので、AI エージェントは自分で正しいページを選びます。機能を説明すれば(「サポートチケットのカンバン」など)、カンバンのページから作り始めます。

共有のデモ API ​

10 個のページテンプレートはそれぞれ専用のバックエンドを持たず、1 つのモジュール apps/api/src/modules/component-center/demo-record と 1 つのテーブル demo_records を共有します。API のプレフィックスは /api/admin/component-center/demo-records です。

エンドポイント使うページ
GET /demo-records(フィルター、ページング、並べ替え)、GET /demo-records/{id}すべてのページ
POST / PUT /{id} / DELETE /{id}追加、編集、削除(子のあるレコードは削除できません)
GET /demo-records/treeツリー一覧、親の選択
GET /demo-records/stats集計一覧:合計と、状態別・カテゴリ別の件数。フィルターは一覧と同じ
POST /demo-records/batch-update、POST /demo-records/batch-delete高度なテーブル
PUT /demo-records/reorderツリー一覧(sort_order)、カンバン(board_order と status)
POST /demo-records/export、GET /demo-records/template、POST /demo-records/import標準リスト

共通のフィールド(name、code、category、status、owner、priority、is_active、description)のほかに、パターンごとにいくつかのフィールドを使います:parent_id + sort_order(ツリー)、board_order(カンバンのカードの順序。ツリーの順序とは別)、amount + quantity(集計)、start_date / end_date / progress(ガントチャート)、cover + tags(カード)、extra(動的フォーム)。status の値は todo / in_progress / done / archived、category の値は product / design / engineering / marketing / operations です。

権限は個々のページではなく「ページテンプレート」のディレクトリ(メニューコード cc_patterns)に属します。ディレクトリのボタン cc_patterns_add / _edit / _delete / _export / _import が書き込みを制御し、読み取りはディレクトリまたはその配下のいずれかのページの権限があれば許可されます(モジュールの schema.ts にある DEMO_RECORD_VIEW_CODES)。権限(RBAC)を参照してください。デモモードでもコンポーネント例には書き込めます。デモのレコードは apps/api/src/demo/fixtures.ts から定期的に復元されます。

コンポーネント ​

グループのディレクトリは components/ です。ページテンプレートがページ全体を示すのに対し、こちらのページは apps/web/src/shared/components/ の共通コンポーネントそれぞれの使い方を示します。どのサンプルもページ上でそのまま動く実際のコードで、クリック 1 つで正確なソース(シンタックスハイライト付き、コピー可能)を表示でき、コンポーネントの主要なプロパティの表も付いています。共通コンポーネントを使う前に、まずここを確認してください。データはすべてモックで、割り当てるボタン権限もありません。これらのページは専用のバックエンドを持ちません(アップロードのページだけは実際のファイルセンターにファイルを保存します)。

ページルート扱うコンポーネント
データテーブル/component-center/components/data-tableDataTable(列定義、カスタムセル、行選択と一括操作バー、ページング、読み込み中と空の状態)、RowActions、ConfirmAction
フォーム/component-center/components/formsFormFields の react-hook-form 用フィールド(FormInput、FormSelect、FormDate、FormTreeSelect、FormFileUpload、FormCustom など)と FormGrid。FormDialog、FormSheet、読み取り専用の DetailSheet / DescriptionList
フィルター/component-center/components/filtersFilterBar と SearchInput / FilterSelect、SegmentedTabs
ピッカー/component-center/components/pickers単独で使う(制御された value + onChange)MultiSelect、TagInput、DatePicker / DateTimePicker、TreeSelect
ツリー/component-center/components/treesTreeView(選択、展開、カスタム行、絞り込み)、CheckableTree(親子連動のチェック、フォーム内での利用)
アップロード/component-center/components/uploadsFileUpload、ImageUpload、AvatarUpload、FileIdUpload。ファイルセンターにアップロード
インポート / エクスポート/component-center/components/import-exportImportDialog(成功と失敗した行)と ExportDialog。モックの処理関数につないである
フィードバック/component-center/components/feedbackStatusBadge、EmptyState、ConfirmAction、toast(@/lib/toast)、Skeleton による読み込み中の表示
データ表示/component-center/components/data-displayStatCard(CountUp / Sparkline 付き)、Chart(テーマの配色に従う ECharts)、Panel、PageHeader、UserAvatar
Markdown/component-center/components/markdownMarkdownView
条件ビルダー/component-center/components/condition-builderConditionBuilder:フィールド / 演算子 / 値からなる条件を AND / OR で組み合わせ、条件グループも追加できる。値はプレーンな JSON で、そのまま保存したり API に送ったりできる(サンプル:テーブルのデータの絞り込み、フォームでのクエリ保存、1 階層のみと読み取り専用)

各ページは components/<名前>_page/(例:components/data_table_page/)にあります。サンプルはそれぞれ examples/ 配下の独立したファイルで、ページはこれを 2 回インポートします。1 回はライブプレビュー用のコンポーネントとして、もう 1 回は下に表示するソースを取得するために Vite の ?raw 付きでインポートするので、プレビューとコードが食い違うことはありません。プロパティの表はページの props.ts にあります。レイアウト用の部品(ShowcasePage、ShowcaseSection、Example、PropsTable、CodeBlock)は apps/web/src/modules/component_center/showcase/ にあります。ページやサンプルを追加するときは、AGENTS.md の「Component showcase pages」の節に従ってください。サンプルのファイルが 2 通りの方法でインポートされていないと、テストが失敗します。

データ可視化 ​

グループのディレクトリは dataviz/ です。@/shared/components/Chart を通じて ECharts を使います。色は useChartColors() から取るのでライト / ダークモードに追従し、ブランドカラーの系列はアクセントカラーにも追従します(テーマとレイアウトを参照)。

ページルート説明
データダッシュボード/component-center/dashboard-page複数のグラフとイベントストリームで構成された総合ダッシュボード
リアルタイム折れ線グラフ/component-center/dataviz/realtime-chart絶えずスクロール更新されるセンサーの曲線(フロントエンドのみ)
カレンダーヒートマップ/component-center/dataviz/heatmap年間のカレンダーヒートマップと、時間 × 曜日のヒートマップ(フロントエンドのみ)
トラフィック分析/component-center/dataviz/traffic-flow流入元 → ランディングページ → 結果の流れを示すサンキー図と、訪問から決済までのコンバージョンファネル

AI アプリ ​

グループのディレクトリは ai/ です。「システム設定」の「AI」タブでモデルサービスを設定する必要があります。設定を参照してください。

ページルート説明
AI チャット/component-center/ai/chatストリーミングのチャット画面(Vercel AI SDK の useChat + AI Elements)
AI プロンプト工房/component-center/ai/promptプロンプトテンプレートのライブラリ。テンプレート変数を抽出してリアルタイムにプレビュー
AI データ検索/component-center/ai/sql自然言語から SQL を生成し、読み取り専用の接続で実行して結果とグラフを表示

AI データ検索のセキュリティ境界

クエリは独立した読み取り専用の接続で実行され、結果の行数には上限があり、権限やログなどの機密性の高いテーブルは除外されます。本番環境では読み取り専用の接続がないと API は起動しません。AI_SQL_DATABASE_URL に読み取り専用アカウントを設定するか、POSTGRES_RO_PASSWORD を設定して自動で導出させてください(付属の docker-compose.yml はこれを設定済みです)。設定 を参照してください。

エディター / ローコード ​

グループのディレクトリは editor/ です。

ページルート説明
リッチテキストエディター/component-center/editor/rich-textreact-quill-new をベースに構築
コードエディター/component-center/editor/codeMonaco をベースに構築。言語を切り替えられ、テーマはデフォルトでアプリに追従
JSON エディター/component-center/editor/jsonJSON の編集とツリー形式のプレビュー
Markdown プレビュー/component-center/editor/markdown左で編集し、右でリアルタイムにプレビュー

開発ツール ​

グループのディレクトリは devtools/ です。

ページルート説明
ドラッグレイアウト/component-center/devtools/drag-layoutドラッグとリサイズが可能なグリッドレイアウト。レイアウトはブラウザのローカルに保存
仮想スクロール一覧/component-center/devtools/virtual-scrollreact-window で大量のデータ行を描画
WebSocket 通信/component-center/devtools/websocketバックエンドの /ws/devtools に接続し、メッセージの送受信とエコーを実演
パフォーマンス監視/component-center/devtools/perf-monitor/ws/devtools 経由でサーバーの CPU、メモリ、ディスク、ネットワークの指標を毎秒受信

WebSocket とリバースプロキシ

WebSocket 通信とパフォーマンス監視のページは /ws/devtools に依存しています。リバースプロキシの背後にデプロイする場合は、/ws に対して WebSocket の転送を設定する必要があります。デプロイガイド を参照してください。

システム管理 ​

コンポーネント例のほかに、「システム管理」の下にはスキャフォールドに標準で付属する業務機能があり、「組織と権限」(ユーザー・ロール・部門)、「セキュリティと監査」(オンラインユーザー・ログ・API トークン)、「システム構成」(システム設定・メニュー・辞書・定期タスク・Webhook)、「コンテンツとメッセージ」(ファイル・通知・お知らせ)の 4 つのグループに分かれています。

ページルート説明
ユーザー管理/system/usersユーザーの追加・編集・削除、ロールの割り当て、有効化・無効化、インポート / エクスポート(標準的な一覧ページの参考実装)
ロール権限/system/rolesロールの管理、メニュー / ボタンの権限付与とデータ範囲
部署管理/system/departments部署ツリー:配下の追加、編集、上下移動。ユーザーの所属とデータ権限の基礎
ファイル管理/system/filesファイルセンターのすべてのファイル:プレビュー、ダウンロード、使用状況の確認、未使用ファイルの削除
オンラインユーザー/system/sessionsログイン中のセッションと強制ログアウト(アカウントセキュリティとシステム設定を参照)
システム設定/system/settings2段階認証・パスワード再設定のスイッチ、パスワードのルール、セッション有効期間、レート制限
メニュー管理/system/menusメニューツリーの管理
ログ管理/system/logs操作ログとログインログ
データ辞書/system/dicts辞書データを管理し、ドロップダウンの選択肢のデータソースを提供
定期タスク/system/scheduled-taskscron に従って HTTP アドレスを定期的に呼び出し、実行履歴を確認
API トークン/system/api-tokensデータ範囲内の全員の API トークン:検索、状態での絞り込み、失効(オープン APIを参照)
Webhook/system/webhooks署名付きのイベント通知を受け取るエンドポイント:テスト送信、配信履歴、再配信(オープン APIを参照)
通知/system/notificationsサイト内通知
お知らせ管理/system/announcementsお知らせの公開と管理

このほかに、ホーム(/dashboard)と個人設定ページ(/profile:アカウント情報と最終ログインの確認、ニックネーム / メール / 電話番号 / アバターとパスワードの変更)があります。

Released under the MIT License.