メインコンテンツまでスキップ

ListOrderTableブロック

ListOrderTable は、BaseTable 上に構築された注文管理テーブルで、検索可能なヘッダーアクション、任意の検索チップ、タブ、行アクション、ページネーションを備えています。

インストール

npm install @nodeblocks/frontend-list-order-table-block

必要なもの

項目用途
labels検索/フィルターコントロール、列、行アクション、空状態のコピー
dataテーブル行(ListOrderTableRowData
listOrderTableTitleヘッダータイトル
tabs + currentTab + onTabChange (任意)タブキーで行をフィルタリング
searchValue + 検索チップ + ハンドラー (任意)制御された検索入力、チップリスト、送信/削除フロー
pagination (任意)制御されたページ状態
行アクション + ハンドラー (任意)labels.rowActions + resolveRowAction + アクションハンドラー
制御コンポーネント

ListOrderTable はタブ/検索/ページネーションの状態を保持しません。currentTab、検索の下書き/チップ、ページネーションをアプリ側で管理し、ハンドラー(onTabChangeonSearchFieldChangeonSearchSubmitpagination.onPageChange)を渡して状態を更新してください。

コード例

ライブエディター
function Example() {
  const allOrderData = Array.from({length: 20}, (_, i) => ({
    id: String(i + 1),
    createdAt: new Date(2024, 0, i + 1).toISOString(),
    ordererName: `ORD-${String(i + 1).padStart(3, '0')}`,
    ordererNameRuby: `オーダー ${i + 1}`,
    title: `注文 ${i + 1}`,
    status: ['pending', 'processing', 'accepted', 'canceled'][i % 4],
  }));

  const tabs = [
    {key: 'pending', label: '保留中'},
    {key: 'processing', label: '処理中'},
    {key: 'accepted', label: '承認済み'},
    {key: 'canceled', label: 'キャンセル済み'},
  ];

  const labels = {
    emptyStateMessage: '注文が見つかりません',
    searchFieldPlaceholder: '注文を検索...',
    actions: {filter: 'フィルター'},
    headerRow: {createdAt: '作成日', title: 'タイトル', ordererName: '注文者'},
    rowActions: {
      markProcessing: '処理中にする',
      cancelOrder: '注文をキャンセル',
      acceptOrder: '注文を承認',
      revertToPending: '保留中に戻す',
      sendMessage: 'メッセージを送信',
    },
  };

  const [currentTab, setCurrentTab] = React.useState('pending');
  const [searchValue, setSearchValue] = React.useState('');
  const [currentPage, setCurrentPage] = React.useState(1);
  const [lastAction, setLastAction] = React.useState('検索、フィルター、行アクションのフィードバックがここに表示されます。');
  const itemsPerPage = 5;

  const filtered = allOrderData.filter(row => row.status === currentTab);
  const totalPages = Math.max(1, Math.ceil(filtered.length / itemsPerPage));
  const start = (currentPage - 1) * itemsPerPage;
  const data = filtered.slice(start, start + itemsPerPage);

  return (
    <>
      <ListOrderTable
        listOrderTableTitle="注文管理"
        labels={labels}
        data={data}
        tabs={tabs}
        currentTab={currentTab}
        onTabChange={tab => {
          setCurrentTab(tab);
          setCurrentPage(1);
        }}
        searchValue={searchValue}
        onSearchFieldChange={setSearchValue}
        onSearchSubmit={() => setLastAction(`検索送信: ${searchValue}`)}
        onFilterButtonClick={() => setLastAction('フィルタークリック')}
        pagination={{
          currentPage,
          totalPages,
          onPageChange: setCurrentPage,
        }}
        rowHref={row => `/orders/${row.id}`}
        onNavigate={to => setLastAction(`ナビゲート: ${to}`)}
      />
      <div style={{marginTop: 12, color: '#475569', fontSize: 13}}>{lastAction}</div>
    </>
  );
}
結果
Loading...

主要プロパティ

コアプロパティ

プロパティ必須デフォルト説明
labels{ emptyStateMessage: string; searchFieldPlaceholder: string; actions: { filter: string }; headerRow: { createdAt: string; title: string; ordererName: string }; rowActions?: { markProcessing: string; cancelOrder: string; acceptOrder: string; revertToPending: string; sendMessage: string } }はい-テーブル、アクション、空状態の UI コピー
dataListOrderTableRowData[]はい-テーブル行
listOrderTableTitleReactNodeはい-ヘッダータイトル
isLoadingbooleanいいえundefinedコンテンツ/ページネーションのローディング状態
searchValuestringいいえundefined制御された検索入力値
onSearchFieldChange(value: string) => voidいいえundefined検索入力変更ハンドラー
onSearchSubmit() => voidいいえundefined検索アイコンクリックまたは Enter キーでトリガー
onFilterButtonClick() => voidいいえundefinedフィルターボタンのハンドラー
searchChipsTitleReactNodeいいえundefinedアクティブな検索チップの上のラベル
searchChipsBaseTableSearchChip[]いいえundefinedアクティブな検索チップ
onSearchChipDelete(chip: BaseTableSearchChip, index: number, event: SyntheticEvent) => voidいいえundefinedチップ削除ハンドラー
tabs{ key: string; label: string; isDisabled?: boolean; subtitle?: string }[]いいえ[{ key: 'pending', label: '保留中' }, { key: 'processing', label: '処理中' }, { key: 'accepted', label: '承認済み' }, { key: 'canceled', label: 'キャンセル済み' }]タブ定義
currentTabstringいいえ最初の tabs キーアクティブなタブキー
onTabChange(tab: string) => voidいいえundefinedタブ変更ハンドラー
pagination{ currentPage: number; totalPages: number; onPageChange: (page: number) => void; className?: string }いいえundefinedページコントロール(ページは 1 から数える)
rowHref(row: ListOrderTableRowData) => stringいいえundefined行リンクを構築する。onNavigate が必要
onNavigate(to: string) => voidいいえundefined行クリックで rowHref が解決されたときに呼ばれる
shouldShowDropdownMenu(row: ListOrderTableRowData) => booleanいいえundefined行ごとに行メニューを表示/非表示
resolveRowAction(row: ListOrderTableRowData) => ('markProcessing' | 'cancelOrder' | 'acceptOrder' | 'revertToPending' | 'sendMessage')[] | undefinedいいえundefinedレンダリングする行アクションの種類
onOrderProcessing(id: string, title?: string) => voidいいえundefinedmarkProcessing アクションのハンドラー
onOrderCanceled(id: string, title?: string) => voidいいえundefinedcancelOrder アクションのハンドラー
onOrderAccepted(id: string, title?: string) => voidいいえundefinedacceptOrder アクションのハンドラー
onOrderRevertedToPending(id: string, title?: string) => voidいいえundefinedrevertToPending アクションのハンドラー
onOrderMessageSent(id: string, title?: string) => voidいいえundefinedsendMessage アクションのハンドラー

ListOrderTableRowData の形状:

プロパティ必須デフォルト説明
createdAtstringはい-作成日列で使用する ISO 日時文字列
idstringはい-一意の行 ID
ordererNamestringはい-メインの注文者名テキスト
ordererNameRubystringいいえundefinedordererName の下の任意の2行目
titlestringはい-注文タイトル
statusstringはい-行データに付随するステータス文字列

コンテンツプロパティ

labels キー:

プロパティ必須デフォルト説明
labels.emptyStateMessagestringはい-空のテーブルのメッセージ
labels.searchFieldPlaceholderstringはい-検索入力のプレースホルダー
labels.actions.filterstringはい-フィルターボタンのラベル
labels.headerRow.createdAtstringはい-作成日ヘッダー
labels.headerRow.titlestringはい-タイトルヘッダー
labels.headerRow.ordererNamestringはい-注文者ヘッダー
labels.rowActions.markProcessingstringいいえundefined行アクションのラベル
labels.rowActions.cancelOrderstringいいえundefined行アクションのラベル
labels.rowActions.acceptOrderstringいいえundefined行アクションのラベル
labels.rowActions.revertToPendingstringいいえundefined行アクションのラベル
labels.rowActions.sendMessagestringいいえundefined行アクションのラベル

サブコンポーネント:

コンポーネントプロパティ必須デフォルト説明
TitlelistOrderTableTitleReactNodeいいえルートの listOrderTableTitleタイトルテキスト(children が優先)
TitlechildrenReactNodeいいえルートのタイトルカスタムタイトルマークアップ
Actionlabels{ searchFieldPlaceholder: string; actions: { filter: string } }いいえルートの labels検索入力 + フィルターアクションのコピー
ActionsearchValuestringいいえルートの searchValue制御された検索入力
ActiononSearchFieldChange(value: string) => voidいいえルートのハンドラー検索入力変更
ActiononSearchSubmit() => voidいいえルートのハンドラー検索送信
ActiononFilterButtonClick() => voidいいえルートのハンドラーフィルタークリック
ActionchildrenReactNodeいいえ組み込みの検索 + フィルターコントロールカスタムアクションコンテンツ
SearchChipssearchChipsTitleReactNodeいいえルートの searchChipsTitleチップグループのタイトル
SearchChipssearchChipsBaseTableSearchChip[]いいえルートの searchChipsチップデータ
SearchChipsonSearchChipDelete(chip, index, event) => voidいいえルートのハンドラーチップ削除コールバック
Tabsvaluestringいいえルートの currentTabアクティブなタブ値をオーバーライド
TabsonChangeTabsProps['onChange']いいえルートの onTabChangeMUI タブ変更コールバック
TabstabPropsMUI Tab props excluding label, value, and disabledいいえundefined各 MUI タブに転送されるプロパティ
TablecolumnsBaseTableColumn<ListOrderTableRowData>[]いいえlabels.headerRow からグリッド列をオーバーライド
TablerowActions(row: ListOrderTableRowData) => BaseTableRowAction<ListOrderTableRowData>[]いいえ行アクションプロパティから生成行アクションをオーバーライド
TableactionColumnBaseTableActionColumnいいえ行アクションがある場合 { pin: 'right' }アクション列の設定
TablerowMenuReactNode or functionいいえデフォルトメニューカスタム行メニュー UI
TableonRowClick(row: ListOrderTableRowData) => voidいいえrowHref + onNavigate から導出行クリックコールバック
LoaderchildrenReactNodeいいえデフォルトローダーローディングコンテンツ
Paginationpagination{ currentPage: number; totalPages: number; onPageChange: (page: number) => void; className?: string }いいえルートの paginationページネーションコントロール
PaginationdataListOrderTableRowData[]いいえルートの data行数のソース
PaginationisLoadingbooleanいいえルートの isLoadingローディング中および行がない場合にページネーションを非表示

TitleActionHeaderLoaderSearchChipsTabsContentTablePaginationListOrderTable.Title などです。ListOrderTable.Tabs はルートの tabs プロパティからタブ定義を読み取ります。

レイアウトと構成プロパティ

プロパティ必須デフォルト説明
childrenBlocksOverride | ReactNodeいいえundefined複合 JSX の子、または blocksblockOrder を返す関数オーバーライド
classNamestringいいえundefinedルートコンテナ(nbb-list-order-table-container)のクラス
sxSxPropsいいえundefinedルート用の MUI システムスタイル

ListOrderTableheaderTitleheaderActions、タブ、行、行アクション、行なしオーバーレイ、任意のページネーションを備えた BaseTable ルートをレンダリングします。StackPropschildren を除く)を継承します。defaultBlockOrderheadersearchChipstabscontentpagination です。

