Description du script

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).

Explication détaillée de l’algorithme

  1. Le script s'exécute uniquement si l'URL de la page contient issuehistory.pl.
  2. Il sélectionne le tableau contenant l’historique des prêts, identifié par l’ID table_issues.
  3. Pour chaque ligne du tableau :
  4. Un MutationObserver est mis en place pour relancer l’analyse en cas de changement dans le tableau (ex. : chargement AJAX).
  5. Des écouteurs sont également ajoutés aux boutons de pagination pour que l’analyse se relance après un changement de page.

Inclusion du code

//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();
}

Éléments à modifier

Points clés pour les mises à jour de Koha

Dépendances