fix & feat : SEO desc, feed cover, livres slug auto + filtre (v1.6.21)
- 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>
This commit is contained in:
@@ -85,5 +85,37 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
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;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -22,12 +22,14 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
initCounter('seo_description', 'seo_desc_counter', 155);
|
||||
|
||||
function updatePreview() {
|
||||
var seoTitle = document.getElementById('seo_title').value.trim();
|
||||
var seoDesc = document.getElementById('seo_description').value.trim();
|
||||
var slug = document.getElementById('confirm-slug').value.trim();
|
||||
var seoTitle = document.getElementById('seo_title').value.trim();
|
||||
var seoDesc = document.getElementById('seo_description').value.trim();
|
||||
var slugEl = document.getElementById('confirm-slug');
|
||||
document.getElementById('preview-title').textContent = seoTitle || defaultTitle;
|
||||
document.getElementById('preview-desc').textContent = seoDesc || defaultDesc;
|
||||
document.getElementById('preview-url').textContent = baseUrl + slug;
|
||||
if (slugEl) {
|
||||
document.getElementById('preview-url').textContent = baseUrl + slugEl.value.trim();
|
||||
}
|
||||
}
|
||||
|
||||
['seo_title', 'seo_description', 'confirm-slug'].forEach(function (id) {
|
||||
@@ -39,7 +41,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
var slugDisplay = document.getElementById('slug-display');
|
||||
|
||||
var btnSuggest = document.getElementById('slug-btn-suggest');
|
||||
if (btnSuggest) {
|
||||
if (btnSuggest && slugInput && slugDisplay) {
|
||||
btnSuggest.addEventListener('click', function () {
|
||||
var val = btnSuggest.dataset.slugSuggest;
|
||||
slugInput.value = val;
|
||||
@@ -49,7 +51,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
}
|
||||
|
||||
var btnKeep = document.getElementById('slug-btn-keep');
|
||||
if (btnKeep) {
|
||||
if (btnKeep && slugInput && slugDisplay) {
|
||||
btnKeep.addEventListener('click', function () {
|
||||
var val = btnKeep.dataset.slugKeep;
|
||||
slugInput.value = val;
|
||||
|
||||
Reference in New Issue
Block a user