';
html += '
';
html += '
Accueil
';
html += '
';
html += '
EcoleDirecte ';
html += '— ';
html += '';
html += '
' + getEncouragementMessage(currentTrimAvg) + '
';
html += '
';
html += '
';
html += '
Devoirs à faire ' + homeworkCount + '
';
html += '
Moyenne générale ' + (currentTrimAvg !== null ? currentTrimAvg.toFixed(2) : '—') + '
';
html += '
';
html += '' + (currentTrimAvg !== null ? currentTrimAvg.toFixed(2) : '—') + ' ';
if (diffText) {
html += '' + diffText + ' ';
}
html += '
';
html += '
';
html += '
';
if (subjects.length > 0) {
html += '
Top matières
';
for (var k = 0; k < subjects.length; k++) {
var item = subjects[k];
html += '
' + item.name + ' ' + item.average.toFixed(2) + '
';
}
html += '
';
}
html += '
';
// if (timelineData && timelineData.length > 0) {
var timelineCount = getTimelineCount();
var displayedTimeline = timelineData.slice(0, timelineCount);
html += '
';
html += '
Timeline récente
';
html += '
';
for (var t = 0; t < displayedTimeline.length; t++) {
var event = displayedTimeline[t];
var eventDate = event.date ? new Date(event.date).toLocaleDateString('fr-FR') : 'Date inconnue';
var subtitle = event.soustitre || '';
var content = event.contenu || '';
html += '
';
html += '
' + (event.titre || 'Événement') + '
';
if (subtitle) html += '
' + subtitle + '
';
html += '
' + (event.typeElement || '') + '
';
html += '
' + eventDate + '
';
if (content) html += '
' + content + '
';
html += '
';
}
html += '
';
html += '
';
// }
contentDiv.innerHTML = html;
}
function renderMoyennes() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
var triData = trimesters[currentTrimester];
var subjectsList = [];
var totalWeighted = 0;
var totalCoef = 0;
var totalGrades = 0;
for (var subject in triData.subjects) {
var subj = triData.subjects[subject];
subjectsList.push({
name: subject,
average: subj.average,
count: subj.count,
coefSum: subj.coefSum
});
totalWeighted += subj.sum;
totalCoef += subj.coefSum;
totalGrades += subj.count;
}
subjectsList.sort(function(a, b) { return b.average - a.average; });
var trimesterAverage = totalCoef > 0 ? (totalWeighted / totalCoef) : null;
var allTotalWeighted = 0;
var allTotalCoef = 0;
var allTotalGrades = 0;
for (var tri in trimesters) {
for (var sub in trimesters[tri].subjects) {
var s = trimesters[tri].subjects[sub];
allTotalWeighted += s.sum;
allTotalCoef += s.coefSum;
allTotalGrades += s.count;
}
}
var annualAverage = allTotalCoef > 0 ? (allTotalWeighted / allTotalCoef) : null;
var html = '';
if (subjectsList.length === 0) {
html += '
Aucune note pour ce trimestre
';
} else {
html += '
';
html += '
MOYENNE GENERALE
' + trimesterAverage.toFixed(2) + '
Coefficientee
';
html += '
NOMBRE DE NOTES
' + totalGrades + '
Ce trimestre
';
html += '
';
html += '
';
for (var i = 0; i < subjectsList.length; i++) {
var sub = subjectsList[i];
var gradeColor = getGradeColor(sub.average);
var diff = sub.average - trimesterAverage;
var diffColor = getDifferenceColor(diff);
var diffText = formatDifference(diff);
html += '
';
html += '';
html += '
';
html += '
' + sub.count + ' note(s)';
html += '
Coeff. ' + sub.coefSum.toFixed(1) + ' ';
html += '
' + diffText + '
';
html += '
';
html += '
';
}
html += '
';
}
if (annualAverage !== null) {
html += '
';
html += '
MOYENNE ANNUELLE PONDEREE
';
html += '
' + annualAverage.toFixed(2) + '
';
html += '
' + allTotalGrades + ' notes sur toute l annee
';
html += '
';
}
contentDiv.innerHTML = html;
var subjectCards = contentDiv.querySelectorAll('.subject-card[data-subject]');
for (var i = 0; i < subjectCards.length; i++) {
subjectCards[i].addEventListener('click', function() {
var subjectName = this.getAttribute('data-subject');
showSubjectGrades(subjectName);
});
}
}
function showSubjectGrades(subjectName) {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
previousView = 'moyennes';
var subjectGrades = originalNotes.filter(function(note) {
return note.libelleMatiere === subjectName && note.codePeriode === currentTrimester;
});
if (subjectGrades.length === 0) {
subjectGrades = originalNotes.filter(function(note) {
return note.libelleMatiere === subjectName;
});
var trimesterDisplay = 'Toutes les periodes';
} else {
var trimesterDisplay = trimesters[currentTrimester].name;
}
var html = '
';
html += '
← Retour aux moyennes ';
html += '
';
html += '
' + subjectName + ' ';
html += '
' + trimesterDisplay + '
';
html += '
';
if (subjectGrades.length === 0) {
html += '
Aucune note trouvee pour cette matiere
';
} else {
html += '
';
for (var i = 0; i < subjectGrades.length; i++) {
var grade = subjectGrades[i];
var gradeValue = grade.valeur;
var noteSur = grade.noteSur || 20;
var gradeColor = getGradeColor(parseFloat(gradeValue.replace(',', '.')) / noteSur * 20);
var dateStr = grade.date || grade.dateSaisie;
var formattedDate = dateStr ? new Date(dateStr).toLocaleDateString('fr-FR') : 'Date inconnue';
var commentaire = grade.commentaire || '';
var decodedComment = decodeContent(commentaire);
html += '
';
html += '
';
html += '
' + gradeValue + '/' + noteSur + '
';
html += '
' + formattedDate + '
';
if (decodedComment) {
html += '
' + decodedComment + '
';
}
html += '
';
html += '
';
html += '
' + gradeValue + '
';
html += '
Coeff. ' + (grade.coef || 1) + '
';
html += '
';
html += '
';
}
html += '
';
}
html += '
';
contentDiv.innerHTML = html;
var backButton = document.getElementById('back-to-moyennes');
if (backButton) {
backButton.addEventListener('click', function() {
renderMoyennes();
});
}
}
function getDifferenceColor(diff) {
if (diff > 0) return '#40D9A4';
if (diff < 0) return '#FF6B6B';
return '#8E8E93';
}
function formatDifference(diff) {
if (diff > 0) return '+' + diff.toFixed(2);
if (diff < 0) return diff.toFixed(2);
return '0.00';
}
function renderDevoirs() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
var dates = Object.keys(cahierData).sort();
var hasTasks = false;
var html = '
';
for (var d = 0; d < dates.length; d++) {
var dateKey = dates[d];
var devoirs = cahierData[dateKey];
var formatted = formatDate(dateKey);
var notDoneTasks = [];
var doneTasks = [];
for (var i = 0; i < devoirs.length; i++) {
if (devoirs[i].effectue === false) {
notDoneTasks.push(devoirs[i]);
} else {
doneTasks.push(devoirs[i]);
}
}
var allTasks = notDoneTasks.concat(doneTasks);
if (allTasks.length > 0) {
hasTasks = true;
html += '
';
html += '
';
html += '
' + formatted.dayName + ' ' + formatted.date + '
';
html += '
' + allTasks.length + ' devoir(s)
';
html += '
';
html += '
';
for (var i = 0; i < allTasks.length; i++) {
var task = allTasks[i];
var isDone = (task.effectue === true);
var taskType = task.interrogation ? "Interrogation" : "Devoir";
var hasDocs = (task.documentsAFaire === true);
var rawContent = '';
if (typeof task.contenu === 'string') {
rawContent = task.contenu;
} else if (typeof task.aFaire === 'string') {
rawContent = task.aFaire;
}
var taskContent = decodeContent(rawContent);
var taskDate = task.donneLe ? new Date(task.donneLe).toLocaleDateString('fr-FR') : formatted.date;
html += '
';
html += '
';
if (taskContent) {
html += '
' + taskContent + '
';
}
if (hasDocs) {
html += '
';
html += '📎 Pieces jointes disponibles ';
html += '
';
}
html += '
';
}
html += '
';
html += '
';
}
}
if (!hasTasks) {
html += '
';
}
html += '
';
contentDiv.innerHTML = html;
var datePills = document.querySelectorAll('#ed-content .date-pill');
for (var i = 0; i < datePills.length; i++) {
datePills[i].addEventListener('click', function(e) {
e.stopPropagation();
var dateKey = this.getAttribute('data-date');
showDayDetails(dateKey);
});
}
}
function isActuallySigned(msg) {
if (!msg.signature) return false;
if (Array.isArray(msg.signature)) {
if (msg.signature.length === 0) return false;
for (var i = 0; i < msg.signature.length; i++) {
var sig = msg.signature[i];
if (sig.dateValidation && sig.dateValidation !== "") return true;
if (sig.datevalidation && sig.datevalidation !== "") return true;
}
return false;
}
if (typeof msg.signature === 'object') {
if (msg.signature.dateValidation && msg.signature.dateValidation !== "") return true;
if (msg.signature.datevalidation && msg.signature.datevalidation !== "") return true;
}
return false;
}
function hasSignatureOption(msg) {
return msg.isSignatureDemandee === true;
}
function getSignature(msg) {
if (!msg.signature) return null;
if (Array.isArray(msg.signature) && msg.signature.length > 0) {
return msg.signature[0];
}
if (typeof msg.signature === 'object') {
return msg.signature;
}
return null;
}
function renderCarnet() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
var correspondances = carnetData.correspondances || [];
function highlightText(text, searchTerm) {
if (!searchTerm || searchTerm.trim() === "") return text;
var regex = new RegExp('(' + searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi');
return text.replace(regex, '
$1 ');
}
var html = '
';
html += '
';
html += '
';
html += '🔍 ';
html += ' ';
html += 'Effacer ';
html += '
';
html += '
';
html += 'Tous ';
html += 'Non signes ';
html += 'Signes ';
html += '
';
html += '
';
html += '
';
html += '
';
contentDiv.innerHTML = html;
function renderMessages(filterText, filterType) {
var messagesDiv = document.getElementById('carnetMessages');
if (!messagesDiv) return;
var filtered = correspondances.filter(function(msg) {
var auteur = msg.auteur || {};
var auteurName = ((auteur.nom || "") + " " + (auteur.prenom || "")).toLowerCase();
var content = (msg.contenu || "").toLowerCase();
var date = (msg.dateCreation || "").toLowerCase();
var searchLower = filterText.toLowerCase();
var matchesSearch = filterText === "" || auteurName.indexOf(searchLower) !== -1 || content.indexOf(searchLower) !== -1 || date.indexOf(searchLower) !== -1;
var isSigned = isActuallySigned(msg);
var matchesFilter = true;
if (filterType === "signed") matchesFilter = isSigned;
if (filterType === "unsigned") matchesFilter = hasSignatureOption(msg) && !isSigned;
return matchesSearch && matchesFilter;
});
if (filtered.length === 0) {
messagesDiv.innerHTML = '
';
return;
}
var html = '';
for (var i = 0; i < filtered.length; i++) {
var msg = filtered[i];
var date = msg.dateCreation || "";
var formattedDate = date.replace(/-/g, '/').substring(0, 16);
var isSigned = isActuallySigned(msg);
var hasOption = hasSignatureOption(msg);
var sig = getSignature(msg);
var auteur = msg.auteur || {};
var auteurName = (auteur.nom || "") + " " + (auteur.prenom || "");
var cleanContent = decodeContent(msg.contenu || "");
var hasAttachment = msg.urlFichier && msg.urlFichier !== "";
var highlightedName = filterText ? highlightText(auteurName, filterText) : auteurName;
var highlightedContent = filterText ? highlightText(cleanContent, filterText) : cleanContent;
var highlightedDate = filterText ? highlightText(formattedDate, filterText) : formattedDate;
var borderColor = '#2C2C44';
if (isSigned) borderColor = '#5E5EFF';
else if (hasOption) borderColor = '#FFB340';
html += '
';
html += '
';
html += '
' + highlightedName + ' (' + (msg.type || "") + ')
';
html += '
' + highlightedDate + '
';
html += '
';
html += '
' + highlightedContent + '
';
html += '
';
if (isSigned && sig) {
var sigDate = sig.dateValidation || sig.datevalidation || "";
sigDate = sigDate.replace(/-/g, '/').substring(0, 16);
var sigName = (sig.nom || "") + " " + (sig.prenom || "");
var highlightedSigName = filterText ? highlightText(sigName, filterText) : sigName;
var highlightedSigDate = filterText ? highlightText(sigDate, filterText) : sigDate;
html += '✓ Signe par ' + highlightedSigName + ' le ' + highlightedSigDate + ' ';
} else if (hasOption) {
html += '○ En attente de signature ';
}
if (hasAttachment) {
html += '📎 Piece jointe ';
}
html += '
';
}
messagesDiv.innerHTML = html;
var attachBtns = document.querySelectorAll('.attachment-btn');
for (var i = 0; i < attachBtns.length; i++) {
attachBtns[i].addEventListener('click', function(e) {
e.stopPropagation();
alert("Piece jointe disponible. Veuillez utiliser l'application Ecole Directe ou le site web pour y acceder.");
});
}
}
var searchInput = document.getElementById('carnetSearch');
var clearBtn = document.getElementById('clearSearch');
var currentFilter = "all";
function updateMessages() {
var searchText = searchInput ? searchInput.value : "";
renderMessages(searchText, currentFilter);
}
if (searchInput) {
searchInput.addEventListener('input', updateMessages);
}
if (clearBtn) {
clearBtn.addEventListener('click', function() {
if (searchInput) searchInput.value = "";
updateMessages();
});
}
var filterBtns = document.querySelectorAll('.filter-btn');
for (var i = 0; i < filterBtns.length; i++) {
filterBtns[i].addEventListener('click', function() {
currentFilter = this.getAttribute('data-filter');
for (var j = 0; j < filterBtns.length; j++) {
filterBtns[j].style.opacity = "0.6";
}
this.style.opacity = "1";
updateMessages();
});
filterBtns[i].style.opacity = i === 0 ? "1" : "0.6";
}
renderMessages("", "all");
}
function renderVieScolaire() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
var absencesRetards = vieScolaireData.absencesRetards || [];
var sanctionsEncouragements = vieScolaireData.sanctionsEncouragements || [];
var absences = absencesRetards.filter(function(item) { return item.typeElement === "Absence"; });
var retards = absencesRetards.filter(function(item) { return item.typeElement === "Retard"; });
var repas = absencesRetards.filter(function(item) { return item.typeElement === "Repas"; });
var punitions = sanctionsEncouragements.filter(function(item) { return item.typeElement === "Punition"; });
var encouragements = sanctionsEncouragements.filter(function(item) { return item.typeElement === "Encouragement"; });
var html = '
';
if (absences.length > 0) {
html += '
';
html += '
Absences ';
for (var i = 0; i < absences.length; i++) {
var a = absences[i];
html += '
';
html += '
' + a.displayDate + '
';
html += '
' + a.libelle + '
';
html += '
' + (a.justifie ? '✓ Justifiee' : '○ Non justifiee') + '
';
if (a.motif && a.motif !== "En attente de motif") {
html += '
Motif: ' + a.motif + '
';
}
if (a.commentaire && a.commentaire !== "") {
html += '
' + a.commentaire.substring(0, 100) + (a.commentaire.length > 100 ? '...' : '') + '
';
}
html += '
';
}
html += '
';
}
if (retards.length > 0) {
html += '
';
html += '
Retards ';
for (var i = 0; i < retards.length; i++) {
var r = retards[i];
var isJustified = r.justifie === true;
html += '
';
html += '
';
html += '' + r.displayDate + ' ';
if (!isJustified) {
html += '⚠️ ';
}
html += '
';
html += '
Duree: ' + r.libelle + '
';
html += '
' + (isJustified ? '✓ Justifie' : '⚠️ Non justifie') + '
';
if (r.motif && r.motif !== "En attente de motif") {
html += '
Motif: ' + r.motif + '
';
}
html += '
';
}
html += '
';
}
if (repas.length > 0) {
html += '
';
html += '
Absences cantine ';
for (var i = 0; i < repas.length; i++) {
var rp = repas[i];
html += '
';
html += '
' + rp.displayDate + '
';
html += '
' + rp.libelle + '
';
html += '
○ Absent
';
if (rp.commentaire && rp.commentaire !== "") {
html += '
' + rp.commentaire.substring(0, 100) + (rp.commentaire.length > 100 ? '...' : '') + '
';
}
html += '
';
}
html += '
';
}
if (punitions.length > 0) {
html += '
';
html += '
⚠️ Punitions ';
for (var i = 0; i < punitions.length; i++) {
var p = punitions[i];
html += '
';
html += '
' + p.libelle + ' - ' + p.date + '
';
html += '
Par: ' + p.par + '
';
if (p.motif) html += '
Motif: ' + p.motif + '
';
if (p.commentaire) html += '
' + p.commentaire + '
';
if (p.dateDeroulement) html += '
' + p.dateDeroulement + '
';
html += '
';
}
html += '
';
}
if (encouragements.length > 0) {
html += '
';
html += '
Encouragements ';
for (var i = 0; i < encouragements.length; i++) {
var e = encouragements[i];
html += '
';
html += '
' + e.libelle + ' - ' + e.date + '
';
if (e.motif) html += '
' + e.motif + '
';
if (e.commentaire) html += '
' + e.commentaire + '
';
html += '
';
}
html += '
';
}
if (absences.length === 0 && retards.length === 0 && repas.length === 0 && punitions.length === 0 && encouragements.length === 0) {
html += '
Aucune information de vie scolaire
';
}
html += '
';
contentDiv.innerHTML = html;
}
function renderMessagerie() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
var received = [];
var sent = [];
var draft = [];
var archived = [];
var currentFolder = "received";
var searchTerm = "";
var currentPage = 1;
var messagesPerPage = 20;
var foldersLoaded = false;
function loadAllMessages() {
contentDiv.innerHTML = '
Chargement des messages...
';
Promise.all([
fetch(`https://api.ecoledirecte.com/v3/eleves/${id}/messages.awp?force=false&typeRecuperation=received&idClasseur=0&orderBy=date&order=desc&query=&onlyRead=&page=0&itemsPerPage=1000&getAll=0&verbe=get&v=4.98.0`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Token": token },
body: "data=" + encodeURIComponent(JSON.stringify({}))
}).then(res => res.json()),
fetch(`https://api.ecoledirecte.com/v3/eleves/${id}/messages.awp?force=false&typeRecuperation=sent&idClasseur=0&orderBy=date&order=desc&query=&onlyRead=&page=0&itemsPerPage=1000&getAll=0&verbe=get&v=4.98.0`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Token": token },
body: "data=" + encodeURIComponent(JSON.stringify({}))
}).then(res => res.json()),
fetch(`https://api.ecoledirecte.com/v3/eleves/${id}/messages.awp?force=false&typeRecuperation=draft&idClasseur=0&orderBy=date&order=desc&query=&onlyRead=&page=0&itemsPerPage=1000&getAll=0&verbe=get&v=4.98.0`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Token": token },
body: "data=" + encodeURIComponent(JSON.stringify({}))
}).then(res => res.json()),
fetch(`https://api.ecoledirecte.com/v3/eleves/${id}/messages.awp?force=false&typeRecuperation=archived&idClasseur=0&orderBy=date&order=desc&query=&onlyRead=&page=0&itemsPerPage=1000&getAll=0&verbe=get&v=4.98.0`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Token": token },
body: "data=" + encodeURIComponent(JSON.stringify({}))
}).then(res => res.json())
]).then(function(results) {
if (results[0].code === 200) received = results[0].data.messages.received || [];
if (results[1].code === 200) sent = results[1].data.messages.sent || [];
if (results[2].code === 200) draft = results[2].data.messages.draft || [];
if (results[3].code === 200) archived = results[3].data.messages.archived || [];
foldersLoaded = true;
buildMessagerieUI();
}).catch(function() {
buildMessagerieUI();
});
}
function decodeBase64Content(str) {
if (!str) return "";
try {
var base64Decoded = atob(str);
var bytes = [];
for (var i = 0; i < base64Decoded.length; i++) bytes.push(base64Decoded.charCodeAt(i) & 0xFF);
var decoder = new TextDecoder('utf-8');
return decoder.decode(new Uint8Array(bytes));
} catch(e) {
return str;
}
}
function getMessagesByFolder() {
var messages = [];
if (currentFolder === "received") messages = received.slice();
if (currentFolder === "sent") messages = sent.slice();
if (currentFolder === "draft") messages = draft.slice();
if (currentFolder === "archived") messages = archived.slice();
messages.sort(function(a, b) { return new Date(b.date || 0) - new Date(a.date || 0); });
return messages;
}
function showMessageDetail(messageId) {
var detailDiv = document.getElementById('messageDetail');
if (!detailDiv) return;
detailDiv.innerHTML = '
Chargement...
';
var mode = "destinataire";
if (currentFolder === "sent") mode = "expediteur";
else if (currentFolder === "draft") mode = "brouillon";
fetch(`https://api.ecoledirecte.com/v3/eleves/${id}/messages/${messageId}.awp?verbe=get&mode=${mode}&v=4.98.0`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Token": token },
body: "data=" + encodeURIComponent(JSON.stringify({}))
})
.then(res => res.json())
.then(function(json) {
var msg = json.data;
if (!msg) { detailDiv.innerHTML = '
Message non trouvé
'; return; }
var contactName = "";
if (currentFolder === "received" && msg.from) contactName = msg.from.prenom + " " + msg.from.nom;
else if (currentFolder === "sent" && msg.to && msg.to[0]) contactName = msg.to[0].prenom + " " + msg.to[0].nom;
else if (currentFolder === "archived" && msg.from) contactName = msg.from.prenom + " " + msg.from.nom;
var date = (msg.date || "").replace(/-/g, '/').substring(0, 16);
var cleanContent = decodeBase64Content(msg.content || "");
var subject = msg.subject || "(Sans objet)";
var hasAttachment = msg.files && msg.files.length > 0;
var html = '
';
html += '
' + contactName + '
' + date + '
';
html += '
' + subject + '
';
html += '
' + cleanContent + '
';
html += '
';
detailDiv.innerHTML = html;
if (hasAttachment) {
var attachSection = document.createElement('div');
attachSection.style.cssText = 'margin-top:20px;padding-top:16px;border-top:1px solid #2C2C44;';
var label = document.createElement('span');
label.textContent = 'Pièces jointes:';
label.style.cssText = 'color:#8E8E93;display:block;margin-bottom:8px;';
attachSection.appendChild(label);
for (var i = 0; i < msg.files.length; i++) {
(function(file) {
var btn = document.createElement('button');
btn.textContent = '📎 ' + file.libelle;
btn.style.cssText = 'background:#2C2C44;border:none;color:#5E5EFF;padding:10px 16px;border-radius:12px;cursor:pointer;margin-right:8px;margin-bottom:8px;font-size:14px;font-weight:500;display:block;width:100%;text-align:left;';
btn.onclick = function(e) {
e.preventDefault();
e.stopPropagation();
window.showAttachmentModal(file.id, file.libelle);
};
attachSection.appendChild(btn);
})(msg.files[i]);
}
detailDiv.appendChild(attachSection);
}
})
.catch(function(err) { detailDiv.innerHTML = '
Erreur: ' + err.message + '
'; });
}
function renderMessages() {
var allMessages = getMessagesByFolder();
var filtered = allMessages.filter(function(msg) {
if (!searchTerm) return true;
var contact = "";
if (currentFolder === "received" && msg.from) contact = msg.from.prenom + " " + msg.from.nom;
else if (currentFolder === "sent" && msg.to && msg.to[0]) contact = msg.to[0].prenom + " " + msg.to[0].nom;
else if (currentFolder === "archived" && msg.from) contact = msg.from.prenom + " " + msg.from.nom;
return contact.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 || (msg.subject || "").toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1;
});
var totalPages = Math.ceil(filtered.length / messagesPerPage);
var start = (currentPage - 1) * messagesPerPage;
var pageMessages = filtered.slice(start, start + messagesPerPage);
var listDiv = document.getElementById('messageList');
if (!listDiv) return;
if (filtered.length === 0) { listDiv.innerHTML = '
Aucun message
'; return; }
var html = '
' + filtered.length + ' message(s)
';
for (var i = 0; i < pageMessages.length; i++) {
var msg = pageMessages[i];
var contactName = "";
if (currentFolder === "received" && msg.from) contactName = msg.from.prenom + " " + msg.from.nom;
else if (currentFolder === "sent" && msg.to && msg.to[0]) contactName = msg.to[0].prenom + " " + msg.to[0].nom;
else if (currentFolder === "archived" && msg.from) contactName = msg.from.prenom + " " + msg.from.nom;
var date = (msg.date || "").replace(/-/g, '/').substring(0, 16);
var subject = msg.subject || "(Sans objet)";
var isRead = msg.read !== false;
var hasAttachment = msg.files && msg.files.length > 0;
html += '
';
html += '
' + contactName + '
' + date + '
';
html += '
' + subject + '
';
if (hasAttachment) html += '
📎 ' + msg.files.length + ' piece(s)
';
html += '
';
}
if (totalPages > 1) {
html += '
';
if (currentPage > 1) {
html += '« ';
html += '← ';
}
for (var p = Math.max(1, currentPage - 2); p <= Math.min(totalPages, currentPage + 2); p++) {
if (p === currentPage) html += '' + p + ' ';
else html += '' + p + ' ';
}
if (currentPage < totalPages) {
html += '→ ';
html += '» ';
}
html += '
';
}
listDiv.innerHTML = html;
document.querySelectorAll('.message-item').forEach(el => el.addEventListener('click', e => showMessageDetail(el.dataset.id)));
document.querySelectorAll('.page-btn').forEach(el => el.addEventListener('click', e => { currentPage = parseInt(el.dataset.page); renderMessages(); document.getElementById('messageList').scrollTop = 0; }));
}
function refreshUI() {
currentPage = 1;
renderMessages();
document.querySelectorAll('.folder-btn').forEach(btn => {
btn.style.background = btn.dataset.folder === currentFolder ? '#5E5EFF' : '#2C2C44';
btn.style.color = 'white';
});
}
function buildMessagerieUI() {
var html = '
';
html += '
';
html += '
';
html += 'Reçus (' + received.length + ') ';
html += 'Envoyés (' + sent.length + ') ';
html += 'Brouillons (' + draft.length + ') ';
html += 'Archive (' + archived.length + ') ';
html += '
';
html += '
';
html += '🔍 ';
html += ' ';
html += 'Effacer ';
html += '
';
html += '
';
html += '
';
html += '
';
html += '
';
contentDiv.innerHTML = html;
document.querySelectorAll('.folder-btn').forEach(btn => btn.addEventListener('click', function() {
currentFolder = this.dataset.folder;
document.getElementById('searchInput').value = '';
searchTerm = '';
refreshUI();
}));
document.getElementById('searchInput').addEventListener('input', e => { searchTerm = e.target.value; currentPage = 1; renderMessages(); });
document.getElementById('clearSearch').addEventListener('click', () => { document.getElementById('searchInput').value = ''; searchTerm = ''; currentPage = 1; renderMessages(); });
refreshUI();
}
if (!foldersLoaded) loadAllMessages();
else buildMessagerieUI();
}
function renderApiLog() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
if (apiLogs.length === 0) {
contentDiv.innerHTML = '
Aucun log API. Activez le debug dans les parametres.
';
return;
}
var html = '
';
html += '
📋 API Logs ';
html += '
';
html += '
';
html += '';
html += 'Date ';
html += 'API ';
html += 'Status ';
html += 'Duree ';
html += ' ';
for (var i = 0; i < apiLogs.length; i++) {
var log = apiLogs[i];
var statusColor = log.responseCode === 200 ? '#5E5EFF' : '#FF5E5E';
html += '';
html += '' + log.timestamp + ' ';
html += '' + (log.url.substring(0, 50) + (log.url.length > 50 ? '...' : '')) + ' ';
html += '' + log.responseCode + ' ';
html += '' + log.duration + ' ';
html += ' ';
}
html += '
';
contentDiv.innerHTML = html;
}
function renderSettings() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
var html = '
';
html += '
';
html += '
Parametres ';
html += '
';
html += '
Mode Debug Activer les logs API
';
html += '
';
html += ' ';
html += ' ';
html += ' ';
html += ' ';
html += '
📋 Voir les logs API ';
html += '
';
html += '
';
contentDiv.innerHTML = html;
var debugToggle = document.getElementById('debugToggle');
if (debugToggle) {
debugToggle.addEventListener('change', function(e) {
debugEnabled = e.target.checked;
if (!debugEnabled) {
apiLogs.length = 0;
}
});
}
var viewLogsBtn = document.getElementById('viewApiLogsBtn');
if (viewLogsBtn) {
viewLogsBtn.addEventListener('click', function() {
if (debugEnabled) {
renderApiLog();
var tabBtns = document.querySelectorAll('#ed-widget .tab-btn');
for (var i = 0; i < tabBtns.length; i++) {
tabBtns[i].classList.remove('active');
}
currentTab = "apilog";
} else {
alert("Activez le mode Debug d'abord dans les parametres");
}
});
}
}
function renderEspaceTravail() {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '';
if (!espaceData || espaceData.length === 0) {
contentDiv.innerHTML = '
Aucun espace de travail disponible
';
return;
}
var mySpaces = [];
var otherSpaces = [];
for (var i = 0; i < espaceData.length; i++) {
var space = espaceData[i];
if (space.estMembre === true) {
mySpaces.push(space);
} else {
otherSpaces.push(space);
}
}
var html = '';
if (mySpaces.length > 0) {
html += '
Mes espaces ';
html += '
';
for (var i = 0; i < mySpaces.length; i++) {
var space = mySpaces[i];
var resumeText = decodeContent(space.resume || "");
html += '
';
html += '
' + space.titre + ' ';
if (resumeText) {
html += '
' + resumeText + '
';
}
html += '
';
if (space.cloud) html += 'Cloud ';
if (space.discussion) html += 'Discussion ';
if (space.agenda) html += 'Agenda ';
html += '
';
html += '
Cree par: ' + (space.creePar || "Inconnu") + '
';
html += '
';
}
html += '
';
}
if (otherSpaces.length > 0) {
html += '
Autres espaces disponibles ';
html += '
';
for (var i = 0; i < otherSpaces.length; i++) {
var space = otherSpaces[i];
var resumeText = decodeContent(space.resume || "");
html += '
';
html += '
' + space.titre + ' ';
if (resumeText) {
html += '
' + resumeText + '
';
}
html += '
';
if (space.cloud) html += 'Cloud ';
if (space.discussion) html += 'Discussion ';
if (space.agenda) html += 'Agenda ';
html += '
';
html += '
';
}
html += '
';
}
contentDiv.innerHTML = html;
var spaceCards = document.querySelectorAll('.espace-card[data-space-id]');
for (var i = 0; i < spaceCards.length; i++) {
spaceCards[i].addEventListener('click', function(e) {
var spaceId = this.getAttribute('data-space-id');
var spaceTitle = this.getAttribute('data-space-title');
showCloudExplorer(spaceId, spaceTitle);
});
}
}
function showCloudExplorer(spaceId, spaceTitle) {
currentSpaceId = spaceId;
currentPath = [];
loadFolder(spaceId, null);
}
function loadFolder(spaceId, folderId) {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
contentDiv.innerHTML = '
';
var url = `https://api.ecoledirecte.com/v3/cloud/W/${spaceId}.awp?verbe=get&v=4.98.0`;
if (folderId && folderId !== '/') {
url = `https://api.ecoledirecte.com/v3/cloud/W/${spaceId}/${encodeURIComponent(folderId)}.awp?verbe=get&v=4.98.0`;
}
fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"X-Token": token
},
body: "data=" + encodeURIComponent(JSON.stringify({}))
})
.then(function(res) { return res.json(); })
.then(function(json) {
var data = json.data;
var items = [];
if (data && data.length > 0) {
if (folderId && folderId !== '/') {
items = data;
} else {
for (var i = 0; i < data.length; i++) {
if (data[i].libelle === '/' && data[i].type === 'folder') {
items = data[i].children || [];
break;
}
}
}
}
renderCloudExplorer(spaceId, items, folderId);
})
.catch(function(e) {
contentDiv.innerHTML = '
Erreur: ' + e.message + '
← Retour aux espaces ';
document.getElementById('cloudBackBtn').addEventListener('click', function() {
renderEspaceTravail();
});
});
}
function renderCloudExplorer(spaceId, items, currentFolderId) {
var contentDiv = document.getElementById('ed-content');
if (!contentDiv) return;
var html = '
';
if (currentPath.length > 0) {
html += '← Retour ';
}
html += '← Retour aux espaces ';
html += '
';
if (items && items.length > 0) {
html += '
';
for (var i = 0; i < items.length; i++) {
var item = items[i];
var isFolder = item.type === 'folder';
var icon = isFolder ? '📁' : '📄';
html += '
';
html += '
';
html += '' + icon + ' ';
html += '' + item.libelle + ' ';
html += '
';
if (!isFolder) {
var size = item.taille || 0;
html += '
' + formatFileSize(size) + ' ';
} else {
html += '
Dossier ';
}
html += '
';
}
html += '
';
} else {
html += '
';
}
contentDiv.innerHTML = html;
if (currentPath.length > 0) {
var backBtn = document.getElementById('backBtn');
if (backBtn) {
backBtn.addEventListener('click', function() {
currentPath.pop();
var parentId = currentPath.length > 0 ? currentPath[currentPath.length - 1] : null;
loadFolder(currentSpaceId, parentId);
});
}
}
var backToSpacesBtn = document.getElementById('cloudBackToSpacesBtn');
if (backToSpacesBtn) {
backToSpacesBtn.addEventListener('click', function() {
currentPath = [];
renderEspaceTravail();
});
}
}
window.navigateToFolder = function(folderId) {
currentPath.push(folderId);
loadFolder(currentSpaceId, folderId);
};
function formatFileSize(bytes) {
if (!bytes) return '';
if (bytes < 1024) return bytes + ' o';
if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' Ko';
return (bytes / 1048576).toFixed(1) + ' Mo';
}
function renderContent() {
if (currentTab === "home") {
renderHome();
} else if (currentTab === "moyennes") {
renderMoyennes();
} else if (currentTab === "devoirs") {
renderDevoirs();
} else if (currentTab === "espacetravail") {
renderEspaceTravail();
} else if (currentTab === "carnet") {
renderCarnet();
} else if (currentTab === "viescolaire") {
renderVieScolaire();
} else if (currentTab === "messagerie") {
renderMessagerie();
} else if (currentTab === "apilog") {
renderApiLog();
} else if (currentTab === "settings") {
renderSettings();
}
}
widget.innerHTML = `
Accueil
Notes
Devoirs
Espace travail
Carnet
Vie scolaire
Messages
Parametres
`;
document.body.appendChild(widget);
window.goBack = goBack;
window.navigateToFolder = navigateToFolder;
var tabBtns = document.querySelectorAll('#ed-widget .tab-btn');
function setTab(tab) {
currentTab = tab;
for (var j = 0; j < tabBtns.length; j++) {
tabBtns[j].classList.remove('active');
}
var button = document.querySelector('#ed-widget .tab-btn[data-tab="' + tab + '"]');
if (button) button.classList.add('active');
var trimesterSelector = document.querySelector('#ed-widget .selector-container');
if (trimesterSelector) {
if (tab === "moyennes") {
trimesterSelector.style.display = 'block';
} else {
trimesterSelector.style.display = 'none';
}
}
renderContent();
}
for (var i = 0; i < tabBtns.length; i++) {
tabBtns[i].addEventListener('click', function(e) {
setTab(this.getAttribute('data-tab'));
});
}
window.setTab = setTab;
var activeTab = document.querySelector('#ed-widget .tab-btn[data-tab="home"]');
if (activeTab) activeTab.classList.add('active');
var trimesterSelectorHtml = document.createElement('div');
trimesterSelectorHtml.className = 'selector-container';
trimesterSelectorHtml.innerHTML = `
1er Trimestre
2eme Trimestre
3eme Trimestre
`;
var contentDiv = document.getElementById('ed-content');
var parentDiv = contentDiv.parentNode;
parentDiv.insertBefore(trimesterSelectorHtml, contentDiv);
trimesterSelectorHtml.style.display = 'none';
renderContent();
var triButtons = document.querySelectorAll('#ed-widget .trimester-option');
for (var i = 0; i < triButtons.length; i++) {
triButtons[i].addEventListener('click', function(e) {
var tri = this.getAttribute('data-tri');
currentTrimester = tri;
for (var j = 0; j < triButtons.length; j++) {
triButtons[j].classList.remove('active');
}
this.classList.add('active');
if (currentTab === "moyennes") {
renderMoyennes();
}
});
}
var activeTri = document.querySelector('#ed-widget .trimester-option[data-tri="' + currentTrimester + '"]');
if (activeTri) activeTri.classList.add('active');
renderContent();
}, 50);
completion("Charge");
} catch (error) {
console.error('Erreur dans le script EcoleDirecte:', error);
var loadingElement = document.getElementById('ed-loading');
if (loadingElement) loadingElement.remove();
var placeholderElement = document.getElementById('ed-widget-placeholder');
if (placeholderElement) placeholderElement.remove();
completion("Erreur: " + (error.message || "Erreur inconnue"));
}
})();
/* ===================
Script End ✨
=================== */