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:
| Pacote | Versão | Para quê |
|---|---|---|
@igrp/platform-process-management-client-ts | 0.1.0-beta.21 | Cliente HTTP: processos, instâncias, tarefas, áreas, atividades |
@igrp/platform-process-management-types | 0.1.0-beta.21 | Tipos (Task, ProcessInstance, TaskData, filtros…) |
@igrp/platform-process-management-client-ui | 0.1.0-beta.63 | Runtime 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ção | Notas |
|---|---|
baseUrl | http://<slug>:2575/gateway-api/<serviço>-process-management-api. Os caminhos começam na raiz (/process-instances). |
timeout | ms (default 30000), com AbortController |
headers | Junta-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étodo | Pedido |
|---|---|
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, rescheduleTimer | ver API |
pm.tasks
| Método | Pedido |
|---|---|
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>IGRPProcessClientConfig | Para quê |
|---|---|
baseUrl | API do Process Management (sem /api/v1) |
accessToken | Token do utilizador → Authorization: Bearer |
taskReturnUrl | Para onde volta "Voltar" depois de concluir, quando o URL não traz ?returnUrl= |
summaryPage | Se 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 Key | Resultado | Ficheiro (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 Key | default.v1 | process/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:
next15.5,next-auth4.24,react/react-dom19.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).
Última atualização:
