Ce script est destiné à la page "detail.pl" de Koha. Il réalise deux actions principales :
#holdings_table pour rechercher, dans la colonne "Statut", une date au format DD/MM/YYYY. Il calcule ensuite le nombre de jours restant ou le retard, et affiche cette information directement dans la cellule.#holdings_table.//Calcul durée prêt page detail
//Code collection lien page detail
if (window.location.pathname.includes("detail.pl")) {
setTimeout(() => {
console.log("Début du traitement");
// Sélection du tableau et des colonnes
const table = document.querySelector("#holdings_table");
if (!table) {
console.log("Tableau #holdings_table introuvable");
return;
}
console.log("Tableau trouvé");
// Récupère l'index de la colonne "Statut" en fonction de l'en-tête
const headers = Array.from(table.querySelectorAll("thead th"));
const statusColumnIndex = headers.findIndex((header) => header.textContent.trim() === "Statut");
if (statusColumnIndex === -1) {
console.log("Colonne 'Statut' introuvable");
return;
}
console.log("Colonne 'Statut' trouvée à l'index " + statusColumnIndex);
// Parcourt les lignes du tableau
const rows = table.querySelectorAll("tbody tr");
const today = new Date();
console.log(`Date d'aujourd'hui : ${today.toISOString()}`);
rows.forEach((row, rowIndex) => {
console.log(`Traitement de la ligne ${rowIndex + 1}`);
const statusCell = row.children[statusColumnIndex];
if (!statusCell) {
console.log(`Cellule de statut introuvable dans la ligne ${rowIndex + 1}`);
return;
}
const textContent = statusCell.textContent.trim();
console.log(`Contenu de la cellule de statut : '${textContent}'`);
// Recherche d'une date au format DD/MM/YYYY
const dateMatch = textContent.match(/(\d{2})\/(\d{2})\/(\d{4})/); // Cherche une date au format DD/MM/YYYY
if (dateMatch) {
const day = dateMatch[1];
const month = dateMatch[2];
const year = dateMatch[3];
// Crée un objet Date avec la date trouvée
const loanDate = new Date(`${year}-${month}-${day}`);
console.log(`Date trouvée et convertie : ${loanDate.toISOString()}`);
const diffTime = loanDate - today; // Différence en millisecondes
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); // Convertit en jours
// Ajout du résultat dans la cellule
const resultSpan = document.createElement("span");
resultSpan.style.display = "block"; // Pour que l'information supplémentaire soit bien visible
if (diffDays >= 0) {
console.log(`${diffDays} jour(s) restant(s)`);
resultSpan.textContent = `${diffDays} jour(s) restant(s)`;
resultSpan.style.color = "green";
} else {
console.log(`${Math.abs(diffDays)} jour(s) de retard`);
resultSpan.textContent = `${Math.abs(diffDays)} jour(s) de retard`;
resultSpan.style.color = "red";
}
statusCell.appendChild(resultSpan); // Ajoute l'information dans la cellule
} else {
console.log("Aucune date trouvée dans la cellule de statut");
}
// Rechercher le tableau des éléments
const catalogTable = document.querySelector("table");
if (!catalogTable) return; // Arrêter si aucun tableau n'est trouvé
// Trouver l'en-tête "Collection"
const tableHeaders = Array.from(catalogTable.querySelectorAll("thead th"));
const collectionColumnIndex = tableHeaders.findIndex(
(header) => header.textContent.trim() === "Collection"
);
if (collectionColumnIndex === -1) return; // Arrêter si la colonne "Collection" n'existe pas
// Parcourir chaque ligne du tableau
const tableRows = catalogTable.querySelectorAll("tbody tr");
tableRows.forEach((row) => {
const rowCells = row.querySelectorAll("td");
const collectionCell = rowCells[collectionColumnIndex];
if (collectionCell) {
const collectionIdentifier = collectionCell.textContent.trim();
if (collectionIdentifier) {
// Créer le lien vers la recherche de la collection
const collectionLink = document.createElement("a");
collectionLink.href = `https://koha.dracenie.com/cgi-bin/koha/catalogue/search.pl?q=ccode:%22${encodeURIComponent(
collectionIdentifier
)}%22`;
collectionLink.textContent = collectionIdentifier;
collectionLink.target = "_blank"; // Ouvre le lien dans un nouvel onglet
// Remplacer le contenu de la cellule par le lien
collectionCell.textContent = ""; // Vider la cellule
collectionCell.appendChild(collectionLink);
}
}
});
});
console.log("Traitement terminé");
}, 1000); // Délai de 2 secondes
}
#holdings_table) et les sélecteurs pour trouver les colonnes "Statut" et "Collection", au cas où la structure HTML changerait.