操作拡張

NocoBase では、操作(Action) はブロック内のボタンで、ビジネスロジックをトリガーします。例えば「新規作成」「編集」「削除」などです。ActionModel 基底クラスを継承することで、カスタム操作ボタンを追加できます。

操作シーン

各操作は表示シーンの宣言が必要で、static scene プロパティで指定します:

シーン説明
collectionActionSceneEnum.collectionデータテーブルに対する操作(「新規作成」ボタンなど)
recordActionSceneEnum.record単一レコードに対する操作(「編集」「削除」ボタンなど)
bothActionSceneEnum.both両方のシーンで使用可能
allActionSceneEnum.allすべてのシーンで使用可能(ダイアログなどの特殊コンテキストを含む)

使用例

データテーブルレベル操作

データテーブル全体に対する操作で、ブロック上部の操作バーに表示されます:

// models/SimpleCollectionActionModel.tsx
import { ActionModel, ActionSceneEnum } from '@nocobase/client-v2';
import { ButtonProps } from 'antd';
import { tExpr } from '@nocobase/flow-engine';

export class SimpleCollectionActionModel extends ActionModel {
  static scene = ActionSceneEnum.collection;

  defaultProps: ButtonProps = {
    children: tExpr('Simple collection action'),
  };
}

SimpleCollectionActionModel.define({
  label: tExpr('Simple collection action'),
});

レコードレベル操作

単一レコードに対する操作で、テーブル各行の操作列に表示されます:

// models/SimpleRecordActionModel.tsx
import { ActionModel, ActionSceneEnum } from '@nocobase/client-v2';
import { ButtonProps } from 'antd';
import { tExpr } from '@nocobase/flow-engine';

export class SimpleRecordActionModel extends ActionModel {
  static scene = ActionSceneEnum.record;

  defaultProps: ButtonProps = {
    children: tExpr('Simple record action'),
  };
}

SimpleRecordActionModel.define({
  label: tExpr('Simple record action'),
});

両方のシーンに対応

操作がシーンを区別しない場合は ActionSceneEnum.both を使います:

// models/SimpleBothActionModel.tsx
import { ActionModel, ActionSceneEnum } from '@nocobase/client-v2';
import { ButtonProps } from 'antd';
import { tExpr } from '@nocobase/flow-engine';

export class SimpleBothActionModel extends ActionModel {
  static scene = ActionSceneEnum.both;

  defaultProps: ButtonProps = {
    children: tExpr('Simple both action'),
  };
}

SimpleBothActionModel.define({
  label: tExpr('Simple both action'),
});

3つの書き方の構造は同じです。違いは static scene の値と defaultProps 内のボタンテキストだけです。

操作の登録

Plugin の load() 内で registerModelLoaders を使って遅延読み込み登録します:

// plugin.tsx
import { Plugin } from '@nocobase/client-v2';

export class PluginSimpleActionClient extends Plugin {
  async load() {
    this.flowEngine.registerModelLoaders({
      SimpleCollectionActionModel: {
        loader: () => import('./models/SimpleCollectionActionModel'),
      },
      SimpleRecordActionModel: {
        loader: () => import('./models/SimpleRecordActionModel'),
      },
      SimpleBothActionModel: {
        loader: () => import('./models/SimpleBothActionModel'),
      },
    });
  }
}

登録完了後、ブロックの「操作の設定」からカスタム操作ボタンを追加できます。

完全なソースコード

関連リンク