ca6cfa4ebf
- buildAutoSeoDesc() : entités HTML décodées + titre supprimé en tête (#91) - post_confirm.js : guard null sur #confirm-slug absent (#91) - feed.php : <media:thumbnail> avec image de couverture RSS (#90) - admin livres : slug auto depuis le titre + filtre articles (#89) - BookManager::sanitizeSlug() passé public Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
122 lines
5.5 KiB
JavaScript
122 lines
5.5 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function () {
|
|
// Confirmation data-confirm sur les formulaires (evite confirm() inline bloqué par CSP)
|
|
document.querySelectorAll('form[data-confirm]').forEach(function (form) {
|
|
form.addEventListener('submit', function (e) {
|
|
var msg = form.getAttribute('data-confirm') || 'Confirmer ?';
|
|
if (!window.confirm(msg)) {
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Sélection globale articles
|
|
var checkAll = document.getElementById('check-all');
|
|
if (checkAll) {
|
|
checkAll.addEventListener('change', function () {
|
|
document.querySelectorAll('.bulk-check').forEach(function (cb) {
|
|
cb.checked = checkAll.checked;
|
|
});
|
|
});
|
|
}
|
|
|
|
// Clic sur la ligne entière pour cocher/décocher la case de sélection
|
|
document.querySelectorAll('table tbody tr').forEach(function (tr) {
|
|
var cb = tr.querySelector('.bulk-check');
|
|
if (!cb) { return; }
|
|
tr.style.cursor = 'pointer';
|
|
tr.addEventListener('click', function (e) {
|
|
if (e.target.closest('a, button, input, label')) { return; }
|
|
cb.checked = !cb.checked;
|
|
if (checkAll) {
|
|
var total = document.querySelectorAll('.bulk-check').length;
|
|
var checked = document.querySelectorAll('.bulk-check:checked').length;
|
|
checkAll.checked = total > 0 && checked === total;
|
|
checkAll.indeterminate = checked > 0 && checked < total;
|
|
}
|
|
});
|
|
});
|
|
|
|
// Indicateurs de traitement formulaire SMTP (config + tester connexion)
|
|
var smtpForm = document.getElementById('smtp-config-form');
|
|
if (smtpForm) {
|
|
smtpForm.addEventListener('submit', function (e) {
|
|
var clicked = e.submitter;
|
|
if (!clicked) return;
|
|
smtpForm.querySelectorAll('button[type="submit"]').forEach(function (btn) {
|
|
btn.disabled = true;
|
|
});
|
|
var isSave = clicked.id === 'smtp-save-btn';
|
|
clicked.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>'
|
|
+ (isSave ? 'Enregistrement…' : 'En cours…');
|
|
});
|
|
}
|
|
|
|
// Indicateur de traitement envoi email de test
|
|
var smtpTestForm = document.getElementById('smtp-test-form');
|
|
if (smtpTestForm) {
|
|
smtpTestForm.addEventListener('submit', function () {
|
|
var btn = document.getElementById('smtp-send-btn');
|
|
if (btn) {
|
|
btn.disabled = true;
|
|
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>En cours…';
|
|
}
|
|
});
|
|
}
|
|
|
|
// Suppression groupée avec confirmation (remplace onclick inline)
|
|
var bulkDeleteBtn = document.getElementById('bulk-delete-btn');
|
|
if (bulkDeleteBtn) {
|
|
bulkDeleteBtn.addEventListener('click', function (e) {
|
|
var checked = document.querySelectorAll('.bulk-check:checked').length;
|
|
if (checked === 0) { e.preventDefault(); return; }
|
|
var msg = bulkDeleteBtn.getAttribute('data-confirm-bulk') || 'Confirmer ?';
|
|
if (!window.confirm(msg)) { e.preventDefault(); }
|
|
});
|
|
}
|
|
|
|
// Ajout d'un article à un livre (remplace onchange="bookAddArticle(this)")
|
|
var bookArticleSel = document.getElementById('book-article-select');
|
|
if (bookArticleSel) {
|
|
bookArticleSel.addEventListener('change', function () {
|
|
var slug = bookArticleSel.value;
|
|
if (!slug) { return; }
|
|
var ta = document.getElementById('book-articles-ta');
|
|
var lines = ta.value.split('\n').map(function (s) { return s.trim(); }).filter(Boolean);
|
|
if (lines.indexOf(slug) === -1) { lines.push(slug); ta.value = lines.join('\n'); }
|
|
bookArticleSel.value = '';
|
|
});
|
|
|
|
// Filtre texte en temps réel pour le sélecteur d'articles
|
|
var bookFilter = document.getElementById('book-article-filter');
|
|
if (bookFilter) {
|
|
var bookOptions = Array.from(bookArticleSel.options);
|
|
bookFilter.addEventListener('input', function () {
|
|
var q = bookFilter.value.trim().toLowerCase();
|
|
bookArticleSel.innerHTML = '';
|
|
bookOptions.forEach(function (opt) {
|
|
if (opt.value === '' || q === '' || opt.textContent.toLowerCase().includes(q)) {
|
|
bookArticleSel.appendChild(opt.cloneNode(true));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
// Slug auto pour la création d'un livre
|
|
var newBookTitle = document.getElementById('new-book-title');
|
|
var newBookSlugPreview = document.getElementById('new-book-slug-preview');
|
|
var newBookSlugHidden = document.getElementById('new-book-slug-hidden');
|
|
if (newBookTitle && newBookSlugPreview && newBookSlugHidden) {
|
|
function toBookSlug(s) {
|
|
var map = { 'à':'a','â':'a','ä':'a','é':'e','è':'e','ê':'e','ë':'e','î':'i','ï':'i','ô':'o','ö':'o','ù':'u','û':'u','ü':'u','ç':'c','æ':'ae','œ':'oe' };
|
|
s = s.toLowerCase().replace(/[àâäéèêëîïôöùûüçæœ]/g, function (c) { return map[c] || c; });
|
|
return s.replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
}
|
|
newBookTitle.addEventListener('input', function () {
|
|
var slug = toBookSlug(newBookTitle.value);
|
|
newBookSlugPreview.value = slug;
|
|
newBookSlugHidden.value = slug;
|
|
});
|
|
}
|
|
});
|