📚 addTable() - Guia Completo
Como criar tabelas interativas no sistema OndeVou
📚 Introdução
A função addTable() é o coração do sistema de tabelas do OndeVou.
Ela transforma uma configuração JSON em uma tabela HTML interativa com:
🏗️ Arquitetura de Funções
O sistema OndeVou segue um padrão consistente de nomenclatura e organização de funções para tabelas.
📋 Padrão de Nomenclatura
| Tipo | Nome | Exemplo | O que faz |
|---|---|---|---|
| Configuração | addTable{tabela}() |
addTableCilindros_tipos() |
Define o JSON da tabela |
| Lista | get{tabela}() (plural) |
getCilindros_tipos() |
Exibe lista/tabela com múltiplos registros |
| Formulário | get{tabela_singular}() |
getCilindro() |
Exibe formulário de um único registro |
| Rotina | ondevou_{numero}() |
ondevou_25() |
Configura setups específicos para uma rotina |
📋 Exemplos Reais
1. Tabela com Nome Composto (Cilindros_tipos)
// 1. CONFIGURAÇÃO (JSON)
function addTableCilindros_tipos(elemPai, setups) {
var parameters = {
'table-id': 'cilindros_tipos',
'data-table-ondevou': 'cilindros_tipos',
// ...
};
var el = addTable(parameters, elemPai, setups);
return (el);
}
// 2. LISTA (Múltiplos registros) - USANDO PLURAL
function getCilindros_tipos() {
var painel = globais.dados_pagina.visivel.painel;
var slide = globais.dados_pagina.visivel.slide;
// 🔥 Obtém o JSON via getParameters
var parametersTable = addTableCilindros_tipos('getParameters');
var parametersFormSearch = parametersTable['formsearch'];
globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
// Cria a tabela
var elemFormTable = addForm({});
var elemTable = addTableCilindros_tipos(elemFormTable);
// Vincula todos os elementos
document.getElementById(slide).querySelectorAll('FORM, .btn, .painel-slide-taskbar').forEach(element => {
element.setAttribute('id-table', elemTable.id);
});
elemFormTable.style.width = "100%";
}
// 3. FORMULÁRIO (Registro único) - USANDO SINGULAR
function getCilindro(parameters) {
// ... estrutura de 3 colunas, formulário, etc
var setups = parameters['setups'] || {};
var elemTable = addTableCilindros(elemForm, setups);
// ...
}
2. Tabela Simples (Veiculos)
// 1. CONFIGURAÇÃO
function addTableVeiculos(elemPai, setups) {
var parameters = {
'table-id': 'veiculos',
'data-table-ondevou': 'veiculos',
// ...
};
return addTable(parameters, elemPai, setups);
}
// 2. LISTA - USANDO PLURAL
function getVeiculos() {
var parametersTable = addTableVeiculos('getParameters');
var parametersFormSearch = parametersTable['formsearch'];
globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
var setups = {
'search': 'nao',
'html': 'nao',
'controls': ['edit', 'qrcode']
};
var elemTable = addTableVeiculos(elemFormTable, setups);
// ...
}
// 3. FORMULÁRIO - USANDO SINGULAR
function getVeiculo(parameters) {
// ... estrutura de 3 colunas
var setups = parameters['setups'] || {};
var elemTable = addTableVeiculos(elemForm, setups);
// ...
}
📱 data-view - Modos de Exibição
O parâmetro data-view define o modo de exibição da tabela. Cada modo tem comportamentos e estruturas diferentes.
📋 Tipos de data-view
| Valor | Descrição | Uso | Exemplo |
|---|---|---|---|
'table' |
Modo lista/tabela padrão | Listar múltiplos registros | getCilindros() |
'form' |
Modo formulário | Editar/Incluir um registro | getCilindro() |
'page' |
Modo página com cards | Visualização em cards | getViewPage() |
'dashboard' |
Modo dashboard | Resumos e métricas | getViewDashboard() |
📊 Comparação de Modos
| Configuração | 'table' |
'form' |
'page' |
'dashboard' |
|---|---|---|---|---|
| Taskbar | ✅ Visível | ❌ Oculta | ❌ Oculta | ❌ Oculta |
| Busca | ✅ Sim | ✅ Sim (se search='sim') | ❌ Não | ❌ Não |
| Controles | ✅ Todos | ✅ Apenas 'save' | ❌ Nenhum | ❌ Nenhum |
| Botão Salvar | ❌ Não | ✅ Sim | ❌ Não | ❌ Não |
| Cards | ❌ Não | ❌ Não | ✅ Sim | ❌ Não |
| Gráficos | ❌ Não | ❌ Não | ❌ Não | ✅ Sim |
| Resumo | ❌ Não | ❌ Não | ❌ Não | ✅ Sim |
| Estrutura | Tabela | Formulário | Cards | Dashboard |
📋 Exemplo: data-view='form'
// Rotina de INCLUSÃO
function ondevou_25(parameters) {
var setups = {};
setups['data-view'] = 'form'; // ← Modo formulário
setups['controls'] = ['copy', 'save', 'qrcode'];
// ...
getCilindro(parameters);
}
// Rotina de EDIÇÃO
function ondevou_26(parameters) {
var setups = {};
setups['data-view'] = 'form'; // ← Modo formulário
setups['controls'] = ['save', 'qrcode'];
setups['inputs'] = {
'Id': { 'required': 'required' },
'Tipo': { 'readonly': 'readonly' }
};
// ...
getCilindro(parameters);
}
📌 Fonte: ondevou-app-0006.js
🏗️ Estrutura Básica
Uma tabela é definida por uma função que retorna a configuração:
function addTableCilindros(elemPai, setups) {
var parameters = {
'table-id': 'cilindros',
'data-table-ondevou': 'cilindros',
'controls': ['add', 'edit', 'save', 'delete', 'remove'],
'headers': { ... },
'columns': { ... },
'formsearch': { ... }
};
var el = addTable(parameters, elemPai, setups);
return el;
}
📌 Exemplo baseado na tabela principal cilindros
📚 Veja a documentação completa: ondevou-db-cilindros.html
⚙️ Parâmetros da addTable()
📋 Parâmetros Principais
| Parâmetro | Obrigatório | Descrição | Exemplo |
|---|---|---|---|
table-id | ✅ Sim | ID único da tabela | 'minha_tabela' |
data-table-ondevou | ✅ Sim | Nome da tabela no banco | 'minha_tabela' |
controls | ❌ Não | Botões disponíveis | ['add', 'edit', 'save'] |
readonly | ❌ Não | Tabela só leitura | 'sim' / 'nao' |
data-view | ❌ Não | Tipo de visualização | 'table' / 'form' / 'page' / 'dashboard' |
data-table-auditor | ❌ Não | Tabela de auditoria | 'auditor_minha_tabela' |
data-table-erplinux | ❌ Não | Tabela no ErpLinux | 'scsccli' |
📋 Headers - Cabeçalho
Definição das colunas da tabela.
Exemplo Real da Tabela apps
{
"Id": {
"width": "10%"
},
"Ordem": {
"width": "10%"
},
"Ativo": {
"width": "10%"
},
"Nome": {
"width": "30%"
},
"Descrição": {
"width": "30%"
},
"Icone": {
"width": "20%"
}
}
📋 Propriedades do Header
| Propriedade | Descrição | Valores |
|---|---|---|
width | Largura da coluna | '70px' / '10%' |
align | Alinhamento | 'left' / 'right' / 'center' |
type | Tipo especial | 'hidden' / 'textarea' |
sum | Totalizar coluna | 'sum' / 'count' / 'avg' |
class | Classe CSS | 'qrcode' |
📝 Columns - Definição de Campos
A seção columns define cada campo da tabela. Cada coluna pode ter diferentes tipos e comportamentos.
1. Campo Simples (text)
O tipo mais comum. Aceita entrada de texto simples.
'Campo': {
'input': {
'required': 'required',
'data-type-ondevou': 'text',
'data-field-ondevou': 'campo',
'data-table-ondevou': 'minha_tabela',
'placeholder': 'Digite o valor...',
'maxlength': '100',
'formsearch': { 'required': '' }
}
}
📋 Propriedades do tipo text
| Propriedade | Descrição | Exemplo |
|---|---|---|
data-type-ondevou | Tipo de dado | 'text' |
data-field-ondevou | Campo no banco | 'nome' |
required | Campo obrigatório | 'required' |
placeholder | Texto de exemplo | 'Digite...' |
maxlength | Máximo de caracteres | '100' |
minlength | Mínimo de caracteres | '3' |
2. Campo Número (number)
Para valores numéricos com formatação automática.
'Valor': {
'input': {
'required': 'required',
'data-type-ondevou': 'number',
'data-field-ondevou': 'valor',
'data-table-ondevou': 'minha_tabela',
'onkeyup': 'setInputFormatNumber(this,`2`)',
'onblur': 'setInputFormatNumberFull(this, 2)',
'onfocus': 'setInputNumberOnFocus(this)'
}
}
📋 Propriedades do tipo number
| Propriedade | Descrição | Exemplo |
|---|---|---|
data-type-ondevou | Tipo de dado | 'number' |
onkeyup | Formata enquanto digita | 'setInputFormatNumber(this,`2`)' |
onblur | Formata ao sair do campo | 'setInputFormatNumberFull(this, 2)' |
onfocus | Prepara para edição | 'setInputNumberOnFocus(this)' |
3. Campo Data (date)
Para datas com seletor de calendário.
'Data': {
'input': {
'data-type-ondevou': 'date',
'data-field-ondevou': 'data_emissao',
'data-table-ondevou': 'minha_tabela',
'type': 'date',
'class': 'datepicker',
'placeholder': 'DD/MM/YYYY'
}
}
📋 Propriedades do tipo date
| Propriedade | Descrição | Exemplo |
|---|---|---|
data-type-ondevou | Tipo de dado | 'date' |
type | Tipo de input HTML | 'date' |
class | Classe para datepicker | 'datepicker' |
format | Formato da data | 'dd/mm/yyyy' |
4. Campo Checkbox
Para valores booleanos (Sim/Não).
'Ativo': {
'input': {
'data-type-ondevou': 'text',
'type': 'checkbox',
'checkbox-options': JSON.stringify({
'Sim': ['S', 'N']
}),
'data-field-ondevou': 'ativo'
}
}
📋 Propriedades do checkbox
| Propriedade | Descrição | Exemplo |
|---|---|---|
type | Tipo de input | 'checkbox' |
checkbox-options | Mapeamento Sim/Não | JSON.stringify({'Sim': ['S', 'N']}) |
checked | Valor padrão | 'checked' |
5. Campo ID (Primary Key)
Chave primária da tabela. Gerada automaticamente.
'Id': {
'input': {
'readonly': 'readonly',
'data-type-ondevou': 'number',
'data-field-ondevou': 'id',
'data-field-alias-ondevou': 'id_campo',
'data-table-ondevou': 'minha_tabela,auditor_minha_tabela'
}
}
📋 Propriedades do ID
| Propriedade | Descrição | Exemplo |
|---|---|---|
readonly | Não editável | 'readonly' |
data-type-ondevou | Tipo de dado | 'number' |
data-field-ondevou | Campo no banco | 'id' |
data-field-alias-ondevou | Alias na VIEW | 'id_campo' |
data-table-ondevou | Tabelas (inclui auditoria) | 'minha_tabela,auditor_minha_tabela' |
6. Campo com Getdata (Relacionamento)
Busca dados de outra tabela (relacionamento).
'Tipo': {
'input': {
'data-type-ondevou': 'number',
'data-id-field-ondevou': 'id_tipo',
'data-field-ondevou': 'nome_tipo',
'data-table-ondevou': 'minha_tabela',
'getdata': JSON.stringify(addInputParametersGetDataTipos())
}
}
📋 Propriedades com getdata
| Propriedade | Descrição | Exemplo |
|---|---|---|
data-id-field-ondevou | Campo ID da relação | 'id_tipo' |
data-field-ondevou | Campo exibido | 'nome_tipo' |
getdata | Configuração da busca | JSON.stringify(addInputParametersGetDataTipos()) |
7. Campo QR Code (canvas)
Geração automática de QR Code.
'qrcode': {
'input': {
'readonly': 'readonly',
'type': 'canvas',
'qrcode-type': 'cl',
'qrcode-text-fields': 'referencia',
'data-type-ondevou': 'text',
'data-field-ondevou': 'qrcode',
'data-table-ondevou': 'qrcode'
}
}
📋 Propriedades do QR Code
| Propriedade | Descrição | Exemplo |
|---|---|---|
type | Tipo de input | 'canvas' |
qrcode-type | Tipo de QR Code | 'cl' (cilindro) |
qrcode-text-fields | Campos para o texto | 'referencia' |
data-field-ondevou | Campo no banco | 'qrcode' |
8. Campo com Eventos
Eventos JavaScript para interação.
'Campo': {
'input': {
'data-type-ondevou': 'text',
'data-field-ondevou': 'campo',
'onclick': 'minhaFuncao(this)',
'onchange': 'outraFuncao(this)',
'onkeyup': 'setInputFormatNumber(this,`2`)',
'onblur': 'setInputFormatNumberFull(this, 2)',
'onfocus': 'setInputNumberOnFocus(this)'
}
}
📋 Eventos Disponíveis
| Evento | Descrição | Uso comum |
|---|---|---|
onclick | Clique | Abrir modal, executar ação |
onchange | Alteração | Atualizar outros campos |
onkeyup | Tecla solta | Formatação em tempo real |
onkeydown | Tecla pressionada | Validar entrada |
onblur | Perda de foco | Finalizar formatação |
onfocus | Ganho de foco | Preparar para edição |
onpaste | Colar | Limpar formatação ao colar |
oninput | Entrada de dados | Validação em tempo real |
ondblclick | Duplo clique | Abrir modal de edição |
📋 Resumo: Todas as Propriedades do Input
| Categoria | Propriedade | Descrição | Exemplo |
|---|---|---|---|
| Básicas | readonly | Somente leitura | 'readonly' |
required | Obrigatório | 'required' | |
data-type-ondevou | Tipo de dado | 'text', 'number', 'date' | |
type | Tipo de input HTML | 'text', 'checkbox', 'canvas' | |
| Dados | data-field-ondevou | Campo no banco | 'nome' |
data-field-alias-ondevou | Alias para exibição | 'nome_view' | |
data-table-ondevou | Tabela OndeVou | 'minha_tabela' | |
data-id-field-ondevou | ID no OndeVou | 'id_campo' | |
| Formatação | placeholder | Texto de exemplo | 'Digite...' |
maxlength | Máximo de caracteres | '100' | |
minlength | Mínimo de caracteres | '3' | |
class | Classe CSS | 'datepicker' | |
| Comportamento | value | Valor padrão | 'valor' |
autofocus | Foco automático | 'autofocus' | |
autocomplete | Auto completar | 'off' | |
multiple | Múltipla seleção | 'multiple' | |
| Integração | getdata | Busca dados relacionados | JSON.stringify({...}) |
putdata | Grava dados | JSON.stringify({...}) | |
launch | Abri documento | JSON.stringify({...}) | |
| Especiais | qrcode-type | Tipo de QR Code | 'cl', 'pr' |
qrcode-text-fields | Campos para o QR | 'referencia' | |
checkbox-options | Opções do checkbox | JSON.stringify({'Sim':['S','N']}) | |
| Eventos | onclick | Clique | 'minhaFuncao(this)' |
onchange | Alteração | 'outraFuncao(this)' | |
onkeyup | Tecla solta | 'setInputFormatNumber(this,`2`)' |
📝 Putdata - Gravação de Dados
Configuração para gravação de dados em tabelas relacionadas.
Putdata - Gravação de Dados
Gravação de Dados
{
"tabela": "bairros",
"unique": "nome",
"fields": {
"nome": "nome_bairro"
}
}
| Propriedade | Descrição | Exemplo |
|---|---|---|
tabela |
Tabela de destino | 'minha_tabela' |
unique |
Campos únicos | 'participante,nome' |
fields |
Mapeamento de campos | {'nome': 'nome_campo'} |
trigger |
Função após gravar | 'setTableFromPutData()' |
inputsExtras |
Campos extras | 'participante,ip' |
🔗 Getdata - Busca de Dados
Configuração para busca de dados relacionados de outras tabelas.
Getdata - Busca de Dados
Busca de Dados
{
"view": "view_apps",
"data": "view_apps",
"text-empty-search": "sim",
"campo-data-id": "id_app",
"campo-data-value-input": "nome_app",
"campo-data-input-select-view": "nome_app",
"query": {
"select": "* from view_apps",
"where": {
"and": {
"texto_digitado": {
"left": "(unaccent(LOWER(nome_app)) ilike `%",
"right": "%`)"
}
}
}
}
}
| Propriedade | Descrição | Exemplo |
|---|---|---|
view |
View para consulta | 'view_minha_tabela' |
campo-data-id |
Campo ID | 'id_minha_tabela' |
campo-data-value-input |
Campos para exibir | 'id,nome' |
text-empty-search |
Buscar vazio | 'sim' / 'nao' |
data-update-full-fields |
Atualizar todos | 'sim' / 'nao' |
reset-form |
Resetar formulário | 'sim' / 'nao' |
📱 GetCollector - Coleta de Dados
Configuração de coleta de dados via QR Code e dispositivos móveis.
GetCollector - Coleta de Dados
Coleta de Dados
{
"qrcode": {
"qrcode-type": [
"cont"
]
},
"table-setups": {
"search": "nao",
"html": "nao",
"controls": [
"info",
"remove"
]
}
}
| Propriedade | Descrição | Exemplo |
|---|---|---|
modal |
Abrir em modal | 'sim' / 'nao' |
qrcode |
Tipos de QR Code permitidos | {'qrcode-type': ['cl', 'pr']} |
table-add |
Tabela de coleta | 'addTableColetar_dados_leituras' |
table-setups |
Configurações da tabela | {'search':'nao','html':'nao'} |
id-origem-getcollector |
ID de origem | 'id_tabela' |
⚙️ Setups - Personalizando a Tabela
A função addTable() aceita um segundo parâmetro setups que permite personalizar o comportamento, visualização e funcionalidades da tabela.
📋 Como os Setups Funcionam
Quando você passa setups para a função, eles substituem as configurações padrão da tabela:
// Configuração padrão da tabela (no parameters)
var parameters = {
'table-id': 'cilindros',
'data-table-ondevou': 'cilindros',
'readonly': 'sim',
'controls': ['info', 'add', 'edit', 'save', 'delete'],
'headers': {
'Id': {'width': '70px'},
'Nome': {'width': '200px'}
}
}
// setups substitui configurações
var setups = {
'readonly': 'nao', // ← Sobrescreve
'controls': ['save', 'qrcode'], // ← Sobrescreve
'headers': ['Id', 'Nome'], // ← Filtra colunas
'inputs': {
'Nome': {'readonly': ''} // ← Modifica input específico
}
}
// Resultado: tabela editável, apenas botões save/qrcode, apenas colunas Id/Nome
var tabela = addTableCilindros(elemPai, setups)
💡 Dica: setups é um objeto opcional.
Se não for passado, a tabela usa todas as configurações padrão do parameters.
📋 Lista Completa de Setups
| Setup | Tipo | Descrição | Valores | Padrão |
|---|---|---|---|---|
top-controls |
string |
Mostrar controles no topo | 'sim' / 'nao' |
'sim' |
responsive |
string |
Tabela responsiva | 'sim' / 'nao' |
'sim' |
search |
string |
Mostrar busca na tabela | 'sim' / 'nao' |
'sim' |
launch |
string |
Habilitar launch (abrir documentos) | 'sim' / 'nao' |
'sim' |
html |
string |
Usar HTML do parameters | 'sim' / 'nao' |
'nao' |
before |
string |
Mostrar conteúdo before | 'sim' / 'nao' |
'sim' |
after |
string |
Mostrar conteúdo after | 'sim' / 'nao' |
'sim' |
data-view |
string |
Modo de exibição da tabela | 'table' / 'form' / 'page' / 'dashboard' |
'table' |
controls |
array |
Botões disponíveis na tabela | ['add','edit','save',...] |
['add','edit','save','delete','remove'] |
headers |
array |
Colunas visíveis (ordem e filtro) | ['Id','Nome',...] |
Todas do JSON |
headers-search |
array |
Campos de busca visíveis | ['Id','Nome',...] |
Todos |
headers-remove |
array |
Colunas removidas da exibição | ['Participante','Ativo'] |
[] |
controls-remove |
array |
Botões removidos da tabela | ['info','cloud_sync','edit','clone','delete','marker'] |
[] |
controls-title |
object |
Personalizar títulos dos botões | {'save':'Salvar','delete':'Excluir'} |
{} |
readonly |
string |
Tabela apenas leitura | 'sim' / 'nao' |
'nao' |
table-class |
string |
Classe CSS da tabela | 'highlight' / 'striped' / 'bordered' |
'responsive-table' |
table-sum-top |
string |
Exibir totais no topo | 'sim' / 'nao' |
'sim' |
table-rows-limit |
number |
Limite de linhas na tabela | 100, 500, 1000 |
Ilimitado |
table-launch-filter |
string |
Filtrar launch | 'sim' / 'nao' |
'sim' |
data-table-delete |
string |
Permitir exclusão de registros | 'sim' / 'nao' |
'sim' |
data-table-sync |
string |
Permitir sincronização | 'sim' / 'nao' |
'sim' |
data-table-getdata |
string |
Validar dados existentes | 'sim' / 'nao' |
'sim' |
data-table-update |
string |
Permitir atualização | 'sim' / 'nao' |
'sim' |
putdata |
object |
Configuração de gravação | {'trigger':'funcao()','inputsExtras':'participante,ip'} |
{} |
getpage |
object |
Configuração de página | {'page':'cilindro','campo':'id'} |
{} |
pdf |
object |
Configuração de PDF | {'format':'a3','orientation':'landscape'} |
{} |
graficos |
object |
Configuração de gráficos | {'1':{'data':{'x':'data','y':'valor'}}} |
{} |
dashboard |
object |
Configuração de dashboard | {'enabled':true,'theme':'modern'} |
{} |
formsearch |
object |
Filtros da busca | {'input':{'campo':{'type':'text'}}} |
{} |
inputs |
object |
Substituir configurações de inputs | {'Nome':{'readonly':'readonly'}} |
{} |
startmenu |
object |
Menu inicial | {'role':'view-table'} |
{} |
role |
string |
Visualização inicial | 'view-table' / 'view-plotly' / 'view-summary' / 'view-page' / 'view-dashboard' |
'view-table' |
routines |
object |
Rotinas associadas | {'add':'25','edit':'26','summary':'getResumo'} |
{} |
📥 getParameters - Obtendo o JSON da Tabela
A função addTable() pode ser chamada com 'getParameters'
como primeiro argumento para retornar o JSON puro da configuração.
📋 Como Funciona
Quando você passa 'getParameters' como elemPai:
// Obtém o JSON da tabela
var jsonConfig = addTableCilindros('getParameters');
// jsonConfig contém:
// {
// 'table-id': 'cilindros',
// 'data-table-ondevou': 'cilindros',
// 'controls': ['info', 'add', 'edit', 'save', ...],
// 'headers': { 'Id': {'width':'70px'}, ... },
// 'columns': { 'Id': { 'input': {...} }, ... },
// 'formsearch': { ... },
// ...
// }
// Útil para:
// - Debug
// - Documentação
// - Integração com outras ferramentas
// - Reutilização de configurações
✅ Observação: O JSON retornado contém TODAS as configurações da tabela, incluindo colunas, headers, controles, filtros, etc.
📋 Exemplo: Usando getParameters em uma Rotina
function getCilindros() {{
var painel = globais.dados_pagina.visivel.painel;
var slide = globais.dados_pagina.visivel.slide;
// 🔥 Obtém o JSON da tabela
var parametersTable = addTableCilindros('getParameters');
// Extrai os filtros de busca
var parametersFormSearch = parametersTable['formsearch'];
globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
// Cria a tabela com setups específicos
var setups = {{ 'search': 'nao' }};
var elemTable = addTableCilindros(elemFormTable, setups);
// ... resto da rotina
}}
📌 Fonte: ondevou-app-0006.js (getCilindros)
🏗️ Fluxo de Renderização
Entenda como a tabela é construída no DOM passo a passo.
📋 Estrutura DOM Gerada
addTable(parameters, elemPai, setups)
↓
1. Processa setups (substitui configurações padrão)
↓
2. Cria a estrutura DOM:
div[idTable-pai]
├── div[idTable-top-controls] // Barra de ferramentas
├── div[idTable-before] // Conteúdo antes
├── div[idTable-search] // Campos de busca
├── div[idTable-table] // Tabela principal
│ └── fieldset
│ └── table[idTable]
│ ├── thead
│ │ └── tr (cabeçalho)
│ │ ├── th (controles)
│ │ └── th (colunas)
│ └── tbody
│ └── tr (linhas)
├── div[idTable-auxiliar] // Tabelas relacionadas
├── div[idTable-auxiliar2] // Tabelas relacionadas
├── div[idTable-auxiliar3] // Tabelas relacionadas
├── div[idTable-btns] // Botões adicionais
├── div[idTable-after] // Conteúdo depois
├── div[idTable-plotly] // Gráficos
├── div[idTable-summary] // Resumo
├── div[idTable-dashboard] // Dashboard
├── div[idTable-pdf] // PDF
└── div[idTable-page] // Página (cards)
↓
3. Inicializa taskbar, controles, etc
↓
4. Retorna o elemento table
📋 Exemplo: Tabela com Tabela Auxiliar
No caso do Romaneio, uma tabela auxiliar (romaneios_destinos) é criada:
function getRomaneio(parameters) {{
// ... cria a tabela principal ...
var elemTable = document.getElementById(addTableRomaneios(elemForm, setups).id);
// 🔥 Cria a tabela auxiliar
var elemTableAuxiliar = document.getElementById(elemTable.id + '-auxiliar');
var setupsUnidades = {{
'search': 'nao',
'html': 'nao',
'responsive': 'nao',
'launch': 'nao',
'data-table-sync': 'nao',
'data-table-delete': 'nao',
'table-launch-filter': 'nao',
'headers': ['Id', 'Romaneio', 'Unidade', 'Motivo', 'Lat destino', 'Lng destino', 'Distância (km)'],
'controls-remove': ['info', 'cloud_sync', 'edit', 'clone', 'delete', 'marker']
}};
var elemTableItens = document.getElementById(
addTableRomaneios_destinos(elemTableAuxiliar, setupsUnidades).id
);
// Carrega os dados da tabela auxiliar
if (parameters['romaneio-id'] != '') {{
var dados_retorno = getData({{
'query': `SELECT * FROM view_romaneios_destinos WHERE id_romaneio='${{parameters['romaneio-id']}}'`,
'view': 'view_romaneios_destinos'
}});
setTableControlsSetValue(elemTableItens.id, dados_retorno);
}}
}}
📌 Fonte: ondevou-app-0017.js (getRomaneio)
📋 Exemplos Reais do Código Fonte
Exemplos extraídos diretamente dos arquivos JavaScript do sistema, mostrando como as tabelas são configuradas em diferentes cenários.
📋 Padrão de Funções Observado
| Função | Nome | Uso | Chama |
|---|---|---|---|
| Configuração | addTable{tabela}() |
Define JSON | - |
| Lista | get{tabela}() (plural) |
Exibe tabela | addTable{tabela}('getParameters') + addTable{tabela}(elemFormTable, setups) |
| Formulário | get{tabela_singular}() (singular) |
Exibe formulário | addTable{tabela}(elemForm, setups) |
| Rotina | ondevou_{numero}() |
Configura setups | get{tabela_singular}(parameters) |
🔹 Rotina 25 - Incluir Cilindro
Formulário de inclusão de cilindro
📌 Função de Lista (plural): getCilindros() |
📌 Função de Formulário (singular): getCilindro()
function ondevou_25(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"search": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"copy",
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Validade",
"Descrição",
"Referência",
"Situação",
"Localização",
"Endereço",
"Tipo",
"Aplicação",
"Capacidade",
"Unidade",
"Fabricante",
"Propriedade",
"Proprietário"
],
"inputs": {
"Id": {
"launch": ""
},
"Descrição": {
"texto_label": "Descrição do cilindro"
}
}
};
parameters['setups'] = setups;
getCilindro(parameters);
}
🔹 Rotina 26 - Editar Cilindro
Formulário de edição de cilindro
📌 Função de Lista (plural): getCilindros() |
📌 Função de Formulário (singular): getCilindro()
function ondevou_26(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"search": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Validade",
"Descrição",
"Referência",
"Situação",
"Localização",
"Endereço",
"Tipo",
"Aplicação",
"Capacidade",
"Unidade",
"Fabricante",
"Propriedade",
"Proprietário"
],
"inputs": {
"Id": {
"launch": "",
"required": "required"
},
"Validade": {
"readonly": "readonly"
},
"Tipo": {
"readonly": "readonly"
},
"Aplicação": {
"readonly": "readonly"
},
"Capacidade": {
"readonly": "readonly"
},
"Unidade": {
"readonly": "readonly"
},
"Descrição": {
"texto_label": "Descrição do cilindro"
}
}
};
parameters['setups'] = setups;
getCilindro(parameters);
}
🔹 Rotina 271 - Editar Cilindro (outro contexto)
Edição com menos campos bloqueados
📌 Função de Lista (plural): getCilindros() |
📌 Função de Formulário (singular): getCilindro()
function ondevou_271(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"search": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Validade",
"Descrição",
"Referência",
"Situação",
"Localização",
"Endereço",
"Tipo",
"Aplicação",
"Capacidade",
"Unidade",
"Fabricante",
"Propriedade",
"Proprietário"
],
"inputs": {
"Id": {
"launch": "",
"required": "required"
},
"Validade": {
"readonly": "readonly"
},
"Descrição": {
"texto_label": "Descrição do cilindro"
}
}
};
parameters['setups'] = setups;
getCilindro(parameters);
}
🔹 Rotina 32 - Incluir Romaneio
Formulário de inclusão de romaneio
📌 Função de Lista (plural): getRomaneios() |
📌 Função de Formulário (singular): getRomaneio()
function ondevou_32(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"search": "nao",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"copy",
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Descrição",
"Observação",
"Permitir cilindros vazios no carregamento",
"Permitir cilindros vencidos no carregamento",
"Situação",
"Rota",
"Vendedor",
"Romaneio erplinux",
"Motorista",
"Veículo",
"Monitoramento da viagem está ativa",
"Início da viagem",
"Fim da viagem",
"Data do acerto",
"KM inicial",
"KM final",
"Latitude inicial",
"Longitude inicial",
"Latitude final",
"Longitude final"
],
"inputs": {
"Descrição": {
"texto_label": "Descrição do romaneio",
"launch": ""
},
"Permitir cilindros vazios no carregamento": {
"readonly": ""
},
"Permitir cilindros vencidos no carregamento": {
"readonly": ""
},
"Rota": {
"launch": ""
},
"Motorista": {
"launch": ""
},
"Veículo": {
"launch": ""
}
}
};
parameters['setups'] = setups;
getRomaneio(parameters);
}
🔹 Rotina 33 - Editar Romaneio
Formulário de edição de romaneio
📌 Função de Lista (plural): getRomaneios() |
📌 Função de Formulário (singular): getRomaneio()
function ondevou_33(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Descrição",
"Observação",
"Permitir cilindros vazios no carregamento",
"Permitir cilindros vencidos no carregamento",
"Situação",
"Rota",
"Vendedor",
"Romaneio erplinux",
"Motorista",
"Veículo",
"Monitoramento da viagem está ativa",
"Início da viagem",
"Fim da viagem",
"Data do acerto",
"KM inicial",
"KM final",
"Latitude inicial",
"Longitude inicial",
"Latitude final",
"Longitude final"
],
"inputs": {
"Id": {
"required": "required"
},
"Descrição": {
"texto_label": "Descrição do romaneio",
"launch": ""
},
"Permitir cilindros vazios no carregamento": {
"readonly": ""
},
"Permitir cilindros vencidos no carregamento": {
"readonly": ""
},
"Situação": {
"readonly": "readonly"
},
"Rota": {
"launch": ""
},
"Motorista": {
"launch": ""
},
"Veículo": {
"launch": ""
}
}
};
parameters['setups'] = setups;
getRomaneio(parameters);
}
🔹 Rotina 40 - Alterar Situação Romaneio
Alteração apenas da situação
📌 Função de Lista (plural): getRomaneios() |
📌 Função de Formulário (singular): getRomaneio()
function ondevou_40(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Descrição",
"Observação",
"Permitir cilindros vazios no carregamento",
"Permitir cilindros vencidos no carregamento",
"Situação",
"Rota",
"Vendedor",
"Romaneio erplinux",
"Motorista",
"Veículo"
],
"inputs": {
"Id": {
"required": "required"
},
"Descrição": {
"texto_label": "Descrição do romaneio",
"readonly": "readonly",
"launch": ""
},
"Rota": {
"readonly": "readonly",
"launch": ""
},
"Motorista": {
"readonly": "readonly",
"launch": ""
},
"Veículo": {
"readonly": "readonly",
"launch": ""
}
}
};
parameters['setups'] = setups;
getRomaneio(parameters);
}
🔹 Rotina 626 - Iniciar Viagem
Início de viagem com campos específicos
📌 Função de Lista (plural): getRomaneios() |
📌 Função de Formulário (singular): getRomaneio()
function ondevou_626(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Descrição",
"Situação",
"Rota",
"Vendedor",
"Motorista",
"Veículo",
"Monitoramento da viagem está ativa",
"Início da viagem",
"Fim da viagem",
"Data do acerto",
"KM inicial",
"KM final"
],
"inputs": {
"Id": {
"required": "required"
},
"Descrição": {
"texto_label": "Descrição do romaneio",
"readonly": "readonly",
"launch": ""
},
"Situação": {
"readonly": "readonly",
"launch": ""
},
"Rota": {
"readonly": "readonly",
"launch": ""
},
"Motorista": {
"readonly": "readonly",
"launch": ""
},
"Veículo": {
"readonly": "readonly",
"launch": ""
},
"Monitoramento da viagem está ativa": {
"readonly": "readonly",
"launch": ""
},
"KM inicial": {
"required": "required",
"launch": ""
}
}
};
parameters['setups'] = setups;
getRomaneio(parameters);
}
🔹 Rotina 627 - Parar Viagem
Finalização de viagem
📌 Função de Lista (plural): getRomaneios() |
📌 Função de Formulário (singular): getRomaneio()
function ondevou_627(parameters) {
if (parameters == undefined) {
parameters = {};
}
var setups = {
"data-table-update": "sim",
"html": "nao",
"readonly": "nao",
"data-view": "form",
"controls": [
"save",
"qrcode"
],
"headers": [
"Id",
"qrcode",
"Participante",
"Descrição",
"Situação",
"Rota",
"Vendedor",
"Motorista",
"Veículo",
"Monitoramento da viagem está ativa",
"Início da viagem",
"Fim da viagem",
"Data do acerto",
"KM inicial",
"KM final"
],
"inputs": {
"Id": {
"required": "required"
},
"Descrição": {
"texto_label": "Descrição do romaneio",
"readonly": "readonly",
"launch": ""
},
"Monitoramento da viagem está ativa": {
"readonly": "readonly",
"launch": ""
},
"Início da viagem": {
"readonly": "readonly",
"launch": ""
},
"Situação": {
"readonly": "readonly",
"launch": ""
},
"Rota": {
"readonly": "readonly",
"launch": ""
},
"Motorista": {
"readonly": "readonly",
"launch": ""
},
"Veículo": {
"readonly": "readonly",
"launch": ""
}
}
};
parameters['setups'] = setups;
getRomaneio(parameters);
}
📊 Matriz Comparativa de Rotinas
Comparação das configurações entre as diferentes rotinas de Cilindros e Romaneios.
| Configuração | Cilindros (25) Incluir |
Cilindros (26) Editar |
Romaneios (32) Incluir |
Romaneios (33) Editar |
Romaneios (40) Alterar Situação |
Romaneios (626) Iniciar Viagem |
|---|---|---|---|---|---|---|
data-view |
'form' |
'form' |
'form' |
'form' |
'form' |
'form' |
readonly |
'nao' |
'nao' |
'nao' |
'nao' |
'nao' |
'nao' |
controls |
['copy','save','qrcode'] |
['save','qrcode'] |
['copy','save','qrcode'] |
['save','qrcode'] |
['save','qrcode'] |
['save','qrcode'] |
search |
'sim' |
'sim' |
'nao' |
— |
— |
— |
Id.required |
❌ |
✅ |
❌ |
✅ |
✅ |
✅ |
Situação.readonly |
❌ |
✅ |
❌ |
✅ |
✅ |
✅ |
Descrição.readonly |
❌ |
❌ |
❌ |
❌ |
✅ |
✅ |
Tipo.readonly |
❌ |
✅ |
— |
— |
— |
— |
Aplicação.readonly |
❌ |
✅ |
— |
— |
— |
— |
Capacidade.readonly |
❌ |
✅ |
— |
— |
— |
— |
Unidade.readonly |
❌ |
✅ |
— |
— |
— |
— |
Rota.readonly |
— |
— |
❌ |
❌ |
✅ |
✅ |
Motorista.readonly |
— |
— |
❌ |
❌ |
✅ |
✅ |
Veículo.readonly |
— |
— |
❌ |
❌ |
✅ |
✅ |
KM inicial |
— |
— |
❌ |
❌ |
— |
✅ required |
Monitoramento.readonly |
— |
— |
❌ |
❌ |
— |
✅ |
Início viagem.readonly |
— |
— |
❌ |
❌ |
— |
❌ |
📌 Legenda: ✅ = Habilitado | ❌ = Desabilitado | — = Não se aplica
📊 Taskbar - Barra de Ferramentas
A Taskbar é a barra de ferramentas que aparece no topo da tabela, fornecendo acesso rápido a todas as funcionalidades.
setTableFormSearchPreload()
showId()
setTableFromGetViewPagePreload()
getViewTable()
getViewPage()
getViewSummary()
getViewPlotly()
getViewDashboard()
getViewMapa()
getViewEmail()
putPrintFromSlide()
putPdfFromSlide()
putExcelFromSlide()
getViewLeftRight()
getViewLeftRight()
🎮 Controles Disponíveis
Ações que o usuário pode realizar na tabela.
Adicionar nova linha
Copiar linha
Editar linha
Salvar dados
Remover conteúdo
Excluir lançamento
Gerar QR Code
Ver mapa
Informações do registro
Linha do tempo
Sincronizar
Fórmulas do produto
Editar nota
Buscar na tabela
📱 Modos de Uso
A tabela pode ser utilizada em dois modos principais.
📋 Modo Lista (Tabela)
Utilizado para exibir e gerenciar múltiplos registros, com taskbar, busca, filtros, navegação e ações.
function getCilindros() {
var painel = globais.dados_pagina.visivel.painel;
var slide = globais.dados_pagina.visivel.slide;
var parametersTable =
addTableCilindros('getParameters');
var parametersFormSearch =
parametersTable['formsearch'];
globais.dados_pagina.paineis[painel][slide]['formsearch'] =
parametersFormSearch;
var setups = {
'search': 'nao',
'html': 'nao',
'controls': ['edit', 'qrcode']
};
var elemFormTable = addForm({});
var elemTable =
addTableCilindros(
elemFormTable,
setups
);
document
.getElementById(slide)
.querySelectorAll(
'FORM, .btn, .painel-slide-taskbar'
)
.forEach(element => {
element.setAttribute(
'id-table',
elemTable.id
);
});
elemFormTable.style.width = "100%";
}
📝 Modo Formulário (Edição)
Utilizado para inclusão, consulta e edição de um único registro.
function getCilindrosForm(parameters) {
return new Promise((resolve, reject) => {
if (parameters == undefined) {
parameters = {};
}
if (parameters['cilindros-id'] == undefined) {
parameters['cilindros-id'] = '';
}
var setups = parameters['setups'] || {};
var elemSlide = document.getElementById(
globais.dados_pagina.visivel.slide
);
elemSlide.innerHTML = `
`;
var elemContent = document.getElementById(
elemSlide.id + '-card-center'
);
var elemForm = addForm(
{
'name': 'cilindros',
'class': 'scrollspy'
},
elemContent
);
var elemTable = document.getElementById(
addTableCilindros(
elemForm,
setups
).id
);
setTableControlsInit(elemTable.id);
setTableControlsInitForm(elemTable.id);
if (parameters['cilindros-id'] != '') {
var dados_retorno = getData({
'query': `SELECT *
FROM view_cilindros
WHERE id_cilindros =
'${parameters['cilindros-id']}'`
});
setTableControlsSetValue(
elemTable.id,
dados_retorno
);
}
resolve();
});
}
🚀 Funções de Inicialização
Funções responsáveis por inicializar e transformar a tabela.
setTableControlsInit()
Inicializa a tabela para edição, limpando campos e ativando a primeira linha.
setTableControlsInit('cilindros');
Fluxo: Reset → Localiza 'edit' → Ativa edição
setTableControlsInitForm()
Transforma a tabela em um formulário, reorganizando labels e inputs.
setTableControlsInitForm('cilindros');
Fluxo: Reorganiza TD → Adiciona botão Salvar → Configura rodapé
setTableControlsReset()
Remove todas as linhas e limpa os campos da tabela.
setTableControlsReset('cilindros');
Fluxo: Remove linhas → Reseta contadores → Limpa campos
setTableControlsSetValue()
Preenche a tabela com dados recebidos do banco.
setTableControlsSetValue('cilindros', dados_retorno);
Fluxo: Limpa dados → Cria linhas → Preenche campos → Atualiza taskbar
💡 Exemplos Práticos
📋 Fluxo Completo Padrão
// 1. Buscar dados com getData
var dados_retorno = getData({
'query': `SELECT * FROM view_cilindros WHERE participante = ${globais.dados_fixo.participante}`,
'view': 'view_cilindros'
});
// 2. Definir painel e slide
var painel = globais.dados_pagina.visivel.painel;
var slide = globais.dados_pagina.visivel.slide;
// 3. Encontrar a tabela no DOM
var idTable = getIdTableFromSlide({ 'table-id': 'cilindros' });
// 4. Resetar a tabela
setTableControlsReset(idTable);
// 5. Popular a tabela
setTableControlsSetValue(idTable, dados_retorno);
📝 Exemplo: Tabela Simples
function addTableCilindros(elemPai, setups) {
var parameters = {
'table-id': 'cilindros',
'data-table-ondevou': 'cilindros',
'controls': ['add', 'edit', 'save', 'delete', 'remove'],
'headers': {
'Id': { 'width': '70px' },
'Nome': { 'width': '100%' }
},
'columns': {
'Id': {
'input': {
'readonly': 'readonly',
'data-type-ondevou': 'number',
'data-field-ondevou': 'id',
'data-table-ondevou': 'cilindros'
}
},
'Nome': {
'input': {
'required': 'required',
'data-type-ondevou': 'text',
'data-field-ondevou': 'nome',
'data-table-ondevou': 'cilindros'
}
}
}
};
parameters['formsearch'] = {
'data-table-ondevou': 'view_cilindros',
'data-where-order': 'order by id desc'
};
addParametersFormSearch(parameters);
var el = addTable(parameters, elemPai, setups);
return el;
}
📱 Exemplo: Com QR Code
function addTableCilindrosComQRCode(elemPai, setups) {
var parameters = {
'table-id': 'cilindros',
'data-table-ondevou': 'cilindros',
'controls': ['add', 'edit', 'save', 'qrcode'],
'headers': {
'Id': { 'width': '70px' },
'qrcode': { 'width': '100px', 'class': 'qrcode' },
'Nome': { 'width': '200px' }
},
'columns': {
'Id': {
'input': {
'readonly': 'readonly',
'data-type-ondevou': 'number',
'data-field-ondevou': 'id',
'data-table-ondevou': 'cilindros'
}
},
'qrcode': {
'input': {
'readonly': 'readonly',
'type': 'canvas',
'qrcode-type': 'cl',
'qrcode-text-fields': 'nome',
'data-type-ondevou': 'text',
'data-field-ondevou': 'qrcode',
'data-table-ondevou': 'qrcode'
}
},
'Nome': {
'input': {
'required': 'required',
'data-type-ondevou': 'text',
'data-field-ondevou': 'nome',
'data-table-ondevou': 'cilindros'
}
}
}
};
parameters['formsearch'] = {
'data-table-ondevou': 'view_cilindros',
'data-where-order': 'order by id desc'
};
addParametersFormSearch(parameters);
var el = addTable(parameters, elemPai, setups);
return el;
}
🔗 Exemplo: Com Getdata e Putdata
function addTableCilindrosComRelacionamento(elemPai, setups) {
var parameters = {
'table-id': 'cilindros',
'data-table-ondevou': 'cilindros',
'controls': ['add', 'edit', 'save'],
'headers': {
'Id': { 'width': '70px' },
'Tipo': { 'width': '200px' },
'Valor': { 'width': '10%', 'align': 'right', 'sum': 'sum' }
},
'columns': {
'Id': {
'input': {
'readonly': 'readonly',
'data-type-ondevou': 'number',
'data-field-ondevou': 'id',
'data-table-ondevou': 'cilindros'
}
},
'Tipo': {
'input': {
'required': 'required',
'data-type-ondevou': 'number',
'data-id-field-ondevou': 'id_tipo',
'data-field-ondevou': 'nome_tipo',
'data-table-ondevou': 'cilindros_tipos',
'getdata': JSON.stringify(addInputParametersGetDataCilindrosTipos()),
'putdata': JSON.stringify({
'tabela': 'cilindros_tipos',
'unique': 'participante,nome',
'fields': {
'participante': 'participante',
'nome': 'nome_tipo'
}
})
}
},
'Valor': {
'input': {
'required': 'required',
'data-type-ondevou': 'number',
'data-field-ondevou': 'valor',
'data-table-ondevou': 'cilindros',
'onkeyup': 'setInputFormatNumber(this,`2`)',
'onblur': 'setInputFormatNumberFull(this, 2)',
'onfocus': 'setInputNumberOnFocus(this)'
}
}
}
};
parameters['formsearch'] = {
'data-table-ondevou': 'view_cilindros',
'data-where-fixed': 'participante=1',
'data-where-order': 'order by id desc'
};
addParametersFormSearch(parameters);
var el = addTable(parameters, elemPai, setups);
return el;
}