Cheatsheet de desenvolvimento de plugins

Ao escrever um plugin, é comum ficar pensando "isso deve ir em qual arquivo, qual API chamar". Este cheatsheet ajuda você a localizar rapidamente.

Estrutura de diretórios do plugin

Ao criar um plugin via yarn pm create @my-project/plugin-name, a estrutura de diretórios a seguir é gerada automaticamente. Não crie diretórios manualmente para evitar pular etapas de registro que podem fazer o plugin não funcionar. Veja Escreva seu primeiro plugin para detalhes.

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

Cliente: o que quero fazer → como escrever

O que quero fazerEm qual arquivoQual API chamarDocumentação
Registrar uma rota de páginaload() em plugin.tsxthis.router.add()Router
Registrar uma página de configurações de pluginload() em plugin.tsxpluginSettingsManager.addMenuItem() + addPageTabItem()Router
Registrar um bloco personalizadoload() em plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensão de blocos
Registrar um campo personalizadoload() em plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensão de campos
Registrar uma ação personalizadaload() em plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensão de ações
Fazer uma tabela interna aparecer na seleção de data tables do blocoload() em plugin.tsxmainDS.addCollection()Collections
Traduzir os textos do pluginlocale/zh-CN.json + locale/en-US.jsoni18n internacionalização

Server: o que quero fazer → como escrever

O que quero fazerEm qual arquivoQual API chamarDocumentação
Definir uma data tableserver/collections/xxx.tsdefineCollection()Collections
Estender uma data table existenteserver/collections/xxx.tsextendCollection()Collections
Registrar uma API personalizadaload() em server/plugin.tsthis.app.resourceManager.define()ResourceManager
Configurar permissões de APIload() em server/plugin.tsthis.app.acl.allow()Controle de permissões ACL
Inserir dados iniciais ao instalar o plugininstall() em server/plugin.tsthis.db.getRepository().create()Plugin

Cheatsheet de FlowModel

O que quero fazerQual classe base herdarAPI-chave
Criar um bloco apenas de exibiçãoBlockModelrenderComponent() + define()
Criar um bloco vinculado a uma data table (renderização personalizada)CollectionBlockModelcreateResource() + renderComponent()
Criar um bloco de tabela completo (personalizando sobre a tabela embutida)TableBlockModelfilterCollection() + customModelClasses
Criar um componente de exibição de campoClickableFieldModelrenderComponent(value) + bindModelToInterface()
Criar um botão de açãoActionModelstatic scene + registerFlow({ on: 'click' })

Cheatsheet de métodos de tradução

CenárioO que usarDe onde importar
Dentro do load() do Pluginthis.t('key')Embutido na classe base Plugin
Em componentes Reactconst t = useT(); t('key')locale.ts
Definição estática de FlowModel (define(), registerFlow())tExpr('key')locale.ts

Cheatsheet de chamadas de API comuns

O que quero fazerNo PluginEm componentes
Enviar requisição APIthis.context.api.request()ctx.api.request()
Obter traduçãothis.t()useT()
Obter loggerthis.context.loggerctx.logger
Registrar rotathis.router.add()
Navegar entre páginasctx.router.navigate()
Abrir modalctx.viewer.dialog()