# Modal de detalhe e grids > detailModal com abas summary, form, relatedGrid, readonlyGrid e customComponent; edição inline por linha; rowActions com interpolação, condições e refresh entre abas. Centrais frequentemente têm uma entidade principal com filhos operacionais — Projeto → Itens → Pagamentos, Pedido → Produtos → Expedições, Contrato → Parcelas → Documentos. A modal de detalhe resolve esse padrão sem página React. ```txt Grid principal └── ação "Editar" └── modal com abas ├── Resumo (summary) ├── Dados Principais (form) ├── Itens (relatedGrid editável inline) └── Pagamentos (readonlyGrid) ``` ## Exemplo completo ```tsx ``` ## Abas | `type` | Uso | Configuração | |---|---|---| | `summary` | Cards de indicadores | `cards[]` com `source`: `field`, `relatedCount`, `relatedSum`, `relatedAvg`, `customMetric`; `format` | | `form` | Dados do registro principal (salva o pai) | `groups[]` com `label`, `description`, `fields`, `columns` (1–4), ou `fields` | | `relatedGrid` | Filhos editáveis | `relation`, `editable`, `editMode` (`inline`, `modal`, `drawer`), `columns`, `rowActions` | | `readonlyGrid` | Relacionados só leitura | `relation`, `columns`, `rowActions` | | `customComponent` | Componente registrado | `component: "custom:Chave"`, `props` | `detailModal.size`: `md`, `lg`, `xl`, `full`. ## Relações ```ts relations: { itens: { model: "OrcamentoItem", foreignKey: "projetoId", parentKey: "_id", label: "Itens" } } ``` A aba busca os filhos por `foreignKey = parent[parentKey]`. Declare uma vez e reutilize em abas, filtros e ações. ## Edição inline Com `editable: true` e `editMode: "inline"`: - célula editável conforme a metadata do campo (ou `editor` explícito: `string`, `number`, `currency`, `date`, `enum`, `select`, `ref`, `boolean`, `textarea`); - linha marcada como alterada, com **Salvar** e **Cancelar** por linha; - `PUT /:modelPath/:id` pelo CRUD genérico; - loading e erro por linha; - refresh pós-salvamento. Em esteiras, `relatedGrid` também aceita `create` (inclusão vinculada ao pai) e `delete` (com confirmação). ## Ações por linha | `type` | Efeito | |---|---| | `openDetailModal` | Abre a modal (`initialTab`) | | `navigate` | Navega para `href` | | `apiAction` | Chama `endpoint` com `method` | | `customAction` | Renderer próprio (`renderer`) | ### Interpolação de endpoint `:id` (linha), `:parentId` (registro pai), `:campo` (campo da linha) e `:parent.campo` (campo do pai). ### Condições ```ts disabledWhen: { field: "pagamentoId", exists: true } hiddenWhen: { field: "status", equals: "Cancelado" } ``` Operadores: `exists`, `equals`, `notEquals`, `in`, `gt`, `gte`, `lt`, `lte`. ### Refresh `self` (grid atual), `parent` (registro principal), `all` (todas as queries da modal) ou o `id` de uma aba. ## RBAC visual Abas, colunas e ações aceitam `roles`/`permissions`. A UI oculta ou desabilita conforme a permissão — mas a **autoridade final é o backend**: a rota de `apiAction` precisa declarar sua `permission`. ## Componentes envolvidos `CoreDetailModal`, `CoreTabbedDetail`, `CoreSummaryCards`, `CoreRelatedGrid`, `CoreInlineEditableCell` e `CoreRowAction` implementam o contrato de forma genérica. Fonte: https://sdk.oonapps.com/docs/frontend/modal-de-detalhe