コンテンツにスキップ

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 の配線を担当
  • AdminExtensionsPlugin
  • loadedPlugins クエリと 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開発ハンドブック - 共通ユーティリティ を参照してください。

運用手順

  1. Vendure を起動し Dashboard にログイン。
  2. 注文一覧ページ: アクションバーの「注文CSVエクスポート」をクリック → ダウンロードを確認。
  3. 商品一覧ページ: アクションバーの「商品CSVエクスポート」をクリック → 出力内容を確認。
  4. 権限がないロールではボタンが表示されないことを確認。

拡張・統合方針

  • シンプルなダッシュボード拡張(アクションバー、ページブロック、簡易ルート)は本プラグイン群に集約する。
  • 新しい機能を追加する場合は、packages/plugins/src/standard-extensions/admin-extensions/dashboard/ 配下にコンポーネントを追加し、index.tsx で登録する形を維持する。
  • 大規模な独立機能(例: 大量の設定ページやワークフロー)は別プラグイン検討だが、まず本プラグイン内での共存を優先する。