マスター用フロントパッケージ
MBC CQRS Serverlessアプリケーションでマスターデータと設定を管理するためのフロントエンドコンポーネントライブラリです。
インストール
npm install @mbc-cqrs-serverless/master-web
クイックスタート(推奨セットアップ)
ここから始める
これは master-web を Next.js App Router と統合する推奨方法です。 このパターンに従うことで、httpClient.get is not a function などの一般的な問題を回避できます。
このライブラリを Next.js App Router (v14+/v15) で使用する場合は、Layout ベースの Provider パターンを使用してください。layout.tsx ファイルで AppProviders をセットアップし、page.tsx ファイルではコンポーネントの動的インポートを使用しま す。
ステップ 1: layout.tsx を作成
Provider をセットアップするレイアウトファイルを作成します。これにより、子コンポーネントがマウントされる前にコンテキストが適切に初期化されます。
// app/admin/[tenant]/master/layout.tsx
'use client'
import { useMemo } from 'react'
import dynamic from 'next/dynamic'
import { useParams } from 'next/navigation'
import axios from 'axios'
import { fetchAuthSession } from 'aws-amplify/auth'
import type { IUrlProvider } from '@mbc-cqrs-serverless/master-web/UrlProvider'
// Dynamic import of AppProviders (SSR disabled) (AppProviders の動的インポート、SSR 無効)
const AppProviders = dynamic(
() =>
import('@mbc-cqrs-serverless/master-web/AppProviders').then(
(mod) => mod.AppProviders
),
{ ssr: false }
)
// Custom URL provider for your application's routing (アプリケーションのルーティング用カスタム URL プロバイダー)
class MasterUrlProvider implements IUrlProvider {
protected readonly baseUrl: string
public readonly SETTINGS_PAGE_URL: string
public readonly ADD_SETTINGS_PAGE_URL: string
public readonly EDIT_SETTINGS_PAGE_URL: string
public readonly DATA_PAGE_URL: string
public readonly ADD_DATA_PAGE_URL: string
public readonly EDIT_DATA_PAGE_URL: string
public readonly FAQ_CATEGORY_PAGE_URL: string
public readonly TOP_URL: string
constructor(tenantCode: string) {
this.baseUrl = `/admin/${tenantCode}/master`
this.SETTINGS_PAGE_URL = `${this.baseUrl}/master-setting`
this.ADD_SETTINGS_PAGE_URL = `${this.baseUrl}/master-setting/new`
this.EDIT_SETTINGS_PAGE_URL = this.SETTINGS_PAGE_URL
this.DATA_PAGE_URL = `${this.baseUrl}/master-data`
this.ADD_DATA_PAGE_URL = `${this.baseUrl}/master-data/new`
this.EDIT_DATA_PAGE_URL = this.DATA_PAGE_URL
this.FAQ_CATEGORY_PAGE_URL = `${this.baseUrl}/faq-category`
this.TOP_URL = `/admin/${tenantCode}`
}
public getCopySettingPageUrl(id: string): string {
return `${this.baseUrl}/master-setting/${id}/copy/new`
}
public getDetailedCopySettingPageUrl(id: string): string {
return `${this.baseUrl}/master-setting/${id}/copy`
}
}
export default function MasterLayout({ children }: { children: React.ReactNode }) {
const params = useParams<{ tenant: string }>()
const tenantCode = params?.tenant || 'common'
const urlProvider = useMemo(() => new MasterUrlProvider(tenantCode), [tenantCode])
// Create httpClient with Axios interceptor for automatic auth token injection (自動認証トークン注入のためのAxiosインターセプター付きhttpClientを作成)
const httpClient = useMemo(() => {
const baseEndpoint = process.env.NEXT_PUBLIC_API_ENDPOINT || 'http://localhost:3010'
const instance = axios.create({
baseURL: `${baseEndpoint}/api`,
headers: {
'Content-Type': 'application/json',
'x-tenant-code': tenantCode,
},
})
instance.interceptors.request.use(async (config) => {
try {
const session = await fetchAuthSession()
const token = session.tokens?.idToken?.toString()
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
} catch {
// Ignore auth errors (認証エラーを無視)
}
return config
})
return instance
}, [tenantCode])
const user = useMemo(() => ({ tenantCode, tenantRole: 'admin' }), [tenantCode])
return (
<AppProviders user={user} urlProvider={urlProvider} httpClient={httpClient}>
<div className="p-6">{children}</div>
</AppProviders>
)
}
ステップ 2: page.tsx を作成
レイアウトでプロバイダーをセットアップした後、各ページコンポーネントはシンプルになります:
// app/admin/[tenant]/master/master-setting/page.tsx
'use client'
import dynamic from 'next/dynamic'
import MsLayout from '@mbc-cqrs-serverless/master-web/MsLayout'
import '@mbc-cqrs-serverless/master-web/styles.css'
const MasterSetting = dynamic(
() => import('@mbc-cqrs-serverless/master-web/MasterSetting').then((mod) => mod.default),
{ ssr: false }
)
export default function MasterSettingPage() {
return (
<main>
<MsLayout useLoading>
<MasterSetting />
</MsLayout>
</main>
)
}
ステップ 3: 環境変数を設定
# .env.local
NEXT_PUBLIC_API_ENDPOINT=http://localhost:3010
NEXT_PUBLIC_MASTER_APPSYNC_URL=https://xxxxxxxx.appsync-api.ap-northeast-1.amazonaws.com/graphql
NEXT_PUBLIC_MASTER_APPSYNC_APIKEY=da2-xxxxxxxxxxxxxxxxx
NEXT_PUBLIC_MASTER_APPSYNC_REGION=ap-northeast-1
なぜこのパターンを使うのか?
| メリット | 説明 |
|---|---|
| コンテキストの分離を回避 | npmパッケージのReact Contextは分離されることがあります。Layoutを使用すると、コンテキストが最初に初期化されることが保証されます。 |
| 同期的な初期化 | useMemoを使用することで、httpClientが同期的に作成され、競合状態を回避できます。 |
| 認証トークンの自動注入 | Axiosインターセプターがリクエストごとに最新の認証トークンを注入します。 |
| シンプルなページコンポーネント | ページは動的インポートとコンポーネントのレンダリングだけで済みます。 |
詳細について
代替パターン、トラブルシューティング、詳細な説明についてはNext.js App Router統合を参照してください。
概要
Master Webパッケージ(@mbc-cqrs-serverless/master-web)は、マスターデータと設定を管理するための完全なReactコンポーネントセットを提供します。バックエンドのMaster Serviceとシームレスに統合され、構築済みのページ、フォーム、データテーブルが含まれています。
機能
- マスター設定管理: マスター設定の表示、作成、編集、削除
- マスターデータ管理: マスターデータレコードのCRUD操作
- リッチテキストエディタ: コンテンツフィールド用の組み込みリッチテキストエディタ
- JSONエディタ: 構造化データフィールド用のJSONエディタ
- データテーブル: TanStack Tableによるソート・ページネーション対応テーブル
- リアルタイム更新: AWS AppSync統合によるリアルタイムデータ同期
- コピー機能: マスター設定とデータのクローン
主要コンポーネント
インポートオプション
コンポーネントはメインパッケージまたはサブパスインポートからインポートできます:
// Main package import (メインパッケージインポート)
import { MasterSetting } from "@mbc-cqrs-serverless/master-web";
// Sub-path import (サブパスインポート)
import MasterSetting from "@mbc-cqrs-serverless/master-web/MasterSetting";