デフォルト UI ブロック

ブロックベース備考
ListOrderTable (ルート)BaseTableルートテーブルラッパー
ListOrderTable.TitleBaseTable.Header.TitlelistOrderTableTitle からのタイトル
ListOrderTable.ActionBaseTable.Header.Actions + TextField + Button検索フィールド + フィルターボタン
ListOrderTable.HeaderBaseTable.Headerタイトル/アクションをラップ
ListOrderTable.SearchChipsBaseTable.SearchChipsアクティブなキーワードチップブロック
ListOrderTable.TabsBaseTable.Tabstabs からのタブナビゲーション
ListOrderTable.LoaderBaseTable.Content.Loaderローディング状態
ListOrderTable.ContentBaseTable.Contentコンテンツラッパー
ListOrderTable.TableBaseTable.Content.Gridデフォルト列/アクション付きデータグリッド
ListOrderTable.PaginationBaseTable.Paginationページコントロール
行なしオーバーレイアイコンPersonOutlineddata が空のときに使用

TypeScript

import {ListOrderTable, ListOrderTableRowData, BaseTableSearchChip} from '@nodeblocks/frontend-list-order-table-block';

const rows: ListOrderTableRowData[] = [
{
id: '1',
createdAt: new Date().toISOString(),
ordererName: 'ORD-001',
ordererNameRuby: 'オーダー 1',
title: '注文 1',
status: 'pending',
},
];

const chips: BaseTableSearchChip[] = [{key: 'keyword-1', label: 'ORD-001'}];

<ListOrderTable
listOrderTableTitle="注文管理"
labels={{
emptyStateMessage: '注文が見つかりません',
searchFieldPlaceholder: '注文を検索...',
actions: {filter: 'フィルター'},
headerRow: {createdAt: '作成日', title: 'タイトル', ordererName: '注文者'},
}}
data={rows}
searchChipsTitle="検索キーワード"
searchChips={chips}
/>;