From 5507882019caf8d07580bb1ffdb6b1300a67ba2d Mon Sep 17 00:00:00 2001 From: Cedric Date: Sun, 21 Jun 2026 14:58:52 +0200 Subject: [PATCH] Actualiser js/admin.js --- js/admin.js | 67 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/js/admin.js b/js/admin.js index 2b8142a..5097b06 100644 --- a/js/admin.js +++ b/js/admin.js @@ -172,23 +172,68 @@ async function saveFilmForm(e) { try { await fetch(`${API_URL}?action=save_film`, { method: 'POST', headers: { 'Authorization': localStorage.getItem('token'), 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); closeAdminModal(); loadDashboardData(); } catch (err) { console.error('Erreur sauvegarde :', err); } } -// ── IMPORT CSV (Envoie les données brutes, le PHP fait le mapping) ── +// ── IMPORT CSV OPTIMISÉ (lots de 15 + stats) ── async function handleCsvUpload(input) { if (!input.files || input.files.length === 0) return; - const file = input.files[0]; input.value = ''; + const file = input.files[0]; + input.value = ''; + try { - const text = await file.text(); const allData = parseCSV(text); - if (allData.length === 0) { alert('❌ Le fichier CSV est vide ou mal formaté.'); return; } - closeConfigModal(); showProgressModal(allData.length); - const batchSize = 3; let processed = 0; + const text = await file.text(); + const allData = parseCSV(text); + if (allData.length === 0) { + alert(' Le fichier CSV est vide ou mal formaté.'); + return; + } + closeConfigModal(); + showProgressModal(allData.length); + + // 🚀 Lots de 15 au lieu de 5 (3× moins de requêtes HTTP) + const batchSize = 15; + let processed = 0; + let totalTmdbCalls = 0; + let totalEanHits = 0; + const startTime = Date.now(); + for (let i = 0; i < allData.length; i += batchSize) { const batch = allData.slice(i, i + batchSize); - try { await fetch(`${API_URL}?action=import_batch`, { method: 'POST', headers: { 'Authorization': localStorage.getItem('token'), 'Content-Type': 'application/json' }, body: JSON.stringify({ items: batch, type: currentAdminTab }) }); } - catch (err) { console.error('Erreur sur un lot:', err); } - processed += batch.length; updateProgressModal(processed, allData.length); + try { + const res = await fetch(`${API_URL}?action=import_batch`, { + method: 'POST', + headers: { + 'Authorization': localStorage.getItem('token'), + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ items: batch, type: currentAdminTab }) + }); + const result = await res.json(); + if (result.stats) { + totalTmdbCalls += (result.stats.tmdb_calls || 0); + totalEanHits += (result.stats.ean_hits || 0); + } + } catch (err) { console.error('Erreur sur un lot:', err); } + + processed += batch.length; + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + const speed = (processed / (Date.now() - startTime) * 1000).toFixed(1); + + // Affichage enrichi : progression + vitesse + stats + const pct = Math.round((processed / allData.length) * 100); + document.getElementById('progress-bar').style.width = pct + '%'; + document.getElementById('progress-text').textContent = + `Import en cours... (${speed} films/s)`; + document.getElementById('progress-count').textContent = + `${processed} / ${allData.length} | 🖼️ ${totalEanHits} jaquettes | 🎬 ${totalTmdbCalls} appels TMDB | ⏱️ ${elapsed}s`; } - closeProgressModal(); alert(`✅ Import terminé ! ${allData.length} élément(s) traité(s).`); loadDashboardData(); - } catch (err) { closeProgressModal(); alert('Impossible de lire le fichier CSV.'); } + + closeProgressModal(); + const totalTime = ((Date.now() - startTime) / 1000).toFixed(1); + alert(`✅ Import terminé en ${totalTime}s !\n📦 ${allData.length} film(s)\n🖼️ ${totalEanHits} jaquette(s) récupérée(s)\n ${totalTmdbCalls} appel(s) TMDB`); + loadDashboardData(); + } catch (err) { + closeProgressModal(); + alert('❌ Impossible de lire le fichier CSV.'); + } } async function saveTmdbKey() {