V7.10 — Tableau de bord, guide, semaine type et enveloppe de formation

Reprise dans le répertoire de production du travail mené dans le worktree
ux-service-enfance :

- tableau de bord Service Enfance (dashboard.php) et navigation regroupée ;
- guide d'utilisation (faq.php) accessible depuis toute la navigation ;
- éditeur de semaine type mis en avant sur l'écran de saisie ;
- droit à l'enveloppe de formation par agent, en remplacement de la case
  « formation déjà prévue dans la répartition annuelle » ;
- correctif de « [object Object] » sur les cartes de quota du PTA ;
- motif de travail par défaut à la saisie, heures travaillées complètes
  dans les PDF.

Le docker-compose.yml de production est conservé : celui du worktree décrit
une pile de test (conteneurs et volume suffixés « test », ports 9080/9081),
qui aurait fait redémarrer l'application sur un volume MariaDB vide.

Les migrations database/migration_v7_9*.sql sont obligatoires ; le service
db-migrate les applique au déploiement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
PTA
2026-08-17 16:53:04 +02:00
parent 57bd8da5c8
commit 4201894e28
69 changed files with 5228 additions and 246 deletions

View File

@@ -1,3 +1,10 @@
<?php
// Les rôles sans droit aux semaines types n'ont qu'un seul mode de saisie :
// le sélecteur de méthode disparaît et la numérotation des étapes se resserre.
$usesTemplates = !empty($permissions['can_use_templates']);
$etapeSaisie = $usesTemplates ? 3 : 2;
$etapePlanning = $usesTemplates ? 4 : 3;
?>
<section id="editor-view" class="app-view page-content">
<?php if (($accessProfile['role'] ?? '') === 'RESPONSABLE_STRUCTURE'): ?>
<div class="message message-info role-page-notice">
@@ -33,6 +40,83 @@
</div>
</section>
<?php if ($usesTemplates): ?>
<section class="card editor-mode-card">
<div class="section-heading">
<div>
<h2>2. Choisir la méthode de saisie</h2>
<p class="section-subtitle">Une semaine type se compose une fois puis se duplique sur toute une période. La saisie semaine par semaine reste disponible pour les corrections.</p>
</div>
</div>
<div class="editor-mode-choices" role="tablist" aria-label="Méthode de saisie">
<button id="editor-mode-template" class="editor-mode-choice is-active" type="button"
role="tab" aria-selected="true" aria-controls="template-mode-panel">
<span class="editor-mode-choice-badge">Le plus rapide</span>
<strong>Semaine type</strong>
<small>Composer une semaine de référence, puis la dupliquer sur une période entière.</small>
</button>
<button id="editor-mode-week" class="editor-mode-choice" type="button"
role="tab" aria-selected="false" aria-controls="week-mode-panel">
<strong>Semaine précise</strong>
<small>Saisir ou corriger une seule semaine, jour par jour.</small>
</button>
</div>
</section>
<div id="template-mode-panel" class="editor-mode-panel" role="tabpanel" aria-labelledby="editor-mode-template">
<section class="card template-editor-card">
<div class="section-heading">
<div>
<h2>Éditeur de semaine type</h2>
<p class="section-subtitle">Les plages saisies ici ne sont pas encore planifiées : elles décrivent une semaine de référence, réutilisable autant de fois que nécessaire.</p>
</div>
<div class="totals template-editor-total">
<span>Total de la semaine type</span>
<strong id="template-editor-total">0 h 00</strong>
<small id="template-editor-total-detail">dont 0 h 00 décomptées</small>
</div>
</div>
<div class="template-editor-toolbar">
<label class="field">
<span>Semaine type de l’agent</span>
<select id="template-editor-select" disabled>
<option value="">Nouvelle semaine type</option>
</select>
</label>
<label class="field">
<span>Nom de la semaine type <strong>*</strong></span>
<input id="template-editor-name" type="text" maxlength="120" placeholder="Ex. Semaine scolaire classique" disabled>
</label>
<div class="template-editor-toolbar-actions">
<button id="template-editor-delete" class="button button-danger" type="button" disabled>Supprimer</button>
</div>
</div>
<div id="template-editor-empty" class="empty-state">Choisissez un lieu d’affectation et un agent pour composer sa semaine type.</div>
<div id="template-editor-grid" class="template-editor-grid" hidden></div>
<div id="template-editor-message" class="message" role="status" aria-live="polite"></div>
<div class="template-editor-actions">
<button id="template-editor-save" class="button button-primary" type="button" disabled>
Enregistrer la semaine type
</button>
<button id="template-editor-apply-period" class="button button-success" type="button" disabled>
Dupliquer sur une période…
</button>
<button id="template-editor-apply-week" class="button button-secondary" type="button" disabled>
Appliquer à la semaine sélectionnée…
</button>
</div>
<p class="hint">Enregistrer une semaine type ne modifie aucun planning. Rien n’est planifié tant que vous ne l’avez pas dupliquée sur une période ou appliquée à une semaine.</p>
</section>
</div>
<?php endif; ?>
<div id="week-mode-panel" class="editor-mode-panel"<?= $usesTemplates ? ' hidden' : '' ?>>
<section class="quota-strip" id="editor-quota" hidden>
<article class="quota-card">
<span>Quotité</span>
@@ -57,7 +141,7 @@
<section class="card" id="entry-card" aria-disabled="true">
<div class="section-heading">
<div>
<h2>2. Saisir ou modifier les affectations</h2>
<h2><?= $etapeSaisie ?>. Saisir ou modifier les affectations</h2>
<p class="section-subtitle">Chaque plage horaire possède son propre motif et sa propre règle de décompte du quota annuel.</p>
</div>
</div>
@@ -92,7 +176,7 @@
<section class="card">
<div class="section-heading">
<div>
<h2>3. Planning global de l’agent</h2>
<h2><?= $etapePlanning ?>. Planning global de l’agent</h2>
<p id="week-label" class="section-subtitle">Toutes les affectations de l’agent sur la semaine, quel que soit le lieu d’affectation. Cliquez sur un créneau pour le déplacer ou le dupliquer, ou glissez-le directement vers un autre jour.</p>
</div>
<div class="planning-summary-actions">
@@ -133,6 +217,8 @@
<?php endif; ?>
</div>
</section>
</div><!-- /#week-mode-panel -->
</section>