fix: improve saving
This commit is contained in:
@@ -720,6 +720,59 @@ class InputManager {
|
||||
input.classList.remove('bg-yellow-50', 'border-yellow-300');
|
||||
ColorManager.applyColorToInput(input, value, type, isValid, maxPoints);
|
||||
}, 1000);
|
||||
|
||||
// Option de sauvegarde incrémentale après 3 secondes d'inactivité
|
||||
clearTimeout(input.saveTimeout);
|
||||
input.saveTimeout = setTimeout(() => {
|
||||
this.saveIncremental(input);
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
static async saveIncremental(input) {
|
||||
if (state.isAutoSaving) return;
|
||||
|
||||
const studentId = input.dataset.studentId;
|
||||
const elementId = input.dataset.elementId;
|
||||
const value = input.value;
|
||||
|
||||
// Chercher le commentaire associé
|
||||
const commentInput = document.querySelector(`[name="comment_${studentId}_${elementId}"]`);
|
||||
const comment = commentInput ? commentInput.value : '';
|
||||
|
||||
try {
|
||||
const response = await fetch(`{{ url_for('grading.save_single_grade', assessment_id=assessment.id) }}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
student_id: parseInt(studentId),
|
||||
element_id: parseInt(elementId),
|
||||
value: value,
|
||||
comment: comment
|
||||
})
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
const key = `${studentId}_${elementId}`;
|
||||
state.unsavedChanges.delete(key);
|
||||
state.updateSaveStatus();
|
||||
|
||||
// Feedback visuel discret
|
||||
input.classList.add('border-green-400');
|
||||
setTimeout(() => {
|
||||
input.classList.remove('border-green-400');
|
||||
}, 1000);
|
||||
} else {
|
||||
console.error('Erreur sauvegarde incrémentale:', result.message);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Erreur réseau sauvegarde incrémentale:', error);
|
||||
}
|
||||
}
|
||||
|
||||
static updateCurrentPosition() {
|
||||
@@ -806,24 +859,29 @@ class FormManager {
|
||||
}
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast('Notes sauvegardées avec succès', 'success');
|
||||
} else {
|
||||
UIManager.showToast(result.message || 'Erreur lors de la sauvegarde', 'error');
|
||||
}
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast(result.message || 'Notes sauvegardées avec succès', 'success');
|
||||
} else {
|
||||
UIManager.showToast('Erreur réseau lors de la sauvegarde', 'error');
|
||||
UIManager.showToast(result.message || 'Erreur lors de la sauvegarde', 'error');
|
||||
|
||||
// Afficher les erreurs détaillées si disponibles
|
||||
if (result.errors && result.errors.length > 0) {
|
||||
console.error('Erreurs détaillées:', result.errors);
|
||||
setTimeout(() => {
|
||||
UIManager.showToast(`${result.errors.length} erreur(s) de validation`, 'warning');
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Erreur sauvegarde:', error);
|
||||
UIManager.showToast('Erreur lors de la sauvegarde', 'error');
|
||||
UIManager.showToast('Erreur de communication avec le serveur', 'error');
|
||||
} finally {
|
||||
saveButton.disabled = false;
|
||||
saveText.textContent = 'Sauvegarder';
|
||||
saveText.textContent = 'Sauvegarder les notes';
|
||||
saveSpinner.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
@@ -855,21 +913,26 @@ class FormManager {
|
||||
}
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast('Notes sauvegardées avec succès', 'success');
|
||||
} else {
|
||||
UIManager.showToast(result.message || 'Erreur lors de la sauvegarde', 'error');
|
||||
}
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast(result.message || 'Notes sauvegardées avec succès', 'success');
|
||||
} else {
|
||||
UIManager.showToast('Erreur réseau lors de la sauvegarde', 'error');
|
||||
UIManager.showToast(result.message || 'Erreur lors de la sauvegarde', 'error');
|
||||
|
||||
// Afficher les erreurs détaillées si disponibles
|
||||
if (result.errors && result.errors.length > 0) {
|
||||
console.error('Erreurs détaillées:', result.errors);
|
||||
setTimeout(() => {
|
||||
UIManager.showToast(`${result.errors.length} erreur(s) de validation`, 'warning');
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Erreur sauvegarde:', error);
|
||||
UIManager.showToast('Erreur lors de la sauvegarde', 'error');
|
||||
UIManager.showToast('Erreur de communication avec le serveur', 'error');
|
||||
} finally {
|
||||
if (saveButtonFs) {
|
||||
saveButtonFs.disabled = false;
|
||||
@@ -946,18 +1009,45 @@ function setupAutosave() {
|
||||
}, 30000);
|
||||
}
|
||||
|
||||
function autoSave() {
|
||||
async function autoSave() {
|
||||
if (state.isAutoSaving) return;
|
||||
|
||||
state.isAutoSaving = true;
|
||||
UIManager.showToast('Sauvegarde automatique...', 'info');
|
||||
|
||||
setTimeout(() => {
|
||||
try {
|
||||
const form = document.getElementById('grading-form');
|
||||
if (!form) {
|
||||
throw new Error('Formulaire non trouvé');
|
||||
}
|
||||
|
||||
const formData = new FormData(form);
|
||||
const response = await fetch(form.action, {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast('Sauvegardé automatiquement', 'success');
|
||||
} else {
|
||||
UIManager.showToast(result.message || 'Erreur lors de la sauvegarde automatique', 'error');
|
||||
}
|
||||
} else {
|
||||
throw new Error('Erreur réseau lors de la sauvegarde automatique');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Erreur sauvegarde automatique:', error);
|
||||
UIManager.showToast('Erreur lors de la sauvegarde automatique', 'error');
|
||||
} finally {
|
||||
state.isAutoSaving = false;
|
||||
state.unsavedChanges.clear();
|
||||
state.updateSaveStatus();
|
||||
UIManager.showToast('Sauvegardé automatiquement', 'success');
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
// Fonctions de compatibilité
|
||||
|
||||
Reference in New Issue
Block a user