iGRPIGRP 3.0Documentation

Process Management · SDK TypeScript

Os pacotes @igrp/platform-process-management-client-ts, -types e -client-ui — cliente HTTP por recurso, runtime de tarefas em React e o contrato dos passos.

O Process Management UI e as apps que executam tarefas falam com o Process Management API através de três pacotes:

PacoteVersãoPara quê
@igrp/platform-process-management-client-ts0.1.0-beta.21Cliente HTTP: processos, instâncias, tarefas, áreas, atividades
@igrp/platform-process-management-types0.1.0-beta.21Tipos (Task, ProcessInstance, TaskData, filtros…)
@igrp/platform-process-management-client-ui0.1.0-beta.63Runtime das tarefas em React: página, provider, contrato dos passos

Numa app gerada pelo Studio, o bundle Process Management UI instala os três e as páginas de runtime — ver Formulários BPMN.


Cliente HTTP

import { ProcessManagementClient } from "@igrp/platform-process-management-client-ts";

const pm = ProcessManagementClient.create({
  baseUrl: process.env.API_GATEWAY!, // rota do gateway, SEM /api/v1
  timeout: 30000,
  headers: { Authorization: `Bearer ${accessToken}` },
});
OpçãoNotas
baseUrlhttp://<slug>:2575/gateway-api/<serviço>-process-management-api. Os caminhos começam na raiz (/process-instances).
timeoutms (default 30000), com AbortController
headersJunta-se a Content-Type/Accept: application/json. A autenticação vai aqui.

O Process Management UI cria um cliente novo por pedido, no servidor, com o token da sessão (auth.getAccessToken()): guardar o cliente num módulo partilharia o token entre utilizadores.

Cada método devolve Promise<ApiResponse<T>> = { data, status, statusText }. As listas vêm em PaginatedResponse<T> (content, pageNumber, pageSize, totalElements, totalPages, first, last).

pm.processes

MétodoPedido
createAndStartProcess(body)POST /process-instances — { processKey, applicationBase, priority?, businessKey?, variables?: {name,value}[], assignmentRules? }
createProcessInstance(body) · startProcessInstance(id, body)POST /process-instances/create · /{id}/start
getProcessInstances(params?, body?)POST /process-instances/search (filtros na query)
getProcessInstanceById(id) · getProcessInstanceTaskStatus(id)GET /process-instances/{id} · /{id}/task-status
cancelProcessInstance(id, { obsCancel? })POST /process-instances/{id}/cancel
getProcesses(filter?) · getProcessById(id)GET /process-definitions[/{id}]
getProcessArtifacts(id) · getProcessDeployedArtifacts(id)GET /process-definitions/{id}/artifacts · /deployed-artifacts
updateProcessArtifact(id, artifact)PUT /process-definitions/{id}/artifacts/{taskKey}
assignGroupsToProcessDefinition · unassign…POST /process-definitions/{id}/assign · /unassign
get…/createProcessSequence(key)GET/POST /process-definitions/{key}/sequence
priorities, export…, import…, archive…, unarchive…, deployProcess, triggerProcessEvent, rescheduleTimerver API

pm.tasks

MétodoPedido
getMyTasks(params?, body?)POST /tasks-instances/me (força status=ASSIGNED)
getAvailableTasks(params?)POST /tasks-instances/search com status=CREATED
getTasks(params?, body?)POST /tasks-instances/search — filtros na query (processInstanceId, processNumber, name, status, applicationBase, page, size…); filtros por variável no corpo ({ variables: [{ name, operator, value }] })
getTasksByProcessInstance(id, paging?)atalho de getTasks
getTaskById(id) · getTaskVariablesById(id)GET /tasks-instances/{id} · /{id}/variables
claimTask(id, { user?, note? })POST /tasks-instances/{id}/claim (parâmetros na query)
unclaimTask(id, { note? })POST /tasks-instances/{id}/unclaim
assignTask(id, { user?, note?, priority?, candidateGroups?, candidateUsers? })POST /tasks-instances/{id}/assign
saveTask(id, data) · completeTask(id, data)POST /tasks-instances/{id}/save · /complete — TaskData = { variables?, forms? }
getTaskStats() · getMyTaskStats()GET /tasks-instances/stats · /stats/me

pm.areas e pm.activities

getAreas, getAreaById, createArea, updateArea, deleteArea, getAreaProcesses, associateProcessToArea, removeProcessFromArea (/areas…); getActivityInstances(instanceId), getActivityProgress(instanceId), getActivityById(id) (/activities…).

Exemplo — iniciar, assumir e concluir

import { ProcessManagementClient, ApiClientError } from "@igrp/platform-process-management-client-ts";

