{"id":"d0920db9-fdb7-451a-967f-f93035c9be57","shortId":"qNfuWN","kind":"skill","title":"sankhya-dashboard-html-jsp-custom-best-pratices","tagline":"This skill should be used when the user asks for patterns, best practices, creation, or fixing of Sankhya dashboards using HTML, JSP, Java, and SQL.","description":"# sankhya-dashboard-html-jsp-custom-best-pratices\n\n## Purpose\n\nTo provide a consolidated guide of patterns and best practices for creating and maintaining dashboards, SQL queries, BI parameterization, and UI/UX within the Sankhya ecosystem (JSP/HTML/Java).\n\n## When to Use This Skill\n\nThis skill should be used when:\n- The user asks about \"boas praticas do sankhya\" or \"Sankhya best practices\".\n- The user mentions \"dashboard sankhya\" or is working on a Sankhya BI dashboard.\n- The user asks for anything related to the word \"Sankhya\".\n- The user wants to create or modify code files for Sankhya dashboards.\n\n## Core Capabilities\n\n1. **Code Generation & Review**: Apply JSP/JSTL patterns and server-side organization to reduce compilation errors and rendering failures.\n2. **Visual Consistency**: Standardize visual identity in BI components using predefined CSS tokens.\n3. **Database Exploration**: Structure data exploration queries for performance and correct mapping of Sankhya entities.\n4. **BI Construction Guide**: Use the HTML5 component flow in BI to ensure correct rendering, reactivity, and navigation.\n\n## Patterns\n\n### Melhores Práticas de Código\nAplicar padrões de JSP/JSTL e organização server-side para reduzir erros de compilação, falhas de renderização e regressões em dashboards/telas.\n\n**Diretrizes de implementação**\n- Declarar diretivas JSP e taglibs obrigatórias no topo do arquivo.\n- Forçar `isELIgnored=\"false\"` para habilitar `${...}` em tempo de renderização.\n- Preferir `core_rt` para JSTL core no ecossistema Sankhya.\n- Evitar scriptlets Java em JSP; usar JSTL (`c:if`, `c:choose`, `c:forEach`).\n- Modularizar lógica de negócio (camadas/serviços), evitando acoplamento em arquivo único.\n- Evitar hardcode de credenciais, URLs sensíveis e tokens.\n- Modelar estado global da UI (dados, filtros, ordenação, aba ativa) e resetar estado antes de novo carregamento.\n- Persistir preferências de visualização no `localStorage` (ordem de colunas e ordenação).\n- Implementar carregamento sob demanda para abas/modais pesados (lazy-load) para reduzir tempo inicial.\n- **Blindagem de Parâmetros**: Sempre definir um valor padrão (fallback) para parâmetros de URL via `c:set` para evitar Erro 500 no servidor Java do Sankhya.\n- **Separação de Camadas (JSP vs JS)**: Evitar injetar tags JSP diretamente dentro de blocos `<script>`. Utilizar containers HTML ocultos para passar dados ao JavaScript, mantendo a saúde do editor de código (IDE Linting).\n\n> Os nomes de tabelas e campos abaixo são representativos e podem variar conforme a implementação da instância.\n\n```jsp\n<%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\" pageEncoding=\"UTF-8\" isELIgnored=\"false\" %>\n<%@ taglib prefix=\"snk\" uri=\"/WEB-INF/tld/sankhyaUtil.tld\" %>\n<%@ taglib uri=\"http://java.sun.com/jstl/core_rt\" prefix=\"c\" %>\n<%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\n<snk:load />\n```\n\n**Carregamento de assets em dashboard/gadget**\n- Referenciar arquivos com `contextPath` + `BASE_FOLDER`.\n- Em níveis secundários (`openLevel`), manter caminho absoluto para evitar quebra de resolução.\n\n```html\n<script src=\"${pageContext.request.contextPath}/${BASE_FOLDER}/js/app.js\"></script>\n<link rel=\"stylesheet\" href=\"${pageContext.request.contextPath}/${BASE_FOLDER}/css/style.css\" />\n```\n\n**Consumo seguro de `snk:query`**\n- Iterar em `query.rows` (não no objeto raiz).\n- Testar vazio com `empty query.rows`.\n\n```jsp\n<snk:query var=\"qDados\">\n    SELECT CAB.NUNOTA, CAB.CODPARC\n      FROM TGFCAB CAB\n</snk:query>\n\n<c:choose>\n    <c:when test=\"${empty qDados.rows}\">\n        <span>Sem resultados</span>\n    </c:when>\n    <c:otherwise>\n        <c:forEach var=\"linha\" items=\"${qDados.rows}\">\n            ${linha.NUNOTA}\n        </c:forEach>\n    </c:otherwise>\n</c:choose>\n```\n\n**Sanitização de parâmetros antes da SQL**\n- Normalizar valor de entrada.\n- Remover aspas (`\"` e `&quot;`) antes de injetar em query.\n- Definir fallback seguro para evitar SQL inválida.\n\n```jsp\n<c:set var=\"raw_codusu\" value=\"${empty param.P_CODUSU ? '0' : param.P_CODUSU}\" />\n<c:set var=\"codusu_limpo\" value=\"${fn:replace(raw_codusu, '\\\"', '')}\" />\n<c:set var=\"codusu_limpo\" value=\"${fn:replace(codusu_limpo, '&quot;', '')}\" />\n<c:set var=\"codusu_seguro\" value=\"${empty codusu_limpo ? '0' : codusu_limpo}\" />\n\n<snk:query var=\"qAcessos\">\n    SELECT CODUSU, NOMEUSU\n      FROM TSIUSU\n     WHERE CODUSU = :codusu_seguro\n</snk:query>\n```\n\n**Estado de tela e lazy-load em dashboard único**\n- Definir listas globais para reutilização em KPI, gráfico, tabela e modais.\n- Guardar flag de carregamento por aba para evitar reconsultas desnecessárias.\n- Recarregar dados e reabrir o contexto (produto/aba) após atualização transacional.\n\n```js\nvar dadosGlobais = [];\nvar produtoAtual = null;\nvar abaCarregada = {};\n\nfunction abrirDetalhe(dado) {\n  produtoAtual = dado;\n  abaCarregada = {};\n  trocarAba(\"estoque\");\n}\n\nfunction trocarAba(aba) {\n  if (aba === \"estoque\" && !abaCarregada.estoque) carregarAbaEstoque(produtoAtual.CODPROD);\n  if (aba === \"pedidos\" && !abaCarregada.pedidos) carregarAbaPedidos(produtoAtual.CODPROD);\n  if (aba === \"parceiros\" && !abaCarregada.parceiros) carregarAbaParceiros(produtoAtual.CODPROD);\n}\n```\n**Exemplo de Blindagem e Separação de Camadas**\n\n```jsp\n<%-- 1. Blindagem no topo do arquivo --%>\n<c:set var=\"v_salesagent\" value=\"${empty param.SALESAGENT ? '0' : param.SALESAGENT}\" />\n\n<%-- 2. Container oculto para dados (Separação JSP vs JS) --%>\n<div id=\"data-container\" style=\"display:none;\">\n    [\n    <c:forEach var=\"row\" items=\"${qDados.rows}\" varStatus=\"loop\">\n        { \"id\": ${row.ID}, \"nome\": \"${fn:replace(row.NOME, '\"', '\\\\\"')}\" }${!loop.last ? ',' : ''}\n    </c:forEach>\n    ]\n</div>\n\n<script>\n    // 3. JS apenas lê os dados do container\n    const rawData = document.getElementById('data-container').textContent.trim();\n    const myData = rawData ? JSON.parse(rawData) : [];\n</script>\n```\n\n### Identidade Visual (Colors)\nPadronizar identidade visual em componentes BI para consistência entre gadgets HTML5, tabelas e indicadores.\n\n**Diretrizes de UI/UX**\n- Definir paleta via tokens (`--color-*`) para evitar valores espalhados.\n- Priorizar contraste mínimo entre texto/fundo (legibilidade operacional).\n- Manter semântica visual consistente: sucesso, alerta, erro, neutro.\n- Permitir sobrescrita por dados vindos do SQL (`BKCOLOR`, `FGCOLOR`) quando necessário.\n- Usar cabeçalho sticky e colunas fixas para tabelas largas com alto volume de leitura.\n- Diferenciar status de linha via classes CSS (aprovado, parcial, histórico, crítico) para leitura operacional rápida.\n\n> Os nomes de tabelas e campos abaixo são representativos e podem variar conforme a implementação da instância.\n\n```html\n<style>\n  :root {\n    --color-bg: #F5F7FA;\n    --color-surface: #FFFFFF;\n    --color-text: #1F2937;\n    --color-success: #1A7F37;\n    --color-warning: #B26A00;\n    --color-danger: #B42318;\n    --color-accent: #0E5A8A;\n  }\n\n  .card {\n    background: var(--color-surface);\n    color: var(--color-text);\n    border-radius: 8px;\n    padding: 12px;\n  }\n</style>\n```\n\n```sql\nSELECT\n    V.CODMETA,\n    V.VALOR_ATUAL,\n    V.VALOR_META,\n    CASE WHEN V.VALOR_ATUAL >= V.VALOR_META THEN '#1A7F37' ELSE '#B42318' END AS BKCOLOR,\n    '#FFFFFF' AS FGCOLOR\nFROM AD_DADOS_VENDA V\n```\n\n```html\n<style>\n  #tblDados thead th { position: sticky; top: 0; z-index: 4; }\n  #tblDados .col-fixa-1 { position: sticky; left: 0; z-index: 3; }\n  #tblDados .col-fixa-2 { position: sticky; left: var(--fix-col-1-width); z-index: 2; }\n  .row-aprovacao td { background: #ffe8cc; color: #7a3a00; }\n  .row-parcial td { background: #fff4c4; color: #5e4c00; }\n</style>\n```\n\n### Consultas e Exploração de Banco\nEstruturar exploração de dados com foco em performance, legibilidade e mapeamento correto de entidades Sankhya.\n\n**Boas práticas de exploração (DBExplorer)**\n- Usar DBExplorer para inspeção de tabelas, campos, índices, views e procedures.\n- Respeitar limite de retorno configurado (ex.: `DBEXPMAXROW`) para evitar carga excessiva.\n- Evitar `SELECT *` em tabelas com campos volumosos (BLOB/CLOB).\n\n**Mapas essenciais do ecossistema**\n- Dicionário: `TDDTAB`, `TDDCAM`, `TDDOPC`, `TDDINS`, `TDDLIG`.\n- Comercial/financeiro: `TGFCAB`, `TGFITE`, `TGFTOP`, `TGFPAR`, `TGFPRO`, `TGFEST`, `TGFVAR`.\n- Segurança/acesso: `TSIUSU`, `TSIGRU`, `TSIACI`, `TSIIMP`.\n\n**Padrões de SQL recomendados**\n- Em TOP versionada, relacionar `CODTIPOPER` + data de alteração (`DHTIPOPER`/`DHALTER`).\n- Em filtros opcionais, usar padrão `(... = :P_PARAM OR :P_PARAM IS NULL)`.\n- Parametrizar sempre (evitar literals de usuário).\n\n> Os nomes de tabelas e campos abaixo são representativos e podem variar conforme a implementação da instância.\n\n```sql\nSELECT\n    CAB.NUNOTA,\n    CAB.CODPARC,\n    CAB.DTNEG,\n    ITE.SEQUENCIA,\n    ITE.CODPROD,\n    (ITE.VLRTOT - ITE.VLRDESC) AS VLR_LIQUIDO\nFROM TGFCAB CAB\nJOIN TGFITE ITE\n  ON ITE.NUNOTA = CAB.NUNOTA\nJOIN TGFTOP TOP\n  ON TOP.CODTIPOPER = CAB.CODTIPOPER\n AND TOP.DHALTER   = CAB.DHTIPOPER\nWHERE (CAB.CODPARC = :P_CODPARC OR :P_CODPARC IS NULL)\n  AND (CAB.CODVEND = :P_CODVEND OR :P_CODVEND IS NULL)\n```\n\n```sql\nSELECT\n    U.CODUSU,\n    U.NOMEUSU,\n    G.NOMEGRUPO,\n    A.CODREL,\n    I.NOME AS DESCRICAO_RECURSO,\n    A.CONS,\n    A.ALTERA\nFROM TSIUSU U\nJOIN TSIGRU G ON G.CODGRUPO = U.CODGRUPO\nJOIN TSIACI A ON A.CODGRUPO = U.CODGRUPO\nJOIN TSIIMP I ON I.CODREL = A.CODREL\nWHERE U.CODUSU = :P_CODUSU\nORDER BY I.NOME\n```\n\n### Guia do Construtor de BI\nAplicar fluxo de desenvolvimento de componentes HTML5 no BI para garantir renderização, reatividade e navegação entre níveis.\n\n**Estrutura e publicação**\n- Empacotar componente em `.zip` com `index.html` como entrada principal.\n- Organizar recursos estáticos em `assets/` (CSS, JS, libs, imagens).\n- Usar XML/design conforme necessidade; considerar JSP de entrada quando houver pré-processamento server-side.\n\n**Fluxo de dados e parâmetros**\n- Definir variáveis SQL ou BeanShell conforme complexidade.\n- Usar prefixos de tradução de parâmetro:\n  - `:` para bind padrão.\n  - `:#` para substituição literal (avaliar com cautela e validação).\n  - `:@` para literal textual em cenários como `LIKE`.\n- Em parâmetros multi-list extensos, usar `/*inCollection*/`.\n\n> Os nomes de tabelas e campos abaixo são representativos e podem variar conforme a implementação da instância.\n\n```sql\nSELECT\n    C.CODCID,\n    C.NOMECID,\n    C.UF\nFROM AD_TABELA_EXEMPLO C\nWHERE /*inCollection*/ C.CODCID IN :P_CODCID /*inCollection*/\n```\n\n**Reatividade e ciclo de vida**\n- Programar re-render quando filtros globais mudarem.\n- Evitar dependência exclusiva de `DOMContentLoaded` em conteúdo injetado.\n- Aplicar inicialização assíncrona para garantir elementos disponíveis.\n\n```html\n<script>\n  function renderizarComponente(dados) {\n    // Atualizar DOM, gráficos e KPIs com os dados recebidos\n  }\n\n  function iniciar() {\n    const dadosIniciais = window.snkBIData || [];\n    renderizarComponente(dadosIniciais);\n  }\n\n  setTimeout(iniciar, 300);\n</script>\n```\n\n**Drill-down e eventos**\n- Modelar níveis independentes (macro → micro) com argumentos explícitos.\n- Evitar contêiner vazio em níveis subsequentes.\n- Usar herança de contexto entre níveis para preservar filtros e navegação.\n- Implementar ações de clique para atualizar detalhes e abrir telas nativas com chave de contexto.\n\n**Navegação multi-nível (openLevel e contrato de contexto)**\n- Definir constantes de nível em configuração (`NIVEL_RESUMO`, `NIVEL_DETALHE`, `NIVEL_ITEM`) para evitar acoplamento em string solta.\n- Encapsular `openLevel` em funções dedicadas por rota de navegação (ex.: abrir detalhe por vendedor, abrir itens por parceiro).\n- Repassar parâmetros de contexto entre níveis com contrato explícito (`ARG_*` para chaves e `P_*` para filtros/período).\n- Validar disponibilidade de `openLevel` e parâmetros obrigatórios antes de navegar.\n- Aplicar fallback de erro no console/UI quando o contexto não permitir abertura de nível.\n\n```js\nvar cfg = window.DASH_CONFIG || {};\nvar NIVEL_DETALHE = cfg.NIVEL_DETALHE || \"NIVEL_B\";\nvar NIVEL_ITEM = cfg.NIVEL_ITEM || \"NIVEL_C\";\n\nfunction abrirNivelDetalhe(codigoEntidade) {\n  if (!codigoEntidade || typeof openLevel !== \"function\") return;\n  openLevel(NIVEL_DETALHE, {\n    ARG_CODENT: parseInt(codigoEntidade, 10),\n    P_PERIODO_INI: cfg.P_PERIODO_INI || \"\",\n    P_PERIODO_FIN: cfg.P_PERIODO_FIN || \"\",\n    P_CODMETA: cfg.P_CODMETA || \"\"\n  });\n}\n\nfunction abrirNivelItem(codigoEntidadeFilha) {\n  if (!codigoEntidadeFilha || typeof openLevel !== \"function\") return;\n  openLevel(NIVEL_ITEM, {\n    ARG_CODENT_FILHA: parseInt(codigoEntidadeFilha, 10),\n    P_PERIODO_INI: cfg.P_PERIODO_INI || \"\",\n    P_PERIODO_FIN: cfg.P_PERIODO_FIN || \"\",\n    P_CODMETA: cfg.P_CODMETA || \"\"\n  });\n}\n```\n\n**Segurança e bloqueio de acesso por escopo**\n- Restringir qualquer consulta de nível pela relação usuário-meta/escopo antes de agregar dados.\n- Centralizar o predicado de segurança em função de montagem de `WHERE` para reaproveitamento em KPIs, grids e gráficos.\n- Preferir variáveis de sessão (`CODUSU_LOG` ou função equivalente de usuário logado) para evitar spoof de parâmetro de usuário.\n- Bloquear carga quando parâmetros críticos estiverem ausentes (ex.: período, meta, entidade de drill-down).\n\n> Os nomes de tabelas e campos abaixo são representativos e podem variar conforme a implementação da instância.\n\n```sql\nSELECT\n    M.CODMETA,\n    M.CODENTIDADE,\n    SUM(M.VLRPREV) AS VLR_PREV,\n    SUM(M.VLRREAL) AS VLR_REAL\nFROM AD_DADOS_META M\nWHERE M.CODMETA = :P_CODMETA\n  AND M.DTREF BETWEEN TO_DATE(:P_PERIODO_INI, 'DD/MM/YYYY')\n                  AND TO_DATE(:P_PERIODO_FIN, 'DD/MM/YYYY')\n  AND EXISTS (\n      SELECT 1\n      FROM AD_META_USUARIO_LIB L\n      WHERE L.CODMETA = M.CODMETA\n        AND L.CODUSU = STP_GET_CODUSULOGADO\n  )\nGROUP BY M.CODMETA, M.CODENTIDADE\n```\n\n**Grid hierárquica com expansão/colapso**\n- Estruturar mapa `filhosPorPai` e estado `nosExpandidos` para renderização incremental da árvore.\n- Inicializar nós não analíticos de níveis superiores como expandidos para melhorar leitura inicial.\n- Em nós colapsados, exibir agregados de descendentes analíticos para manter contexto sem abrir toda árvore.\n- Fornecer ações rápidas de “Expandir tudo” e “Recolher tudo” no cabeçalho.\n- Em filtros de texto, incluir ancestrais dos nós encontrados para preservar rastreabilidade hierárquica.\n\n```js\nvar filhosPorPai = {};\nvar nosExpandidos = {};\n\nfunction alternarNo(codNo) {\n  var id = String(codNo);\n  nosExpandidos[id] = !nosExpandidos[id];\n  renderizarGrid();\n}\n\nfunction obterVisiveis(raiz) {\n  var lista = [];\n  function visitar(pai) {\n    (filhosPorPai[pai] || []).forEach(function (no) {\n      lista.push(no);\n      if (nosExpandidos[String(no.CODNO)]) visitar(String(no.CODNO));\n    });\n  }\n  visitar(String(raiz || \"\"));\n  return lista;\n}\n```\n\n**Resiliência de carregamento**\n- Separar a carga principal da carga complementar (ex.: realizado mensal) e não bloquear a visualização principal por falha secundária.\n- Tratar ausência de dados por componente (`vazio`) sem derrubar o layout inteiro.\n- Destruir instâncias de gráfico antes de recriar para evitar vazamento e sobreposição visual.\n- Carregar painéis secundários somente ao abrir aba/visão correspondente (on-demand).\n\n**Navegação intra-nível (single JSP)**\n- Tratar o JSP único como shell de navegação: tabela principal + modal de detalhe + abas internas + modais auxiliares.\n- Encadear cliques sem trocar de nível Sankhya: KPI → lista modal, gráfico → filtro de tabela, linha da tabela → detalhe.\n- Aplicar atalhos de ação no detalhe para abrir cadastro nativo no contexto da chave primária.\n- Fechar modal por clique no overlay para reduzir atrito de uso.\n\n```js\nfunction abrirTelaNativa(resourceIdBase64, pkObj) {\n  var pk = btoa(JSON.stringify(pkObj));\n  top.location.href = \"/mge/system.jsp#app/\" + resourceIdBase64 + \"/\" + pk + \"&pk-refresh=\" + Date.now();\n}\n\nfunction onKpiClick(lista) {\n  abrirModalLista(\"Itens selecionados\", \"Navegação por atalho\", lista);\n}\n\nfunction onGraficoClick(grupo) {\n  filtrarTabelaPorGrupo(grupo);\n}\n```\n\n**Feedback operacional de interface**\n- Exibir estados explícitos de carregamento, vazio e erro em cada painel.\n- Em ações de atualização, desabilitar botão de confirmação até o retorno do `executeQuery`.\n- Após sucesso, recarregar dados e restaurar contexto anterior (produto e aba ativa).\n\n**Variáveis internas de segurança**\n- Aproveitar variáveis de sessão para segurança em nível de linha (`CODUSU_LOG`, `CODGRU_LOG`, `CODVEN_LOG`).\n- Restringir dados por contexto do usuário antes de montar visualizações.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["sankhya","dashboard","html","jsp","custom","best","pratices","antigravity","awesome","skills","sickn33","agent-skills"],"capabilities":["skill","source-sickn33","skill-sankhya-dashboard-html-jsp-custom-best-pratices","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/sankhya-dashboard-html-jsp-custom-best-pratices","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34583 github stars · SKILL.md body (16,899 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T18:52:10.375Z","embedding":null,"createdAt":"2026-04-18T21:43:51.037Z","updatedAt":"2026-04-22T18:52:10.375Z","lastSeenAt":"2026-04-22T18:52:10.375Z","tsv":"'/acesso':739 '/colapso':1410 '/escopo':1271 '/mge/system.jsp':1655 '1':129,512,1387 '10':1213,1242 '1a7f37':650 '2':148,518 '3':161 '4':176 '500':344 'a.altera':852 'a.codgrupo':866 'a.codrel':846,873 'a.cons':851 'aba':291,452,485,487,493,499,1596,1716 'aba/vis':1571 'abacarregada':474,480 'abacarregada.estoque':489 'abacarregada.parceiros':501 'abacarregada.pedidos':495 'abaixo':624,782,990,1334 'abas/modais':316 'abertura':1175 'abrir':1085,1129,1133,1447,1570,1625 'abrirdetalh':476 'abrirmodallista':1666 'abrirniveldetalh':1198 'abrirnivelitem':1226 'abrirtelanativa':1646 'acesso':1258 'acoplamento':271,1115 'ad':660,1007,1360,1389 'agregado':1439 'agregar':1274 'alerta':575 'alteração':755 'alternarno':1480 'alto':599 'analítico':1425,1442 'ancestrai':1466 'ant':296,394,404,1161,1272,1556,1744 'anterior':1713 'anyth':109 'ao':1569 'aplicar':199,886,1039,1164,1618 'app':1656 'appli':133 'aprovado':610 'aproveitar':1722 'apó':464,1706 'arg':1146,1209,1237 'argumento':1058 'arquivo':232,273,517 'ask':17,82,107,1781 'aspa':402 'asset':919 'assíncrona':1041 'atalho':1619,1671 'ativa':292,1717 'atrito':1641 'atual':640,646 'atualizar':1082 'atualização':465,1696 'até':1701 'ausent':1319 'ausência':1541 'auxiliar':1599 'avaliar':964 'ação':1621 'açõ':1078,1451,1694 'b':1189 'b42318':652 'banco':669 'beanshel':949 'best':7,20,40,51,90 'bi':60,103,155,177,186,542,885,894 'bind':959 'bkcolor':585,655 'blindagem':325,506,513 'blob/clob':719 'bloco':363 'bloquear':1313,1533 'bloqueio':1256 'boa':84,685 'botão':1698 'boundari':1789 'btoa':1651 'c':258,260,262,339,1010,1196 'c.codcid':1003,1013 'c.nomecid':1004 'c.uf':1005 'cab':387,807 'cab.codparc':384,796,824 'cab.codtipoper':819 'cab.codvend':833 'cab.dhtipoper':822 'cab.dtneg':797 'cab.nunota':383,795,813 'cabeçalho':590,1460 'cada':1691 'cadastro':1626 'camada':352,510 'camadas/servi':268 'campo':623,696,717,781,989,1333 'capabl':128 'carga':710,1314,1523,1526 'carregamento':299,312,450,1520,1686 'carregar':1565 'carregarabaestoqu':490 'carregarabaparceiro':502 'carregarabapedido':496 'case':643 'cautela':966 'centralizar':1276 'cenário':973 'cfg':1180 'cfg.nivel':1186,1193 'cfg.p_codmeta':1224,1253 'cfg.p_periodo_fin':1221,1250 'cfg.p_periodo_ini':1217,1246 'chave':1089,1148,1631 'choos':261 'ciclo':1020 'clarif':1783 'class':608 'clear':1756 'cliqu':1080,1601,1636 'codcid':1016 'code':122,130 'codent':1210,1238 'codgru':1734 'codigoentidad':1199,1201,1212 'codigoentidadefilha':1227,1229,1241 'codmeta':1223,1252,1367 'codno':1481,1485 'codparc':826,829 'codtipop':752 'codusu':418,423,424,877,1298,1732 'codusulogado':1401 'codven':1736 'codvend':835,838 'colapsado':1437 'color':536,558 'coluna':308,593 'com':378,598,674,716,910,965,1057,1088,1143,1408 'comercial/financeiro':730 'como':912,974,1429,1587 'compil':143 'compilação':212 'complementar':1527 'complexidad':951 'compon':156,183 'component':541,891,907,1545 'config':1182 'configurado':705 'configuração':1106 'confirmação':1700 'conform':630,788,926,950,996,1340 'considerar':928 'consist':150 'consistent':573 'consistência':544 'console/ui':1169 'consolid':46 'constant':1102 'construct':178 'construtor':883 'consulta':665,1263 'consumo':364 'contain':519 'contexto':462,1069,1091,1100,1140,1172,1445,1629,1712,1741 'conteúdo':1037 'contrast':564 'contrato':1098,1144 'contêin':1061 'core':127,243,247 'correct':171,189 'correspondent':1573 'correto':681 'creat':54,119 'creation':22 'credenciai':278 'criteria':1792 'crítico':613,1317 'css':159,609,920 'custom':6,39 'código':198 'da':286,395,633,791,999,1343,1420,1525,1615,1630 'dado':288,458,477,479,522,581,661,673,942,1275,1361,1543,1709,1739 'dadosglobai':469 'dashboard':3,27,36,57,95,104,126,434 'dashboards/telas':219 'data':165,753 'databas':162 'date':1372,1379 'date.now':1662 'dbexplor':689,691 'dbexpmaxrow':707 'dd/mm/yyyy':1376,1383 'de':197,201,211,214,221,240,266,277,297,302,307,326,336,351,362,366,392,399,405,427,449,505,509,552,601,605,620,668,672,682,687,694,703,745,754,774,778,884,888,890,930,941,954,956,986,1021,1034,1068,1079,1090,1099,1103,1126,1139,1156,1162,1166,1176,1257,1264,1273,1279,1283,1285,1296,1303,1309,1311,1324,1330,1426,1440,1453,1463,1519,1542,1554,1557,1589,1594,1604,1612,1620,1642,1680,1685,1695,1699,1720,1724,1730,1745 'declarar':223 'dedicada':1123 'definir':329,409,436,554,945,1101 'demand':1576 'demanda':314 'dentro':361 'dependência':1032 'derrubar':1548 'desabilitar':1697 'descendent':1441 'describ':1760 'descricao':849 'desenvolvimento':889 'desnecessária':456 'destruir':1552 'detalh':1083,1110,1130,1185,1187,1208,1595,1617,1623 'dhalter':757 'dhtipop':756 'dicionário':724 'diferenciar':603 'diretament':360 'diretiva':224 'diretr':220,551 'disponibilidad':1155 'disponívei':1045 'domcontentload':1035 'dos':1467 'drill':1048,1326 'drill-down':1047,1325 'e':203,216,226,281,293,309,403,429,445,459,507,549,592,622,627,666,679,699,780,785,899,904,943,967,988,993,1019,1050,1075,1084,1097,1149,1158,1255,1292,1332,1337,1414,1456,1531,1562,1688,1710,1715 'ecossistema':249,723 'ecosystem':67 'elemento':1044 'els':651 'em':218,238,254,272,370,407,433,441,540,676,714,748,758,908,918,972,976,1036,1063,1105,1116,1121,1281,1289,1435,1461,1690,1693,1728 'empacotar':906 'empti':379 'encadear':1600 'encapsular':1119 'encontrado':1469 'end':653 'ensur':188 'entidad':683,1323 'entiti':175 'entr':545,566,901,1070,1141 'entrada':400,913,931 'environ':1772 'environment-specif':1771 'equivalent':1302 'erro':210,343,576,1167,1689 'error':144 'escopo':1260 'espalhado':562 'essenciai':721 'estado':284,295,426,1415,1683 'estiverem':1318 'estoqu':482,488 'estrutura':903 'estruturar':670,1411 'estático':917 'evento':1051 'evitando':270 'evitar':251,275,342,356,413,454,560,709,712,772,1031,1060,1114,1307,1560 'ex':706,1128,1320,1528 'excessiva':711 'exclusiva':1033 'executequeri':1705 'exemplo':504,1009 'exibir':1438,1682 'exist':1385 'expandido':1430 'expandir':1454 'expansão':1409 'expert':1777 'explor':163,166 'exploração':667,671,688 'explícito':1059,1145,1684 'extenso':981 'failur':147 'falha':213,1538 'fallback':333,410,1165 'fals':235 'fechar':1633 'feedback':1678 'ffffff':656 'fgcolor':586,658 'file':123 'filha':1239 'filhosporpai':1413,1476,1499 'filtrartabelaporgrupo':1676 'filtro':289,759,1028,1074,1462,1611 'filtros/per':1152 'fin':1220,1249,1382 'fix':24 'fixa':594 'flag':448 'flow':184 'fluxo':887,940 'fn':530 'foco':675 'foreach':263,1501 'fornec':1450 'forçar':233 'function':475,483,1197,1204,1225,1232,1479,1491,1496,1502,1645,1663,1673 'função':1282,1301 'funçõ':1122 'g':858 'g.codgrupo':860 'g.nomegrupo':845 'gadget':546 'garantir':896,1043 'generat':131 'get':1400 'globai':438,1029 'global':285 'grid':1291,1406 'group':1402 'grupo':1675,1677 'gráfico':443,1293,1555,1610 'guardar':447 'guia':881 'guid':47,179 'habilitar':237 'hardcod':276 'herança':1067 'hierárquica':1407,1473 'histórico':612 'houver':933 'html':4,29,37,635,664,1046 'html5':182,547,892 'i.codrel':872 'i.nome':847,880 'id':527,1483,1487,1489 'ident':153 'identidad':534,538 'imagen':923 'implementar':311,1077 'implementação':222,632,790,998,1342 'incluir':1465 'incollect':983,1012,1017 'increment':1419 'independent':1054 'index.html':911 'indicador':550 'ini':1216,1245,1375 'inici':324,1434 'inicializar':1422 'inicialização':1040 'injetado':1038 'injetar':357,406 'input':1786 'inspeção':693 'instância':634,792,1000,1344,1553 'inteiro':1551 'interfac':1681 'interna':1597,1719 'intra':1579 'intra-nível':1578 'inválida':415 'iselignor':234 'ite':810 'ite.codprod':799 'ite.nunota':812 'ite.sequencia':798 'ite.vlrdesc':801 'ite.vlrtot':800 'item':1112,1192,1194,1236 'iten':1134,1667 'iterar':369 'java':31,253,347 'join':808,814,856,862,868 'js':355,467,526,921,1178,1474,1644 'json.stringify':1652 'jsp':5,30,38,225,255,353,359,381,416,511,524,929,1582,1585 'jsp/html/java':68 'jsp/jstl':134,202 'jstl':246,257 'kpi':442,1607 'kpis':1290 'l':1393 'l.codmeta':1395 'l.codusu':1398 'larga':597 'layout':1550 'lazi':319,431 'lazy-load':318,430 'legibilidad':568,678 'leitura':602,615,1433 'lib':922,1392 'like':975 'limit':702,1748 'linha':606,1614,1731 'linha.nunota':390 'liquido':804 'list':980 'lista':437,1495,1517,1608,1665,1672 'lista.push':1504 'liter':773,963,970 'load':320,432 'localstorag':305 'log':1299,1733,1735,1737 'logado':1305 'loop.last':533 'lógica':265 'm':1363 'm.codentidade':1348,1405 'm.codmeta':1347,1365,1396,1404 'm.dtref':1369 'm.vlrprev':1350 'm.vlrreal':1355 'macro':1055 'maintain':56 'manter':570,1444 'map':172 'mapa':720,1412 'mapeamento':680 'match':1757 'melhor':195 'melhorar':1432 'mensal':1530 'mention':94 'meta':642,648,1270,1322,1362,1390 'micro':1056 'miss':1794 'modai':446,1598 'modal':1593,1609,1634 'modelar':283,1052 'modifi':121 'modularizar':264 'montagem':1284 'montar':1746 'mudarem':1030 'multi':979,1094 'multi-list':978 'multi-nível':1093 'mínimo':565 'nativa':1087 'nativo':1627 'navegar':1163 'navegação':900,1076,1092,1127,1577,1590,1669 'navig':193 'necessidad':927 'necessário':588 'negócio':267 'neutro':577 'nivel':1107,1109,1111,1184,1188,1191,1195,1207,1235 'no.codno':1509,1512 'nome':529,619,777,985,1329 'nomeusu':419 'normalizar':397 'nosexpandido':1416,1478,1486,1488,1507 'novo':298 'null':472,769,831,840 'não':372,1173,1424,1532 'nívei':902,1053,1064,1071,1142,1427 'nível':1095,1104,1177,1265,1580,1605,1729 'nós':1423,1436,1468 'o':461,1171,1277,1549,1584,1702 'objeto':374 'obrigatória':228 'obrigatório':1160 'obtervisivei':1492 'oculto':520 'on-demand':1574 'ongraficoclick':1674 'onkpiclick':1664 'opcionai':760 'openlevel':1096,1120,1157,1203,1206,1231,1234 'operacion':569,616,1679 'ordem':306 'ordenação':290,310 'order':878 'organ':140 'organizar':915 'organização':204 'os':618,776,984,1328 'ou':948,1300 'output':1766 'overlay':1638 'p':763,766,825,828,834,837,876,1015,1150,1214,1218,1222,1243,1247,1251,1366,1373,1380 'padronizar':537 'padrão':332,762,960 'padrõ':200,744 'pai':1498,1500 'painel':1692 'painéi':1566 'paleta':555 'para':208,236,245,315,321,334,341,412,439,453,521,543,559,595,614,692,708,895,958,961,969,1042,1072,1081,1113,1147,1151,1287,1306,1417,1431,1443,1470,1559,1624,1639,1726 'param':764,767 'parameter':61 'parametrizar':770 'parceiro':500,1136 'parcial':611 'parseint':1211,1240 'parâmetro':327,335,393,944,957,977,1138,1159,1310,1316 'pattern':19,49,135,194 'pedido':494 'pela':1266 'perform':169,677 'periodo':1215,1219,1244,1248,1374,1381 'permiss':1787 'permitir':578,1174 'persistir':300 'período':1321 'pesado':317 'pk':1650,1658,1660 'pk-refresh':1659 'pkobj':1648,1653 'podem':628,786,994,1338 'por':451,580,1124,1131,1135,1259,1537,1544,1635,1670,1740 'practic':21,52,91 'pratic':8,41 'pratica':85 'predefin':158 'predicado':1278 'preferir':242,1294 'preferência':301 'prefixo':953 'preservar':1073,1471 'prev':1353 'primária':1632 'princip':914,1524,1536,1592 'priorizar':563 'procedur':700 'processamento':936 'produto':1714 'produto/aba':463 'produtoatu':471,478 'produtoatual.codprod':491,497,503 'programar':1023 'provid':44 'prática':196,686 'pré':935 'pré-processamento':934 'publicação':905 'purpos':42 'qualquer':1262 'quando':587,932,1027,1170,1315 'queri':59,167,368,408 'query.rows':371,380 'raiz':375,1493,1515 'rastreabilidad':1472 're':1025 're-rend':1024 'reabrir':460 'reactiv':191 'real':1358 'realizado':1529 'reaproveitamento':1288 'reatividad':898,1018 'recarregar':457,1708 'recolh':1457 'recomendado':747 'reconsulta':455 'recriar':1558 'recurso':850,916 'reduc':142 'reduzir':209,322,1640 'refresh':1661 'regressõ':217 'relacionar':751 'relat':110 'relação':1267 'remov':401 'render':146,190,1026 'renderizargrid':1490 'renderização':215,241,897,1418 'repassar':1137 'replac':531 'representativo':626,784,992,1336 'requir':1785 'resetar':294 'resiliência':1518 'resourceidbase64':1647,1657 'respeitar':701 'restaurar':1711 'restringir':1261,1738 'resultado':389 'resumo':1108 'retorno':704,1703 'return':1205,1233,1516 'reutilização':440 'review':132,1778 'rota':1125 'row.id':528 'row.nome':532 'rt':244 'rápida':617,1452 'safeti':1788 'sanitização':391 'sankhya':2,26,35,66,87,89,96,102,114,125,174,250,349,684,1606 'sankhya-dashboard-html-jsp-custom-best-pratic':1,34 'scope':1759 'scriptlet':252 'secundária':1539 'secundário':1567 'segurança':738,1254,1280,1721,1727 'seguro':365,411,425 'selecionado':1668 'select':382,417,637,713,794,842,1002,1346,1386 'sem':388,1446,1547,1602 'sempr':328,771 'semântica':571 'sensívei':280 'separar':1521 'separação':350,508,523 'server':138,206,938 'server-sid':137,205,937 'servidor':346 'sessão':1297,1725 'set':340 'shell':1588 'side':139,207,939 'singl':1581 'skill':10,73,75,1751 'skill-sankhya-dashboard-html-jsp-custom-best-pratices' 'snk':367 'sob':313 'sobreposição':1563 'sobrescrita':579 'solta':1118 'soment':1568 'source-sickn33' 'specif':1773 'spoof':1308 'sql':33,58,396,414,584,636,746,793,841,947,1001,1345 'standard':151 'status':604 'sticki':591 'stop':1779 'stp':1399 'string':1117,1484,1508,1511,1514 'structur':164 'subsequent':1065 'substituição':962 'substitut':1769 'success':1791 'sucesso':574,1707 'sum':1349,1354 'superior':1428 'são':625,783,991,1335 'tabela':444,548,596,621,695,715,779,987,1008,1331,1591,1613,1616 'tag':358 'taglib':227 'task':1755 'tddcam':726 'tddin':728 'tddlig':729 'tddopc':727 'tddtab':725 'tela':428,1086 'tempo':239,323 'test':1775 'testar':376 'texto':1464 'texto/fundo':567 'textual':971 'tgfcab':386,731,806 'tgfest':736 'tgfite':732,809 'tgfpar':734 'tgfpro':735 'tgftop':733,815 'tgfvar':737 'toda':1448 'token':160,282,557 'top':749,816 'top.codtipoper':818 'top.dhalter':821 'top.location.href':1654 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'topo':230,515 'tradução':955 'transacion':466 'tratar':1540,1583 'treat':1764 'trocar':1603 'trocaraba':481,484 'tsiaci':742,863 'tsigru':741,857 'tsiimp':743,869 'tsiusu':421,740,854 'tudo':1455,1458 'typeof':1202,1230 'u':855 'u.codgrupo':861,867 'u.codusu':843,875 'u.nomeusu':844 'ui':287 'ui/ux':63,553 'um':330 'url':279,337 'usar':256,589,690,761,924,952,982,1066 'use':13,28,71,78,157,180,1749 'user':16,81,93,106,116 'uso':1643 'usuario':1391 'usuário':775,1269,1304,1312,1743 'usuário-meta':1268 'v':663 'v.codmeta':638 'v.valor':639,641,645,647 'valid':1774 'validar':1154 'validação':968 'valor':331,398,561 'var':468,470,473,1179,1183,1190,1475,1477,1482,1494,1649 'variar':629,787,995,1339 'variávei':946,1295,1718,1723 'vazamento':1561 'vazio':377,1062,1546,1687 'venda':662 'vendedor':1132 'versionada':750 'via':338,556,607 'vida':1022 'view':698 'vindo':582 'visitar':1497,1510,1513 'visual':149,152,535,539,572,1564 'visualização':303,1535 'visualizaçõ':1747 'vlr':803,1352,1357 'volum':600 'volumoso':718 'vs':354,525 'want':117 'window.dash':1181 'within':64 'word':113 'work':99 'xml/design':925 'zip':909 'árvore':1421,1449 'ão':1572 'ços':269 'índice':697 'íodo':1153 'único':274,435,1586","prices":[{"id":"b5f1551f-4389-4671-b5ad-ea0b998bbfa2","listingId":"d0920db9-fdb7-451a-967f-f93035c9be57","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:43:51.037Z"}],"sources":[{"listingId":"d0920db9-fdb7-451a-967f-f93035c9be57","source":"github","sourceId":"sickn33/antigravity-awesome-skills/sankhya-dashboard-html-jsp-custom-best-pratices","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/sankhya-dashboard-html-jsp-custom-best-pratices","isPrimary":false,"firstSeenAt":"2026-04-18T21:43:51.037Z","lastSeenAt":"2026-04-22T18:52:10.375Z"}],"details":{"listingId":"d0920db9-fdb7-451a-967f-f93035c9be57","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"sankhya-dashboard-html-jsp-custom-best-pratices","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34583,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"5b69354d476ff7f37c92627ded1767b2b09c443d","skill_md_path":"skills/sankhya-dashboard-html-jsp-custom-best-pratices/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/sankhya-dashboard-html-jsp-custom-best-pratices"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"sankhya-dashboard-html-jsp-custom-best-pratices","description":"This skill should be used when the user asks for patterns, best practices, creation, or fixing of Sankhya dashboards using HTML, JSP, Java, and SQL."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/sankhya-dashboard-html-jsp-custom-best-pratices"},"updatedAt":"2026-04-22T18:52:10.375Z"}}