Histórico da Página
| HTML |
|---|
<!DOCTYPE html> <html> <head> -- <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style>Confluence/TDN: Cole este HTML no macro "HTML" (não em bloco de código/preformatado). Este arquivo é um *SNIPPET { margin: 0; padding: 0;(sem <html>/<head>/<body>) para reduzir quebra por sanitização. --> <div style="max-width:1200px; margin:0 auto; padding:16px; font-family: Arial, Helvetica, sans-serif; background:#ffffff;"> <div style="border:1px solid #dfe1e6; boxborder-sizingradius: border-box;8px; overflow:hidden;"> } <!-- Cor do header: era #0052CC; ajustado para um azul mais claro --> body {<div style="background:#2684FF; color:#fff; padding:14px 16px;"> <div font-family: 'Segoe UI', Arial, sans-serif;style="display:flex; align-items:center; gap:12px;"> background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);<!-- TOTVS logo (anexo do Confluence/TDN): min-height: 100vh; - Nome do anexo: "totvs logo.jpg" padding: 20px; - } O JS abaixo tenta carregar primeiro do pageId atual, e cai em fallback se não achar .release-notes-wrapper {> max-width: 1400px; <img margin: 0 auto; id="totvs-logo" background: white; alt="TOTVS" style="display:none; height:28px; width:auto; background:#ffffff; border-radius: 12px;6px; padding:4px; border:1px solid rgba(255,255,255,0.35);" box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); /> <div id="page-title" overflow: hidden; style="font-size:18px; font-weight:700;">Dicionário de Dados</div> } </div> .header {</div> <div style="background:#f4f5f7; linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;border-top:1px solid #dfe1e6; padding:12px 16px; display:flex; gap:12px; align-items:center; flex-wrap:wrap;"> <div padding: 30px 40px;style="display:flex; gap:8px; align-items:center;"> border-radius: 0;<div style="font-weight:700; color:#172b4d;">Versão:</div> margin-bottom: 0; <div id="version-display" style="background:#fff; border:1px solid #dfe1e6; border-radius:6px; padding:4px 10px; font-weight:700; color:#172b4d;">-</div> position: relative; </div> overflow: hidden; }<!-- Link removido por solicitação: sem botão externo --> </div> .header::before {<div id="widget-container" style="min-height:520px; background:#ffffff;"> <!-- content: ''; position: absolute; IMPORTANTE (TDN/Confluence): top: -50%; Se o HTML for colado dentro de um bloco PRE/CODE, o right: -10%; Confluence pode inserir </pre> no final. width: 500px; Isso quebra o JavaScript e fica preso height: 500px;em "Carregando...". --> background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%); <div style="padding:18px; color:#6b778c;">Carregando documento...</div> border-radius: 50%; </div> }</div> </div> <!-- IMPORTANTE: .header h1 { - O TDN está injetando </pre> no final de <script> margin: 0; inline (isso aparece no view-source e quebra o JS). font-size - Solução estável: 32px; carregar o JS via SRC (arquivo público no GitHub RAW), sem font-weight: 600;JS inline. - Este } arquivo `tdn_release_widget.js` precisa existir no repo `Juansimeoni/ReleaseDatasul` (na raiz) para funcionar. --> .metadata {<!-- IMPORTANT: do NOT use raw.githubusercontent.com for background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);JS <script src>. GitHub RAW serves JS as text/plain padding:with 20px 40px; nosniff, so browsers refuse to execute it (strict MIME). border-bottom: 1pxUse solid #dee2e6; jsDelivr (or another CDN) which serves application/javascript. display: flex;--> align-items: center; gap: 30px; flex-wrap: wrap;<!-- Dica: para evitar cache do CDN, pode "pin"ar por commit SHA (imutável). --> } .metadata-item { display: flex; align-items: center; gap: 10px; } .metadata-item strong { color: #495057; font-weight: 600; } .metadata-item span { color: #0A2333; background: white; padding: 6px 14px; border-radius: 6px; font-weight: 600; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } .doc-link { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; font-size: 14px; transition: all 0.3s ease; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); margin-left: auto; } .doc-link:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); } .doc-link:active { transform: translateY(0); } #widget-container { padding: 0; min-height: 700px; background: #ffffff; } .message-box { padding: 40px; text-align: center; background: linear-gradient(135deg, #fff3cd 0%, #ffe69c 100%); margin: 30px; border-radius: 10px; border-left: 5px solid #ffc107; box-shadow: 0 4px 12px rgba(255, 193, 7, 0.2); } .message-box.error { background: linear-gradient(135deg, #fee 0%, #fcc 100%); border-left-color: #dc3545; box-shadow: 0 4px 12px rgba(220, 53, 69, 0.2); } .message-box h2 { color: #856404; margin-bottom: 15px; font-size: 24px; } .message-box.error h2 { color: #721c24; } .message-box p { color: #856404; font-size: 16px; line-height: 1.6; } .message-box.error p { color: #721c24; } .message-icon { font-size: 48px; margin-bottom: 15px; display: block; } iframe { border: none; width: 100%; height: 800px; display: block; } .loading { text-align: center; padding: 60px 20px; color: #6c757d; font-size: 18px; } .loading::before { content: ''; display: block; width: 50px; height: 50px; margin: 0 auto 20px; border: 4px solid #e9ecef; border-top-color: #667eea; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @media (max-width: 768px) { body { padding: 10px; } .header { padding: 20px; } .header h1 { font-size: 24px; } .metadata { padding: 15px 20px; flex-direction: column; align-items: flex-start; } .doc-link { margin-left: 0; margin-top: 10px; width: 100%; justify-content: center; } } </style> </head> <body> <div class="release-notes-wrapper"> <div class="header"> <h1 id="page-title">Dicionário de Dados</h1> </div> <div class="metadata"> <div class="metadata-item"> <strong>Versão:</strong> <span id="version-display">Carregando...</span> </div> <div class="metadata-item"> <strong>Última atualização:</strong> <span id="last-update">-</span> </div> <a href="#" id="doc-link" class="doc-link" target="_blank" style="display: none;"> <span>📄</span> <span>Abrir no Google Docs</span> </a> </div> <div id="widget-container"> <div class="loading">Carregando documento...</div> </div> </div> <script> (function() { // Mapeamento de versões para arquivos no Drive (Google Docs ou .txt) // Gerado automaticamente a partir da pasta: 141aJRhZeYZca4QCBnou6-00WzRLkBYbs // Data: 2025-12-16 22:24:12 // Total: 79 versões const versionToFile = { '12.1.2411': { id: '1Lv47Us2UXm2UP0JjtfGFiOcVXW9cwSjS', type: 'txt' }, '12.1.2411.1': { id: '12KVuystA1cYiy8KyStDkuRZ6Y_bnd7vp', type: 'txt' }, '12.1.2411.2': { id: '131kP3__usmuXsh-IWJX1pf2oQkHIVgd2', type: 'txt' }, '12.1.2411.3': { id: '1rEiaQCivt3ypEuSSJjhcJwLWb8hWzTYC', type: 'txt' }, '12.1.2411.4': { id: '16LxCYWkutU4Di6sYfjlLIPd7SBbWTJdA', type: 'txt' }, '12.1.2411.5': { id: '1ITodeqjUDPH-T6Ve5LbNRoTfPMHa9EU9', type: 'txt' }, '12.1.2411.6': { id: '1eoIz5qr6Yk_leeayK8kpAfGsZkZgm1_k', type: 'txt' }, '12.1.2411.7': { id: '1NTabmPduDgwOhs2yiXaUKdE5XgDgIDP5', type: 'txt' }, '12.1.2411.8': { id: '1BO4TvdfDZIziAHo_RVTRQ_Ylt4ESBp4u', type: 'txt' }, '12.1.2411.9': { id: '1LUxDVYRwO7DuFkPOWzBD6YCf58wJDNJl', type: 'txt' }, '12.1.2411.10': { id: '1HOmWcuLGW-iDEEeQmdSDCN8eRbYHzbdr', type: 'txt' }, '12.1.2411.11': { id: '1po-iUP-p9KNqQAufsuMra5So1vBqjzTo', type: 'txt' }, '12.1.2411.12': { id: '10Ef2MFpKsGIfpmhoswv5ys6D2A4bvzUM', type: 'txt' }, '12.1.2411.13': { id: '1lQpU7EYwf2kwpv3gZ-yUCnpQcCmXe4kd', type: 'txt' }, '12.1.2411.14': { id: '1OskDxjRPa6XFa-Bgue-Xk86kLEy_I0Yl', type: 'txt' }, '12.1.2411.15': { id: '1bNHh5VsjJNzaaeHcgpD7xrxn0NsXvP4T', type: 'txt' }, '12.1.2411.16': { id: '1jUAT3g_NLQeSMMOPAqyJTZf2sXv8x5ic', type: 'txt' }, '12.1.2411.17': { id: '1ogZ3JPrQ_J40345zZTQCL5Uv7TOt741y', type: 'txt' }, '12.1.2503': { id: '1AkBtHsIAFcGZ5OyBYNi5KXeAr5ssm_x6', type: 'txt' }, '12.1.2503.1': { id: '12Ke9OpqKA4R_UYWNr6XP9k9-ukjYm_KH', type: 'txt' }, '12.1.2503.2': { id: '1R8hPo8IEZlPxIqjyVqluyNN1JffkrNXZ', type: 'txt' }, '12.1.2503.3': { id: '1TL4ythCv_84avpzIeSHjB3Cgxf7_zcgA', type: 'txt' }, '12.1.2503.4': { id: '1NkcD1TAnRYxiKcJIVQ9jZ6Psq9SDmMx8', type: 'txt' }, '12.1.2503.5': { id: '1WH6uqDCBJ8zK8_gRf8DpSiFuivfbUED_', type: 'txt' }, '12.1.2503.6': { id: '1rksaNy4Kv-tq55VD7VS2ckoKoGZNNaXe', type: 'txt' }, '12.1.2503.7': { id: '1pUz-j2eWuQrbhJu62nHSiyIzWC-REX2r', type: 'txt' }, '12.1.2503.8': { id: '1yFXKrIkbEfwUwmYVDe07_QlXt9UVG62y', type: 'txt' }, '12.1.2503.9': { id: '1mO80nVEasIRDJ2i9mrRyPM8ObylNDw4T', type: 'txt' }, '12.1.2503.10': { id: '1VETVn5z5GzD03D1CQpvmmM4Dn0DCH3op', type: 'txt' }, '12.1.2503.11': { id: '1yTTeMu43Q3sBaimMM6cQTvNmD6EkG9VE', type: 'txt' }, '12.1.2503.12': { id: '10tvn9fo-QqXelPRSrb6inuulUQr7vf9g', type: 'txt' }, '12.1.2503.13': { id: '1Pq1LsXO6SbXr16an401_FKp3yKlfhKx_', type: 'txt' }, '12.1.2503.14': { id: '1pXbF0em-a6e0GYqOMNcbHPGpOOM09VX0', type: 'txt' }, '12.1.2503.15': { id: '1wNBB4tvAaKOC2JLvkTzbxiIyTOgxpEjm', type: 'txt' }, '12.1.2503.16': { id: '13mOmXGZ9HaZob2Df6t27osRxWfV138_v', type: 'txt' }, '12.1.2507': { id: '1WdEk0hszYS2UDuOM9vE1_KngjkH74oxR', type: 'txt' }, '12.1.2507.1': { id: '1AyMLAxejP2heuLdXWjHKXeWAkSPkVB0f', type: 'txt' }, '12.1.2507.2': { id: '1OA878i2Izd3BiwZ0m1UR_mEXgCoxZOyh', type: 'txt' }, '12.1.2507.3': { id: '133AZhy4WixraizeKsqSf6DvJLXyt3h2c', type: 'txt' }, '12.1.2507.4': { id: '1n7D6J02XoWPOQzIj9sPXKo9FTdiKgFcL', type: 'txt' }, '12.1.2507.5': { id: '1TjukYrLbIi1Uc6adUTLrIvwSP-7LLv7V', type: 'txt' }, '12.1.2507.6': { id: '16HpmgtvM0WhxN8sr-PiMwNzzKDLocaz1', type: 'txt' }, '12.1.2507.7': { id: '1iHJlFXGQMyS-qq6FMj-Ip4n2xLrMjtZA', type: 'txt' }, '12.1.2507.8': { id: '1EzYgb0Cvha1FB5iX5pZ8I5nh4M8gFnxM', type: 'txt' }, '12.1.2507.9': { id: '1rr_KlDuyyZpKlrOJeaXN-xy3AKlx-Cbu', type: 'txt' }, '12.1.2507.10': { id: '1pptApgNcLAhk5fNIgq8a-onq-vSNWs3n', type: 'txt' }, '12.1.2507.11': { id: '1STmDXQJDoOH5xMx3qzOd44c-t_k1y7jR', type: 'txt' }, '12.1.2507.12': { id: '1BRHWVWAIlhWbTqyIui7VXcqvvLm7l33D', type: 'txt' }, '12.1.2507.13': { id: '19aARCX-cSPA9QIeAxZIW5XxPNXZ3DrMr', type: 'txt' }, '12.1.2507.14': { id: '1Kb0f1ijpnPyFLdkHKzHadRvS3FenqIqL', type: 'txt' }, '12.1.2511': { id: '14k_1KZwT66qJGnV6mbnEw3bjV-YW7e24', type: 'txt' }, '12.1.2511.1': { id: '1OvmZgFOtOoWNVk2zyq1XhFNibCz6pJEc', type: 'txt' }, '12.1.2511.2': { id: '1rV53pygU6L6Ms6x3TU6-syUVsoF6bRs7', type: 'txt' }, '12.1.2511.3': { id: '1WxDLhvrFSwdV2Fj1IDs_VHB6n7KSog8O', type: 'txt' }, '12.1.2511.4': { id: '1lM65BjCZEzqWcTuP2E9aWaKvORK_nxL5', type: 'txt' }, '12.1.2511.5': { id: '1SiFQs7kQFV9lgodbrigees8erNiSg54P', type: 'txt' }, '12.1.2511.6': { id: '1mhhHU3KgpUKHVZ6JFFY2qdDkKYF1_uQ5', type: 'txt' }, '12.1.2511.7': { id: '1yHtTXT2B0ZiTRHnBdbkqQkyEm0epeKhT', type: 'txt' }, '12.1.2511.8': { id: '1gx-1Al9ZOW6jUTwxWrp9HciFn5jZi3d8', type: 'txt' }, '12.1.2603': { id: '1VavQf3Ydp_ig_LlgUU-qSgKchZNuMB6P', type: 'txt' }, '12.2.2411': { id: '1WyGG5rBNM2Uoy_j1W9DyrwFC3Oj63CJx', type: 'txt' }, '12.2.2411.16': { id: '121oW6Mq_ivk2lT9wfORwVhpmkTk84lWL', type: 'txt' }, '12.2.2411.17': { id: '1TImPbeVuRiv2fbPV9DpdIAIuJIN3jIM6', type: 'txt' }, '12.2.2503': { id: '1cIup3Z-F7J4NE9MMoFUj7CLcbpmLOQP6', type: 'txt' }, '12.2.2503.11': { id: '1mfmpLR7h0ruGo397tQCtHpYcSCwpqn4N', type: 'txt' }, '12.2.2503.12': { id: '1O_-1CnuKhm1XAtnVMmsb9ovSBVGWA-6G', type: 'txt' }, '12.2.2503.13': { id: '1bwgAgWYzWRFn2E8L_2Y_xokPepLEIF6_', type: 'txt' }, '12.2.2503.15': { id: '1vIy-eE4UtDvI0Vv7BXPZvyucO2su6KkL', type: 'txt' }, '12.2.2507': { id: '1OGqnrdwMc0j6zwaRhMPNGG8bkuO-kECb', type: 'txt' }, '12.2.2507.4': { id: '1I2PJINB0z4HWlcxDTiq-I9skmO0A9zc8', type: 'txt' }, '12.2.2507.5': { id: '19kiRv3tBFyUSHnGwyvjvGMBhC5EzToXx', type: 'txt' }, '12.2.2507.6': { id: '1L_Jw3GMjz7F_OaNZr_lzcJHRKGW76gbN', type: 'txt' }, '12.2.2507.7': { id: '1ZDyVikOavwwz5rCByx1_s9PyF2czY_BF', type: 'txt' }, '12.2.2507.8': { id: '1cLJ_BPltcqHslEP1Lim0iUMUBPBQrYPz', type: 'txt' }, '12.2.2507.9': { id: '13Er9lyxm4HmPPCd3JNymTvX_Dl4-mdlj', type: 'txt' }, '12.2.2511': { id: '1eGYnJ1I820VGvUwrpuMvWCWqlgiiWvkg', type: 'txt' }, '12.2.2511.1': { id: '1jIW7ElN9zpUw4B-9z98O1pkpyKWXS9vW', type: 'txt' }, '12.2.2511.2': { id: '1MCI-twulc3CVz8rfeoJNF-gXrx_B_QBy', type: 'txt' }, '12.2.2511.3': { id: '1u49828qMI0OtX129cMPD-zysUGof4msV', type: 'txt' }, }; // Função para extrair versão do título "Dicionário de Dados 12.1.2503.14" function getPageVersion() { const versionPattern = /(\d+\.\d+\.\d+(?:\.\d+)?)/; // Método 1: Título da página (Confluence) const selectors = [ 'h1#title-text', '.page-title', 'h1', '[data-page-title]' ]; for (const selector of selectors) { const element = document.querySelector(selector); if (element) { const text = element.textContent.trim(); const match = text.match(versionPattern); if (match) { return match[1]; } } } // Método 2: Meta tags const metaTitle = document.querySelector('meta[property="og:title"], meta[name="title"]'); if (metaTitle) { const titleText = metaTitle.getAttribute('content') || ''; const match = titleText.match(versionPattern); if (match) { return match[1]; } } // Método 3: document.title const titleMatch = document.title.match(versionPattern); if (titleMatch) { return titleMatch[1]; } // Método 4: URL (fallback) const urlParams = new URLSearchParams(window.location.search); const titleParam = urlParams.get('title'); if (titleParam) { const match = decodeURIComponent(titleParam).match(versionPattern); if (match) { return match[1]; } } return null; } // Obter versão const version = getPageVersion(); const container = document.getElementById('widget-container'); if (!version) { container.innerHTML = ` <div class="message-box error"> <span class="message-icon">❌</span> <h2>Versão não identificada</h2> <p>Certifique-se de que o título da página contém a versão no formato:<br> <strong>"Dicionário de Dados 12.1.2503.14"</strong></p> </div> `; return; } // Atualizar display document.getElementById('version-display').textContent = version; document.getElementById('page-title').textContent = `Dicionário de Dados ${version}`; document.getElementById('last-update').textContent = new Date().toLocaleString('pt-BR'); // Obter arquivo (Google Doc ou .txt) para a versão const fileEntry = versionToFile[version]; if (!fileEntry) { container.innerHTML = ` <div class="message-box"> <span class="message-icon">📋</span> <h2>Release Notes ainda não foi expedido para essa versão</h2> <p>O Release Notes para a versão <strong>${version}</strong> ainda não foi expedido.<br> Aguarde a expedição ou verifique se a versão está correta.</p> </div> `; return; } const fileId = fileEntry.id; const fileType = fileEntry.type; // 'doc' | 'txt' | 'file' // Construir URLs corretas por tipo const openUrl = (fileType === 'doc') ? `https://docs.google.com/document/d/${fileId}/edit?usp=sharing` : `https://drive.google.com/file/d/${fileId}/view?usp=sharing`; const previewUrl = (fileType === 'doc') ? `https://docs.google.com/document/d/${fileId}/preview` : `https://drive.google.com/file/d/${fileId}/preview`; // Adicionar link para abrir documento const docLink = document.getElementById('doc-link'); if (docLink) { docLink.href = openUrl; // Ajustar texto do link conforme tipo const labelSpan = docLink.querySelector('span:last-child'); if (labelSpan) { labelSpan.textContent = (fileType === 'doc') ? 'Abrir no Google Docs' : 'Abrir no Google Drive'; } docLink.style.display = 'inline-flex'; } // Verificar se está em modo de edição (Confluence) if (window.location.href.includes('editpage.action') || window.location.href.includes('edit')) { // Modo de edição: mostrar código do macro Widget Connector const widgetCode = `<ac:structured-macro ac:name="widget" ac:schema-version="1"> <ac:parameter ac:name="url">${openUrl}</ac:parameter> <ac:parameter ac:name="width">100%</ac:parameter> <ac:parameter ac:name="height">800</ac:parameter> </ac:structured-macro>`; container.innerHTML = ` <div style="padding: 30px 40px;"> <div style="background: #f4f5f7; padding: 20px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="margin-bottom: 15px; color: #495057;">📋 Código do Widget Connector:</h3> <pre style="background: white; padding: 15px; border-radius: 5px; overflow-x: auto; font-size: 13px; border: 1px solid #dee2e6;">${widgetCode}</pre> </div> <p style="color: #6c757d; font-size: 14px;"> 💡 <strong>Instruções:</strong> Copie o código acima e cole no editor do Confluence usando o macro "Widget Connector". </p> </div> `; } else { // Modo de visualização: usar iframe const iframe = document.createElement('iframe'); iframe.src = previewUrl; iframe.width = '100%'; iframe.height = '800'; iframe.allow = 'fullscreen'; iframe.title = `Dicionário de Dados ${version}`; container.innerHTML = ''; container.appendChild(iframe); } })(); </script> </body> </html> <script src="https://cdn.jsdelivr.net/gh/Juansimeoni/ReleaseDatasul@aacbab7efc799ce5204d55a142412e3631ddf87c/tdn_release_widget.js"></script> |
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas