Esteiras (CorePipeline)
Quadro kanban e lista para models com etapas — filtros, inclusão, modal de ticket com abas, ações padrão de aprovação e status de trabalho, e ações próprias.
CorePipeline renderiza uma esteira operacional sobre uma model com campo de etapa. A regra de transição vive no backend (central.process.json); a UI é a projeção.
import { CorePipeline } from "@oondemand/oon-core-front";
export function TicketsPage() {
return (
<CorePipeline
model="Ticket"
label="Tickets"
endpoint="/tickets"
titleField="titulo"
stageField="etapa"
create={{ enabled: true, defaultStage: "Aberto" }}
defaultActions={{ workStatus: false }}
stages={[{ id: "Aberto", label: "Aberto" }, { id: "Concluido", label: "Concluído" }]}
/>
);
}
Props
| Prop | Descrição |
|---|---|
model, label, endpoint |
Model dos cards, título e CRUD |
stageField |
Campo que define a coluna/etapa |
stages |
Etapas fixas; se omitido, derivadas do enum de stageField |
titleField |
Campo exibido no card |
filters |
Mesmo contrato de filtros das coleções |
create |
{ enabled, label?, initialTab?, defaultStage?, defaultValues? } |
viewModes, defaultView |
board e/ou list |
list |
Colunas do modo lista |
form |
Overrides de campos (inclui referenceFilters) |
relations, ticketModal |
Modal do ticket com o mesmo contrato de abas do detailModal |
defaultActions |
Ações padrão (ou false) |
ticketActions |
Ações específicas do App |
Exemplo completo
<CorePipeline
model="ProjetoItem"
endpoint="/projetos-itens"
stageField="etapa"
titleField="nome"
filters={[
{ field: "projetoId", label: "Projeto", type: "ref" },
{ field: "responsavelId", label: "Responsável", type: "ref" },
]}
create={{ enabled: true, label: "Novo item", initialTab: "dados", defaultStage: "Pendente", defaultValues: { statusTrabalho: "Aguardando início" } }}
viewModes={["board", "list"]}
defaultView="board"
list={{ columns: ["projetoId", "nome", "etapa", "responsavelId"] }}
relations={{ pagamentos: { model: "Pagamento", foreignKey: "projetoItemId", parentKey: "_id" } }}
ticketActions={[{
id: "gerar-pagamento", label: "Gerar pagamento", type: "formAction",
loadEndpoint: "/projetos-itens/:id/pagamento-pendente",
endpoint: "/projetos-itens/:id/gerar-pagamento", method: "POST",
fields: [
{ field: "dataPrevisaoPagamento", kind: "date", required: true },
{ field: "valor", kind: "currency", required: true },
],
refresh: ["all", "pagamentos"],
}]}
ticketModal={{
enabled: true, size: "full", defaultTab: "dados",
tabs: [
{ id: "dados", label: "Dados", type: "form", groups: [{ label: "Localização", fields: ["estadoId", "cidadeId"], columns: 2 }] },
{ id: "resumo", label: "Resumo", type: "summary", cards: [{ label: "Total", source: "field", field: "total", format: "currency" }] },
{ id: "pagamentos", label: "Pagamentos", type: "relatedGrid", relation: "pagamentos", editable: true, editMode: "inline" },
],
}}
/>
Ações padrão
O Core habilita dois grupos quando a metadata possui os campos necessários:
- Aprovação —
Aprovarmove para a próxima etapa;Recusarretorna à anterior. Etapas negativas (Cancelado,Rejeitado) ficam fora do fluxo automático. - Status de trabalho — usa
statusTrabalhoe reconheceAguardando início,TrabalhandoeRevisar/Revisão.
defaultActions={{ approval: true, workStatus: true, workStatusField: "statusTrabalho", excludedStages: ["Arquivado"] }}
Use defaultActions={false} para desabilitar ambos. Não repita essas ações em ticketActions.
Ações próprias
type |
Efeito |
|---|---|
transition |
Atualiza o campo informado (normalmente a etapa) |
setField |
Atualização rápida de um campo operacional |
formAction |
Carrega valores (loadEndpoint), abre formulário e envia ao endpoint |
| REST / navegação | Continuam disponíveis |
hiddenWhen, disabledWhen, confirmações, permissões e refresh seguem o contrato de ações do Core.
Evento para métricas
A cada ação operacional concluída o Core dispara o evento de navegador oon:pipeline-action com tipo, registro, campo, valor anterior, valor seguinte e horário — base para SLA, tempo por atividade e produtividade.
window.addEventListener("oon:pipeline-action", (event) => {
console.info((event as CustomEvent).detail);
});
Como view declarativa
import { definePipelineView } from "@oondemand/oon-core-front";
ui: { views: [definePipelineView({ model: "Ticket", label: "Tickets", path: "/tickets", stageField: "etapa" })] }