74 lines
2.4 KiB
JavaScript
Executable File
74 lines
2.4 KiB
JavaScript
Executable File
document.addEventListener('DOMContentLoaded', () => {
|
|
const quill = window.quillEditorInstance;
|
|
const textarea = window.quillTextarea;
|
|
if (!quill || !textarea) return;
|
|
|
|
let lastSavedContent = textarea.value;
|
|
let saveTimeout;
|
|
|
|
function showMessage(message, isError = false) {
|
|
let msgEl = document.getElementById('autosave-message');
|
|
if (!msgEl) {
|
|
msgEl = document.createElement('div');
|
|
msgEl.id = 'autosave-message';
|
|
msgEl.style.cssText = `
|
|
position: fixed;
|
|
top: 70px;
|
|
right: 10px;
|
|
padding: 8px 12px;
|
|
background: ${isError ? '#dc3545' : '#28a745'};
|
|
color: white;
|
|
border-radius: 3px;
|
|
z-index: 10000;
|
|
font-size: 0.8rem;
|
|
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
|
|
`;
|
|
document.body.appendChild(msgEl);
|
|
}
|
|
msgEl.textContent = message;
|
|
msgEl.style.background = isError ? '#dc3545' : '#28a745';
|
|
msgEl.style.display = 'block';
|
|
setTimeout(() => msgEl.style.display = 'none', 2000);
|
|
}
|
|
|
|
const autoSave = () => {
|
|
const currentContent = textarea.value;
|
|
if (currentContent === lastSavedContent) return;
|
|
|
|
const form = document.getElementById('chapter-form');
|
|
const formData = new FormData(form);
|
|
formData.append('autosave', 'true');
|
|
|
|
showMessage('Сохранение...');
|
|
|
|
fetch(window.location.href, {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(res => {
|
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
return res.json();
|
|
})
|
|
.then(data => {
|
|
if (data.success) {
|
|
lastSavedContent = currentContent;
|
|
showMessage('Автосохранено: ' + new Date().toLocaleTimeString());
|
|
} else {
|
|
throw new Error(data.error || 'Ошибка сервера');
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.error(err);
|
|
showMessage('Ошибка автосохранения: ' + err.message, true);
|
|
});
|
|
};
|
|
|
|
quill.on('text-change', () => {
|
|
clearTimeout(saveTimeout);
|
|
saveTimeout = setTimeout(autoSave, 2000);
|
|
});
|
|
|
|
// Периодическая автосохранение
|
|
setInterval(autoSave, 30000);
|
|
});
|