Расширение действий

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

Структура трёх вариантов одинакова — различие только в значении static scene и тексте кнопки в defaultProps.

Регистрация действия

В load() Plugin зарегистрируйте через 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'),
      },
    });
  }
}

После регистрации в «Настройка действий» блока можно будет добавить Ваши пользовательские кнопки действий.

Полный исходный код

Связанные ссылки