mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 16:19:19 +02:00
Mirrors the mots-clé tag-search system: dropdown suggestions from existing languages via HTMX, pill display with bin-icon remove buttons, 'Créer' option for new languages. Replaces the plain text input. - New partial: templates/partials/form/language-search.php - New fragment: public/partage/language-search-fragment.php - Admin wrapper: public/admin/language-search-fragment.php - Updated language-autre-fragment to return just the required asterisk indicator - Updated both controllers to handle language_autre as array (pill-based) with backward-compatible string path - Updated edit form to compute selectedOtherLanguages from DB - Registered new route in partage/index.php - Fix CSV importer: split comma-separated language column into individual entries - Add htmx active search to admin index, title line-clamp, predefined languages only in checkboxes - Admin index: filter form now uses htmx triggers (input delay:300ms on search, change on selects) to actively search without page reload - Sort links include hx-push-url for back-button support - Added loading indicator bar (.admin-search-indicator) - Title column: line-clamp at 2 lines with overflow hidden, native title attr tooltip for full text - Language checkboxes now show only 3 predefined languages (Français, Anglais, Néerlandais); all others go via the Autre langue search component - Added Database::getPredefinedLanguages() and excluded predefined from language-search-fragment suggestions - Included hidden sort/dir inputs in table-wrap so sort state preserved across filter changes - Fix language-search: block 'Créer' for predefined languages in dropdown The 'Créer' option in the language-search dropdown now also checks against the predefined set (français, anglais, néerlandais) to avoid offering creation of languages that already exist as checkboxes.
246 lines
11 KiB
PHP
246 lines
11 KiB
PHP
<main id="main-content">
|
|
<h1>Contenus</h1>
|
|
|
|
<?php
|
|
$flash = App::consumeFlash();
|
|
?>
|
|
<?php if ($flash['success']): ?>
|
|
<div class="flash-success" role="alert"><?= htmlspecialchars($flash['success']) ?></div>
|
|
<?php endif; ?>
|
|
<?php if ($flash['error']): ?>
|
|
<div class="flash-error" role="alert"><?= htmlspecialchars($flash['error']) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<!-- ═══════════════════════════════════════════════════════════════════
|
|
PARAMÈTRES DU FORMULAIRE
|
|
═══════════════════════════════════════════════════════════════════ -->
|
|
<h2 id="form-settings-title">Paramètres du Formulaire</h2>
|
|
|
|
<!-- ── Restrictions d'accès aux fichiers ── -->
|
|
<section aria-labelledby="form-restricted-files-title">
|
|
<h3 id="form-restricted-files-title">Restrictions d'accès aux fichiers</h3>
|
|
|
|
<form method="post" action="actions/settings.php" class="param-form">
|
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
|
<input type="hidden" name="section" value="formulaire">
|
|
|
|
<label class="param-checkbox">
|
|
<input type="checkbox" name="restricted_files_enabled" value="1"
|
|
<?= ($siteSettings['restricted_files_enabled'] ?? '0') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Activer la restriction d'accès</strong><br>
|
|
<small>Pour les TFE de type "Interne", masquer les fichiers et exiger une demande d'accès par email. Les métadonnées et le résumé restent visibles publiquement.</small>
|
|
</span>
|
|
</label>
|
|
|
|
<button type="submit" class="btn btn--primary">Enregistrer</button>
|
|
</form>
|
|
</section>
|
|
|
|
<!-- ── Degré d'ouverture ── -->
|
|
<section aria-labelledby="form-access-types-title">
|
|
<h3 id="form-access-types-title">Degré d'ouverture</h3>
|
|
<p>Options de visibilité disponibles dans le formulaire d'ajout de TFE.</p>
|
|
<p class="param-note">L'option <strong>Libre</strong> ne sera activée qu'à partir de l'année académique prochaine.</p>
|
|
|
|
<form method="post" action="actions/settings.php" class="param-form">
|
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
|
<input type="hidden" name="section" value="formulaire">
|
|
|
|
<label class="param-checkbox">
|
|
<input type="checkbox" name="access_type_interdit_enabled" value="1"
|
|
<?= ($siteSettings['access_type_interdit_enabled'] ?? '1') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Interdit</strong><br>
|
|
<small>TFE non disponible en physique ni sur le site</small>
|
|
</span>
|
|
</label>
|
|
|
|
<label class="param-checkbox">
|
|
<input type="checkbox" name="access_type_interne_enabled" value="1"
|
|
<?= ($siteSettings['access_type_interne_enabled'] ?? '1') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Interne</strong><br>
|
|
<small>TFE accessible uniquement sur place en physique</small>
|
|
</span>
|
|
</label>
|
|
|
|
<label class="param-checkbox param-checkbox--disabled">
|
|
<input type="checkbox" name="access_type_libre_enabled" value="1"
|
|
<?= ($siteSettings['access_type_libre_enabled'] ?? '0') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Libre</strong><br>
|
|
<small>Libre accès — disponible à partir de l'année académique prochaine</small>
|
|
</span>
|
|
</label>
|
|
|
|
<button type="submit" class="btn btn--primary">Enregistrer</button>
|
|
</form>
|
|
</section>
|
|
|
|
<!-- ── Types de travaux ── -->
|
|
<section aria-labelledby="form-objet-types-title">
|
|
<h3 id="form-objet-types-title">Types de travaux</h3>
|
|
<p>Active ou désactive les types de travaux dans les formulaires et la consultation. Un type désactivé ne peut plus être soumis ni affiché sur le site.</p>
|
|
<p class="param-note">Le type <strong>TFE</strong> est toujours actif et ne peut pas être désactivé.</p>
|
|
|
|
<form method="post" action="actions/settings.php" class="param-form">
|
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
|
<input type="hidden" name="section" value="objet_types">
|
|
|
|
<label class="param-checkbox param-checkbox--disabled">
|
|
<input type="checkbox" disabled checked>
|
|
<span>
|
|
<strong>TFE</strong><br>
|
|
<small>Travail de fin d'études — toujours actif</small>
|
|
</span>
|
|
</label>
|
|
|
|
<label class="param-checkbox">
|
|
<input type="checkbox" name="objet_these_enabled" value="1"
|
|
<?= ($siteSettings['objet_these_enabled'] ?? '1') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Thèse</strong><br>
|
|
<small>Thèses doctorales</small>
|
|
</span>
|
|
</label>
|
|
|
|
<label class="param-checkbox">
|
|
<input type="checkbox" name="objet_frart_enabled" value="1"
|
|
<?= ($siteSettings['objet_frart_enabled'] ?? '1') === '1' ? 'checked' : '' ?>>
|
|
<span>
|
|
<strong>Frart</strong><br>
|
|
<small>Formation de recherche en art</small>
|
|
</span>
|
|
</label>
|
|
|
|
<button type="submit" class="btn btn--primary">Enregistrer</button>
|
|
</form>
|
|
</section>
|
|
|
|
<!-- ═══════════════════════════════════════════════════════════════════
|
|
PAGES STATIQUES
|
|
═══════════════════════════════════════════════════════════════════ -->
|
|
<h2>Pages statiques</h2>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Slug</th>
|
|
<th scope="col">Titre</th>
|
|
<th scope="col">Mis à jour</th>
|
|
<th scope="col">Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($pages as $p): ?>
|
|
<tr>
|
|
<td><code><?= htmlspecialchars($p['slug']) ?></code></td>
|
|
<td><?= htmlspecialchars($p['title']) ?></td>
|
|
<td><?= htmlspecialchars($p['updated_at'] ?? '—') ?></td>
|
|
<td>
|
|
<a href="/admin/contenus-edit.php?slug=<?= urlencode($p['slug']) ?>"
|
|
class="admin-icon-btn admin-icon-btn--edit" title="Éditer">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" viewBox="0 0 256 256"><path d="M248,92.68a15.86,15.86,0,0,0-4.69-11.31L174.63,12.68a16,16,0,0,0-22.63,0L123.57,41.11l-58,21.77A16.06,16.06,0,0,0,55.35,75.23L32.11,214.68A8,8,0,0,0,40,224a8.4,8.4,0,0,0,1.32-.11l139.44-23.24a16,16,0,0,0,12.35-10.17l21.77-58L243.31,104A15.87,15.87,0,0,0,248,92.68Zm-69.87,92.19L63.32,204l47.37-47.37a28,28,0,1,0-11.32-11.32L52,192.7,71.13,77.86,126,57.29,198.7,130ZM112,132a12,12,0,1,1,12,12A12,12,0,0,1,112,132Zm96-15.32L139.31,48l24-24L232,92.68Z"></path></svg>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<!-- ── Structure du formulaire ── -->
|
|
<section aria-labelledby="form-help-blocks">
|
|
<h3 id="form-help-blocks">Structure du Formulaire</h3>
|
|
<p class="fhb-hint">
|
|
Chaque <strong>bloc d'aide</strong> s'affiche au-dessus de sa section dans le formulaire de soumission.
|
|
Le <strong>bouton rond</strong> active/désactive l'affichage.
|
|
</p>
|
|
|
|
<?php
|
|
$blocks = $formHelpBlocks;
|
|
|
|
// ── Student form structure — each help block above its fieldset ───────────
|
|
// Pairs: [help_key, fieldset_name, fieldset_inputs]
|
|
$pairs = [
|
|
// Top of form
|
|
['partage_intro', null, null],
|
|
|
|
// Informations du TFE
|
|
['fieldset_tfe_info', 'Informations du TFE',
|
|
['Titre', 'Sous-titre', 'Auteur·ice(s)', 'Contact visible', 'Synopsis']],
|
|
|
|
// Langue(s)
|
|
['fieldset_languages', 'Langue(s)',
|
|
['Langues du TFE (cases à cocher)', 'Autre(s) langue(s)']],
|
|
|
|
// Mots-clés
|
|
['fieldset_keywords', 'Mots-clés',
|
|
['Mots-clés (max 10), séparés par des virgules']],
|
|
|
|
// Cadre académique
|
|
['fieldset_academic', 'Cadre académique',
|
|
['Année', 'Orientation', 'AP', 'Finalité']],
|
|
|
|
// Composition du jury
|
|
['fieldset_jury', 'Composition du jury',
|
|
['Président·e', 'Promoteur·ice(s)', 'Lecteur·ices']],
|
|
|
|
// Format(s) + Fichiers
|
|
['fieldset_files', 'Format(s) + Fichiers',
|
|
['Formats (PDF, vidéo, audio, site web…)', 'Couverture', 'Note d\'intention', 'Fichier principal', 'Annexes']],
|
|
|
|
// Métadonnées complémentaires (supprimé)
|
|
// Ces champs sont redondants avec les fichiers attachés
|
|
|
|
// Degrés d'ouverture et licences
|
|
['fieldset_access', 'Degrés d\'ouverture et licences',
|
|
['Généralités', 'Degré (libre/interne/interdit)', 'Licence', 'CC2r']],
|
|
|
|
// E-mail de confirmation
|
|
['fieldset_email', 'E-mail de confirmation',
|
|
['Adresse e-mail']],
|
|
];
|
|
?>
|
|
|
|
<div class="fhb-structure">
|
|
<?php foreach ($pairs as [$helpKey, $fieldsetName, $inputs]):
|
|
// Help block
|
|
$b = $blocks[$helpKey] ?? ['content' => '', 'name' => '', 'enabled' => 0];
|
|
$title = $b['name'] ?: ($fieldsetName ?? $helpKey);
|
|
?>
|
|
<div class="fhb-block-wrapper" data-key="<?= htmlspecialchars($helpKey) ?>">
|
|
<div class="fhb-inline"
|
|
hx-get="/admin/form-help-inline-fragment.php?key=<?= urlencode($helpKey) ?>"
|
|
hx-trigger="load"
|
|
hx-swap="outerHTML">
|
|
<div class="fhb-inline-name"><?= htmlspecialchars($title) ?></div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($fieldsetName !== null): ?>
|
|
<div class="fhb-fieldset-card">
|
|
<div class="fhb-fieldset-card-legend"><?= htmlspecialchars($fieldsetName) ?></div>
|
|
<?php if ($inputs): ?>
|
|
<ul class="fhb-fieldset-card-inputs">
|
|
<?php foreach ($inputs as $inp): ?>
|
|
<li><?= htmlspecialchars($inp) ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</section>
|
|
|
|
</main>
|
|
|
|
<script>
|
|
(function () {
|
|
var otScript = document.createElement('script');
|
|
otScript.src = '<?= App::assetV('/assets/js/overtype.min.js') ?>';
|
|
document.head.appendChild(otScript);
|
|
})();
|
|
</script>
|