';
return;
}
renderEventsList(events.slice(0, state.displayedEventsCount));
// Adiciona botão "Ver Mais" se houver mais eventos
if (events.length > state.displayedEventsCount) {
const loadMoreWrapper = document.createElement('div');
loadMoreWrapper.className = 'avel-load-more-wrapper';
loadMoreWrapper.innerHTML = `
VER MAIS EVENTOS
(+${events.length - state.displayedEventsCount})
`;
container.appendChild(loadMoreWrapper);
}
};
const renderEventsList = (events) => {
const container = getEl('avelEventsContainer');
const indexMap = new Map(state.rawData.map((e, i) => [e, i]));
// Agrupa eventos por mês
const monthGroups = new Map();
events.forEach((event) => {
const monthLabel = getMonthLabel(event.data);
if (!monthGroups.has(monthLabel)) monthGroups.set(monthLabel, []);
monthGroups.get(monthLabel).push(event);
});
const monthOrder = Array.from(monthGroups.keys());
const buildCard = (event) => {
const displayDate = formatDisplayDate(event.data);
const eventIndex = indexMap.get(event);
const isFechado = event.modalidade.toLowerCase().includes('fechado');
let actionHtml = '';
if (isFechado) {
actionHtml = `
EVENTO EXCLUSIVO
`;
} else {
const hasMaterial = (event.convite && event.convite.trim() !== '') || (event.texto && event.texto.trim() !== '');
const disabledAttr = hasMaterial ? '' : 'disabled';
actionHtml = `
${hasMaterial ? 'CONVITE E MATERIAL' : 'MATERIAL INDISPONÍVEL'}
`;
}
return `
${escapeHTML(displayDate)}
${escapeHTML(event.assunto)}
${escapeHTML(event.tipo)}
${escapeHTML(event.modalidade)}
${actionHtml}
`;
};
let html = monthOrder.map((monthKey) => {
const monthEvents = monthGroups.get(monthKey) || [];
return `
${monthEvents.map(buildCard).join('')}
`;
}).join('');
// Adiciona espaço extra se todos os eventos foram carregados
if (state.displayedEventsCount >= state.filteredEvents.length) {
html += '
';
}
container.innerHTML = html;
};
const applyQuickFilters = (events) => {
let filtered = events;
// Filtro de eventos abertos (não fechados)
if (state.quickFilters.open) {
filtered = filtered.filter(e => !e.modalidade.toLowerCase().includes('fechado'));
}
// Filtro de eventos fechados
if (state.quickFilters.closed) {
filtered = filtered.filter(e => e.modalidade.toLowerCase().includes('fechado'));
}
// Filtro de eventos com material disponível (Ignora se for fechado)
if (state.quickFilters.material) {
filtered = filtered.filter(e => {
const isFechado = e.modalidade.toLowerCase().includes('fechado');
const hasMaterial = (e.convite && e.convite.trim() !== '') || (e.texto && e.texto.trim() !== '');
return hasMaterial && !isFechado;
});
}
return filtered;
};
const applyFilters = () => {
const searchTerm = getEl('avelSearch').value.trim().toLowerCase();
let filteredEvents = filterEvents(state.rawData, searchTerm);
filteredEvents = applyFilterLogic(filteredEvents);
filteredEvents = applyQuickFilters(filteredEvents);
renderEvents(filteredEvents);
};
const loadMoreEvents = () => {
if (state.isLoadingMore || state.displayedEventsCount >= state.filteredEvents.length) return;
state.isLoadingMore = true;
state.displayedEventsCount = state.filteredEvents.length;
const container = getEl('avelEventsContainer');
const loadMoreWrapper = container.querySelector('.avel-load-more-wrapper');
if (loadMoreWrapper) loadMoreWrapper.remove();
renderEventsList(state.filteredEvents.slice(0, state.displayedEventsCount));
state.isLoadingMore = false;
};
const setupViewToggle = (viewMode) => {
const container = getEl('avelEventsContainer');
const listBtn = getEl('listViewBtn');
const gridBtn = getEl('gridViewBtn');
listBtn.classList.remove('active');
gridBtn.classList.remove('active');
if (viewMode === 'grid') {
container.classList.add('grid-view');
gridBtn.classList.add('active');
} else {
container.classList.remove('grid-view');
listBtn.classList.add('active');
}
};
const toggleView = (viewMode) => {
const normalizedView = viewMode === 'grid' ? 'grid' : 'list';
state.viewMode = normalizedView;
try { localStorage.setItem('avelViewMode', normalizedView); } catch(e) { /* storage unavailable */ }
setupViewToggle(normalizedView);
};
const toggleQuickFilter = (filterType) => {
// Se clicar no mesmo filtro, desativa
if (state.quickFilters[filterType]) {
state.quickFilters[filterType] = false;
} else {
// Se for 'open' ou 'closed', desativa o outro
if (filterType === 'open') {
state.quickFilters.open = true;
state.quickFilters.closed = false;
} else if (filterType === 'closed') {
state.quickFilters.closed = true;
state.quickFilters.open = false;
} else {
state.quickFilters[filterType] = true;
}
}
// Atualiza UI apenas do botão de material que sobrou
const matBtn = getEl('quickFilterMaterial');
if (matBtn) matBtn.classList.toggle('active', state.quickFilters.material);
applyFilters();
};
const openModal = (eventIndex) => {
const event = state.rawData[eventIndex];
document.getElementById('mTitle').textContent = event.assunto;
const actionsContainer = getEl('avelModalActions');
if (!event.convite && !event.texto) {
actionsContainer.innerHTML = `
O material de divulgação deste evento estará disponível em breve. Fique atento!
`;
} else {
let html = '';
if (event.convite) html += `
SALVAR IMAGEM DO CONVITE `;
if (event.texto) html += `
COPIAR MENSAGEM PARA CLIENTE `;
actionsContainer.innerHTML = html;
if (event.convite) {
document.getElementById('mDl').onclick = () => {
const url = safeURL(getDirectDownloadUrl(event.convite));
if (url) window.open(url, '_blank', 'noopener,noreferrer');
};
}
if (event.texto) {
const copyBtn = document.getElementById('mCp');
copyBtn.onclick = () => {
navigator.clipboard.writeText(event.texto).then(() => {
const originalText = copyBtn.textContent;
copyBtn.textContent = "TEXTO COPIADO!";
setTimeout(() => copyBtn.textContent = originalText, 2000);
}).catch(() => {
copyBtn.textContent = "ERRO AO COPIAR";
setTimeout(() => copyBtn.textContent = "COPIAR MENSAGEM PARA CLIENTE", 2000);
});
};
}
}
getEl('avelModal').classList.add('active');
};
const closeModal = () => getEl('avelModal').classList.remove('active');
const openInfoModal = () => {
getEl('avelInfoModal').classList.add('active');
};
const closeInfoModal = () => {
getEl('avelInfoModal').classList.remove('active');
};
const openFilters = () => {
getEl('avelFiltersOverlay').classList.add('active');
};
const closeFilters = () => {
getEl('avelFiltersOverlay').classList.remove('active');
};
const extractFilterOptions = (events) => {
const cities = new Set(), months = new Set(), types = new Set(), status = new Set();
const monthNames = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
events.forEach(event => {
if (event.cidade && event.cidade !== 'A definir') cities.add(event.cidade);
if (event.tipo) types.add(event.tipo);
if (event.modalidade) status.add(event.modalidade);
if (event.data && event.data !== 'A definir') {
const mIdx = parseInt(event.data.split('/')[1]) - 1;
if (monthNames[mIdx]) months.add(monthNames[mIdx]);
}
});
state.availableCities = Array.from(cities).sort();
state.availableMonths = Array.from(months);
state.availableTypes = Array.from(types).sort();
state.availableStatus = Array.from(status).sort();
renderFilterOptions();
};
const renderFilterOptions = () => {
const citiesContainer = getEl('citiesFilterContainer');
const monthsContainer = getEl('monthsFilterContainer');
const typeContainer = getEl('typeFilterContainer');
const statusContainer = getEl('statusFilterContainer');
citiesContainer.innerHTML = state.availableCities.map(city => `
${escapeHTML(city)} `).join('');
monthsContainer.innerHTML = state.availableMonths.map(month => `
${escapeHTML(month)} `).join('');
statusContainer.innerHTML = state.availableStatus.map(st => `
${escapeHTML(st)} `).join('');
typeContainer.innerHTML = state.availableTypes.map(t => `
${escapeHTML(t)} `).join('');
};
const applyFilterLogic = (events) => {
return events.filter(event => {
const cityMatch = state.filters.cities.length === 0 || state.filters.cities.includes(event.cidade);
const typeMatch = state.filters.types.length === 0 || state.filters.types.includes(event.tipo);
const statusMatch = state.filters.status.length === 0 || state.filters.status.includes(event.modalidade);
let monthMatch = true;
if (state.filters.months.length > 0) {
const monthNames = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
const mIdx = parseInt(event.data.split('/')[1]) - 1;
monthMatch = state.filters.months.includes(monthNames[mIdx]);
}
let dateMatch = true;
if (state.filters.dateFrom || state.filters.dateTo) {
const eventDate = parseDate(event.data);
if (!eventDate) dateMatch = false;
else {
if (state.filters.dateFrom) dateMatch = eventDate >= new Date(state.filters.dateFrom);
if (dateMatch && state.filters.dateTo) dateMatch = eventDate {
const debouncedFilter = debounce(() => applyFilters(), 300);
getEl('avelSearch').addEventListener('input', debouncedFilter);
getEl('listViewBtn').addEventListener('click', () => toggleView('list'));
getEl('gridViewBtn').addEventListener('click', () => toggleView('grid'));
getEl('filterDateFrom').addEventListener('change', (e) => state.filters.dateFrom = e.target.value);
getEl('filterDateTo').addEventListener('change', (e) => state.filters.dateTo = e.target.value);
getEl('avelFiltersOverlay').addEventListener('click', (e) => { if(e.target.id === 'avelFiltersOverlay') closeFilters(); });
getEl('avelModal').addEventListener('click', (e) => { if(e.target.id === 'avelModal') closeModal(); });
getEl('avelInfoModal').addEventListener('click', (e) => { if(e.target.id === 'avelInfoModal') closeInfoModal(); });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
closeModal();
closeInfoModal();
closeFilters();
}
});
};
const init = async () => {
if (typeof SA_CONFIG === 'undefined' || !SA_CONFIG.email || !SA_CONFIG.key || !SA_CONFIG.sheetId) {
const container = getEl('avelEventsContainer');
if (container) {
container.innerHTML = '
Arquivo de configuracao nao encontrado ou incompleto.
';
}
return;
}
try {
if (!checkRateLimit()) return;
if (!shouldUseCache()) {
const parsedRows = await fetchSheetData();
if (!parsedRows || parsedRows.length event.assunto && event.assunto.trim() !== '')
.filter(event => {
if (event.data === 'A definir') return true;
const eventDate = parseDate(event.data);
if (!eventDate) return true;
return eventDate >= today;
});
state.rawData = sortEvents(formattedEvents);
state.cachedData = state.rawData;
state.cacheTimestamp = Date.now();
} else {
state.rawData = state.cachedData;
}
extractFilterOptions(state.rawData);
setupEventListeners();
let savedView = null;
try { savedView = localStorage.getItem('avelViewMode'); } catch(e) { /* storage unavailable */ }
const initialView = savedView === 'grid' ? 'grid' : 'list';
state.viewMode = initialView;
setupViewToggle(initialView);
applyFilters();
} catch (error) {
console.error('Erro:', error);
const container = getEl('avelEventsContainer');
if (container) {
container.innerHTML = '
Nao foi possivel carregar os eventos.
Verifique sua conexao e recarregue a pagina.
';
}
}
};
window.avelApp = {
openModal,
closeModal,
openInfoModal,
closeInfoModal,
openFilters,
closeFilters,
loadMoreEvents,
toggleQuickFilter,
toggleFilter: (type, value) => {
const allowedTypes = ['cities', 'months', 'types', 'status'];
if (!allowedTypes.includes(type)) return;
const idx = state.filters[type].indexOf(value);
idx > -1 ? state.filters[type].splice(idx, 1) : state.filters[type].push(value);
renderFilterOptions();
},
clearFilters: () => {
state.filters = { cities: [], months: [], types: [], status: [], dateFrom: null, dateTo: null };
state.quickFilters = { open: false, closed: false, material: false };
document.querySelectorAll('.avel-date-input').forEach(i => i.value = '');
const matBtn = getEl('quickFilterMaterial');
if (matBtn) matBtn.classList.remove('active');
renderFilterOptions();
applyFilters();
closeFilters();
},
applyFilters: () => {
applyFilters();
closeFilters();
}
};
document.addEventListener('DOMContentLoaded', init);
})();