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

ListInvitesブロック

ListInvites は、ページネーション、行アクション、ブロック構成を備えた招待管理テーブルです。

インストール

npm install @nodeblocks/frontend-list-invites-block

必要なもの

項目用途
labelsヘッダー、ステータス、空状態、アクションのコピー
data行(idnameemailstatus
listInvitesTitleヘッダーのページタイトル
onClickActionユーザーを招待ボタンのハンドラー
isLoading (任意)ローディング状態を表示する
pagination (任意)クライアント側またはサーバー駆動のページ変更
rowHref + onNavigate (任意)アプリのルーティングで行をクリック可能にする
statusMatch (任意)生の row.status 値をステータスラベルにマッピングする
shouldShowDropdownMenu (任意)一致する行の行アクションメニューを非表示にする
resolveRowAction + ハンドラー (任意)行ごとの有効化/無効化メニューアクション
制御コンポーネント

ListInvites はテーブルやページネーションの状態を保持しません。datapagination.currentPagepagination.onPageChange をアプリ側で管理してください(クライアントでページごとに行をスライスするか、API からページを取得します)。行をクリック可能にするには rowHrefonNavigate をセットで渡してください

行の形とステータスラベル

各行は ListInvitesRowData オブジェクトです: idnameemailstatus。生成されるステータス列は row.statusstatusMatch(デフォルト active / inactive / pending)と比較して、表示するステータスラベルを決定します。行アクションには labels.rowActionsresolveRowAction、および対応するハンドラー(onItemActivate / onItemDeactivate)が必要です。shouldShowDropdownMenu で行ごとに非表示にできます。statusMatch は行アクションの選択には使用されません。

コード例

ライブエディター
function Example() {
  const allInviteData = [
    {id: '0', name: 'User 0', email: 'user0@example.com', status: 'pending'},
    {id: '1', name: 'User 1', email: 'user1@example.com', status: 'active'},
    {id: '2', name: 'User 2', email: 'user2@example.com', status: 'inactive'},
    {id: '3', name: 'User 3', email: 'user3@example.com', status: 'pending'},
    {id: '4', name: 'User 4', email: 'user4@example.com', status: 'active'},
    {id: '5', name: 'User 5', email: 'user5@example.com', status: 'inactive'},
  ];

  const labels = {
    emptyStateMessage: '招待が見つかりません',
    actions: {inviteUser: 'ユーザーを招待'},
    headerRow: {name: '名前', email: 'メールアドレス', status: 'ステータス'},
    cellData: {statusActive: 'アクティブ', statusInactive: '非アクティブ', statusPending: '保留中'},
    rowActions: {activate: '招待を有効化', deactivate: '招待を無効化'},
  };

  const [currentPage, setCurrentPage] = React.useState(1);
  const [lastAction, setLastAction] = React.useState('招待アクションを選択すると、ここにフィードバックが表示されます。');
  const itemsPerPage = 5;
  const totalPages = Math.ceil(allInviteData.length / itemsPerPage);
  const startIndex = (currentPage - 1) * itemsPerPage;
  const paginatedData = allInviteData.slice(startIndex, startIndex + itemsPerPage);

  return (
    <>
      <ListInvites
        listInvitesTitle="招待管理"
        labels={labels}
        data={paginatedData}
        rowHref={row => `/invites/${row.id}`}
        onNavigate={path => setLastAction(`ナビゲート: ${path}`)}
        onClickAction={() => setLastAction('ユーザーを招待がクリックされました')}
        onItemActivate={id => setLastAction(`有効化: ${id}`)}
        onItemDeactivate={id => setLastAction(`無効化: ${id}`)}
        resolveRowAction={row => {
          if (row.id === '0') return undefined;
          return row.status === 'inactive' ? ['activate'] : ['deactivate'];
        }}
        pagination={{
          currentPage,
          totalPages,
          onPageChange: setCurrentPage,
        }}
      />
      <div style={{marginTop: 12, color: '#475569', fontSize: 13}}>{lastAction}</div>
    </>
  );
}
結果
Loading...

主要プロパティ

コアプロパティ

プロパティ必須デフォルト説明
labels{ emptyStateMessage: string; actions: { inviteUser: string }; headerRow: { name: string; email: string; status: string }; cellData: { statusActive: string; statusInactive: string; statusPending: string }; rowActions?: { activate: string; deactivate: string } }はい-ヘッダー、ステータス、空状態、アクションの UI コピー
dataListInvitesRowData[]はい-テーブル行(idnameemailstatus
listInvitesTitleReactNodeはい-ヘッダータイトル
onClickAction() => voidはい-ユーザーを招待ボタンのハンドラー
isLoadingbooleanいいえundefinedtrue のときローディング状態を表示する
pagination{ currentPage: number; totalPages: number; onPageChange: (page: number) => void; className?: string }いいえundefinedページコントロール。ページは 1 から数える
rowHref(row: ListInvitesRowData) => stringいいえundefined行リンク先を構築する。onNavigate とセットで行をクリック可能にする
onNavigate(to: string) => voidいいえundefinedクリック可能な行がアクティブ化されたときに呼ばれる
shouldShowDropdownMenu(row: ListInvitesRowData) => booleanいいえundefinedfalse を返すと、その行の行アクションメニュー項目を非表示にする
resolveRowAction(row: ListInvitesRowData) => ('activate' | 'deactivate')[] | undefinedいいえundefined表示する行アクションを選択する
statusMatch{ active: string; inactive: string; pending: string }いいえ{ active: 'active', inactive: 'inactive', pending: 'pending' }生の row.status 値を生成されるステータスラベルにマッピングする
onItemActivate(id: string) => voidいいえundefinedactivate 行アクションを処理する
onItemDeactivate(id: string) => voidいいえundefineddeactivate 行アクションを処理する

行アクションには labels.rowActionsresolveRowAction が必要です。ハンドラーが欠けている場合、そのアクションはメニューから省略されます。

コンテンツプロパティ

labels キー(rowActions を除くルートの labels オブジェクト上のすべて必須):

プロパティ必須デフォルト説明
labels.emptyStateMessagestringはい-空のテーブルのメッセージ
labels.actions.inviteUserstringはい-ヘッダーボタンのラベル
labels.headerRow.namestringはい-名列のヘッダー
labels.headerRow.emailstringはい-メール列のヘッダー
labels.headerRow.statusstringはい-ステータス列のヘッダー
labels.cellData.statusActivestringはい-アクティブステータスのラベル
labels.cellData.statusInactivestringはい-非アクティブステータスのラベル
labels.cellData.statusPendingstringはい-保留中ステータスのラベル
labels.rowActions.activatestringいいえundefined有効化アクションの行メニューラベル
labels.rowActions.deactivatestringいいえundefined無効化アクションの行メニューラベル

サブコンポーネント(複合レイアウト):

コンポーネントプロパティ必須デフォルト説明
TitlechildrenReactNodeいいえルートの listInvitesTitleカスタムタイトルマークアップ
TitlelistInvitesTitleReactNodeいいえルートの listInvitesTitlechildren が提供されない場合のタイトルテキスト
ActionchildrenReactNodeいいえルートの labels.actions.inviteUseronClickAction からの招待ボタンカスタムアクションマークアップ
Actionlabels{ actions: { inviteUser: string } }いいえルートの labelsボタンラベルのソース
ActiononClickAction() => voidいいえルートのハンドラー招待ボタンのクリックハンドラー
HeaderchildrenReactNodeいいえundefinedヘッダーラッパーのコンテンツ
LoaderchildrenReactNodeいいえCircularProgressローディングインジケーター
ContentchildrenReactNodeいいえundefinedローダーおよび/またはテーブルをラップする
ContentisLoadingbooleanいいえundefinedコンテンツラッパーにローディング状態を転送する
Tablelabels{ emptyStateMessage: string; actions: { inviteUser: string }; headerRow: { name: string; email: string; status: string }; cellData: { statusActive: string; statusInactive: string; statusPending: string }; rowActions?: { activate: string; deactivate: string } }いいえルートの labelsデフォルト列と行アクションを生成する
TabledataListInvitesRowData[]いいえルートの dataレンダリングする行
TablerowHref(row: ListInvitesRowData) => stringいいえルートの rowHref行リンク先
TableonNavigate(to: string) => voidいいえルートの onNavigate行ナビゲーションハンドラー
TableonItemActivate(id: string) => voidいいえルートの onItemActivateactivate 行アクションを処理する
TableonItemDeactivate(id: string) => voidいいえルートの onItemDeactivatedeactivate 行アクションを処理する
TableshouldShowDropdownMenu(row: ListInvitesRowData) => booleanいいえルートの shouldShowDropdownMenu一致する行の行メニューを非表示にする
TableresolveRowAction(row: ListInvitesRowData) => ('activate' | 'deactivate')[] | undefinedいいえルートの resolveRowAction行メニューアクションを選択する
TablestatusMatch{ active: string; inactive: string; pending: string }いいえルートの statusMatchカスタムステータスマッピング
Paginationpagination{ currentPage: number; totalPages: number; onPageChange: (page: number) => void; className?: string }いいえルートの paginationページコントロール
PaginationdataListInvitesRowData[]いいえルートの dataページネーション用の行数
PaginationisLoadingbooleanいいえルートの isLoadingローディング中はページネーションを非表示にする

TitleActionHeaderLoaderContentTablePaginationListInvites.Title などです。完全にカスタムなグリッド動作が必要な場合、ListInvites.Table はカスタムの columnsrowActionsrowMenuactionColumnonRowClick も受け取ります。

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

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

ListInvitesStackPropschildren を除く)を継承します。オーバーライドがない場合のレンダリング順序は headercontentpagination です。defaultBlockOrderheadercontentpaginationdefaultBlocks キー: titleactionheaderloadercontenttablepagination)。

