CONFIG JSON — referência (Crud All Custom)
Objeto gravado na coluna CONFIG de nfs_crud_all_custom. O assistente em /admin/crud-all-custom monta a maior parte; use a aba JSON para chaves avançadas ou cópia entre ambientes.
Esqueleto mínimo (no admin: Aplicar esqueleto vazio ou template minimal via API):
{
"ui": {
"enabled": true,
"mode": "cards",
"fields_layout": "compact",
"fields_columns": 2,
"actions_in_header": true
},
"main": {
"title": "",
"fields": []
},
"children": [],
"replicate_from_main_enabled": true,
"replicate_field_pairs": [],
"replicate_excluded_fields": []
}
Metadados (colunas da tabela, não dentro do JSON)
| Coluna | Obrigatório | Notas |
|---|---|---|
MAIN_TABLE | Sim | Uppercase no save |
TITULO | Sim | |
SLUG | Não | Único por (EMPRESA, FILIAL, LOCAL, MAIN_TABLE) |
DESCRICAO | Não | |
EMPRESA, FILIAL, LOCAL | Sim (default 9999) | Escopo EFL |
ATIVO | Sim | 0 = não resolve no runtime |
CONFIG | Sim | JSON válido |
ui — apresentação
| Chave | Valores | Runtime |
|---|---|---|
enabled | boolean (default true) | Desliga customização visual se false |
mode | cards (default), classic | classic → NfsCrudFormAll sem wrapper cards (blocos azuis) |
fields_layout | compact, grid | Só com mode=cards; grid força 1 coluna de campos |
fields_columns | 2 | Só cards + compact; runtime fixa em 2 colunas |
actions_in_header | boolean | Salvar/Limpar no topo (cards) |
page.accent | cor #hex | Destaque no cards (via ui.page no assistente) |
page.background, header_background, header_text, header_border | #hex | Opcional; sanitizados no PHP |
page.meta_icon | FontAwesome | Ex.: fa-database |
page.show_table_meta | boolean | Exibe nome da tabela principal no header |
sections.default | cores padrão dos cards | Fallback de filhas |
sections.draft | estilo card rascunho | Borda tracejada |
sections_by_table | mapa por nome de tabela | Sobrescreve título/cores por filha |
Regras no assistente (crudAllCustomUiRules.js): com mode=classic, fields_layout, fields_columns, actions_in_header, accent, promotedChildTableKeys e fundos de card não aplicam no runtime. Com fields_layout=grid, fields_columns e promotedChildTableKeys também não se aplicam.
main — tabela principal
| Chave | Tipo | Descrição |
|---|---|---|
title | string | Título do card / seção |
icon | string | FontAwesome (fa-wrench ou fa fa-wrench) |
header_background | #hex | Cabeçalho do card (mode cards) |
header_text, body_background, border_color | #hex | Opcional |
fields | string[] | Whitelist de NOME de campo; [] = todos |
layout | object | Reservado / extensões futuras |
children[] — tabelas no formulário
Cada item:
{
"table": "OS_TECNICO",
"title": "Técnico",
"icon": "fa-user",
"header_background": "#e87a6f",
"fields": ["SEQ_DB_TECNICO", "INI_DH"]
}
| Chave | Descrição |
|---|---|
table | Nome no DS. Se está em FK_DOWN da principal → vínculo no save; senão → extra_tables |
title, icon, header_background | Card no mode cards |
fields | Whitelist; vazio = todos os campos da tabela |
Ordem do array = ordem dos cards (childTableOrder).
Filhas do DS não listadas → hidden_children (não aparecem).
promotedChildTableKeys
Tipo: string[] — nomes de tabelas filhas que, no layout cards + compact, ficam na coluna direita quando há conteúdo na principal.
| Configuração | Comportamento |
|---|---|
Omitido ou [] | Todas as filhas elegíveis podem ir à direita |
| Lista parcial | Só as marcadas à direita; as demais ficam abaixo da OS |
Exemplo: duas filhas OS_TECNICO e EQP_APT, com promotedChildTableKeys: ["OS_TECNICO"] — após preencher a OS, OS_TECNICO tende à coluna direita e EQP_APT abaixo.
Em ui.mode=classic ou ui.fields_layout=grid, esta chave é ignorada no runtime.
Replicação
| Chave | Clássico EP | Custom assistente | Custom JSON |
|---|---|---|---|
replicate_from_main_enabled | Sim | Checkbox | Sim |
replicate_mode | Sim | Radio ask / auto / on_click | Sim |
replicate_field_pairs | Sim | Pares explícitos OS → filha | Sim |
replicate_field_map | Sim | Importado/convertido para pares no editor | Sim (retrocompat) |
replicate_field_map_scope | Sim | — (só JSON, retrocompat) | Sim |
replicate_excluded_fields | Sim | — (só JSON) | Sim |
replicate_mode
| Valor | Comportamento |
|---|---|
auto | Cópia ao mudar a OS (pares do CONFIG e campos com FILTRO_VIEW/gatilho). Valor já editado manualmente na filha, diferente da OS, não é sobrescrito de novo |
ask | Diálogo Sim/Não antes de aplicar cópia — vale para pares e para FILTRO_VIEW/gatilho, mesmo sem replicate_field_pairs. Após Não, não envia o valor na filha no save; mudar de novo a OS ou o campo na filha pode perguntar outra vez. Campos de edição contínua (texto, número, data/hora, multiselect) confirmam ao concluir a interação (blur/fechar LOV) |
on_click | Cópia só ao interagir com campo pareado na filha; FILTRO_VIEW não preenche sozinho. Se a OS mudar depois, pode perguntar atualização |
Se inválido ou ausente no PHP: auto. Valor inicial no assistente ao criar registro: ask.
FILTRO_VIEW (DS) vs replicate_field_pairs
| Origem | O que faz |
|---|---|
replicate_field_pairs | Pares explícitos OS → filha definidos no CONFIG |
FILTRO_VIEW + gatilho no DS | Filha segue valor canônico da OS (ex.: LOV restrito ao cliente da OS). Exige replicate_from_main_enabled: true; respeita replicate_mode |
Não é necessário repetir no JSON um par que já está coberto só pelo FILTRO_VIEW, mas o par pode coexistir (o diálogo no modo ask considera os dois).
replicate_field_pairs
Lista explícita de pares main + childTable + childField:
"replicate_field_pairs": [
{ "main": "DESCRICAO", "childTable": "EQP_APT", "childField": "INI_DH_ONLINE" }
]
Somente os pares listados participam da cópia. Campos com mesmo nome não são pareados automaticamente.
replicate_field_map (retrocompat)
Objeto legado: chave = campo na principal, valor = campo na filha.
"replicate_field_map": {
"DESCRICAO": "INI_DH_ONLINE"
}
Ao abrir no manager, esse formato é convertido para replicate_field_pairs.
replicate_field_map_scope (retrocompat)
Limita um par a filhas específicas (chave CAMPO_MAIN:CAMPO_FILHA):
"replicate_field_map_scope": {
"DESCRICAO:INI_DH_ONLINE": ["EQP_APT"]
}
Filhas fora da lista não recebem aquele mapeamento, mesmo tendo o campo destino. No manager, o escopo é representado após conversão para pares explícitos.
replicate_excluded_fields
Lista de nomes homônimos que não devem replicar.
Outras chaves
| Chave | Uso |
|---|---|
extra_tables | Tabelas avulsas além das declaradas em children[] (raro; assistente deriva de children) |
enable_mobile_tables | Boolean; comportamento mobile. O assistente remove ao salvar — incluir via JSON se necessário |
Chaves ignoradas (aviso na validação)
workflowchild_relations
Não são lidas pelo runtime; a validação pode emitir aviso.
Exemplo completo (cards + duas filhas)
{
"ui": {
"enabled": true,
"mode": "cards",
"fields_layout": "compact",
"fields_columns": 2,
"actions_in_header": true,
"page": { "accent": "#1ab7bc", "meta_icon": "fa-wrench" }
},
"main": {
"title": "Ordem de serviço",
"icon": "fa-wrench",
"header_background": "#f0ad4e",
"fields": ["DESCRICAO", "STATUS"]
},
"children": [
{
"table": "OS_TECNICO",
"title": "Técnico",
"icon": "fa-user",
"header_background": "#5bc0de",
"fields": []
},
{
"table": "EQP_APT",
"title": "Equipamento",
"fields": ["EQP_SEQ_DB"]
}
],
"promotedChildTableKeys": ["OS_TECNICO"],
"replicate_from_main_enabled": true,
"replicate_mode": "ask",
"replicate_field_pairs": [
{
"main": "DESCRICAO",
"childTable": "EQP_APT",
"childField": "INI_DH_ONLINE"
}
],
"replicate_excluded_fields": [],
"replicate_field_map_scope": {}
}
Equivalência com Entry Point CrudAll
Conversão de nfs_entry_point (CrudAll) para CONFIG:
Entry Point (CrudAll) | Custom CONFIG |
|---|---|
main_hidden_fields | Inverso de main.fields[] |
children_fields[T].hidden_fields | Inverso de children[].fields |
hidden_children | Filhas FK não listadas em children[] |
extra_tables | Filhas em children[] sem FK + extra_tables explícito |
replicate_field_pairs | Pares explícitos main + childTable + childField |
Demais chaves replicate_* | Mesmos nomes no JSON |
Validação
POST /admin/crud-all-custom/validate retorna:
| Tipo | Exemplos |
|---|---|
| errors | MAIN_TABLE inexistente no DS, JSON inválido, falha no preview de UI |
| warnings | Campo inexistente no DS, chave workflow / child_relations, children[].table vazio |
Alertas abaixo do editor após Validar CONFIG. Com errors, corrija antes de usar no runtime.