Compare commits

..

No commits in common. "v3.1.2" and "main" have entirely different histories.
v3.1.2 ... main

4 changed files with 15 additions and 49 deletions

4
.gitignore vendored
View File

@ -47,7 +47,3 @@ dist/
build/ build/
.sass-cache/ .sass-cache/
.cache/ .cache/
# --- Nginx erreurs fichiers ---
# A remplir au fur et à mesure
50x.html

View File

@ -12,12 +12,8 @@ et ce projet respecte le [Versionnement Sémantique](https://semver.org/lang/fr/
- **Moteur Drag & Drop Natif :** Implémentation d'un système de planification agile (Kanban) dans `app.js` permettant de glisser-déposer les séances d'entraînement à la souris sans aucune dépendance logicielle externe. - **Moteur Drag & Drop Natif :** Implémentation d'un système de planification agile (Kanban) dans `app.js` permettant de glisser-déposer les séances d'entraînement à la souris sans aucune dépendance logicielle externe.
- **Cockpit Physiologique & Matériel :** Intégration de 4 indicateurs de performance (Fraîcheur VRC, Charge Hebdo, Usure Chaîne Vélo, Paires Carbone) basés sur des tracés SVG natifs et légers. - **Cockpit Physiologique & Matériel :** Intégration de 4 indicateurs de performance (Fraîcheur VRC, Charge Hebdo, Usure Chaîne Vélo, Paires Carbone) basés sur des tracés SVG natifs et légers.
- **Gouvernance & Linters :** Déploiement des fichiers de configuration modernes `eslint.config.js` (Format Flat Config de niveau industriel) et `.stylelintrc.json` à la racine du projet. - **Gouvernance & Linters :** Déploiement des fichiers de configuration modernes `eslint.config.js` (Format Flat Config de niveau industriel) et `.stylelintrc.json` à la racine du projet.
- **Moteur Kanban Métier :** Implémentation du système de Drag & Drop natif dans l'onglet RYM Coach permettant de réorganiser le planning hebdomadaire.
- **Calculateur de Charge Dynamique :** Automatisation du recalcul du spinner "Charge Hebdo" en JavaScript à chaque déplacement d'entraînement.
### Modifié ### Modifié
- **Architecture de Navigation :** Consolidation du routage événementiel pour assurer la permutation étanche entre les onglets MCO Dashboard, RYM Bank, RYM Coach et Suivi Cohorte.
- **Design System :** Correction structurelle des imbrications de conteneurs Bootstrap 5 pour garantir un affichage fluide de la zone Expert.
- **Design System Responsif :** Optimisation de la structure Bootstrap 5 pour forcer l'alignement des "spinners" sur une seule ligne (`row`) sur écran desktop et une répartition fluide sur mobile. - **Design System Responsif :** Optimisation de la structure Bootstrap 5 pour forcer l'alignement des "spinners" sur une seule ligne (`row`) sur écran desktop et une répartition fluide sur mobile.
- **Pont de Développement :** Restructuration du conteneur de validation openSUSE Leap 15.6 via un montage de volume Podman sécurisé (`:Z`) permettant l'audit du code en temps réel depuis l'hôte Fedora. - **Pont de Développement :** Restructuration du conteneur de validation openSUSE Leap 15.6 via un montage de volume Podman sécurisé (`:Z`) permettant l'audit du code en temps réel depuis l'hôte Fedora.

44
app.js
View File

@ -1,5 +1,5 @@
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
// --- NAV SWITCHER DES ONGLETS LATÉRAUX --- // --- GESTION DES ONGLETS EXISTANTE ---
const navLinks = document.querySelectorAll(".nav-link"); const navLinks = document.querySelectorAll(".nav-link");
const tabContents = document.querySelectorAll(".tab-content"); const tabContents = document.querySelectorAll(".tab-content");
@ -11,42 +11,21 @@ document.addEventListener("DOMContentLoaded", () => {
link.classList.add("active"); link.classList.add("active");
const tabId = link.getAttribute("data-tab"); const tabId = link.getAttribute("data-tab");
const targetSection = document.getElementById(tabId); document.getElementById(tabId).classList.add("active");
if (targetSection) {
targetSection.classList.add("active");
}
}); });
}); });
// --- DRAG & DROP ENGINE INTELLIGENT --- // --- OPTION 1 : DRAG & DROP ENGINE (AAA SOUVERAIN) ---
const draggables = document.querySelectorAll(".rym-draggable-workout"); const draggables = document.querySelectorAll(".rym-draggable-workout");
const dropZones = document.querySelectorAll(".drop-zone"); const dropZones = document.querySelectorAll(".drop-zone");
function recalculerChargeHebdo() {
let totalSéances = 0;
dropZones.forEach(zone => {
totalSéances += zone.querySelectorAll(".rym-draggable-workout").length;
});
// Calcul dynamique : 25% de charge par bloc actif, plafonné à 100%
const nouvelleCharge = Math.min(totalSéances * 25, 100);
// Cibler le deuxième spinner du dashboard (Charge Hebdo)
const spinnerCharge = document.querySelectorAll(".rym-spinner-wrapper")[1];
if (spinnerCharge) {
const cercleStroke = spinnerCharge.querySelector(".circle-stroke");
const texteValeur = spinnerCharge.querySelector(".rym-spinner-text span");
texteValeur.textContent = nouvelleCharge;
cercleStroke.setAttribute("stroke-dasharray", `${nouvelleCharge}, 100`);
}
}
draggables.forEach(draggable => { draggables.forEach(draggable => {
draggable.addEventListener("dragstart", (e) => { draggable.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", draggable.id); e.dataTransfer.setData("text/plain", draggable.id);
setTimeout(() => { draggable.style.display = "none"; }, 0); // Petit délai pour l'effet visuel de déplacement
setTimeout(() => {
draggable.style.display = "none";
}, 0);
}); });
draggable.addEventListener("dragend", () => { draggable.addEventListener("dragend", () => {
@ -56,7 +35,7 @@ document.addEventListener("DOMContentLoaded", () => {
dropZones.forEach(zone => { dropZones.forEach(zone => {
zone.addEventListener("dragover", (e) => { zone.addEventListener("dragover", (e) => {
e.preventDefault(); e.preventDefault(); // Indispensable pour autoriser le drop
zone.classList.add("drag-over"); zone.classList.add("drag-over");
}); });
@ -73,11 +52,10 @@ document.addEventListener("DOMContentLoaded", () => {
if (draggableElement) { if (draggableElement) {
zone.appendChild(draggableElement); zone.appendChild(draggableElement);
recalculerChargeHebdo(); // Ici se branchera l'appel API asynchrone vers ton Gitea/Serveur
const targetDay = zone.getAttribute("data-day");
console.log(`Séance déplacée avec succès sur le jour : ${targetDay}`);
} }
}); });
}); });
// Calcul initial
recalculerChargeHebdo();
}); });

View File

@ -135,7 +135,7 @@
<div class="col"> <div class="col">
<div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Lun"> <div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Lun">
<div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Lundi</div> <div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Lundi</div>
<div class="rym-draggable-workout bg-primary text-white p-2 rounded mb-2 shadow-sm small" draggable="true" id="w-swim"> <div class="rym-draggable-workout bg-primary text-white p-2 rounded mb-2 shadow-sm small" draggable="true" id="w1">
<i class="bi bi-water me-1"></i> Natation : 2500m <i class="bi bi-water me-1"></i> Natation : 2500m
</div> </div>
</div> </div>
@ -144,7 +144,7 @@
<div class="col"> <div class="col">
<div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Mar"> <div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Mar">
<div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Mardi</div> <div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Mardi</div>
<div class="rym-draggable-workout bg-warning text-dark p-2 rounded mb-2 shadow-sm small" draggable="true" id="w-vma"> <div class="rym-draggable-workout bg-warning text-dark p-2 rounded mb-2 shadow-sm small" draggable="true" id="w2">
<i class="bi bi-lightning me-1"></i> VMA Balayage <i class="bi bi-lightning me-1"></i> VMA Balayage
</div> </div>
</div> </div>
@ -153,7 +153,7 @@
<div class="col"> <div class="col">
<div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Mer"> <div class="bg-light p-2 rounded border h-100 drop-zone" data-day="Mer">
<div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Mercredi</div> <div class="fw-bold text-center border-bottom pb-1 mb-2 bg-dark text-white rounded-top small">Mercredi</div>
<div class="rym-draggable-workout bg-info text-dark p-2 rounded mb-2 shadow-sm small" draggable="true" id="w-bike"> <div class="rym-draggable-workout bg-info text-dark p-2 rounded mb-2 shadow-sm small" draggable="true" id="w3">
<i class="bi bi-bicycle me-1"></i> Vélo Tempête <i class="bi bi-bicycle me-1"></i> Vélo Tempête
</div> </div>
</div> </div>
@ -186,11 +186,7 @@
</div> </div>
</div> </div>
<div class="card card-rym p-4 premium-zone shadow-lg mb-5"> <div class="card card-rym p-4 premium-zone shadow-lg">
<h5 class="fw-bold text-dark"><i class="bi bi-clock me-2"></i>Agenda Précision Premium</h5>
<p class="text-muted small mb-0">Zone réservée aux flux haute précision asynchrones.</p>
</div>
</section>
<section id="clients" class="tab-content"> <section id="clients" class="tab-content">
<div class="d-flex justify-content-between align-items-center mb-4"> <div class="d-flex justify-content-between align-items-center mb-4">