一覧画面にアクションを追加する


エントリー一覧・モジュール一覧に、独自のボタン・一括操作・メニュー項目を追加します。

対応バージョン: Ver. 3.2.38 以降

実験的機能

この機能は Ver. 3.2 の間は実験的機能として提供し、Ver. 3.3 で正式に提供する予定です。

  • 変わりうる範囲: 登録 API の名前と引数、イベント名とイベントが受け取る値の構造は、マイナーバージョンアップで変更される可能性があります。
  • 変わらない範囲: 従来の ACMS.Config.entryAdminConfig / moduleAdminConfig による一覧のカスタマイズは、今後も動作します。
  • 公開 API の線引き: このページに掲載している登録 API とイベントを公開 API として扱います。掲載外のものも利用できますが、告知なく変更されることがあります。
  • サポート対象外: 管理画面に追加した独自の JavaScript・CSS は、バージョンアップ後の動作を保証しません。これらを原因とする不具合は、サポートの対象外です。

すでに entryAdminConfig でカスタマイズしている場合

従来の ACMS.Config.entryAdminConfig / moduleAdminConfig の getActions / getBulkActions / getMenus は今後も動作します。書き換えは不要です。このページの方法と併用もできます。

行にボタンを追加する

各行の操作ボタンを追加します。次の例は、公開中のエントリーの行に「ID をコピー」ボタンを追加します。

ACMS.adminReady(() => {
  ACMS.plugins.register('acme-entry-copy-id', {
    setup(ctx) {
      ctx.dataview.registerAction('entry', 'acme-entry-copy-id/copy', {
        id: 'acme-entry-copy-id/copy',
        label: 'ID をコピー',
        condition: (entry) => entry.status === 'open',
        onAction: async (entry) => {
          await navigator.clipboard.writeText(String(entry.id));
        },
      });
    },
  });
});
指定できる項目説明
idアクションの識別子(必須)
labelボタンのラベル。関数を渡すと行の内容によって変えられます
onAction(行のデータ)クリック時の処理
condition(行のデータ)false を返した行にはボタンを表示しません
type'primary' / 'secondary' / 'tertiary'(見た目)
buttonPropsボタンに渡す属性。行のデータを受け取る関数も渡せます

第1引数は対象の一覧です。エントリー一覧は 'entry'、モジュール一覧は 'module' を指定します。

行のデータは、エントリー一覧ではエントリーの情報(id / title / status / blog.id / category.id など)、モジュール一覧ではモジュールの情報(id / identifier / name / status など)です。

リンクとして表示する

onAction の代わりに getHref を指定すると、ボタンではなくリンクとして描画されます。

ACMS.adminReady(() => {
  ACMS.plugins.register('acme-entry-open-page', {
    setup(ctx) {
      ctx.dataview.registerAction('entry', 'acme-entry-open-page/open', {
        id: 'acme-entry-open-page/open',
        label: '公開ページを開く',
        getHref: (entry) => ACMS.Library.acmsLink({ bid: entry.blog.id, eid: entry.id }),
      });
    },
  });
});

一括操作を追加する

複数選択したあとに実行する操作です。一括操作は、選択したあとに操作を選び、フォームの送信ボタンを押して実行する形です。送信ボタンは renderForm で自分で用意します。 renderForm を省略すると、操作を選んでも実行するボタンが表示されません。

ACMS.adminReady(() => {
  const { createElement } = ACMS.Library.React;

  ACMS.plugins.register('acme-entry-bulk', {
    setup(ctx) {
      ctx.dataview.registerBulkAction('entry', 'acme-entry-bulk/list-ids', {
        id: 'acme-entry-bulk/list-ids',
        label: '選択したエントリーの ID を表示',
        renderForm: () =>
          createElement(
            'button',
            { type: 'submit', className: 'acms-admin-btn-admin acms-admin-btn-admin-primary' },
            '実行'
          ),
        onAction: async (formData, entries) => {
          await ACMS.Library.dialog.alert(entries.map((entry) => entry.id).join(', '));
        },
      });
    },
  });
});

onAction には、フォームの内容(FormData)と、選択された行の配列が渡されます。renderForm で入力欄を返せば、その値も FormData に入ります。condition(選択された行の配列) で、操作を選択肢に出すかどうかを切り替えることもできます。

メニュー項目を追加する

一覧上部のメニューに項目を追加します。

ACMS.adminReady(() => {
  ACMS.plugins.register('acme-entry-menu', {
    setup(ctx) {
      ctx.dataview.registerMenu('entry', 'acme-entry-menu/count', {
        id: 'acme-entry-menu/count',
        label: '表示件数を確認',
        onAction: async (entries) => {
          await ACMS.Library.dialog.alert(`${entries.length} 件のエントリーを表示しています`);
        },
      });
    },
  });
});

onAction には、一覧に表示されている行の配列が渡されます。

カラムの型を追加する

一覧に表示するカラムの、セルの見た目を追加します。ここで登録した型は、カスタムカラムを追加するときの型の選択肢に label の名前で加わります。

ACMS.adminReady(() => {
  const { createElement } = ACMS.Library.React;

  ACMS.plugins.register('acme-entry-column', {
    setup(ctx) {
      ctx.dataview.registerColumnType('acme-entry-column/badge', {
        label: 'バッジ',
        getValue: (info) =>
          createElement('span', { className: 'acms-admin-label acms-admin-label-info' }, String(info.getValue() ?? '')),
      });
    },
  });
});
指定できる項目説明
getValue(セルの情報)セルに表示する内容を返す関数。info.getValue() でセルの値を取得できます
labelカスタムカラムの型の選択肢に表示する名前(省略可)
filterabletrue にすると、絞り込み条件の対象のカラムに含まれます(省略可)

標準のカラム型と同じ名前で登録すると、標準の定義が上書きされ、その型を使うすべての一覧に影響します。 独自の名前を付けてください。

カラムの並び替えや削除は、この API では行えません。従来の getColumns を使ってください。

一括操作の前に処理を挟みたい場合

「公開状態を一括変更する前に確認したい」といった割り込みは、レジストリではなくイベントを使います。

ACMS.adminReady(() => {
  ACMS.plugins.register('acme-entry-confirm', {
    setup(ctx) {
      ctx.events.on('entry.bulk-status.before', async (payload, gate) => {
        const ok = await ACMS.Library.dialog.confirm('選択したエントリーの公開状態を変更します。よろしいですか?');
        if (!ok) {
          gate.cancel(); // 呼ぶと一括変更を中止する
        }
      });
    },
  });
});

一覧画面で使えるイベントは イベント一覧 の「エントリー」「モジュール」を参照してください。

名前の付け方

同じ名前で2回登録するとエラーになります。 プラグイン名/機能名 の形にしておくと衝突しません。'entry' と 'module' は別扱いなので、同じ名前を両方に登録できます。

このページの例を1つのファイルにまとめて試すときは、プラグイン名(ACMS.plugins.register() の第1引数)が重複しないようにしてください。

関連ページ

変更履歴

バージョン変更内容
Ver. 3.2新規追加(実験的機能)