Extensão de ações

No NocoBase, ações (Actions) são botões dentro dos blocos usados para disparar lógica de negócio — por exemplo, "Novo", "Editar", "Excluir" etc. Ao herdar a classe base ActionModel, você pode adicionar botões de ação personalizados.

Cenários de ação

Cada ação precisa declarar o cenário em que aparece, especificado pela propriedade static scene:

CenárioValorDescrição
collectionActionSceneEnum.collectionAtua sobre a data table, por exemplo o botão "Novo"
recordActionSceneEnum.recordAtua sobre um único registro, por exemplo botões "Editar", "Excluir"
bothActionSceneEnum.bothPode ser usado nos dois cenários
allActionSceneEnum.allDisponível em todos os cenários (incluindo contextos especiais como modais)

Exemplos

Ação de nível de data table

Atua sobre toda a data table, aparecendo na barra de ações no topo do bloco:

// 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'),
});

Ação de nível de registro

Atua sobre um único registro, aparecendo na coluna de ações de cada linha da tabela:

// 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'),
});

Aplicável aos dois cenários

Se a ação não diferencia cenários, use 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'),
});

A estrutura dos três é idêntica — a diferença está apenas no valor de static scene e no texto do botão em defaultProps.

Registrando a ação

No load() do Plugin, registre com registerModelLoaders para carregamento sob demanda:

// 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'),
      },
    });
  }
}

Após o registro, em "Configurar ações" do bloco você poderá adicionar seus botões de ação personalizados.

Código-fonte completo