{"id":756,"date":"2025-09-16T11:08:30","date_gmt":"2025-09-16T14:08:30","guid":{"rendered":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/?page_id=756"},"modified":"2025-10-23T07:29:36","modified_gmt":"2025-10-23T10:29:36","slug":"filtro-de-trabalhos","status":"publish","type":"page","link":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/filtro-de-trabalhos\/","title":{"rendered":"Filtro de Trabalhos"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"756\" class=\"elementor elementor-756\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a69a7ca elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a69a7ca\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-60635af\" data-id=\"60635af\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-05519ab elementor-widget elementor-widget-html\" data-id=\"05519ab\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"sbm-filter-container\">\n    <header class=\"sbm-filter-header\">\n        <h1>Distribui\u00e7\u00e3o de Trabalhos<\/h1>\n        <p>Confira novamente o n\u00famero do painel onde voc\u00ea deve colocar o seu Banners.<\/p>\n        <div style=\"background-color:#ffdddd9c!important;padding:20px;border-radius:10px;color:red;\"><b>Aten\u00e7\u00e3o: <\/b> os trabalhos selecionados para apresenta\u00e7\u00e3o oral est\u00e3o informados <a href=\"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/apresentacao-oral\/\" style=\"color:#1E4ED8 !important;\">neste link<\/a>.\n        <\/div>\n    <\/header>\n    <!-- Se\u00e7\u00e3o de Filtros -->\n    <div class=\"sbm-filters\">\n        <div class=\"sbm-filter-grid\">\n            <!-- Filtro por Painel -->\n            <div>\n                <label for=\"painel-filter\">Painel<\/label>\n                <input type=\"text\" id=\"painel-filter\" placeholder=\"Digite o n\u00ba do painel\">\n            <\/div>\n            <!-- Filtro por TrabalhoID -->\n            <div>\n                <label for=\"trabalhoid-filter\">TrabalhoID<\/label>\n                <input type=\"text\" id=\"trabalhoid-filter\" placeholder=\"Digite o ID do trabalho\">\n            <\/div>\n            <!-- Filtro por \u00c1rea -->\n            <div>\n                <label for=\"area-filter\">\u00c1rea<\/label>\n                <select id=\"area-filter\">\n                    <option value=\"\">Todas as \u00c1reas<\/option>\n                <\/select>\n            <\/div>\n            <!-- Filtro por T\u00edtulo -->\n            <div class=\"titulo-container\">\n                <label for=\"titulo-filter\">T\u00edtulo<\/label>\n                <input type=\"text\" id=\"titulo-filter\" placeholder=\"Digite uma palavra-chave do t\u00edtulo\">\n            <\/div>\n            <!-- Filtro por Dia -->\n            <div>\n                <label for=\"dia-filter\">Dia<\/label>\n                <select id=\"dia-filter\">\n                    <option value=\"\">Ambos os Dias<\/option>\n                    <option value=\"26\/10\">26\/10<\/option>\n                    <option value=\"27\/10\">27\/10<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n        <div class=\"sbm-filter-buttons\">\n            <button id=\"clear-filters-btn\">Limpar Filtros<\/button>\n        <\/div>\n    <\/div>\n    <!-- Resultados -->\n    <div class=\"sbm-results\">\n        <p id=\"results-count-p\"><\/p>\n        <div class=\"sbm-table-wrapper\">\n            <table>\n                <thead>\n                    <tr>\n                        <th>Painel<\/th>\n                        <th>TrabalhoID<\/th>\n                        <th>\u00c1rea<\/th>\n                        <th>T\u00edtulo<\/th>\n                        <th>Dia<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"results-tbody\">\n                    <!-- Linhas da tabela ser\u00e3o inseridas aqui via JavaScript -->\n                <\/tbody>\n            <\/table>\n            <div id=\"no-results-msg\" style=\"display: none;\">\n                <p>Nenhum resultado encontrado para os filtros aplicados.<\/p>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n    document.addEventListener('DOMContentLoaded', () => {\n        \/\/ --- CONFIGURA\u00c7\u00c3O ---\n        const urlDia26 = 'https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-content\/uploads\/2025\/10\/dia26.csv';\n        const urlDia27 = 'https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-content\/uploads\/2025\/10\/dia27.csv';\n        \/\/ --- ELEMENTOS DO DOM ---\n        const painelFilterInput = document.getElementById('painel-filter');\n        const trabalhoIDFilterInput = document.getElementById('trabalhoid-filter');\n        const areaFilterSelect = document.getElementById('area-filter');\n        const tituloFilterInput = document.getElementById('titulo-filter');\n        const diaFilterSelect = document.getElementById('dia-filter');\n        const clearFiltersButton = document.getElementById('clear-filters-btn');\n        const resultsTbody = document.getElementById('results-tbody');\n        const resultsCountP = document.getElementById('results-count-p');\n        const noResultsDiv = document.getElementById('no-results-msg');\n        let allData = [];\n\n        \/\/ --- FUN\u00c7\u00d5ES ---\n        \/**\n         * Converte o texto de um CSV (delimitado por ';') para um array de objetos.\n         * Esta fun\u00e7\u00e3o lida corretamente com quebras de linha e ponto e v\u00edrgula dentro de campos citados.\n         * Ordem esperada no CSV: Painel;TrabalhoID;\u00c1rea;Titulo;Dia;Resumo\n         *\/\n        function parseCSV(csvText) {\n            const data = [];\n            \/\/ Remove \\r and trim whitespace\n            const text = csvText.replace(\/\\r\/g, '').trim();\n            let cursor = 0;\n            \n            \/\/ Skip header line\n            const headerEnd = text.indexOf('\\n');\n            if (headerEnd === -1) return []; \/\/ No content after header\n            cursor = headerEnd + 1;\n\n            while (cursor < text.length) {\n                const row = [];\n                let field = '';\n                let inQuotes = false;\n\n                while (cursor < text.length) {\n                    const char = text[cursor];\n\n                    if (inQuotes) {\n                        if (char === '\"') {\n                            if (text[cursor + 1] === '\"') { \/\/ Handle escaped quote \"\"\n                                field += '\"';\n                                cursor++;\n                            } else {\n                                inQuotes = false;\n                            }\n                        } else {\n                            field += char;\n                        }\n                    } else {\n                         if (char === '\"') {\n                            inQuotes = true;\n                        } else if (char === ';') {\n                            row.push(field);\n                            field = '';\n                        } else if (char === '\\n') {\n                            row.push(field);\n                            cursor++;\n                            break; \/\/ End of row\n                        } else {\n                            field += char;\n                        }\n                    }\n                    cursor++;\n                }\n\n                if (cursor >= text.length && (field || row.length > 0)) { \n                    row.push(field);\n                }\n\n                if (row.length >= 5 && row.some(f => f.trim() !== '')) {\n                    const entry = {\n                        painel: row[0]?.trim() || '',\n                        trabalhoID: row[1]?.trim() || '',\n                        \u00e1rea: row[2]?.trim() || '',\n                        titulo: row[3]?.trim() || '',\n                        dia: row[4]?.trim() || '', \n                        resumo: row[5]?.trim() || '',\n                    };\n                    data.push(entry);\n                }\n            }\n            return data;\n        }\n\n        \/**\n         * Preenche o dropdown de \u00e1reas com valores \u00fanicos.\n         *\/\n        function populateAreaFilter(data) {\n            const areas = [...new Set(data.map(item => item.\u00e1rea.trim()))].sort();\n            areas.forEach(area => {\n                if (area) {\n                    const option = document.createElement('option');\n                    option.value = area;\n                    option.textContent = area;\n                    areaFilterSelect.appendChild(option);\n                }\n            });\n        }\n\n        \/**\n         * Renderiza as linhas da tabela com os dados fornecidos.\n         * Cada trabalho tem uma linha principal e uma linha de resumo (oculta).\n         *\/\n        function renderTable(data) {\n            resultsTbody.innerHTML = ''; \n            noResultsDiv.style.display = data.length === 0 ? 'block' : 'none';\n\n            data.forEach(item => {\n                \/\/ Linha Principal\n                const mainRow = document.createElement('tr');\n                mainRow.classList.add('main-data-row');\n                mainRow.innerHTML = `\n                    <td>${item.painel}<\/td>\n                    <td>${item.trabalhoID}<\/td>\n                    <td>${item.\u00e1rea}<\/td>\n                    <td><span class=\"toggle-icon\">[+]<\/span>${item.titulo}<\/td>\n                    <td>${item.dia}<\/td>\n                `;\n                resultsTbody.appendChild(mainRow);\n                \n                \/\/ Linha do Resumo (oculta por padr\u00e3o)\n                if (item.resumo && item.resumo.trim() !== '') {\n                    const resumoRow = document.createElement('tr');\n                    resumoRow.classList.add('resumo-row');\n                    resumoRow.style.display = 'none';\n                    resumoRow.innerHTML = `\n                        <td colspan=\"5\" class=\"resumo-cell\">\n                            <b>Resumo:<\/b> ${item.resumo}\n                        <\/td>\n                    `;\n                    resultsTbody.appendChild(resumoRow);\n                }\n            });\n        }\n\n        \/**\n         * Filtra os dados com base nos valores dos inputs e atualiza a tabela.\n         *\/\n        function applyFilters() {\n            const painelFilter = painelFilterInput.value.toLowerCase();\n            const trabalhoIDFilter = trabalhoIDFilterInput.value.toLowerCase();\n            const areaFilter = areaFilterSelect.value;\n            const tituloFilter = tituloFilterInput.value.toLowerCase();\n            const diaFilter = diaFilterSelect.value;\n            const filteredData = allData.filter(item => {\n                if (!item || !item.painel || !item.\u00e1rea || !item.titulo) return false;\n                \n                const painelMatch = item.painel.toLowerCase().includes(painelFilter);\n                const trabalhoIDMatch = item.trabalhoID.toLowerCase().includes(trabalhoIDFilter);\n                const areaMatch = !areaFilter || item.\u00e1rea === areaFilter;\n                const tituloMatch = item.titulo.toLowerCase().includes(tituloFilter);\n                const diaMatch = !diaFilter || item.dia === diaFilter;\n\n                return painelMatch && trabalhoIDMatch && areaMatch && tituloMatch && diaMatch;\n            });\n            renderTable(filteredData);\n            resultsCountP.textContent = '';\n        }\n\n        \/**\n         * Limpa todos os filtros e re-renderiza a tabela completa.\n         *\/\n        function clearFilters() {\n            painelFilterInput.value = '';\n            trabalhoIDFilterInput.value = '';\n            areaFilterSelect.value = '';\n            tituloFilterInput.value = '';\n            diaFilterSelect.value = '';\n            applyFilters();\n        }\n\n        \/**\n         * Carrega e processa os dados dos arquivos CSV a partir das URLs.\n         *\/\n        async function loadAndProcessData() {\n            try {\n                resultsCountP.textContent = 'Carregando dados...';\n                \n                const fetchAndDecode = async (url) => {\n                    const response = await fetch(url);\n                    if (!response.ok) {\n                        throw new Error(`Erro HTTP ${response.status} ao carregar ${url}`);\n                    }\n                    const buffer = await response.arrayBuffer();\n                    \/\/ Usando TextDecoder para lidar com a acentua\u00e7\u00e3o (UTF-8)\n                    return new TextDecoder('UTF-8').decode(buffer);\n                };\n                const [text26, text27] = await Promise.all([\n                    fetchAndDecode(urlDia26),\n                    fetchAndDecode(urlDia27)\n                ]);\n                allData = [\n                    ...parseCSV(text26),\n                    ...parseCSV(text27)\n                ].filter(item => item.painel); \n                if (allData.length === 0) {\n                    resultsCountP.textContent = 'Nenhum dado encontrado. Verifique as URLs e o formato dos arquivos.';\n                    return;\n                }\n                \n                populateAreaFilter(allData);\n                applyFilters();\n            } catch (error) {\n                console.error('Falha ao carregar os dados CSV:', error);\n                resultsCountP.textContent = 'Erro ao carregar os dados.';\n                resultsTbody.innerHTML = `<tr><td colspan=\"5\" style=\"text-align: center; color: red; padding: 2rem;\">Falha ao buscar os dados. Verifique se as URLs est\u00e3o corretas e acess\u00edveis.<\/td><\/tr>`;\n            }\n        }\n\n        \/\/ --- INICIALIZA\u00c7\u00c3O ---\n        loadAndProcessData();\n        \/\/ --- EVENT LISTENERS ---\n        [painelFilterInput, tituloFilterInput].forEach(input => {\n    input.addEventListener('keyup', applyFilters);\n});\n[areaFilterSelect, diaFilterSelect].forEach(select => {\n    select.addEventListener('change', applyFilters);\n});\nclearFiltersButton.addEventListener('click', clearFilters);\n\n\/\/ trava espa\u00e7os no TrabalhoID\ntrabalhoIDFilterInput.addEventListener('input', () => {\n    trabalhoIDFilterInput.value = trabalhoIDFilterInput.value.replace(\/\\s+\/g, '');\n    applyFilters();\n});\n        \n        \/\/ Listener para expandir\/recolher o resumo\n        resultsTbody.addEventListener('click', (event) => {\n            const mainRow = event.target.closest('.main-data-row');\n            if (mainRow) {\n                const resumoRow = mainRow.nextElementSibling;\n                if (resumoRow && resumoRow.classList.contains('resumo-row')) {\n                    const isVisible = resumoRow.style.display !== 'none';\n                    resumoRow.style.display = isVisible ? 'none' : 'table-row';\n                    const icon = mainRow.querySelector('.toggle-icon');\n                    if (icon) {\n                        icon.textContent = isVisible ? '[+]' : '[-]';\n                    }\n                }\n            }\n        });\n    });\n<\/script>\n\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5b28ba elementor-widget elementor-widget-text-editor\" data-id=\"d5b28ba\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.21.0 - 18-04-2024 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p><strong>SOBRE A CONFEC\u00c7\u00c3O E APRESENTA\u00c7\u00c3O DO P\u00d4STER<\/strong> <br \/><br \/>O tamanho deve ser confeccionado na vertical, tamanho m\u00e1ximo de 1,0 m de largura por 1,5 m. de altura.<br \/><br \/>O p\u00f4ster dever\u00e1 ser afixado de acordo com a programa\u00e7\u00e3o, que ser\u00e1 elaborada pela coordena\u00e7\u00e3o cient\u00edfica do evento, sendo obrigat\u00f3ria a presen\u00e7a do apresentador durante o per\u00edodo estabelecido.<\/p><p>O p\u00f4ster poder\u00e1 ser confeccionado em Portugu\u00eas ou Ingl\u00eas(Food micro)).<\/p><p>Fixar o P\u00f4ster entre \u00e0s 14hs e 16hs do dia de sua apresenta\u00e7\u00e3o. As sess\u00f5es de p\u00f4steres ser\u00e3o realizadas nos dias 26,27 de outubro de 2025 das 19hs \u00e0s 20hs de acordo com a programa\u00e7\u00e3o do evento. Caso o apresentador n\u00e3o esteja presente, ser\u00e1 facultado \u00e0 Comiss\u00e3o Cient\u00edfica o fornecimento de certificados.<\/p><p><strong>Modelo do p\u00f4ster:<\/strong><br \/>A SBM n\u00e3o determina um modelo \u00fanico para confec\u00e7\u00e3o do p\u00f4ster.<\/p><p>Caso o p\u00f4ster n\u00e3o seja fixado, os autores ser\u00e3o impedidos de apresentar trabalhos por dois congressos consecutivos.<\/p><p><strong>O p\u00f4ster dever\u00e1 apresentar:<\/strong><br \/>a) t\u00edtulo b) autor(es) c) introdu\u00e7\u00e3o <br \/>d) material e m\u00e9todos (quando pesquisa); diagn\u00f3stico ou plano de tratamento (quando casos cl\u00ednicos) <br \/>e) resultados e conclus\u00f5es <br \/>f) refer\u00eancias bibliogr\u00e1ficas<br \/><br \/>A responsabilidade pela seguran\u00e7a e poss\u00edveis danos ao p\u00f4ster, \u00e9 \u00fanica e exclusiva do apresentador A Comiss\u00e3o de Avalia\u00e7\u00e3o dos P\u00f4steres e a Secretaria do Congresso n\u00e3o se responsabilizam pelos p\u00f4steres n\u00e3o retirados dos pain\u00e9is ap\u00f3s o t\u00e9rmino da exibi\u00e7\u00e3o.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Distribui\u00e7\u00e3o de Trabalhos Confira novamente o n\u00famero do painel onde voc\u00ea deve colocar o seu Banners. Aten\u00e7\u00e3o: os trabalhos selecionados para apresenta\u00e7\u00e3o oral est\u00e3o informados neste link. Painel TrabalhoID \u00c1rea Todas as \u00c1reas T\u00edtulo Dia Ambos os Dias26\/1027\/10 Limpar Filtros Painel TrabalhoID \u00c1rea T\u00edtulo Dia Nenhum resultado encontrado para os filtros aplicados. SOBRE A CONFEC\u00c7\u00c3O [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/pages\/756"}],"collection":[{"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/comments?post=756"}],"version-history":[{"count":144,"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/pages\/756\/revisions"}],"predecessor-version":[{"id":1107,"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/pages\/756\/revisions\/1107"}],"wp:attachment":[{"href":"https:\/\/sbmicrobiologia.org.br\/33cbm2025\/wp-json\/wp\/v2\/media?parent=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}