一覧画面にアクションを追加する
エントリー一覧・モジュール一覧に、独自のボタン・一括操作・メニュー項目を追加します。
対応バージョン: 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 | カスタムカラムの型の選択肢に表示する名前(省略可) |
filterable | true にすると、絞り込み条件の対象のカラムに含まれます(省略可) |
標準のカラム型と同じ名前で登録すると、標準の定義が上書きされ、その型を使うすべての一覧に影響します。 独自の名前を付けてください。
カラムの並び替えや削除は、この 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 | 新規追加(実験的機能) |