v2026.5.18 — Polish date custom

This commit is contained in:
Quentin Rouiller
2026-04-23 14:20:52 +02:00
parent d589447533
commit 1a7393c297
3 changed files with 193 additions and 40 deletions
+119 -25
View File
@@ -2366,9 +2366,13 @@ async function writeCache(isoDate, data) {
async function loadForDate(isoDate, opts = {}) {
// v4.3.1 : changer de date fermait tous les popups épinglés.
// v2026.5.17 : les popups épinglés restent maintenant ouverts entre dates,
// avec les données qu'ils avaient au moment de l'épinglage. L'utilisateur
// peut les fermer manuellement s'il veut.
// avec les données qu'ils avaient au moment de l'épinglage.
// v2026.5.18 : au changement de date, on réduit tous les popups épinglés
// dans la taskbar du bas (l'user peut les re-agrandir au clic).
const previousDate = state.currentDate;
if (previousDate && previousDate !== isoDate) {
_reduceAllPinnedPopups();
}
state.currentDate = isoDate;
document.getElementById("date-picker").value = isoDate;
@@ -6476,35 +6480,29 @@ function pinTooltip() {
popup.dataset.actionId = iv.actionId || "";
popup.innerHTML = srcEl.innerHTML;
// v2026.5.18 : mémoriser la ref et la couleur pour le dock (pastille avec
// couleur de catégorie + texte ref)
popup.dataset.ref = iv.ref || "";
popup.dataset.colorKey = (typeof deriveColorKey === "function" ? deriveColorKey(iv) : "autre") || "autre";
// v2026.5.17 : masquer l'icône 📌 du contenu cloné (redondante car le
// popup a sa propre topbar avec le bouton "désépingler" 📍 explicite)
const oldPin = popup.querySelector('.tooltip-pinbtn[data-action="pin"]');
if (oldPin) oldPin.remove();
// v2026.5.17 : topbar avec 3 boutons pour un popup épinglé :
// _ = Minimiser (popup reste flottant mais compact, juste la ref)
// = Réduire (docké dans la taskbar du bas)
// v2026.5.18 : swap des actions — _ réduit dans le dock, ▭ minimise flottant
// _ = Réduire (docké dans la taskbar du bas)
// ▭ = Minimiser (popup reste flottant mais compact, juste la ref)
// 📍 = Désépingler (l'icône d'épingle "plantée" ; clic = retire l'épingle)
const topbar = document.createElement("div");
topbar.className = "pinned-popup-topbar";
// Bouton Minimiser
const minBtn = document.createElement("button");
minBtn.type = "button";
minBtn.className = "pinned-popup-btn pinned-popup-minimize";
minBtn.innerHTML = "_";
minBtn.title = "Minimiser (reste flottant mais compact)";
minBtn.addEventListener("click", (e) => {
e.stopPropagation();
_minimizePinnedPopup(popup);
});
topbar.appendChild(minBtn);
// Bouton Réduire
// Bouton Réduire (icône _ )
const reduceBtn = document.createElement("button");
reduceBtn.type = "button";
reduceBtn.className = "pinned-popup-btn pinned-popup-reduce";
reduceBtn.innerHTML = "";
reduceBtn.innerHTML = "_";
reduceBtn.title = "Réduire (docké en bas de l'écran)";
reduceBtn.addEventListener("click", (e) => {
e.stopPropagation();
@@ -6512,6 +6510,18 @@ function pinTooltip() {
});
topbar.appendChild(reduceBtn);
// Bouton Minimiser (icône ▭ )
const minBtn = document.createElement("button");
minBtn.type = "button";
minBtn.className = "pinned-popup-btn pinned-popup-minimize";
minBtn.innerHTML = "▭";
minBtn.title = "Minimiser (reste flottant mais compact)";
minBtn.addEventListener("click", (e) => {
e.stopPropagation();
_minimizePinnedPopup(popup);
});
topbar.appendChild(minBtn);
// Bouton Désépingler (icône épingle plantée)
const unpinBtn = document.createElement("button");
unpinBtn.type = "button";
@@ -6636,6 +6646,21 @@ function _softUnpinPopup(el) {
el.classList.remove("pinned-popup-minimized");
el.classList.remove("pinned-popup-reduced");
// v2026.5.18 : retirer aussi la pastille du dock si elle existe
if (el._linkedPill) {
try { el._linkedPill.remove(); } catch (e) {}
el._linkedPill = null;
}
// Si le dock est vide, le cacher ; mettre à jour le bouton "Fermer tous"
const dock = document.getElementById("pinned-popups-dock");
if (dock && dock.querySelectorAll(".pinned-popup-dock-pill").length === 0) {
dock.classList.remove("visible");
const closeAllBtn = document.getElementById("pinned-popups-close-all");
if (closeAllBtn) closeAllBtn.remove();
} else {
_ensureDockCloseAllBtn();
}
// Helper qui joue l'animation de sortie puis supprime le DOM
const animateAndRemove = () => {
el.classList.add("unpinning");
@@ -6704,7 +6729,7 @@ function _expandPinnedPopup(popup) {
// Restaurer bouton Minimiser
const minBtn = popup.querySelector(".pinned-popup-minimize");
if (minBtn) {
minBtn.innerHTML = "_";
minBtn.innerHTML = "";
minBtn.title = "Minimiser (reste flottant mais compact)";
const newBtn = minBtn.cloneNode(true);
minBtn.replaceWith(newBtn);
@@ -6732,8 +6757,14 @@ function _reducePinnedPopup(popup) {
if (!popup) return;
// Récupérer la référence pour le label de la pastille
// v2026.5.18 : préférer le dataset.ref mémorisé à la création plutôt que
// le textContent (qui peut contenir "—" si la ref n'était pas encore
// disponible à l'épinglage)
const refEl = popup.querySelector(".iv-ref-header");
const label = refEl ? (refEl.textContent || "").trim() || "Popup" : "Popup";
const label = popup.dataset.ref
|| (refEl ? (refEl.textContent || "").trim() : "")
|| "Popup";
const colorKey = popup.dataset.colorKey || "autre";
// S'assurer que la taskbar du bas existe
let dock = document.getElementById("pinned-popups-dock");
@@ -6745,9 +6776,11 @@ function _reducePinnedPopup(popup) {
}
// Créer la pastille dock
// v2026.5.18 : le fond de la pastille prend la couleur de catégorie
// (via la classe color-XXX déjà utilisée ailleurs dans le CSS)
const pill = document.createElement("button");
pill.type = "button";
pill.className = "pinned-popup-dock-pill";
pill.className = "pinned-popup-dock-pill color-" + colorKey;
pill.textContent = label;
pill.title = "Cliquer pour agrandir";
@@ -6772,6 +6805,53 @@ function _reducePinnedPopup(popup) {
dock.appendChild(pill);
dock.classList.add("visible");
// v2026.5.18 : s'assurer qu'il y a un bouton "Fermer tous" si 2+ popups
_ensureDockCloseAllBtn();
}
/**
* v2026.5.18 : réduit TOUS les popups épinglés actuellement ouverts (en mode
* normal ou minimisé) dans la taskbar du bas. Appelé au changement de date.
*/
function _reduceAllPinnedPopups() {
const popups = document.querySelectorAll(".pinned-popup:not(.pinned-popup-reduced)");
popups.forEach(popup => {
try { _reducePinnedPopup(popup); } catch (e) {}
});
}
/**
* v2026.5.18 : ajoute (ou met à jour) le bouton "Fermer tous" dans le dock
* quand au moins 2 popups épinglés existent (réduits OU affichés).
* Le bouton est placé à droite du dock.
*/
function _ensureDockCloseAllBtn() {
const dock = document.getElementById("pinned-popups-dock");
if (!dock) return;
const allPinned = document.querySelectorAll(".pinned-popup");
let closeAllBtn = document.getElementById("pinned-popups-close-all");
if (allPinned.length >= 2) {
if (!closeAllBtn) {
closeAllBtn = document.createElement("button");
closeAllBtn.type = "button";
closeAllBtn.id = "pinned-popups-close-all";
closeAllBtn.className = "pinned-popups-close-all";
closeAllBtn.textContent = "✕ Fermer tous";
closeAllBtn.title = "Fermer tous les popups épinglés";
closeAllBtn.addEventListener("click", (e) => {
e.stopPropagation();
closeAllPinnedPopups();
});
dock.appendChild(closeAllBtn);
} else {
// Remettre à la fin (après les pastilles éventuellement ajoutées)
dock.appendChild(closeAllBtn);
}
dock.classList.add("visible");
} else if (closeAllBtn) {
closeAllBtn.remove();
}
}
/**
@@ -6786,7 +6866,7 @@ function _restorePinnedPopupFromDock(popup) {
popup.classList.remove("pinned-popup-minimized");
const minBtn = popup.querySelector(".pinned-popup-minimize");
if (minBtn) {
minBtn.innerHTML = "_";
minBtn.innerHTML = "";
minBtn.title = "Minimiser (reste flottant mais compact)";
const newBtn = minBtn.cloneNode(true);
minBtn.replaceWith(newBtn);
@@ -6802,10 +6882,17 @@ function _restorePinnedPopupFromDock(popup) {
popup._linkedPill = null;
}
// Si le dock est vide, le masquer
// Si le dock est vide (sauf le bouton "Fermer tous"), le masquer
const dock = document.getElementById("pinned-popups-dock");
if (dock && dock.children.length === 0) {
dock.classList.remove("visible");
if (dock) {
const remainingPills = dock.querySelectorAll(".pinned-popup-dock-pill").length;
if (remainingPills === 0) {
dock.classList.remove("visible");
const closeAllBtn = document.getElementById("pinned-popups-close-all");
if (closeAllBtn) closeAllBtn.remove();
} else {
_ensureDockCloseAllBtn();
}
}
}
@@ -6869,6 +6956,13 @@ function closeAllPinnedPopups() {
pinnedPopups.length = 0;
// Fermer aussi les popups en état soft-unpinned qui trainent encore
document.querySelectorAll(".pinned-popup.soft-unpinned").forEach(el => el.remove());
// v2026.5.18 : supprimer aussi les éléments du dock
document.querySelectorAll(".pinned-popup").forEach(el => el.remove());
document.querySelectorAll(".pinned-popup-dock-pill").forEach(el => el.remove());
const closeAllBtn = document.getElementById("pinned-popups-close-all");
if (closeAllBtn) closeAllBtn.remove();
const dock = document.getElementById("pinned-popups-dock");
if (dock) dock.classList.remove("visible");
}
/**