144 lines
4.7 KiB
JavaScript
144 lines
4.7 KiB
JavaScript
|
document.addEventListener('DOMContentLoaded', function() {
|
||
|
// Initialisation de l'éditeur Quill
|
||
|
const quill = new Quill('#editor', {
|
||
|
theme: 'snow',
|
||
|
modules: {
|
||
|
toolbar: [
|
||
|
[{ 'header': [1, 2, 3, false] }],
|
||
|
['bold', 'italic', 'underline'],
|
||
|
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
|
||
|
['link', 'blockquote'],
|
||
|
['clean']
|
||
|
]
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Gestion du tri des chapitres
|
||
|
const chaptersList = document.getElementById('chaptersList');
|
||
|
if (chaptersList) {
|
||
|
new Sortable(chaptersList, {
|
||
|
animation: 150,
|
||
|
handle: '.chapter-number',
|
||
|
onEnd: updateChaptersOrder
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Gestion des événements
|
||
|
const modal = document.getElementById('chapterEditor');
|
||
|
const addChapterBtn = document.getElementById('addChapter');
|
||
|
const saveChapterBtn = document.getElementById('saveChapter');
|
||
|
const cancelEditBtn = document.getElementById('cancelEdit');
|
||
|
let currentEditingChapter = null;
|
||
|
|
||
|
if (addChapterBtn) {
|
||
|
addChapterBtn.addEventListener('click', () => {
|
||
|
currentEditingChapter = null;
|
||
|
document.getElementById('chapterTitle').value = '';
|
||
|
quill.setContents([]);
|
||
|
modal.style.display = 'block';
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Sauvegarde d'un chapitre
|
||
|
if (saveChapterBtn) {
|
||
|
saveChapterBtn.addEventListener('click', async () => {
|
||
|
const title = document.getElementById('chapterTitle').value;
|
||
|
const content = quill.root.innerHTML;
|
||
|
const storyId = document.querySelector('input[name="id"]').value;
|
||
|
|
||
|
try {
|
||
|
const response = await fetch('api/save-chapter.php', {
|
||
|
method: 'POST',
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json',
|
||
|
},
|
||
|
body: JSON.stringify({
|
||
|
storyId,
|
||
|
chapterId: currentEditingChapter,
|
||
|
title,
|
||
|
content
|
||
|
})
|
||
|
});
|
||
|
|
||
|
if (response.ok) {
|
||
|
window.location.reload();
|
||
|
} else {
|
||
|
throw new Error('Erreur lors de la sauvegarde');
|
||
|
}
|
||
|
} catch (error) {
|
||
|
alert('Erreur lors de la sauvegarde du chapitre');
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Fermeture du modal
|
||
|
if (cancelEditBtn) {
|
||
|
cancelEditBtn.addEventListener('click', () => {
|
||
|
modal.style.display = 'none';
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Écoute des clics sur la liste des chapitres
|
||
|
if (chaptersList) {
|
||
|
chaptersList.addEventListener('click', (e) => {
|
||
|
if (e.target.matches('.delete-chapter')) {
|
||
|
if (confirm('Voulez-vous vraiment supprimer ce chapitre ?')) {
|
||
|
const chapterId = e.target.closest('.chapter-item').dataset.id;
|
||
|
deleteChapter(chapterId);
|
||
|
}
|
||
|
} else if (e.target.matches('.chapter-title')) {
|
||
|
const chapterItem = e.target.closest('.chapter-item');
|
||
|
currentEditingChapter = chapterItem.dataset.id;
|
||
|
document.getElementById('chapterTitle').value = e.target.value;
|
||
|
quill.root.innerHTML = chapterItem.querySelector('.editor').innerHTML;
|
||
|
modal.style.display = 'block';
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Mise à jour de l'ordre des chapitres
|
||
|
async function updateChaptersOrder() {
|
||
|
const chapters = Array.from(document.querySelectorAll('.chapter-item'))
|
||
|
.map((item, index) => ({
|
||
|
id: item.dataset.id,
|
||
|
order: index
|
||
|
}));
|
||
|
|
||
|
try {
|
||
|
const response = await fetch('api/update-chapters-order.php', {
|
||
|
method: 'POST',
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json',
|
||
|
},
|
||
|
body: JSON.stringify(chapters)
|
||
|
});
|
||
|
|
||
|
if (!response.ok) {
|
||
|
throw new Error('Erreur lors de la mise à jour');
|
||
|
}
|
||
|
} catch (error) {
|
||
|
alert('Erreur lors de la mise à jour de l\'ordre des chapitres');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Suppression d'un chapitre
|
||
|
async function deleteChapter(chapterId) {
|
||
|
try {
|
||
|
const response = await fetch('api/delete-chapter.php', {
|
||
|
method: 'POST',
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json',
|
||
|
},
|
||
|
body: JSON.stringify({ chapterId })
|
||
|
});
|
||
|
|
||
|
if (response.ok) {
|
||
|
window.location.reload();
|
||
|
} else {
|
||
|
throw new Error('Erreur lors de la suppression');
|
||
|
}
|
||
|
} catch (error) {
|
||
|
alert('Erreur lors de la suppression du chapitre');
|
||
|
}
|
||
|
}
|