178 lines
5.4 KiB
JavaScript
178 lines
5.4 KiB
JavaScript
/**
|
|
* Scripts Vanilla ES6 — Union Locale CGT Foix Haute-Ariège
|
|
* Menu mobile accessible + ombre header + partage + onglets & médias admin WP.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
/* -------------------------------------------------------------------------
|
|
* 1. Navigation mobile accessible & sticky header
|
|
* ---------------------------------------------------------------------- */
|
|
const header = document.querySelector('.cgt-header');
|
|
const navToggle = document.querySelector('.cgt-nav-toggle');
|
|
const navMenu = document.getElementById('cgt-primary-nav');
|
|
|
|
if (header) {
|
|
const onScroll = () => {
|
|
header.classList.toggle('is-scrolled', window.scrollY > 10);
|
|
};
|
|
onScroll();
|
|
window.addEventListener('scroll', onScroll, { passive: true });
|
|
}
|
|
|
|
if (navToggle && navMenu) {
|
|
const setOpen = (isOpen) => {
|
|
navToggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
|
|
navToggle.setAttribute(
|
|
'aria-label',
|
|
isOpen ? 'Fermer le menu principal' : 'Ouvrir le menu principal'
|
|
);
|
|
navMenu.classList.toggle('is-open', isOpen);
|
|
};
|
|
|
|
navToggle.addEventListener('click', () => {
|
|
const expanded = navToggle.getAttribute('aria-expanded') === 'true';
|
|
setOpen(!expanded);
|
|
});
|
|
|
|
document.addEventListener('keydown', (event) => {
|
|
if (event.key === 'Escape' && navMenu.classList.contains('is-open')) {
|
|
setOpen(false);
|
|
navToggle.focus();
|
|
}
|
|
});
|
|
|
|
document.addEventListener('click', (event) => {
|
|
if (
|
|
navMenu.classList.contains('is-open') &&
|
|
!navMenu.contains(event.target) &&
|
|
!navToggle.contains(event.target)
|
|
) {
|
|
setOpen(false);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* -------------------------------------------------------------------------
|
|
* 2. Bouton copier le lien sur les articles
|
|
* ---------------------------------------------------------------------- */
|
|
const copyBtns = document.querySelectorAll('[data-cgt-copy-url]');
|
|
copyBtns.forEach((btn) => {
|
|
btn.addEventListener('click', async () => {
|
|
const url = btn.getAttribute('data-cgt-copy-url');
|
|
if (!url || !navigator.clipboard) {
|
|
return;
|
|
}
|
|
try {
|
|
await navigator.clipboard.writeText(url);
|
|
const original = btn.textContent;
|
|
btn.textContent = 'Lien copié !';
|
|
setTimeout(() => {
|
|
btn.textContent = original;
|
|
}, 2200);
|
|
} catch (e) {
|
|
// Ignore silencieusement si l'API clipboard est restreinte
|
|
}
|
|
});
|
|
});
|
|
|
|
/* -------------------------------------------------------------------------
|
|
* 3. Interface d'administration : onglets + sélecteur média WP
|
|
* ---------------------------------------------------------------------- */
|
|
const adminWrap = document.querySelector('.cgt-admin-wrap');
|
|
if (!adminWrap) {
|
|
return;
|
|
}
|
|
|
|
const tabButtons = adminWrap.querySelectorAll('[data-cgt-tab]');
|
|
const tabPanels = adminWrap.querySelectorAll('[data-cgt-panel]');
|
|
const activeTabInput = adminWrap.querySelector('input[name="cgt_fha_active_tab"]');
|
|
const refererInput = adminWrap.querySelector('input[name="_wp_http_referer"]');
|
|
|
|
const activateTab = (tabId) => {
|
|
tabButtons.forEach((btn) => {
|
|
const match = btn.getAttribute('data-cgt-tab') === tabId;
|
|
btn.classList.toggle('nav-tab-active', match);
|
|
btn.setAttribute('aria-selected', match ? 'true' : 'false');
|
|
});
|
|
tabPanels.forEach((panel) => {
|
|
const match = panel.getAttribute('data-cgt-panel') === tabId;
|
|
panel.hidden = !match;
|
|
});
|
|
if (activeTabInput) {
|
|
activeTabInput.value = tabId;
|
|
}
|
|
if (refererInput) {
|
|
try {
|
|
const url = new URL(refererInput.value, window.location.origin);
|
|
url.searchParams.set('tab', tabId);
|
|
refererInput.value = url.pathname + url.search;
|
|
} catch (e) {
|
|
// Ignore si l'URL est invalide
|
|
}
|
|
}
|
|
};
|
|
|
|
tabButtons.forEach((btn) => {
|
|
btn.addEventListener('click', (event) => {
|
|
event.preventDefault();
|
|
activateTab(btn.getAttribute('data-cgt-tab'));
|
|
});
|
|
});
|
|
|
|
// Sélecteurs de médias WordPress (wp.media)
|
|
if (typeof wp !== 'undefined' && wp.media) {
|
|
adminWrap.querySelectorAll('[data-cgt-media-select]').forEach((selectBtn) => {
|
|
selectBtn.addEventListener('click', (event) => {
|
|
event.preventDefault();
|
|
const targetId = selectBtn.getAttribute('data-cgt-media-select');
|
|
const inputEl = document.getElementById(targetId);
|
|
const previewEl = document.getElementById(targetId + '_preview');
|
|
|
|
const frame = wp.media({
|
|
title: 'Choisir une image',
|
|
button: { text: 'Utiliser cette image' },
|
|
library: { type: 'image' },
|
|
multiple: false,
|
|
});
|
|
|
|
frame.on('select', () => {
|
|
const attachment = frame.state().get('selection').first().toJSON();
|
|
if (inputEl && attachment.url) {
|
|
inputEl.value = attachment.url;
|
|
}
|
|
if (previewEl && attachment.url) {
|
|
previewEl.src = attachment.url;
|
|
previewEl.hidden = false;
|
|
}
|
|
});
|
|
|
|
frame.open();
|
|
});
|
|
});
|
|
|
|
adminWrap.querySelectorAll('[data-cgt-media-clear]').forEach((clearBtn) => {
|
|
clearBtn.addEventListener('click', (event) => {
|
|
event.preventDefault();
|
|
const targetId = clearBtn.getAttribute('data-cgt-media-clear');
|
|
const defaultUrl = clearBtn.getAttribute('data-cgt-default-url') || '';
|
|
const inputEl = document.getElementById(targetId);
|
|
const previewEl = document.getElementById(targetId + '_preview');
|
|
|
|
if (inputEl) {
|
|
inputEl.value = defaultUrl;
|
|
}
|
|
if (previewEl) {
|
|
if (defaultUrl) {
|
|
previewEl.src = defaultUrl;
|
|
previewEl.hidden = false;
|
|
} else {
|
|
previewEl.src = '';
|
|
previewEl.hidden = true;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
})();
|