Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
HTML
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
  <meta  <style>
        .release-notes-container {
            name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Release Notes</title>
</head>
<body style="margin:0; padding:0; font-family: Arial, Helvetica, sans-serif; background:#ffffff;">
            <div style="max-width: 1200px;
 margin:0 auto; padding:16px;">
    <div style="border:1px solid #dfe1e6;  margin: 0 auto;border-radius:8px; overflow:hidden;">
      <div      style="background:#0052CC; color:#fff; padding:14px 20px16px;">
        }
        .header {<div style="display:flex; align-items:center; gap:12px;">
          <!-- TOTVS background:logo linear-gradient(135deg,anexo #667eea 0%, #764ba2 100%);do Confluence/TDN):
            color: white;
  - Nome do anexo: "totvs logo.jpg"
     padding: 20px;
         - O JS border-radius: 8px;
            margin-bottom: 20px;
abaixo tenta carregar primeiro do pageId atual, e cai em fallback se não achar -->
          }<img
         .header  h1 { id="totvs-logo"
            margin: 0;alt="TOTVS"
            font-size: 24px;
        }
 style="display:none; height:28px; width:auto; background:#ffffff; border-radius:6px; padding:4px; border:1px solid rgba(255,255,255,0.35);"
       .metadata {   />
          <div  background-color: #f4f5f7;
  id="page-title" style="font-size:18px; font-weight:700;">Dicionário de Dados</div>
        </div>
  padding: 15px;
   </div>

      <div style="background:#f4f5f7;  border-radiustop:1px 5pxsolid #dfe1e6;
 padding:12px 16px; display:flex; gap:12px;        margin: 20px 0;align-items:center; flex-wrap:wrap;">
        <div style="display:flex;   display: flex;gap:8px; align-items:center;">
            justify-content: space-between;<div style="font-weight:700; color:#172b4d;">Versão:</div>
            flex-wrap: wrap;
        }<div id="version-display" style="background:#fff; border:1px solid #dfe1e6; border-radius:6px; padding:4px 10px; font-weight:700; color:#172b4d;">-</div>
        .metadata-item {</div>

        <div style="display:flex;   margin: 5px 0;gap:8px; align-items:center;">
        }
        .metadata-item strong {<div style="font-weight:700; color:#172b4d;">Atualizado:</div>
          <div  color: #667eea;
        }id="last-update" style="background:#fff; border:1px solid #dfe1e6; border-radius:6px; padding:4px 10px; color:#172b4d;">-</div>
        .widget-container {</div>

        <a id="doc-link" href="#" target="_blank" style="display:none; margin-left: 20px 0;
       auto; text-decoration:none; background:#ffffff; color:#0052CC; border:1px solid #0052CC; border-radius:6px; padding:6px 10px; font-weight:700;">
     border: 1px solid #ddd;
  Abrir no Drive
        border-radius: 5px;</a>
            overflow: hidden;</div>

      <div      id="widget-container" style="min-height:520px; 600pxbackground:#ffffff;">
        }
   <div style="padding:18px; color:#6b778c;">Carregando documento...</div>
     .loading {</div>
    </div>
   </div>

  <script>
   text-align: center;
            padding: 40px;(function() {
    // Mapeamento de versões para arquivos no Drive (Google Docs ou .txt)
    // Pasta: 141aJRhZeYZca4QCBnou6-00WzRLkBYbs
    // Data:  color: #666;2025-12-17 09:03:10
    // Total: 79  }versões
    const versionToFile   .error= {
            background-color: #fee;'12.1.2411': { id: '1Lv47Us2UXm2UP0JjtfGFiOcVXW9cwSjS', type: 'txt' },
    '12.1.2411.1': { id: '12KVuystA1cYiy8KyStDkuRZ6Y_bnd7vp', type:    color: #c33;'txt' },
    '12.1.2411.2': { id:      padding: 15px;
            border-radius: 5px;
            margin: 20px 0;
        }
        .warning {
            background-color: #fff3cd;
            color: #856404;
            padding: 15px;
            border-radius: 5px;
            margin: 20px 0;
        }
        .links {
            margin: 20px 0;
        }
        .links a {
            display: inline-block;
            margin: 5px 10px 5px 0;
            padding: 8px 15px;
            background-color: #0052CC;
            color: white;
            text-decoration: none;
            border-radius: 4px;
            font-weight: bold;
        }
        .links a:hover {
            background-color: #0065FF;
        }
    </style>
</head>
<body>
    <div class="release-notes-container">
        <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">Carregando...</span>
            </div>
            <div class="metadata-item">
                <strong>Última atualização:</strong> <span id="last-update">-</span>
            </div>
        </div>
        
        <div class="links" id="links-container">
            <!-- Links serão inseridos aqui -->
        </div>
        
        <div class="widget-container">
            <div id="loading" class="loading">
                🔄 Carregando documento...
            </div>
            <div id="error" class="error" style="display: none;"></div>
            <div id="warning" class="warning" style="display: none;"></div>
            <div id="widget-placeholder"></div>
        </div>
    </div>

    <script>
        (function() {
            // Mapeamento de versões para Document IDs do Google Docs
            // Gerado automaticamente a partir da pasta do Google Drive
            // ATUALIZADO: 2025-12-16
            const versionToDocId = {
                // Google Docs existentes
                '12.1.2503.14': '13QaSU_lP1_haWnOYl7UjPvsKfi3AaPdKwciYHrceEt4',
                '12.1.2511.2': '1gLo16QDT99iGdaoKyFHBW1n5jF-gt-awBjnSQrBZa3c',
                
                // NOTA: A maioria das versões ainda tem apenas arquivos .txt
                // Quando os arquivos .txt forem convertidos para Google Docs,
                // adicione os Document IDs aqui ou execute o script generate_version_mapping.py novamente
            };
            
            // Função para extrair versão do título "Dicionário de Dados 12.1.2503.14"
            function extractVersionFromTitle() {
                let version = null'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: '1P8o3z3encE-72SlMTylf7t0rovGZVOJMCGado1To4Ok', type: 'doc' },
    '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' },
    };

    function getPageVersion() {
      const versionPattern = /(\d+\.\d+\.\d+(?:\.\d+)?)/;

      const pageTitleElement = document.querySelector('h1#title-text, .page-title, h1, [data-page-title]');
      if (pageTitleElement) {
        const titleText = (pageTitleElement.textContent || '').trim();
        const match = titleText.match(versionPattern);
     
   if (match) return match[1];
      }

     // Padrãoconst regexmetaTitle para versão: números.números.números.números= document.querySelector('meta[property="og:title"], meta[name="title"]');
      if (metaTitle) {
        const versionPatterntitleText = /(\d+\.\d+\.\d+(?:\.\d+)?)/metaTitle.getAttribute('content') || '';
        const match = titleText.match(versionPattern);
     
   if (match) return match[1];
      }

     // Métodoconst 1:titleMatch Título da página (Confluence)= (document.title || '').match(versionPattern);
      if (titleMatch) return titleMatch[1];

       const pageTitle = document.querySelector('h1#title-text, .page-title, h1, [data-page-title]')return null;
    }

    function getPageId() {
      if (pageTitle)try {
        const qs = new URLSearchParams(window.location.search);
        const titleTextfromQuery = pageTitleqs.textContent.trim(get('pageId');
        if (fromQuery) return String(fromQuery);
      } catch (e) { const/* matchignore = titleText.match(versionPattern);*/ }

      // Confluence costuma expor isso quando AJS está disponível
      iftry (match) {
        if (window.AJS && AJS.params && AJS.params.pageId) return String(AJS.params.pageId);
      } catch (e) version{ = match[1];
  /* ignore */ }

      return null;
    }

    function setTotvsLogo() {
 }
     const logoEl = document.getElementById('totvs-logo');
      if  }(!logoEl) return;

      const pageId = getPageId();
      const 
filename = 'totvs logo.jpg';
      const encodedName      // Método 2: Meta tags= encodeURIComponent(filename);

      const candidates = [];
       if (!versionpageId) {
        // thumbnails costuma funcionar melhor no Confluence
      const metaTitle = documentcandidates.querySelector('meta[property="og:title"], meta[name="title"]');
        push('/download/thumbnails/' + pageId + '/' + encodedName + '?api=v2');
        candidates.push('/download/attachments/' + pageId + '/' if+ (metaTitleencodedName);
 {
     }
      // fallback: página “principal” antiga (se existir o anexo  também)
   const titleText = metaTitlecandidates.getAttributepush('content') || '';
/download/attachments/649987902/' + encodedName);

      let idx = 0;
               const match = titleText.match(versionPattern);function tryNext() {
        if (idx               if (match) {>= candidates.length) return;
                            version = match[1];
                        }
                    }
                }
                
                // Método 3: document.title
                if (!version) {
                    const match = document.title.match(versionPattern);
                    if (match) {
                        version = match[1];
                    }
                }
                
                // Método 4: URL (fallback)
                if (!version) {
                    const urlParams = new URLSearchParams(window.location.search);
                    const titleParam = urlParams.get('title');
                    if (titleParam) {
                        const match = decodeURIComponent(titleParam).match(versionPattern);
                        if (match) {
                            version = match[1];
                        }
                    }
                }
                
                return version;
            }
            
            // Função para buscar Document ID no Google Drive (via API - requer autenticação)
            // Esta é uma função placeholder - você precisaria implementar a busca via API
            async function findDocumentInDrive(version) {
                // Por enquanto, retorna null
                // Em uma implementação completa, você faria uma chamada à API do Google Drive
                // para buscar o documento pelo nome
                return null;
            }
            
            // Função principal
            function init() {
                const version = extractVersionFromTitle();
                
                if (!version) {
                    document.getElementById('error').style.display = 'block';
                    document.getElementById('error').innerHTML = 
                        '❌ <strong>Versão não identificada</strong><br>' +
                        'Certifique-se de que o título da página contém a versão no formato: "Dicionário de Dados 12.1.2503.14"';
                    document.getElementById('loading').style.display = 'none';
                    return;
                }
                
                // Atualizar interface
                document.getElementById('version').textContent = version;
                document.getElementById('page-title').textContent = `Dicionário de Dados ${version}`;
                document.getElementById('last-update').textContent = new Date().toLocaleString('pt-BR');
                
                // Obter Document ID
                let docId = versionToDocId[version];
                
                if (!docId) {
                    // Tentar buscar no Google Drive (se implementado)
                    findDocumentInDrive(version).then(foundId => {
                        if (foundId) {
                            docId = foundId;
                            loadDocument(docId, version);
                        } else {
                            showWarning(version);
                        }
                    });
                    
                    if (!docId) {
                        showWarning(version);
                        return;
                    }
                }
                
                loadDocument(docId, version);
            }
            
            function showWarning(version) {
                document.getElementById('warning').style.display = 'block';
                document.getElementById('warning').innerHTML = 
                    `⚠️ <strong>Documento não encontrado para versão ${version}</strong><br>` +
                    `O documento pode ainda não ter sido criado no Google Drive ou o mapeamento precisa ser atualizado.<br>` +
                    `Verifique se existe um Google Doc com o nome "${version}" ou "${version}.txt" na pasta.`;
                document.getElementById('loading').style.display = 'none';
            }
            
            function loadDocument(docId, version) {
                // Construir URL do Google Doc
                const googleDocUrl = `https://docs.google.com/document/d/${docId}/edit?usp=sharing`;
                const previewUrl = `https://docs.google.com/document/d/${docId}/preview`;
                
                // Criar links
                const linksContainer = document.getElementById('links-container');
                linksContainer.innerHTML = `
                    <a href="${googleDocUrl}" target="_blank">📄 Abrir no Google Docs</a>
                    <a href="https://drive.google.com/drive/folders/141aJRhZeYZca4QCBnou6-00WzRLkBYbs" target="_blank">📁 Pasta Release Notes</a>
                    <a href="https://tdn.totvs.com/pages/viewpage.action?pageId=649987902" target="_blank">📚 Release Notes Principal</a>
                `;
                
                // Criar Widget Connector ou iframe
                const placeholder = document.getElementById('widget-placeholder');
                
                // Verificar se está em modo de edição do Confluence
                const isEditMode = window.location.href.includes('editpage.action') || 
                                  window.location.href.includes('edit');
                
                if (isEditMode) {
                    // 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">${googleDocUrl}</ac:parameter>
  <ac:parameter ac:name="width">100%</ac:parameter>
  <ac:parameter ac:name="height">800</ac:parameter>
</ac:structured-macro>`const url = candidates[idx++];
        const probe = new Image();
        
probe.onload = function() {
                 placeholder.innerHTMLlogoEl.src = `url;
          logoEl.style.display = 'inline-block';
        };
    <div style="background: #f4f5f7; padding: 15px; border-radius: 5px; margin: 10px 0;"> probe.onerror = function() {
          tryNext();
        };
        probe.src = url;
  <p><strong>📋 Código do Widget Connector:</strong></p> }

      tryNext();
    }

    // Tenta resolver o logo mesmo antes de identificar versão/documento
    setTotvsLogo();

    const <preversion style="background: white; padding: 10px; border-radius: 3px; overflow-x: auto; font-size: 12px;">${widgetCode}</pre> getPageVersion();
    const container = document.getElementById('widget-container');
    const docLink = document.getElementById('doc-link');

    if (!version) {
      container.innerHTML =
        <p'<div style="margin-top: 10px; font-size: 12pxpadding:18px; border-left:4px solid #DE350B; background:#FFEBE6; color: #666#172b4d;">' +
          '<div style="font-weight:700; margin-bottom:6px;">Versão não identificada</div>' +
          '<div>Coloque a versão no título da página, ex: <b>Dicionário de 💡 <strong>Instruções:</strong> Copie o código acima e cole no editor do Confluence usando o macro "Widget Connector".Dados 12.1.2503.14</b></div>' +
        '</div>';
      return;
    }

    document.getElementById('version-display').textContent = version;
    document.getElementById('page-title').textContent = 'Dicionário de Dados ' + version;
    document.getElementById('last-update').textContent =  </p>
   new Date().toLocaleString('pt-BR');

    const entry = versionToFile[version];
    if (!entry) {
        </div>container.innerHTML =
        '<div style="padding:18px; border-left:4px solid #FFAB00; background:#FFFAE6; color:#172b4d;">' +
     `;
     '<div style="font-weight:700; margin-bottom:6px;">Documento ainda não     está disponível } else {no momento</div>' +
          '<div>O Release Notes para a versão <b>' + version + '<//b> Modoainda denão visualização: usar iframefoi expedido.</div>' +
        '</div>';
      return;
    }

    const iframefileId = document.createElement('iframe')entry.id;
    const fileType = entry.type;

             iframe.src = previewUrl;// Link SEMPRE para o Drive (como solicitado)
    const driveOpenUrl = 'https://drive.google.com/file/d/' + fileId + '/view?usp=sharing';
    docLink.href = driveOpenUrl;
    iframedocLink.style.widthdisplay = '100%inline-block';

    // Preview: Docs preview para Google Doc; Drive preview para txt
    const previewUrl = iframe.height(fileType === '800doc';)
      ? ('https://docs.google.com/document/d/' + fileId + '/preview')
      : ('https://drive.google.com/file/d/' + iframe.style.border =fileId + 'none/preview');

    // Modo de edição: mostrar macro Widget Connector (URL do Drive)
    const isEditMode =  iframe.style.borderRadius = '5px'window.location.pathname.includes('/pages/editpage.action');
    if (isEditMode) {
      const widgetCode =
      iframe.allow = 'fullscreen';
   <ac:structured-macro ac:name="widget" ac:schema-version="1">\n' +
        '  <ac:parameter ac:name="url">' + driveOpenUrl + '</ac:parameter>\n' +
 iframe.title = `Dicionário de Dados ${version}`;
  '  <ac:parameter ac:name="width">100%</ac:parameter>\n' +
        '  <ac:parameter ac:name="height">800</ac:parameter>\n' +
  
       '</ac:structured-macro>';

      const escaped =     placeholder.appendChild(iframewidgetCode.replace(/</g, '<').replace(/>/g, '>');
      container.innerHTML =
        '<div  }style="padding:16px;">' +
          '<div style="font-weight:700; margin-bottom:8px; color:#172b4d;">Código do Widget Connector</div>' +
          '<pre style="white-space:pre-wrap; background:#f4f5f7; border:1px solid  document.getElementById('loading').style.display = 'none';
     #dfe1e6; padding:12px; border-radius:6px;">' + escaped + '</pre>' +
       }
   '<div         
    style="color:#6b778c; margin-top:8px;">Copie o código acima e cole no macro <b>Widget Connector</b>.</div>' +
        // Executar quando a página carregar'</div>';
      return;
    }

    const iframe   if= (document.readyState === 'loadingcreateElement('iframe') {;
    iframe.src = previewUrl;
    iframe.width      document.addEventListener('DOMContentLoaded', init);
  = '100%';
    iframe.height = '800';
    } else {iframe.style.border = '0';
    iframe.setAttribute('allowfullscreen', 'true');
    iframe.title = 'Dicionário de Dados ' + init()version;

    container.innerHTML = '';
      }container.appendChild(iframe);
        })(); 
    </script>
</body>
</html>