/** * ========================================================================= * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0 * Interface Administrateur - Modales : Sauvegardes Système * ========================================================================= */ window.pano_AdminModalsBackups = ({ activeModal, activeDialog, closeCurrentLayer, openLocalDialog, fetchTelemetry, showToast }) => { const { useState, useEffect } = React; const [isSaving, setIsSaving] = useState(false); const [backupsList, setBackupsList] = useState([]); const [backupDesc, setBackupDesc] = useState(''); // États pour la restauration const [backupToRestore, setBackupToRestore] = useState(null); const [restorePwd, setRestorePwd] = useState(''); const [confirmConfig, setConfirmConfig] = useState(null); // Composants et Icônes const Modal = window.pano_Modal || (() => null); const ConfirmModal = window.pano_ConfirmModal || (() => null); const Button = window.pano_Button || (() => null); const { ArchiveIcon, Trash2Icon, RefreshCwIcon, DownloadIcon, CheckCircleIcon, ShieldIcon } = window.pano_getIcons(); // 1. CHARGEMENT INITIAL useEffect(() => { if (activeModal === 'backups') { loadBackups(); } }, [activeModal]); const loadBackups = async () => { const d = await window.pano_apiFetch('system/backups', { method: 'GET' }); if (d && d.status === 'success') { setBackupsList(d.data || []); } }; // 2. CRÉATION DE SAUVEGARDE const handleCreateBackup = async () => { closeCurrentLayer(); // ferme le prompt const d = await window.pano_apiFetch('system/backups/create', { body: { label: backupDesc.trim() }, setLoading: setIsSaving, successMessage: "Sauvegarde créée avec succès." }); if (d) { setBackupDesc(''); loadBackups(); if (fetchTelemetry) fetchTelemetry(); } }; // 3. RESTAURATION const confirmRestore = (b) => { setBackupToRestore(b); openLocalDialog('restore_prompt'); }; const executeRestore = async () => { if (!restorePwd) { if (showToast) showToast("Mot de passe requis.", "error"); return; } closeCurrentLayer(); const d = await window.pano_apiFetch('system/backups/restore', { body: { filename: backupToRestore.name, pwd: restorePwd }, setLoading: setIsSaving, successMessage: "Restauration terminée. Le système a été réinitialisé." }); if (d) { setRestorePwd(''); setBackupToRestore(null); setTimeout(() => window.location.reload(), 1500); } }; // 4. SUPPRESSION ET NETTOYAGE const handleDeleteBackup = (b) => { setConfirmConfig({ title: "Supprimer la sauvegarde", message: `Voulez-vous vraiment supprimer la sauvegarde "${b.label}" ?`, confirmText: "Oui, supprimer", isDestructive: true, onConfirm: async () => { setConfirmConfig(null); const d = await window.pano_apiFetch('system/backups/delete', { body: { file: b.name }, setLoading: setIsSaving, successMessage: "Sauvegarde supprimée." }); if (d) { loadBackups(); if (fetchTelemetry) fetchTelemetry(); } }, onCancel: () => setConfirmConfig(null) }); openLocalDialog('confirm'); }; const handleCleanupBackups = () => { setConfirmConfig({ title: "Nettoyage des archives", message: "Voulez-vous vraiment supprimer toutes les sauvegardes à l'exception des 5 plus récentes ?", confirmText: "Oui, nettoyer", isDestructive: true, onConfirm: async () => { setConfirmConfig(null); const d = await window.pano_apiFetch('system/backups/cleanup', { method: 'POST', setLoading: setIsSaving, successMessage: "Archives obsolètes purgées avec succès." }); if (d) { loadBackups(); if (fetchTelemetry) fetchTelemetry(); } }, onCancel: () => setConfirmConfig(null) }); openLocalDialog('confirm'); }; return ( <> {/* MODALE PRINCIPALE : LISTE DES SAUVEGARDES */} {activeModal === 'backups' && (

Gérez les archives système (BDD + fichiers de configuration).

{backupsList.sort((a,b) => b.date - a.date).map((b, i) => (

{b.label} {i === 0 && Actuelle}

{new Date(b.date).toLocaleString('fr-FR')} • {b.size}

))} {backupsList.length === 0 && (
Aucune sauvegarde trouvée sur le serveur.
)}
)} {/* PROMPT : NOM DE LA NOUVELLE SAUVEGARDE */} {activeDialog === 'backup_prompt' && (

Donnez une description courte à cette archive (ex: "Avant mise à jour V2"). Optionnel.

setBackupDesc(e.target.value)} placeholder="Description de l'archive (Optionnel)..." className="w-full border-2 border-slate-200 rounded-xl p-3 focus:border-emerald-500 outline-none transition font-bold" autoFocus />
)} {/* PROMPT SÉCURISÉ : MOT DE PASSE POUR RESTAURATION */} {activeDialog === 'restore_prompt' && backupToRestore && (
Vous êtes sur le point d'écraser la base de données actuelle avec l'archive du {new Date(backupToRestore.date).toLocaleString('fr-FR')}. Toutes les données générées depuis cette date seront définitivement perdues.
setRestorePwd(e.target.value)} placeholder="Saisissez votre mot de passe principal..." className="w-full border-2 border-slate-200 rounded-xl p-3 pl-10 focus:border-amber-500 outline-none transition font-bold" autoFocus />
)} {/* MODALE DE CONFIRMATION GLOBALE (Suppression / Nettoyage) */} {activeDialog === 'confirm' && confirmConfig && ConfirmModal && ( )} ); }; /* EOF ========== [_react/_admin_modals_backups.jsx] */