Initial commit
This commit is contained in:
146
js/agendaView.js
Normal file
146
js/agendaView.js
Normal file
@@ -0,0 +1,146 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var toggleBtn = document.querySelector('.agenda-toggle-btn');
|
||||
var gridSections = document.getElementById('grid-sections');
|
||||
var agendaEl = document.getElementById('agenda-view');
|
||||
if (!toggleBtn || !agendaEl) return;
|
||||
|
||||
var swiper = null;
|
||||
var agendaPage = 0;
|
||||
var agendaDone = false;
|
||||
var agendaLoading = false;
|
||||
var swiperWrapper = document.getElementById('agenda-swiper-wrapper');
|
||||
var agendaSpinner = document.getElementById('agenda-spinner');
|
||||
|
||||
var categoryId = agendaEl.dataset.category || '';
|
||||
var includeChildren = agendaEl.dataset.includeChildren || '0';
|
||||
var axe = agendaEl.dataset.axe || '';
|
||||
var dateFrom = agendaEl.dataset.dateFrom || '';
|
||||
var dateTo = agendaEl.dataset.dateTo || '';
|
||||
|
||||
function showAgenda() {
|
||||
if (gridSections) gridSections.style.display = 'none';
|
||||
agendaEl.classList.add('is-active');
|
||||
toggleBtn.innerHTML =
|
||||
'<i class="iconoir-view-grid"></i>' +
|
||||
(agendaViewData.lang === 'en' ? 'Switch to grid view' : 'Passer à la vue grille');
|
||||
if (!swiper) {
|
||||
loadMoreAgenda(function (data) {
|
||||
var todayOffset = Math.max(0, ((data && data.today_offset) || 0) - 1);
|
||||
var anchorPage = Math.ceil((todayOffset + 1) / 12);
|
||||
if (anchorPage > 1) {
|
||||
chainLoadPages(2, anchorPage, function () {
|
||||
initSwiper(todayOffset);
|
||||
});
|
||||
} else {
|
||||
initSwiper(todayOffset);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function showGrid() {
|
||||
agendaEl.classList.remove('is-active');
|
||||
if (gridSections) gridSections.style.display = '';
|
||||
toggleBtn.innerHTML =
|
||||
'<i class="iconoir-calendar"></i>' +
|
||||
(agendaViewData.lang === 'en' ? 'Switch to agenda view' : 'Passer à la vue agenda');
|
||||
}
|
||||
|
||||
function initSwiper(initialSlide) {
|
||||
swiper = new Swiper(agendaEl.querySelector('.agenda-swiper'), {
|
||||
slidesPerView: 1.2,
|
||||
spaceBetween: 20,
|
||||
initialSlide: initialSlide || 0,
|
||||
navigation: {
|
||||
nextEl: agendaEl.querySelector('.agenda-swiper-prev'),
|
||||
prevEl: agendaEl.querySelector('.agenda-swiper-next'),
|
||||
},
|
||||
breakpoints: {
|
||||
640: { slidesPerView: 2, spaceBetween: 24 },
|
||||
1024: { slidesPerView: 3, spaceBetween: 32 },
|
||||
},
|
||||
on: {
|
||||
reachEnd: function () {
|
||||
if (!agendaDone) loadMoreAgenda();
|
||||
},
|
||||
},
|
||||
});
|
||||
swiper.changeLanguageDirection('rtl');
|
||||
}
|
||||
|
||||
function chainLoadPages(fromPage, toPage, callback) {
|
||||
if (fromPage > toPage) { callback(); return; }
|
||||
loadMoreAgenda(function () {
|
||||
chainLoadPages(fromPage + 1, toPage, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function loadMoreAgenda(callback) {
|
||||
if (agendaLoading || agendaDone) return;
|
||||
agendaLoading = true;
|
||||
agendaPage++;
|
||||
agendaSpinner.style.display = 'flex';
|
||||
|
||||
var data = new FormData();
|
||||
data.append('action', 'load_more_agenda');
|
||||
data.append('page', agendaPage);
|
||||
data.append('nonce', agendaViewData.nonce);
|
||||
data.append('lang', agendaViewData.lang);
|
||||
if (categoryId) data.append('category', categoryId);
|
||||
if (includeChildren==='1') data.append('include_children', '1');
|
||||
if (axe) data.append('axe', axe);
|
||||
if (dateFrom) data.append('date_from', dateFrom);
|
||||
if (dateTo) data.append('date_to', dateTo);
|
||||
|
||||
fetch(agendaViewData.ajaxUrl, { method: 'POST', body: data })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (result) {
|
||||
agendaSpinner.style.display = 'none';
|
||||
agendaLoading = false;
|
||||
if (result.success && result.data.html) {
|
||||
var tmp = document.createElement('div');
|
||||
tmp.innerHTML = result.data.html;
|
||||
Array.from(tmp.children).forEach(function (slide) {
|
||||
if (swiper) {
|
||||
swiper.appendSlide(slide.outerHTML);
|
||||
} else {
|
||||
swiperWrapper.appendChild(slide);
|
||||
}
|
||||
});
|
||||
if (swiper) swiper.update();
|
||||
if (callback) callback(result.data);
|
||||
} else {
|
||||
agendaDone = true;
|
||||
if (callback) callback(result.data);
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
agendaSpinner.style.display = 'none';
|
||||
agendaLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
toggleBtn.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
if (agendaEl.classList.contains('is-active')) {
|
||||
var url = new URL(window.location.href);
|
||||
url.searchParams.delete('view');
|
||||
history.pushState({}, '', url.toString());
|
||||
showGrid();
|
||||
} else {
|
||||
var url = new URL(window.location.href);
|
||||
url.searchParams.set('view', 'agenda');
|
||||
history.pushState({}, '', url.toString());
|
||||
showAgenda();
|
||||
}
|
||||
});
|
||||
|
||||
// Initial state driven by server-side class
|
||||
if (agendaEl.classList.contains('is-active')) {
|
||||
showAgenda();
|
||||
}
|
||||
});
|
||||
}());
|
||||
Reference in New Issue
Block a user