Шпаргалка по разработке плагинов

При написании плагина часто возникает мысль: «Что и где именно писать, какой API вызывать?». Эта шпаргалка поможет быстро найти ответ.

Структура каталогов плагина

При создании плагина через yarn pm create @my-project/plugin-name автоматически генерируется следующая структура каталогов. Не создавайте каталоги вручную, чтобы не пропустить шаг регистрации и не получить неработающий плагин. Подробности см. в Написание первого плагина.

plugin-name/
├── src/
   ├── client-v2/              # 客户端代码(v2)
   ├── plugin.tsx          # 客户端插件入口
   ├── locale.ts           # useT / tExpr 翻译 hook
   ├── models/             # FlowModel(区块、字段、操作)
   └── pages/              # 页面组件
   ├── client/                 # 客户端代码(v1,兼容)
   ├── plugin.tsx
   ├── locale.ts
   ├── models/
   └── pages/
   ├── server/                 # 服务端代码
   ├── plugin.ts           # 服务端插件入口
   └── collections/        # 数据表定义
   └── locale/                 # 多语言翻译文件
       ├── zh-CN.json
       └── en-US.json
├── client-v2.js                # 根目录入口(构建产物指向)
├── client-v2.d.ts
├── client.js
├── client.d.ts
├── server.js
├── server.d.ts
└── package.json

Клиент: что я хочу сделать → как это написать

Что я хочу сделатьВ каком файле писатьКакой API вызыватьДокументация
Зарегистрировать маршрут страницыload() в plugin.tsxthis.router.add()Router
Зарегистрировать страницу настроек плагинаload() в plugin.tsxpluginSettingsManager.addMenuItem() + addPageTabItem()Router
Зарегистрировать пользовательский блокload() в plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Расширение блоков
Зарегистрировать пользовательское полеload() в plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Расширение полей
Зарегистрировать пользовательское действиеload() в plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Расширение действий
Сделать так, чтобы внутренняя таблица появилась в выборе таблицы данных блокаload() в plugin.tsxmainDS.addCollection()Collections (Таблицы данных)
Перевести тексты плагинаlocale/zh-CN.json + locale/en-US.jsoni18n Интернационализация

Сервер: что я хочу сделать → как это написать

Что я хочу сделатьВ каком файле писатьКакой API вызыватьДокументация
Определить таблицу данныхserver/collections/xxx.tsdefineCollection()Collections (Таблицы данных)
Расширить существующую таблицу данныхserver/collections/xxx.tsextendCollection()Collections (Таблицы данных)
Зарегистрировать пользовательский интерфейсload() в server/plugin.tsthis.app.resourceManager.define()ResourceManager
Настроить права доступа интерфейсаload() в server/plugin.tsthis.app.acl.allow()ACL Контроль доступа
Записать начальные данные при установке плагинаinstall() в server/plugin.tsthis.db.getRepository().create()Plugin (Плагин)

Шпаргалка по FlowModel

Что я хочу сделатьКакой базовый класс наследоватьКлючевой API
Сделать чистый блок отображенияBlockModelrenderComponent() + define()
Сделать блок, привязанный к таблице данных (с пользовательским рендерингом)CollectionBlockModelcreateResource() + renderComponent()
Сделать полноценный блок таблицы (на базе встроенной таблицы)TableBlockModelfilterCollection() + customModelClasses
Сделать компонент отображения поляClickableFieldModelrenderComponent(value) + bindModelToInterface()
Сделать кнопку действияActionModelstatic scene + registerFlow({ on: 'click' })

Шпаргалка по методам перевода

СценарийЧто использоватьОткуда импортировать
В load() плагинаthis.t('key')Встроено в базовый класс Plugin
В React-компонентеconst t = useT(); t('key')locale.ts
Статическое определение FlowModel (define(), registerFlow())tExpr('key')locale.ts

Шпаргалка распространённых API-вызовов

Что я хочу сделатьВ PluginВ компоненте
Отправить API-запросthis.context.api.request()ctx.api.request()
Получить переводthis.t()useT()
Получить логгерthis.context.loggerctx.logger
Зарегистрировать маршрутthis.router.add()
Навигацияctx.router.navigate()
Открыть модальное окноctx.viewer.dialog()

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