注文テーブルリストブロック
ListOrderTableコンポーネントは、ReactとTypeScriptで構築された完全にカスタマイズ可能でアクセシブルな注文テーブルインターフェースです。モダンなデザインパターン、ソート可能な列、アクションドロップダウン、タブ、ページネーションサポート、ローディング状態、および高度な注文管理アプリケーション向けの柔軟なカスタマイズオプションを備えた完全な表形式注文リスト体験を提供します。
🚀 インストール
npm install @nodeblocks/frontend-list-order-table-block@0.0.8
📖 使用方法
import {ListOrderTable} from '@nodeblocks/frontend-list-order-table-block';
- 基本的な使用方法
- 高度な使用方法
function BasicListOrderTable() {
const [currentTab, setCurrentTab] = useState('pending');
const [isLoading, setIsLoading] = useState(false);
const orderData = [
{
id: '1',
createdAt: '2024-01-15T10:30:00Z',
orderName: 'ORD-001',
title: 'オフィス用品注文',
status: 'pending'
},
{
id: '2',
createdAt: '2024-01-14T14:20:00Z',
orderName: 'ORD-002',
title: 'ソフトウェアライセンス',
status: 'accepted'
}
];
const tabs = [
{ label: '保留中の注文' },
{ label: '承認済み注文' },
{ label: 'キャンセル済み注文' }
];
const labels = {
emptyStateMessage: '注文が見つかりません',
actions: {
headerAction: '注文作成'
},
headerRow: {
createdAt: '作成日',
title: '注文タイトル',
orderName: '注文ID'
},
rowActions: {
accepted: '注文承認',
canceled: '注文キャンセル',
processing: '処理中にマーク'
}
};
const handleOrderAccepted = (orderId, title) => {
console.log('注文が承認されました:', orderId, title);
};
const handleOrderRejected = (orderId, title) => {
console.log('注文が拒否されました:', orderId, title);
};
const handleOrderProcessing = (orderId, title) => {
console.log('注文処理中:', orderId, title);
};
const handleNavigate = (path) => {
console.log('ナビゲート先:', path);
};
const getRowHref = (row) => `#${row.id}`;
const getUpdateRowHref = (row) => `#${row.id}/edit`;
return (
<ListOrderTable
listOrderTableTitle="注文管理"
labels={labels}
isLoading={isLoading}
onNavigate={handleNavigate}
onOrderAccepted={handleOrderAccepted}
onOrderRejected={handleOrderRejected}
onOrderProcessing={handleOrderProcessing}
data={orderData}
rowHref={getRowHref}
updateRowHref={getUpdateRowHref}
tabs={tabs}
currentTab={currentTab}
onTabChange={setCurrentTab}
createHref="#new"
style={{
backgroundColor: 'white',
padding: '8px',
}}>
<ListOrderTable.Header style={{display: 'flex', justifyContent: 'space-between'}}>
<ListOrderTable.Title />
<ListOrderTable.Action />
</ListOrderTable.Header>
<ListOrderTable.Content>
{isLoading ? (
<ListOrderTable.Loader />
) : (
<>
<ListOrderTable.Tabs />
<ListOrderTable.Table />
</>
)}
</ListOrderTable.Content>
</ListOrderTable>
);
}
function AdvancedOrderTable() {
const [currentTab, setCurrentTab] = useState('pending');
const [isLoading, setIsLoading] = useState(false);
const orderData = [
{
id: '1',
createdAt: '2024-01-15T10:30:00Z',
orderName: '📦 ORD-2024-001',
title: 'プレミアムオフィス用品パッケージ',
status: 'pending'
},
{
id: '2',
createdAt: '2024-01-14T14:20:00Z',
orderName: '💻 ORD-2024-002',
title: 'ソフトウェアライセンス更新バンドル',
status: 'accepted'
},
{
id: '3',
createdAt: '2024-01-13T09:15:00Z',
orderName: '🔧 ORD-2024-003',
title: 'IT機器メンテナンス契約',
status: 'processing'
}
];
const tabs = [
{ label: '⏳ 保留中の注文', key: 'pending' },
{ label: '✅ 承認済み注文', key: 'accepted' },
{ label: '🚫 キャンセル済み注文', key: 'canceled' }
];
const labels = {
emptyStateMessage: 'このカテゴリに注文はありません',
actions: {
headerAction: '✨ 新規注文作成'
},
headerRow: {
createdAt: '注文日',
title: '注文詳細',
orderName: '注文参照番号'
},
rowActions: {
accepted: '🎯 注文承認',
canceled: '❌ 注文キャンセル',
processing: '⚡ 処理開始'
}
};
return (
<ListOrderTable
listOrderTableTitle="🛒 エンタープライズ注文ダッシュボード"
labels={labels}
isLoading={isLoading}
onNavigate={(path) => console.log('ナビゲート先:', path)}
onOrderAccepted={(id, title) => console.log('注文承認中:', title)}
onOrderRejected={(id, title) => console.log('注文キャンセル中:', title)}
onOrderProcessing={(id, title) => console.log('注文処理中:', title)}
data={orderData}
rowHref={(row) => `#${row.id}`}
updateRowHref={(row) => `#${row.id}/edit`}
tabs={tabs}
currentTab={currentTab}
onTabChange={setCurrentTab}
style={{
backgroundColor: 'white',
padding: '8px',
}}
createHref="#new">
{({ defaultBlocks, defaultBlockOrder }) => ({
blocks: {
// グラデーションスタイリングで強化されたヘッダー
header: {
...defaultBlocks.header,
props: {
...defaultBlocks.header.props,
style: {
background: 'white',
borderRadius: '20px',
padding: '32px',
color: 'white',
width: 'calc(100% - 48px)',
margin: '0 auto',
marginTop: '12px',
boxShadow: '0 15px 35px rgba(0,0,0,0.1)',
border: '0.5px solid rgb(0, 0, 0)',
}
}
},
// モダンスタイリングで強化されたコンテンツ
content: {
...defaultBlocks.content,
props: {
...defaultBlocks.content.props,
style: {
background: 'white',
borderRadius: '16px',
padding: '24px',
boxShadow: '0 10px 30px rgba(0,0,0,0.05)',
width: 'calc(100% - 48px)',
margin: '0 auto',
marginTop: '24px',
borderRadius: '16px',
border: '0.5px solid rgb(0, 0, 0)',
}
}
}
},
blockOrder: defaultBlockOrder
})}
</ListOrderTable>
);
}
🔧 プロパティリファレンス
メインコンポーネントのプロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
listOrderTableTitle | ReactNode | 必須 | 注文テーブルセクションのタイトル |
labels | TableLabels | 必須 | テーブルヘッダー、アクション、メッセージのラベルオブジェクト |
isLoading | boolean | undefined | テーブルが現在読み込み中かどうか |
onNavigate | (to: string) => void | 必須 | ナビゲーション用のコールバック関数 |
onOrderAccepted | (id: string) => void | 必須 | 注文が承認されたときのコールバック関数 |
onOrderRejected | (id: string) => void | 必須 | 注文が拒否されたときのコールバック関数 |
onOrderProcessing | (id: string) => void | 必須 | 注文が処理中としてマークされたときのコールバック関数 |
data | ListOrderTableRowData[] | 必須 | 注文データオブジェクトの配列 |
rowHref | (row: ListOrderTableRowData) => string | 必須 | 行リンクURLを生成する関数 |
updateRowHref | (row: ListOrderTableRowData) => string | 必須 | 更新行リンクURLを生成する関数 |
tabs | Tab[] | 必須 | タブ設定オブジェクトの配列 |
currentTab | string | undefined | 現在アクティブなタブ識別子 |
onTabChange | (tab: string) => void | undefined | タブが変更されたときのコールバック関数 |
createHref | string | 必須 | 新規注文作成用のURL |
pagination | {currentPage: number; onPageChange: (page: number) => void; totalPages: number} | undefined | ページネーション設定オブジェクト |
className | string | undefined | コンテナスタイリング用の追加CSSクラス名 |
children | BlocksOverride | undefined | デフォルトブロックをオーバーライドまたはカスタムコンポーネントレンダリングするための関数 |
注意: メインコンポーネントはすべてのHTML div要素プロパティを継承します。
サブコンポーネント
ListOrderTableコンポーネントは複数のサブコンポーネントを提供します。すべてのサブコンポーネントは、メインコンポーネントのコンテキストからデフォルト値を受け取り、プロパティを通じてこれらの値をオーバーライドできます。
ListOrderTable.Title
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | コンテキストから | タイトルコンテンツ - コンテキストのlistOrderTableTitleをオーバーライド |
size | enum | "2XL" | タイトルのタイポグラフィサイズ |
type | enum | "heading" | タイポグラフィタイプ |
color | enum | "low-emphasis" | タイトルのカラーテーマ |
weight | enum | "bold" | タイトルの太さ |
className | string | undefined | スタイリング用の追加CSSクラス名 |
ListOrderTable.Action
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | undefined | デフォルトアクションレンダリングをオーバーライドするカスタムコンテンツ |
createHref | string | コンテキストから | 作成アクションボタンのURL |
labels | TableLabels | コンテキストから | アクションテキストのラベル |
direction | enum | "row" | アクションボタンのフレックス方向 |
alignItems | enum | "stretch" | コンテナ内のアイテムの整列 |
gapSize | enum | "S" | コンテナ内のアイテム間のギャップ |
className | string | undefined | スタイリング用の追加CSSクラス名 |
ListOrderTable.Header
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | undefined | デフォルトヘッダーレンダリングをオーバーライドするカスタムコンテンツ |
className | string | undefined | スタイリング用の追加CSSクラス名 |
注意: このコンポーネントはすべてのHTML div要素プロパティを継承します。
ListOrderTable.Loader
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | CircularProgressIndicator | カスタムローディングインジケーターコンテンツ |
className | string | undefined | スタイリング用の追加CSSクラス名 |
注意: このコンポーネントはすべてのHTML div要素プロパティを継承します。
ListOrderTable.Content
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | undefined | デフォルトコンテンツレンダリングをオーバーライドするカスタムコンテンツ |
isLoading | boolean | コンテキストから | コンテキストからのローディング状態 |
className | string | undefined | スタイリング用の追加CSSクラス名 |
注意: このコンポーネントはすべてのHTML div要素プロパティを継承します。
ListOrderTable.Tabs
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
tabs | Tab[] | コンテキストから | タブ設定オブジェクトの配列 |
currentTab | string | コンテキストから | 現在アクティブなタブ識別子 |
onTabChange | (tab: string) => void | コンテキストから | タブ変更コールバック関数 |
tabWidth | string | "stretch" | タブの幅の動作 |
className | string | undefined | スタイリング用の追加CSSクラス名 |
ListOrderTable.Table
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
onOrderAccepted | (id: string) => void | コンテキストから | 注文が承認されたときのコールバック関数 |
onOrderRejected | (id: string) => void | コンテキストから | 注文が拒否されたときのコールバック関数 |
onOrderProcessing | (id: string) => void | コンテキストから | 注文が処理中としてマークされたときのコールバック関数 |
className | string | undefined | スタイリング用の追加CSSクラス名 |
data | ListOrderTableRowData[] | コンテキストから | テーブルデータの配列 |
labels | TableLabels | 必須 | テーブルヘッダー、アクション、メッセージのラベルオブジェクト |
dropdownMenuItems | (cell: ListOrderTableRowData) => Array<DropDownMenuItems> | コンテキストから | ドロップダウンメニューアイテムを生成する関数 |
dropdownMenuState | {openedDropdownMenuId: string} | コンテキストから | 現在開かれているドロップダウンメニュー |
setDropdownMenuState | ({openedDropdownMenuId: string}) => void | コンテキストから | 開かれたドロップダウンメニューが変更されたときのコールバック関数 |
emptyState | {icon?: IconType; message: string} | コンテキストから | 空状態の設定 |
isLoading | boolean | コンテキストから | ローディング状態 |
onNavigate | (to: string) => void | コンテキストから | ナビゲーションコールバック関数 |
pagination | {currentPage: number; onPageChange: (page: number) => void; totalPages: number} | コンテキストから | ページネーション設定 |
rowHref | `(cell: ListOrderTableRowData) => string | undefined | null` |
🔧 TypeScriptサポート
包括的な型定義による完全なTypeScriptサポート:
import {ListOrderTable} from '@nodeblocks/frontend-list-order-table-block';
import {ComponentProps, ReactNode} from 'react';
interface Tab {
isDisabled?: boolean;
key?: string;
label: string;
subtitle?: string;
}
interface DropDownMenuItems {
text: string;
onClick: () => void;
closeMenu: () => void;
href: string;
icon?: IconType;
showSeparator: boolean;
}
// メインコンポーネントインターフェース
interface ListOrderTableProps extends Omit<ComponentProps<'div'>, 'children'> {
listOrderTableTitle: ReactNode;
labels: TableLabels;
isLoading?: boolean;
onNavigate: (to: string) => void;
onOrderAccepted: DropdownItemAction;
onOrderRejected: DropdownItemAction;
onOrderProcessing: DropdownItemAction;
data: ListOrderTableRowData[];
rowHref: (row: ListOrderTableRowData) => string;
updateRowHref: (row: ListOrderTableRowData) => string;
tabs: ComponentProps<typeof ListOrderTable.Tabs>['tabs'];
currentTab?: string;
onTabChange?: (tab: string) => void;
createHref: string;
pagination?: {
className: string;
currentPage: number;
onPageChange: (page: number) => void;
totalPages: number;
};
className?: string;
}
// 行データインターフェース
export interface ListOrderTableRowData {
createdAt: string;
id: string;
orderName: string;
title: string;
status: string;
}
// アクションコールバック型
export type DropdownItemAction = (
order: ListOrderTableRowData['id'],
title?: ListOrderTableRowData['title'],
) => void;
// ラベルインターフェース
interface TableLabels {
emptyStateMessage: string;
actions?: {
headerAction: string;
};
headerRow: {
createdAt: string;
title: string;
orderName: string;
};
rowActions: {
canceled: string;
processing: string;
accepted: string;
};
}
// 完全な型付けを使用した使用例
interface CustomOrderTableProps {
orders: ListOrderTableRowData[];
onAcceptOrder: DropdownItemAction;
onRejectOrder: DropdownItemAction;
onProcessOrder: DropdownItemAction;
tableTabs: Array<Tab>;
currentActiveTab: string;
onTabSwitch: (tab: string) => void;
isTableLoading: boolean;
}
const OrderTableComponent = ({
orders,
onAcceptOrder,
onRejectOrder,
onProcessOrder,
tableTabs,
currentActiveTab,
onTabSwitch,
isTableLoading,
}: CustomOrderTableProps) => {
const tableLabels: TableLabels = {
emptyStateMessage: '利用可能な注文がありません',
actions: {headerAction: '新規注文'},
headerRow: {
createdAt: '作成日',
title: '注文タイトル',
orderName: '注文番号',
},
rowActions: {
accepted: '承認',
canceled: '拒否',
processing: '処理',
},
};
return (
<ListOrderTable
listOrderTableTitle="注文ダッシュボード"
labels={tableLabels}
isLoading={isTableLoading}
onNavigate={path => console.log('ナビゲート:', path)}
onOrderAccepted={onAcceptOrder}
onOrderRejected={onRejectOrder}
onOrderProcessing={onProcessOrder}
data={orders}
rowHref={row => `/orders/${row.id}`}
updateRowHref={row => `/orders/${row.id}/edit`}
tabs={tableTabs}
currentTab={currentActiveTab}
onTabChange={onTabSwitch}
createHref="/orders/create">
<ListOrderTable.Header />
<ListOrderTable.Content />
<ListOrderTable.Table />
</ListOrderTable>
);
};
React、TypeScript、モダンWebスタンダードを使用して❤️で構築されました。