Dashboard運用拡張プラグイン(DashboardExtensionsPlugin / AdminExtensionsPlugin)¶
概要¶
React
Dashboard のアクションバー拡張を集約し、注文・商品バリアントのCSVエクスポートを提供する。UI の読込は
DashboardExtensionsPlugin、GraphQL と設定フックは AdminExtensionsPlugin
が担い、バックエンド処理は既存プラグイン(SMILE連携 /
ProductVariants 公開クエリ)を再利用する。
- Dashboard UI ソース:
packages/plugins/src/standard-extensions/admin-extensions/dashboard/index.tsx - Dashboard 登録:
apps/vendure-server/src/plugins/ritsubi-admin-extensions/dashboard-extensions.plugin.ts - Admin API / 設定フック:
packages/plugins/src/standard-extensions/admin-extensions/admin-extensions.plugin.ts
プラグイン構成¶
DashboardExtensionsPlugin- React Dashboard のエントリーポイントを登録する読み込み専用プラグイン
pageBlocks、追加ルート、アクションバー UI の配線を担当AdminExtensionsPluginloadedPluginsクエリとorderCodeFinalizerProcessの登録を担当- 受注番号確定の詳細は 受注番号採番 を参照
提供機能¶
- 注文CSVエクスポート
- 対象ページ:
order-list(注文一覧アクションバー) - 権限:
SuperAdmin - API:
exportSmileOrders(SMILE連携プラグインのAdmin API)を呼び出し、SHIFT_JISでCSVをダウンロード -
ファイル名: API応答の
filenameがあればそれを使用。無い場合はorders-YYYYMMDD-hhmm-<encoding>.csv -
商品バリアントCSVエクスポート
- 対象ページ:
product-list(商品一覧アクションバー) - 権限:
ReadProduct - API:
productVariantsクエリを200件ずつページング取得し、全件をCSV化 - 出力カラム:
productVariantId, productId, productName, variantName, sku, priceWithTax, currency, stockOnHand, enabled, createdAt, updatedAt - ファイル名:
product-variants-YYYYMMDD-hhmm.csv
依存関係¶
- SMILE連携プラグイン (
packages/plugins/smile-integration) - Admin API の
exportSmileOrdersを利用。 - Shop ProductVariants 拡張
(
apps/vendure-server/src/plugins/shop-product-variants.plugin.ts) productVariantsクエリを公開し、CSV生成に使用。
UI挙動とエラーハンドリング¶
- 実行中はボタンを disabled にし、「エクスポート中…」表示。
- 成功時: toast で件数を通知し、自動ダウンロード。
- 失敗時: toast でエラーメッセージを表示(APIエラー文言をそのまま表示)。
チャネル境界¶
React Dashboard の一覧・PageBlock・関連データ表示は、現在選択中の active channel に属するデータだけを表示することを大前提にする。別 channel のデータ(例: production smoke 専用商品、他 channel 専用の商品バリアント、他 channel 専用設定)を通常 channel の画面に混ぜて表示してはならない。
- Product / ProductVariant / Collection など channel 共有 entity を返す Admin API
拡張では、
ctx.channelIdを使って channel join を明示し、totalItemsも同じ条件で集計する。 - UI 側で非表示にするだけの対処は不可。別 channel のデータを返さない責務は backend query / resolver 側に置く。
- 商品バリアントを返す場合は、variant 自身だけでなく親 Product も同じ active channel に属することを確認する。親子の片方だけの channel join では不十分。
- cross-channel の棚卸しや運用診断として意図的に複数 channel を表示する画面では、その目的と対象 channel を画面名・説明・query 名で明示し、通常の detail/list 表示と混同させない。
- default channel が正本の設定ページ(例:
/delivery-business-scheduleの配送営業日設定)は、通常一覧の active channel 境界とは別の設定正本取得として扱う。channels(options: filter...)のような汎用一覧クエリを流用せず、Admin API 側に専用 query を置き、ChannelService.getDefaultChannel(ctx)など Vendure の既定チャネル解決を使う。 これにより active channel の切替、一覧 filter、query cache の揺れで default channel を取り逃さないようにする。
実装詳細¶
ファイルダウンロード処理¶
CSVエクスポート機能では、共通ユーティリティ関数(utils/download-helper.ts)を使用してファイルダウンロードを実装しています。
- 注文CSV: GraphQL
APIからBase64エンコードされたCSVデータを受け取り、
downloadBase64()を使用 - 商品バリアントCSV: クライアント側でCSV文字列を生成し、
downloadText()を使用
詳細は Vendure開発ハンドブック - 共通ユーティリティ を参照してください。
運用手順¶
- Vendure を起動し Dashboard にログイン。
- 注文一覧ページ: アクションバーの「注文CSVエクスポート」をクリック → ダウンロードを確認。
- 商品一覧ページ: アクションバーの「商品CSVエクスポート」をクリック → 出力内容を確認。
- 権限がないロールではボタンが表示されないことを確認。
拡張・統合方針¶
- シンプルなダッシュボード拡張(アクションバー、ページブロック、簡易ルート)は本プラグイン群に集約する。
- 新しい機能を追加する場合は、
packages/plugins/src/standard-extensions/admin-extensions/dashboard/配下にコンポーネントを追加し、index.tsxで登録する形を維持する。 - 大規模な独立機能(例: 大量の設定ページやワークフロー)は別プラグイン検討だが、まず本プラグイン内での共存を優先する。