const pm = ProcessManagementClient.create({ baseUrl, headers: { Authorization: `Bearer ${token}` } });

const { data: instance } = await pm.processes.createAndStartProcess({
  processKey: "registo-entidade",
  applicationBase: "registos",
  variables: [{ name: "nomeEntidade", value: "Exemplo Serviços, Lda." }],
});

const { data: tasks } = await pm.tasks.getTasksByProcessInstance(instance.id);
const pedido = tasks.content[0];

try {
  await pm.tasks.claimTask(pedido.id);
  await pm.tasks.completeTask(pedido.id, {
    variables: [{ name: "nif", value: "123456789" }],
  });
} catch (e) {
  if (e instanceof ApiClientError) console.error(e.status, e.details);
}

Erros

ApiClientError (exportado) tem status (HTTP; 0 em falha de rede ou timeout), message (HTTP Error: <status> <statusText>) e details (corpo da resposta).


Runtime de tarefas (client-ui)

O client-ui desenha a página de uma tarefa: cabeçalho com o número da instância, Guardar e Concluir Tarefa, a barra de passos e o passo atual. As apps usam-no através das páginas do bundle; o essencial:

// process/[...process]/layout.tsx (servidor) — /process/<processKey>/<instância>/<tarefa>/<id>
const config: IGRPProcessClientConfig = {
  baseUrl: process.env.PROCESS_MANAGEMENT_CLIENT_BASE_URL ?? "",
  accessToken: token?.accessToken ?? null,
  taskReturnUrl: processManagementAppHref("my-tasks", process.env.IGRP_APP_PAGE_TASK),
  summaryPage: "/process/resumo",
};

// process/[...process]/page.tsx (cliente)
<IGRPProcessProvider params={params} config={config} resolveStepComponent={resolve}>
  <IGRPProcessPage />
</IGRPProcessProvider>
IGRPProcessClientConfigPara quê
baseUrlAPI do Process Management (sem /api/v1)
accessTokenToken do utilizador → Authorization: Bearer
taskReturnUrlPara onde volta "Voltar" depois de concluir, quando o URL não traz ?returnUrl=
summaryPageSe definido, concluir com sucesso navega para <summaryPage>/<instância> em vez de mostrar o diálogo

IGRPProcessProvider recebe params (processKey, processInstanceId — UUID ou número —, userTaskKey, userTaskInstanceId), config, resolveStepComponent e mode (execution | consultation; sem userTaskInstanceId assume consulta só de leitura). Dentro dele, useIGRPProcessContext() dá acesso a stepConfig, completeTask, saveTask, getFormDataForTask, getVariableForTask, readOnly…

Que passo abre — Form Key

getFormDiscovery(form) traduz a Form Key da tarefa:

Form KeyResultadoFicheiro (bundle)
ui:form:<nome>@<v>{ kind: "form", page: "<nome>.v<v>" }process/[...process]/(<processKey>)/<nome>.v<v>.tsx
ui:shared:<nome>@<v> ou outra{ kind: "shared", page }process/shared/<nome>.v<v>.tsx
sem Form Keydefault.v1process/shared/default.v1.tsx

Contrato de um passo

O passo recebe { config: IGRPStepComponentConfig } — processKey, processInstanceId, userTaskInstanceId, processName, processNumber, variables, readOnly, onRegisterMethods — e regista dois métodos:

config.onRegisterMethods?.({
  saveStep: async () => ({ success: true, variables, forms }),
  completeStep: async () => ({ success: true, variables, forms }),
});

A página usa o resultado assim: com success: true, envia variables (para o processo) e forms (dados do formulário, { name, value }[]) para saveTask/completeTask; com success: false, mostra error. Os passos gerados pelo Studio já trazem este esqueleto; tu escreves o corpo em handleSave/handleComplete.

O tipo exportado não bate com o runtime

IGRPStepMethods declara { success, data?, error? }, mas a página lê { success, variables, forms, error }. Segue o segundo formato (é o que os passos gerados devolvem).

Dependências

  • Peers: next 15.5, next-auth 4.24, react/react-dom 19.2.
  • Depende diretamente do Design System 0.2.0-beta.3 — numa app com outra versão, força uma só com overrides (ver Formulários BPMN).
  • Estilos próprios em @igrp/platform-process-management-client-ui/styles.css (as páginas do bundle não o importam; usam os estilos do Design System da app).

README desatualizado

O README do pacote ainda fala de @igrp/process-ui, ProcessPage e createProcessActions, e de Next 14/React 18. Os nomes atuais são os desta página (IGRPProcessPage, IGRPProcessProvider, IGRPProcessPageRenderer).

How is this guide?

Última atualização: