164 lines
8.8 KiB
PHP
164 lines
8.8 KiB
PHP
<?php
|
||
/**
|
||
* Administration : horaires de couverture attendus des lieux, et jetons d'accès
|
||
* des agents et des responsables de lieu.
|
||
* Modules JS : `coverage` et `accessTokens`.
|
||
*
|
||
* Partiel de contenu inclus par la vue de page homonyme. Les identifiants HTML
|
||
* posés ici sont les points d'ancrage du module JS : les renommer casse le
|
||
* module sans aucune erreur visible.
|
||
*
|
||
* V7.14 : les agents et les lieux d'affectation ont quitté cet écran pour la
|
||
* page « Management ». Ne restent ici que les règles de couverture, qui ne
|
||
* décrivent ni une personne ni un lieu mais une EXIGENCE DE PRÉSENCE — le
|
||
* paramètre que contrôle l'onglet « Couverture ».
|
||
*
|
||
* V7.27 : s'y ajoute la distribution des JETONS DE TERRAIN. Le Service Enfance
|
||
* équipe ses agents et ses responsables de lieu sans passer par la DSI, mais
|
||
* RIEN AU-DELÀ : les comptes Service Enfance et DSI n'apparaissent pas ici et
|
||
* sont refusés par le serveur (AccessAccountController). Les classes `dsi-*`
|
||
* sont réutilisées telles quelles — elles ne portent qu'une mise en forme, et
|
||
* les deux écrans montrent la même chose : des comptes et des jetons.
|
||
*/
|
||
?>
|
||
<section id="assignment-view" class="app-view page-content">
|
||
<section class="card coverage-settings-card">
|
||
<div class="section-heading">
|
||
<div>
|
||
<h2>Horaires de couverture des lieux</h2>
|
||
<p class="section-subtitle">Définissez les périodes pendant lesquelles un nombre minimum d’agents doit être physiquement présent. Seules les affectations « Heure de travail » comptent comme présence.</p>
|
||
</div>
|
||
</div>
|
||
<div class="selection-grid overview-filters">
|
||
<label class="field">
|
||
<span>Lieu d’affectation</span>
|
||
<select id="coverage-rules-structure">
|
||
<option value="">Choisir un lieu d’affectation</option>
|
||
<?php foreach ($structures as $structure): ?>
|
||
<option value="<?= (int) $structure['id_structure'] ?>"><?= htmlspecialchars($structure['nom']) ?></option>
|
||
<?php endforeach; ?>
|
||
</select>
|
||
</label>
|
||
<div class="overview-filter-actions">
|
||
<button id="load-coverage-rules" class="button button-secondary filter-button" type="button">Charger</button>
|
||
</div>
|
||
</div>
|
||
<div id="coverage-rules-message" class="message" role="status" aria-live="polite"></div>
|
||
<div id="coverage-rules-editor" class="coverage-rules-editor">
|
||
<div class="empty-state">Choisissez un lieu pour configurer les plages où une présence minimale est obligatoire.</div>
|
||
</div>
|
||
<div class="coverage-rules-actions">
|
||
<button id="save-coverage-rules" class="button button-primary" type="button" disabled>Enregistrer les horaires de couverture</button>
|
||
</div>
|
||
</section>
|
||
|
||
<!--
|
||
Jetons d'accès de terrain (V7.27).
|
||
|
||
Panneau des jetons fraîchement produits : c'est la SEULE occasion de
|
||
les lire, la base n'en conserve qu'une empreinte. Il reste ouvert
|
||
tant qu'il n'a pas été explicitement refermé, pour laisser le temps
|
||
de les recopier ou de les imprimer.
|
||
-->
|
||
<section id="access-token-panel" class="card dsi-token-panel" hidden>
|
||
<div class="section-heading">
|
||
<div>
|
||
<h2>Jetons à transmettre</h2>
|
||
<p class="section-subtitle">Ces jetons ne seront plus jamais affichés : la base n’en garde qu’une empreinte. Copiez-les, remettez-les à leurs titulaires, puis refermez ce panneau.</p>
|
||
</div>
|
||
<div class="button-group">
|
||
<button id="access-token-copy" class="button button-secondary" type="button">Tout copier</button>
|
||
<button id="access-token-close" class="button button-secondary" type="button">Fermer</button>
|
||
</div>
|
||
</div>
|
||
<div id="access-token-list" class="dsi-token-list"></div>
|
||
<div id="access-token-message" class="message" role="status" aria-live="polite"></div>
|
||
</section>
|
||
|
||
<section class="card">
|
||
<div class="section-heading">
|
||
<div>
|
||
<h2>Jetons d’accès des agents et des responsables</h2>
|
||
<p class="section-subtitle">Un compte par agent et par lieu d’affectation. Chacun se connecte avec son jeton : il n’y a pas de mot de passe pour ces deux rôles. Les comptes Service Enfance et DSI ne se gèrent pas ici — ils relèvent de la DSI.</p>
|
||
</div>
|
||
<button id="access-generate-missing" class="button button-secondary" type="button">
|
||
Générer les jetons manquants <span id="access-missing-count" class="nav-count-badge" hidden>0</span>
|
||
</button>
|
||
</div>
|
||
|
||
<form id="access-account-form" class="admin-form">
|
||
<div class="admin-form-grid">
|
||
<label class="field">
|
||
<span>Type de compte</span>
|
||
<select id="access-account-role" required>
|
||
<option value="AGENT">Agent</option>
|
||
<option value="RESPONSABLE_STRUCTURE">Responsable de structure</option>
|
||
</select>
|
||
</label>
|
||
<label class="field" id="access-account-agent-field">
|
||
<span>Agent titulaire</span>
|
||
<select id="access-account-agent"><option value="">Choisir un agent sans compte</option></select>
|
||
</label>
|
||
<label class="field" id="access-account-structure-field" hidden>
|
||
<span>Lieu titulaire</span>
|
||
<select id="access-account-structure"><option value="">Choisir un lieu sans compte</option></select>
|
||
</label>
|
||
<label class="field admin-field-wide">
|
||
<span>Commentaire (facultatif)</span>
|
||
<input id="access-account-comment" type="text" maxlength="255" placeholder="Ex. remplacement congé maternité, jusqu’en septembre">
|
||
</label>
|
||
</div>
|
||
<p id="access-account-hint" class="hint"></p>
|
||
<div class="admin-form-actions">
|
||
<div id="access-account-message" class="message" role="status" aria-live="polite"></div>
|
||
<button class="button button-primary" type="submit">Créer le compte et générer son jeton</button>
|
||
</div>
|
||
</form>
|
||
|
||
<div class="selection-grid overview-filters">
|
||
<label class="field">
|
||
<span>Type</span>
|
||
<select id="access-filter-role">
|
||
<option value="">Agents et responsables</option>
|
||
<option value="AGENT">Agents</option>
|
||
<option value="RESPONSABLE_STRUCTURE">Responsables de structure</option>
|
||
</select>
|
||
</label>
|
||
<label class="field">
|
||
<span>État</span>
|
||
<select id="access-filter-state">
|
||
<option value="">Tous</option>
|
||
<option value="1">Actifs</option>
|
||
<option value="0">Désactivés</option>
|
||
</select>
|
||
</label>
|
||
<label class="field">
|
||
<span>Rechercher</span>
|
||
<input id="access-filter-search" type="search" maxlength="80" placeholder="Nom, matricule ou début de jeton">
|
||
</label>
|
||
<div class="overview-filter-actions">
|
||
<button id="access-accounts-refresh" class="button button-secondary filter-button" type="button">Actualiser</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="access-accounts-message" class="message" role="status" aria-live="polite"></div>
|
||
<div class="table-scroll">
|
||
<table class="planning-table dsi-accounts-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Titulaire</th>
|
||
<th>Type</th>
|
||
<th>Jeton</th>
|
||
<th>Dernière connexion</th>
|
||
<th>État</th>
|
||
<th>Actions</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="access-accounts-body">
|
||
<tr><td colspan="6">Chargement des comptes…</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
</section>
|