デフォルト UI ブロック

ブロックベース備考
ListInvites (ルート)Stackテーブルシェル。header/content/pagination をレンダリング。空状態は PersonOutlined を使用
ListInvites.TitleTypographylistInvitesTitle からのタイトルテキスト
ListInvites.ActionButtonPeopleOutlineOutlined アイコン付きのユーザーを招待アクション
ListInvites.HeaderStackタイトルとアクション用のヘッダーラッパー
ListInvites.LoaderCircularProgressローディング状態
ListInvites.ContentBoxローダー、空状態、またはグリッド用のコンテンツラッパー
ListInvites.TableStack + TableContainer + Tableデータグリッド。カスタム列、行アクション、行メニュー、行クリック動作をサポート
ListInvites.PaginationStack + Paginationページコントロール

TypeScript

import { ListInvites, type ListInvitesRowData } from '@nodeblocks/frontend-list-invites-block';

const labels = {
emptyStateMessage: '招待が見つかりません',
actions: {inviteUser: 'ユーザーを招待'},
headerRow: {name: '名前', email: 'メールアドレス', status: 'ステータス'},
cellData: {statusActive: 'アクティブ', statusInactive: '非アクティブ', statusPending: '保留中'},
rowActions: {activate: '招待を有効化', deactivate: '招待を無効化'},
};

const rows: ListInvitesRowData[] = [{id: '1', name: 'Alex', email: 'alex@example.com', status: 'pending'}];

<ListInvites
listInvitesTitle="招待管理"
labels={labels}
data={rows}
onClickAction={() => {}}
rowHref={row => `/invites/${row.id}`}
onNavigate={(path) => window.location.assign(path)}
/>;