Ce script JavaScript a pour objectif d'améliorer la lisibilité de la page issuehistory.pl dans Koha, en mettant en évidence les prêts présentant des anomalies. Il permet d’identifier visuellement les retours en retard ou incohérents (par exemple, un retour avant la date d’emprunt).
issuehistory.pl.table_issues.data-order.MutationObserver est mis en place pour relancer l’analyse en cas de changement dans le tableau (ex. : chargement AJAX).//mise en page de la page Historique de prêts
if (window.location.pathname.includes("issuehistory.pl")) {
let observer;
function highlightIssues() {
const table = document.getElementById("table_issues");
if (!table) return;
const rows = table.querySelectorAll("tbody tr");
rows.forEach((row) => {
const cells = row.querySelectorAll("td");
if (cells.length < 8) return;
// Supprime les anciens messages pour éviter les doublons
const existingSpans = cells[7].querySelectorAll("span");
existingSpans.forEach(span => span.remove());
// Réinitialise le style de la cellule
cells[7].style.backgroundColor = "";
cells[7].style.color = "";
const borrowedDate = new Date(cells[5].getAttribute("data-order"));
const dueDate = new Date(cells[6].getAttribute("data-order"));
const returnDate = new Date(cells[7].getAttribute("data-order"));
let hasIssue = false;
let issueMessage = "";
// Vérifie les retards
if (returnDate > dueDate) {
const delayDays = Math.ceil((returnDate - dueDate) / (1000 * 60 * 60 * 24));
cells[7].style.backgroundColor = "rgba(255, 0, 0, 0.3)";
issueMessage = `Retour en retard (${delayDays} jours)`;
hasIssue = true;
}
// Vérifie les incohérences (retour avant emprunt)
if (returnDate < borrowedDate) {
cells[7].style.backgroundColor = "rgba(255, 165, 0, 0.5)";
issueMessage = "Retour avant emprunt";
hasIssue = true;
}
// Ajoute un message dans la cellule en cas de problème
if (hasIssue) {
const issueSpan = document.createElement("span");
issueSpan.style.display = "block";
issueSpan.style.color = "red";
issueSpan.textContent = issueMessage;
cells[7].appendChild(issueSpan);
} else {
// Si aucun problème, réinitialise la cellule
cells[7].style.color = "green";
}
});
}
function observeTableChanges() {
const tableBody = document.querySelector("#table_issues tbody");
if (!tableBody) return;
observer = new MutationObserver(() => {
console.log("Changement détecté dans le tableau, relance du script.");
highlightIssues();
});
observer.observe(tableBody, {
childList: true,
});
}
function addPaginationListener() {
const paginationButtons = document.querySelectorAll('.paginate_button');
paginationButtons.forEach(button => {
button.addEventListener('click', () => {
console.log("Bouton de pagination cliqué : " + button.id);
setTimeout(() => {
console.log("Relance du script après le changement de page.");
highlightIssues();
}, 1000);
});
});
}
highlightIssues();
observeTableChanges();
addPaginationListener();
}
rgba) peuvent être modifiées selon les préférences visuelles.issuehistory.pl : toute modification de l'ID table_issues ou de la disposition des colonnes pourrait nécessiter des ajustements.data-order des cellules concernées.