docs: prenom de l'auteur (Quentin) retabli a la place du pseudonyme

Le prenom seul reste visible dans les projets ; le nom de famille n'y figure jamais.
This commit is contained in:
FroSteel
2026-09-14 00:26:34 +02:00
parent cd106484d5
commit a1c7f45b03
11 changed files with 61 additions and 61 deletions
+37 -37
View File
@@ -5,13 +5,13 @@
* réservations, absences, statut pompier, etc. Regroupé par tech avec
* timelines visuelles et popups détaillés.
*
* Copyright (c) 2026 FroSteel
* Copyright (c) 2026 Quentin
* Licensed under the MIT License — see LICENSE file in the project root.
*
* @author FroSteel
* @author Quentin
* @repository https://gitea.netaplaid.ch/FroSteel/Planification
*
* Développé par FroSteel (FRS) — DGNSI, Canton de Vaud. Licence MIT.
* Développé par Quentin (FRS) — DGNSI, Canton de Vaud. Licence MIT.
*/
// ============================================================================
@@ -543,11 +543,11 @@ let _myActionsRows = null;
let _myActionsLoading = false;
let _myActionsDiag = ""; // diagnostic du dernier fetch (affiché dans l'onglet)
// v2026.5.46 — impersonation (RÉSERVÉE à FroSteel) : permet de tester
// v2026.5.46 — impersonation (RÉSERVÉE à Quentin) : permet de tester
// la vue coordinateur en "se faisant passer pour" une autre personne. Chargé
// depuis admin_config (cfg.impersonate = { enabled, name, initials, memberId }).
let _impersonate = null;
// Vrai uniquement si l'utilisateur connecté EST FroSteel (garde-fou
// Vrai uniquement si l'utilisateur connecté EST Quentin (garde-fou
// pour n'afficher l'onglet Test qu'à lui).
// Empreintes FNV-1a (32 bits) du nom et du prenom de l'auteur : jamais en clair dans le code.
const _EMPREINTES_AUTEUR = [0x716d54e7, 0xa6e31b47];
@@ -1184,7 +1184,7 @@ const _CURRENT_USER_RETRY_DELAY_MS = 60 * 1000;
/**
* Récupère le nom de l'utilisateur EasyVista connecté et l'affiche dans le badge.
*
* @author FroSteel
* @author Quentin
*/
async function fetchAndShowCurrentUser() {
const attemptId = _currentUserRetryCount + 1;
@@ -1286,7 +1286,7 @@ async function fetchAndShowCurrentUser() {
*
* @param {string} reason - contexte pour les logs (ex: "after_load_success")
*
* @author FroSteel
* @author Quentin
*/
function _maybeRetryFetchUser(reason) {
if (state.currentUser && state.currentUser.name) {
@@ -1440,7 +1440,7 @@ function toggleUserNamePopup() {
// gris atténué, séparé par une fine ligne supérieure.
const authorLine = document.createElement("div");
authorLine.className = "user-name-popup-author";
authorLine.textContent = "Développé par FroSteel";
authorLine.textContent = "Développé par Quentin";
authorLine.title = "Auteur de l'extension";
popup.appendChild(authorLine);
@@ -2151,7 +2151,7 @@ function initModalScrollLock() {
/**
* Pied de page discret bas-droite avec FRS et numéro de version.
*
* @author FroSteel
* @author Quentin
*/
function initAppFooter() {
if (document.querySelector(".app-footer")) return;
@@ -2222,7 +2222,7 @@ function _toggleView() {
* logs verbeux étape par étape ont été retirés, ils polluaient la console
* à chaque toggle.
*
* @author FroSteel
* @author Quentin
*/
function _applyViewMode() {
const mode = _getCurrentView();
@@ -2299,7 +2299,7 @@ function _applyViewMode() {
* v2026.5.36 : crée ou retrouve la sidebar, et y déplace les éléments listés.
* Les éléments sont déplacés dans l'ordre du tableau.
*
* @author FroSteel
* @author Quentin
*/
function _moveElementsToSidebar(ids) {
// Créer (ou retrouver) le wrapper qui contiendra sidebar + main côte à côte
@@ -2377,7 +2377,7 @@ function _moveElementsToSidebar(ids) {
* v2026.5.36 : restaure chaque élément à son parent d'origine (mémorisé dans
* data-orig-parent). Utilisé quand on revient en vue classique.
*
* @author FroSteel
* @author Quentin
*/
function _restoreElementsToTopbar(ids) {
// v2026.5.37 : d'abord remettre les flèches dans .date-nav (avant de
@@ -2484,7 +2484,7 @@ function _restoreToOriginalParent(el, label) {
/**
* Horloge HH:MM au milieu de la topbar, mise à jour chaque minute (depuis v5.0.0).
*
* @author FroSteel
* @author Quentin
*/
function initAppClock() {
const el = document.getElementById("app-clock");
@@ -3118,7 +3118,7 @@ async function showAdminPanel(initialSection) {
{ id: "diagnostics",label: "Diagnostics", render: renderAdminSectionDiagnostics },
{ id: "about", label: "À propos", render: renderAdminSectionAbout }
];
// v2026.5.46 — onglet "Test (FRS)" RÉSERVÉ à FroSteel : permet de
// v2026.5.46 — onglet "Test (FRS)" RÉSERVÉ à Quentin : permet de
// se faire passer pour une autre personne (coordinateur) pour tester « Mes
// actions » sans être réellement coordinateur. Caché pour tout autre utilisateur.
if (_estAuteur()) {
@@ -4896,7 +4896,7 @@ function renderAdminSectionImpersonate(container, cfg, saveFn) {
const intro = document.createElement("p");
intro.style.cssText = "font-size:13px; color:var(--text-muted); margin:0 0 6px;";
intro.textContent = "Réservé à FroSteel. Permet de tester la vue « Mes actions » en te faisant passer pour une autre personne (ex. un coordinateur). N'affecte que l'affichage local de l'extension — aucune action côté EasyVista.";
intro.textContent = "Réservé à Quentin. Permet de tester la vue « Mes actions » en te faisant passer pour une autre personne (ex. un coordinateur). N'affecte que l'affichage local de l'extension — aucune action côté EasyVista.";
container.appendChild(intro);
const who = document.createElement("p");
@@ -5464,7 +5464,7 @@ function renderAdminSectionAbout(container, cfg, saveFn) {
</div>
<div class="admin-about-row">
<div class="admin-about-label">Auteur</div>
<div class="admin-about-value"><strong>FroSteel</strong></div>
<div class="admin-about-value"><strong>Quentin</strong></div>
</div>
<div class="admin-about-row">
<div class="admin-about-label">Affiliation</div>
@@ -7668,7 +7668,7 @@ function sendMessage(msg) {
// Filets supplémentaires à l'ingestion : correspondance par réf, et signature
// composite (tech|type|dates|libellé) pour les résa/absences sans requestId.
//
// Auteur : FroSteel (FRS).
// Auteur : Quentin (FRS).
// ============================================================================
const TOMBSTONE_TTL_MS = 7 * 24 * 3600 * 1000; // rétention tombstone (convergence postes)
@@ -7912,7 +7912,7 @@ function ivFreshness(iv) {
* 3. existence : max des événements des deux côtés, puis règle vie/mort —
* une VIE strictement postérieure à la mort lève les tombstones
* (ré-apparition EV autoritaire), sinon la mort est conservée/propagée.
* @author FroSteel
* @author Quentin
*/
function ivMerge(a, b) {
if (!a) return b;
@@ -8205,7 +8205,7 @@ function _ivAbsenceSig(iv, techId) {
*
* @returns {{day: object, toAnalyze: object[]}} le store mis à jour + la
* liste des enregistrements à passer à l'analyse de disparition.
* @author FroSteel
* @author Quentin
*/
function storeApplyFresh(day, freshTechs, isoDate) {
const now = Date.now();
@@ -8862,7 +8862,7 @@ function _legacyDayToV2(isoDate, v1) {
* Convertit tout l'ancien dossier (racine v1) vers le store v2 : liste les
* jours, lit chaque fichier v1, convertit, fusionne au store local (dayMerge)
* et sauvegarde — le push différé propage ensuite vers le sous-dossier v2.
* @author FroSteel
* @author Quentin
*/
async function importLegacyFolderCache(rootPath, onProgress) {
if (state.networkContext !== "internal") return { ok: false, error: "réseau externe — dossier partagé injoignable" };
@@ -8966,7 +8966,7 @@ function scheduleFolderPush(isoDate) {
* v2026.5.46 — le rendu après tirage du dossier passe par storeProject
* (mêmes filtres que tout rendu : tombstones, dock, déplacées récentes) → fini
* le flash d'une iv parquée/déplacée qui réapparaissait via la sync.
* @author FroSteel
* @author Quentin
*/
// v2026.5.49 — blocage ferme lié à la connexion : les opérations sensibles
// (lecture/écriture du dossier PARTAGÉ, déplacement, suppression) exigent une
@@ -9088,7 +9088,7 @@ async function reconcileCacheForDate(isoDate) {
* 6. phase B : fiches complètes + analyse des disparues en SÉQUENTIEL ;
* 7. sauvegarde finale + convergence dossier en arrière-plan.
*
* @author FroSteel
* @author Quentin
*/
async function loadForDate(isoDate, opts = {}) {
LOG.info("load", `début pour ${isoDate}`, { opts, hasSession: !!state.session });
@@ -10156,7 +10156,7 @@ function actionBelongsToTech(action, techName, techId) {
* 3-4) actions de la fiche : du tech ? même jour ? commentaire « login: » ?
* 4bis) action de PLANIFICATION via xhr2 (la fiche ne la contient pas).
*
* @author FroSteel
* @author Quentin
*/
async function analyzeMissingIv(iv) {
const techName = iv.techName || "";
@@ -12217,7 +12217,7 @@ function _recurringAbsenceLabel(isoDate) {
// v2026.5.46 — menu contextuel (clic droit) sur le nom d'un technicien :
// ouvre directement Réservation / Absence / Pompier / Sync douchette avec CE
// tech pré-sélectionné (la liste/sélecteur de tech est masquée dans la modal).
// Les boutons « Ajouter » du haut restent inchangés. Auteur : FroSteel.
// Les boutons « Ajouter » du haut restent inchangés. Auteur : Quentin.
let _techCtxMenuEl = null;
function _closeTechContextMenu() {
if (_techCtxMenuEl) { _techCtxMenuEl.remove(); _techCtxMenuEl = null; }
@@ -12325,7 +12325,7 @@ function _showQuickAddMenu(ev, tech, startHHMM, endHHMM, disabledReason) {
/**
* Construit la card HTML d'un technicien (header, timeline, interventions, absences).
*
* @author FroSteel
* @author Quentin
*/
function buildCard(tech, isoDate) {
const card = document.createElement("section");
@@ -14065,7 +14065,7 @@ function getStatusClass(iv) {
/**
* Lie les segments timeline à un popover persistant au clic (depuis v4.2.3).
*
* @author FroSteel
* @author Quentin
*/
function bindTimelinePopover(el) {
// v2026.5.40 : comportement UNIFIÉ vue classique + vue horizontale.
@@ -14199,7 +14199,7 @@ function findIvByActionId(actionId) {
/**
* Ouvre une grande popup détaillée pour un segment timeline.
*
* @author FroSteel
* @author Quentin
*/
function openPersistentTimelinePopup(el) {
if (!el) {
@@ -17555,10 +17555,10 @@ function cleanContactName(raw) {
// v2026.5.49 — retirer les « ? » (et le caractère de remplacement Unicode
// U+FFFD, souvent rendu « ? ») collés au nom : c'est un encodage cassé côté
// EasyVista, jamais un vrai caractère d'un nom de personne. Ex : "?Exemple"
// → "Exemple", "Exemple?, FroSteel" → "FroSteel".
// → "Exemple", "Exemple?, Quentin" → "Quentin".
s = s.replace(/[?\uFFFD]/g, " ");
// ... et recoller l'espace laisse devant une virgule/point-virgule
// ("Exemple?, FroSteel" -> "Exemple , FroSteel" -> "FroSteel").
// ("Exemple?, Quentin" -> "Exemple , Quentin" -> "Quentin").
s = s.replace(/\s+([,;:])/g, "$1");
// Espaces multiples → un seul
s = s.replace(/\s{2,}/g, " ").trim();
@@ -18084,7 +18084,7 @@ function _cancelPendingShowTooltip() {
/**
* Affiche un tooltip au survol d'une intervention/réservation.
*
* @author FroSteel
* @author Quentin
*/
function showTooltip(e, iv, rowEl, posOpts) {
if (_techCtxMenuEl) return; // v2026.5.46 — menu contextuel ouvert : pas de popup par-dessus
@@ -18383,7 +18383,7 @@ function reapplyTooltipPosition() {
* @param {HTMLElement} sourceEl - l'élément déclencheur (row, card, segment)
* @param {object} opts - options { anchorBelow: true pour préférer dessous }
*
* @author FroSteel
* @author Quentin
*/
function positionTooltipAnchored(sourceEl, opts) {
opts = opts || {};
@@ -18563,7 +18563,7 @@ function _rectsOverlap(a, b) {
* empêche un simple `style.zIndex = "9"` de prendre effet. Il FAUT utiliser
* `setProperty(..., 'important')` pour battre le `!important` du CSS.
*
* @author FroSteel
* @author Quentin
*/
function _bringPinnedPopupToFront(popup) {
if (!popup) return;
@@ -18625,7 +18625,7 @@ function _applyRememberedPopupSize(popup, iv, date) {
* ligne source `rowEl`. Essaie dans l'ordre : droite, gauche, dessous, dessus.
* Retourne {x, y} en coordonnées document, ou null si aucune position libre.
*
* @author FroSteel
* @author Quentin
*/
function _findFreePopupPosition(rowEl, w, h) {
const pad = 14;
@@ -18739,7 +18739,7 @@ function _findFreePopupPosition(rowEl, w, h) {
* v4.3.0 : épingle la bulle courante en la clonant dans un popup détaché
* ancré au contenu. Le tooltip live redevient disponible.
*
* @author FroSteel
* @author Quentin
*/
function pinTooltip() {
if (!state.currentTooltipIv) return;
@@ -19233,7 +19233,7 @@ async function _refreshPinnedPopupIv(popup, iv) {
*
* @param {HTMLElement} el - le popup à désépingler
*
* @author FroSteel
* @author Quentin
*/
function _softUnpinPopup(el) {
if (!el) {
@@ -19856,7 +19856,7 @@ function _getPopupSafeArea() {
* dans la safe area. Appelé à l'épinglage, pendant le drag, et quand le dock
* apparaît/disparaît.
*
* @author FroSteel
* @author Quentin
*/
function _clampPopupInSafeArea(popup) {
if (!popup) return;
@@ -20739,7 +20739,7 @@ function bindTooltipInteractions() {
/**
* Construit le HTML du tooltip détaillé pour une intervention/réservation.
*
* @author FroSteel
* @author Quentin
*/
function buildTooltipHTML(iv) {
if (!iv) return '<dl><dt>Info</dt><dd>—</dd></dl>';