mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-06-25 16:19:19 +02:00
feat: refactor licence fragment — Libre→CC2r+licence, Interne→opt-in want_license, Interdit→none, add details/summary to license UI
This commit is contained in:
1
TODO.md
1
TODO.md
@@ -22,6 +22,7 @@
|
|||||||
- [x] Decorelate formats from fichiers: no HTMX toggling; Site web/Vidéo/Audio always visible
|
- [x] Decorelate formats from fichiers: no HTMX toggling; Site web/Vidéo/Audio always visible
|
||||||
- [x] Sticky formats fieldset inside parent container
|
- [x] Sticky formats fieldset inside parent container
|
||||||
- [x] Server-side progress: PeerTubeService writes to temp file, client polls progress endpoint
|
- [x] Server-side progress: PeerTubeService writes to temp file, client polls progress endpoint
|
||||||
|
- [x] Refactor licence fieldset: Libre→CC2r+licence, Interne→opt-in licence, Interdit→none
|
||||||
|
|
||||||
## HTMX Toast Feedback for Settings Checkboxes (contenus.php)
|
## HTMX Toast Feedback for Settings Checkboxes (contenus.php)
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* HTMX fragment (admin): renders the licence section with conditional required states.
|
* HTMX fragment (admin): renders the licence section with conditional options.
|
||||||
*
|
*
|
||||||
* POST: access_type_id, license_id, license_custom, cc2r, admin_mode
|
* POST: access_type_id, license_id, license_custom, cc2r, want_license
|
||||||
*
|
*
|
||||||
* Admin mode: never required.
|
* Libre (1): CC2r checkbox + licence select/custom (at least one required)
|
||||||
|
* Interne (2): opt-in "Je souhaite appliquer une licence" → CC2r + licence select/custom
|
||||||
|
* Interdit (3): no licence options
|
||||||
*/
|
*/
|
||||||
require_once __DIR__ . '/../../bootstrap.php';
|
require_once __DIR__ . '/../../bootstrap.php';
|
||||||
require_once __DIR__ . '/../../src/AdminAuth.php';
|
require_once __DIR__ . '/../../src/AdminAuth.php';
|
||||||
AdminAuth::requireLogin();
|
AdminAuth::requireLogin();
|
||||||
|
|
||||||
$accessTypeId = $_POST['access_type_id'] ?? '2';
|
$accessTypeId = $_POST['access_type_id'] ?? '';
|
||||||
$licenseId = $_POST['license_id'] ?? '';
|
$licenseId = $_POST['license_id'] ?? '';
|
||||||
$licenseCustom = $_POST['license_custom'] ?? '';
|
$licenseCustom = $_POST['license_custom'] ?? '';
|
||||||
$cc2r = !empty($_POST['cc2r']);
|
$cc2r = !empty($_POST['cc2r']);
|
||||||
$adminMode = true;
|
$wantLicense = !empty($_POST['want_license']);
|
||||||
|
|
||||||
require_once APP_ROOT . '/src/Database.php';
|
require_once APP_ROOT . '/src/Database.php';
|
||||||
$db = Database::getInstance();
|
$db = Database::getInstance();
|
||||||
@@ -22,6 +24,22 @@ $licenseTypes = $db->getAllLicenseTypes();
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="licence-license-choice">
|
<div class="licence-license-choice">
|
||||||
|
<?php if ($accessTypeId === '1'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">J'autorise que mon TFE soit disponible en libre accès. Je suis conscient·e des responsabilités légales.</p>
|
||||||
|
|
||||||
|
<div class="admin-form-group">
|
||||||
|
<label class="admin-checkbox-label">
|
||||||
|
<input type="checkbox" name="cc2r" value="1"
|
||||||
|
<?= $cc2r ? 'checked' : '' ?>>
|
||||||
|
J'accepte les conditions collectives de réutilisation (CC2r)
|
||||||
|
</label>
|
||||||
|
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="licence-or-separator"><span>et / ou</span></div>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
||||||
$selected = $licenseId; $placeholder = '— Sélectionner —'; $required = false;
|
$selected = $licenseId; $placeholder = '— Sélectionner —'; $required = false;
|
||||||
@@ -31,16 +49,61 @@ $licenseTypes = $db->getAllLicenseTypes();
|
|||||||
<?php
|
<?php
|
||||||
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
||||||
$value = htmlspecialchars($licenseCustom);
|
$value = htmlspecialchars($licenseCustom);
|
||||||
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés...';
|
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés…';
|
||||||
include APP_ROOT . '/templates/partials/form/text-field.php';
|
include APP_ROOT . '/templates/partials/form/text-field.php';
|
||||||
?>
|
?>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<?php elseif ($accessTypeId === '2'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">Mon TFE est accessible sur place et sur la plateforme xamxam par la communauté erg. J'autorise une (ré-)utilisation dans un contexte académique au sein de l'erg.</p>
|
||||||
|
|
||||||
|
<div class="admin-form-group">
|
||||||
|
<label class="admin-checkbox-label">
|
||||||
|
<input type="checkbox" name="want_license" value="1"
|
||||||
|
hx-post="/admin/licence-fragment.php"
|
||||||
|
hx-target=".licence-license-choice"
|
||||||
|
hx-swap="outerHTML"
|
||||||
|
hx-include="closest fieldset"
|
||||||
|
<?= $wantLicense ? 'checked' : '' ?>>
|
||||||
|
<strong>Je souhaite appliquer une licence sur mon TFE</strong>
|
||||||
|
</label>
|
||||||
|
<small>Par défaut, aucune licence spécifique n'est appliquée. Cochez pour en choisir une.</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ($wantLicense): ?>
|
||||||
<div class="admin-form-group">
|
<div class="admin-form-group">
|
||||||
<label class="admin-checkbox-label">
|
<label class="admin-checkbox-label">
|
||||||
<input type="checkbox" name="cc2r" value="1"
|
<input type="checkbox" name="cc2r" value="1"
|
||||||
<?= $cc2r ? 'checked' : '' ?>>
|
<?= $cc2r ? 'checked' : '' ?>>
|
||||||
J'accepte les Conditions Collectives de Réutilisation (CC2r)
|
J'accepte les conditions collectives de réutilisation (CC2r)
|
||||||
</label>
|
</label>
|
||||||
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
||||||
|
$selected = $licenseId; $placeholder = '— Sélectionner —'; $required = false;
|
||||||
|
include APP_ROOT . '/templates/partials/form/select-field.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
||||||
|
$value = htmlspecialchars($licenseCustom);
|
||||||
|
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés…';
|
||||||
|
include APP_ROOT . '/templates/partials/form/text-field.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<p class="licence-note"><em>Je suis conscient·e des obligations légales venant avec la licence choisie et acquiesce avoir lu la documentation prévue à cet effet par l'erg, ainsi qu'avoir discuté des enjeux des licences avec l'équipe pédagogique.</em></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<?php elseif ($accessTypeId === '3'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">Mon TFE n'est pas disponible en physique ni sur le site. Une note descriptive est visible publiquement.</p>
|
||||||
|
<p class="licence-note"><em>Aucune licence n'est applicable.</em></p>
|
||||||
|
</fieldset>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -743,3 +743,18 @@ details > summary::-webkit-details-marker {
|
|||||||
audio::-webkit-media-controls-enclosure {
|
audio::-webkit-media-controls-enclosure {
|
||||||
border-radius: var(--radius);
|
border-radius: var(--radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
details {
|
||||||
|
padding: var(--space-s);
|
||||||
|
}
|
||||||
|
summary {
|
||||||
|
font-family: var(--font-display);
|
||||||
|
font-weight: 600;
|
||||||
|
text-decoration: 1px wavy;
|
||||||
|
color: var(--accent-secondary);
|
||||||
|
svg {
|
||||||
|
fill: var(--accent-secondary);
|
||||||
|
vertical-align: text-bottom;
|
||||||
|
height: 1.4em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1362,3 +1362,135 @@ legend {
|
|||||||
#format-fichiers-block {
|
#format-fichiers-block {
|
||||||
container-type: inline-size;
|
container-type: inline-size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Licence choice or-separator ─────────────────────────── */
|
||||||
|
|
||||||
|
.licence-or-separator {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--space-xs);
|
||||||
|
margin: var(--space-xs) 0;
|
||||||
|
color: var(--text-tertiary);
|
||||||
|
font-size: var(--step--1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.licence-or-separator::before,
|
||||||
|
.licence-or-separator::after {
|
||||||
|
content: '';
|
||||||
|
flex: 1;
|
||||||
|
height: 1px;
|
||||||
|
background: var(--accent-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Nested licence fieldset ─────────────────────────────── */
|
||||||
|
|
||||||
|
.licence-options-fieldset {
|
||||||
|
border: 1px solid var(--accent-muted);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: var(--space-s);
|
||||||
|
margin-top: var(--space-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.licence-options-fieldset legend {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: var(--step--1);
|
||||||
|
color: var(--text-secondary);
|
||||||
|
padding: 0 var(--space-2xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── File figures (recap + edit existing files) ──────────── */
|
||||||
|
|
||||||
|
.admin-file-list,
|
||||||
|
.recap-files-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-s);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-list-item,
|
||||||
|
.recap-files-list-item {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-figure,
|
||||||
|
.recap-file-figure {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: var(--space-s);
|
||||||
|
background: var(--bg-secondary, rgba(149, 87, 181, 0.05));
|
||||||
|
border-radius: var(--radius);
|
||||||
|
padding: var(--space-s);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-icon,
|
||||||
|
.recap-file-icon {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: var(--accent-muted);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-thumb,
|
||||||
|
.recap-file-thumb {
|
||||||
|
max-width: 160px;
|
||||||
|
max-height: 120px;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-caption,
|
||||||
|
.recap-file-caption {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-3xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-name,
|
||||||
|
.recap-file-name {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: var(--step--1);
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-peertube-id,
|
||||||
|
.recap-file-peertube-id {
|
||||||
|
font-size: var(--step--2);
|
||||||
|
color: var(--text-tertiary);
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-meta-row,
|
||||||
|
.recap-file-meta-row {
|
||||||
|
display: flex;
|
||||||
|
gap: var(--space-xs);
|
||||||
|
align-items: center;
|
||||||
|
font-size: var(--step--2);
|
||||||
|
color: var(--text-tertiary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recap-file-label {
|
||||||
|
font-size: var(--step--1);
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-file-label-input {
|
||||||
|
font-size: var(--step--2);
|
||||||
|
padding: var(--space-3xs) var(--space-2xs);
|
||||||
|
border: 1px solid var(--accent-muted);
|
||||||
|
border-radius: var(--radius);
|
||||||
|
background: var(--bg-primary);
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-top: var(--space-3xs);
|
||||||
|
}
|
||||||
|
|||||||
@@ -79,20 +79,19 @@ $websiteLabel = htmlspecialchars($_POST['website_label'] ?? '');
|
|||||||
if ($editMode && (!empty($_efiles) || $_cover)):
|
if ($editMode && (!empty($_efiles) || $_cover)):
|
||||||
?>
|
?>
|
||||||
<div class="admin-form-group">
|
<div class="admin-form-group">
|
||||||
<ul id="existing-files-sortable" class="admin-file-list">
|
<ul id="existing-files-sortable" class="admin-file-list" role="list">
|
||||||
<?php if ($_cover): ?>
|
<?php if ($_cover): ?>
|
||||||
<li class="admin-file-list-item">
|
<li class="admin-file-list-item">
|
||||||
<span class="admin-file-icon-col">🖼️</span>
|
<figure class="admin-file-figure">
|
||||||
<span class="admin-file-info">
|
<img src="/media?path=<?= urlencode($_cover) ?>"
|
||||||
<span class="admin-file-name">Couverture</span>
|
alt="Couverture actuelle" class="admin-file-thumb">
|
||||||
<span class="admin-file-meta-row">
|
<figcaption class="admin-file-caption">
|
||||||
<img src="/media?path=<?= urlencode($_cover) ?>"
|
<span class="admin-file-name">Couverture</span>
|
||||||
alt="Couverture actuelle" style="max-height:120px;border-radius:var(--radius);margin-top:var(--space-3xs);">
|
<label class="admin-checkbox-label" style="margin-top:var(--space-3xs);">
|
||||||
</span>
|
<input type="checkbox" name="remove_cover" value="1"> Supprimer
|
||||||
<label class="admin-checkbox-label" style="margin-top:var(--space-3xs);">
|
</label>
|
||||||
<input type="checkbox" name="remove_cover" value="1"> Supprimer
|
</figcaption>
|
||||||
</label>
|
</figure>
|
||||||
</span>
|
|
||||||
</li>
|
</li>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php
|
<?php
|
||||||
@@ -118,27 +117,31 @@ $websiteLabel = htmlspecialchars($_POST['website_label'] ?? '');
|
|||||||
?>
|
?>
|
||||||
<li class="admin-file-list-item" data-file-id="<?= (int)$_f["id"] ?>">
|
<li class="admin-file-list-item" data-file-id="<?= (int)$_f["id"] ?>">
|
||||||
<input type="hidden" name="file_sort_order[]" value="<?= (int)$_f["id"] ?>">
|
<input type="hidden" name="file_sort_order[]" value="<?= (int)$_f["id"] ?>">
|
||||||
<span class="admin-file-icon-col"><?= $_fIcon ?></span>
|
<figure class="admin-file-figure">
|
||||||
<span class="admin-file-info">
|
<span class="admin-file-icon"><?= $_fIcon ?></span>
|
||||||
<a href="<?= $_fLinkHref ?>" target="_blank" rel="noopener" class="admin-file-name">
|
<figcaption class="admin-file-caption">
|
||||||
<?= htmlspecialchars($_f["file_name"] ?? basename($_f["file_path"])) ?>
|
<a href="<?= $_fLinkHref ?>" target="_blank" rel="noopener" class="admin-file-name">
|
||||||
</a>
|
<?= htmlspecialchars($_f["file_name"] ?? basename($_f["file_path"])) ?>
|
||||||
<span class="admin-file-meta-row">
|
</a>
|
||||||
<span class="admin-file-type-badge"><?= htmlspecialchars($_fType) ?></span>
|
<?php if ($_fIsPeerTube): ?>
|
||||||
<?php if (!empty($_f["file_size"]) && $_f["file_size"] > 0): ?>
|
<span class="admin-file-peertube-id">ID : <?= htmlspecialchars(substr($_fPath, strlen("peertube_ids:"))) ?></span>
|
||||||
<span class="admin-file-size"><?= number_format($_f["file_size"] / 1024 / 1024, 2) ?> MB</span>
|
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</span>
|
<span class="admin-file-meta-row">
|
||||||
<input type="text" name="file_label[<?= (int)$_f["id"] ?>]"
|
<span class="admin-file-type-badge"><?= htmlspecialchars($_fType) ?></span>
|
||||||
value="<?= htmlspecialchars($_f["display_label"] ?? "") ?>"
|
<?php if (!empty($_f["file_size"]) && $_f["file_size"] > 0): ?>
|
||||||
placeholder="Légende / description (optionnel)"
|
<span class="admin-file-size"><?= number_format($_f["file_size"] / 1024 / 1024, 2) ?> MB</span>
|
||||||
class="admin-file-label-input">
|
<?php endif; ?>
|
||||||
</span>
|
</span>
|
||||||
|
<input type="text" name="file_label[<?= (int)$_f["id"] ?>]"
|
||||||
|
value="<?= htmlspecialchars($_f["display_label"] ?? "") ?>"
|
||||||
|
placeholder="Légende / description (optionnel)"
|
||||||
|
class="admin-file-label-input">
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
<input type="hidden" name="delete_files[]" value="<?= (int)$_f["id"] ?>" disabled>
|
<input type="hidden" name="delete_files[]" value="<?= (int)$_f["id"] ?>" disabled>
|
||||||
<button type="button"
|
<button type="button"
|
||||||
class="admin-btn-remove fq-remove"
|
class="btn btn--danger btn--sm"
|
||||||
onclick="this.previousElementSibling.disabled=false;this.closest('li').style.opacity='0.4';this.disabled=true;"
|
onclick="this.previousElementSibling.previousElementSibling.disabled=false;this.closest('li').style.opacity='0.4';this.disabled=true;">Supprimer</button>
|
||||||
aria-label="Supprimer <?= htmlspecialchars($_f["file_name"] ?? basename($_f["file_path"])) ?>">✕</button>
|
|
||||||
</li>
|
</li>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* HTMX fragment: renders the licence section with conditional required states.
|
* HTMX fragment (partage): renders the licence section with conditional options.
|
||||||
*
|
*
|
||||||
* POST: access_type_id, license_id, license_custom, cc2r, admin_mode
|
* POST: access_type_id, license_id, license_custom, cc2r, want_license, admin_mode
|
||||||
*
|
*
|
||||||
* When access_type_id=1 (Libre): licence fields are required.
|
* Libre (1): CC2r checkbox + licence select/custom (au moins une des deux)
|
||||||
* When access_type_id=2|3 (Interne/Interdit): licence fields are optional.
|
* Interne (2): opt-in "Je souhaite appliquer une licence" → CC2r + licence
|
||||||
|
* Interdit (3): no licence options
|
||||||
*/
|
*/
|
||||||
require_once __DIR__ . '/../../bootstrap.php';
|
require_once __DIR__ . '/../../bootstrap.php';
|
||||||
|
|
||||||
$accessTypeId = $_POST['access_type_id'] ?? '2';
|
$accessTypeId = $_POST['access_type_id'] ?? '';
|
||||||
$licenseId = $_POST['license_id'] ?? '';
|
$licenseId = $_POST['license_id'] ?? '';
|
||||||
$licenseCustom = $_POST['license_custom'] ?? '';
|
$licenseCustom = $_POST['license_custom'] ?? '';
|
||||||
$cc2r = !empty($_POST['cc2r']);
|
$cc2r = !empty($_POST['cc2r']);
|
||||||
$adminMode = ($_POST['admin_mode'] ?? '0') === '1';
|
$wantLicense = !empty($_POST['want_license']);
|
||||||
|
$adminMode = ($_POST['admin_mode'] ?? '0') === '1';
|
||||||
$required = !$adminMode && $accessTypeId === '1';
|
|
||||||
|
|
||||||
require_once APP_ROOT . '/src/Database.php';
|
require_once APP_ROOT . '/src/Database.php';
|
||||||
$db = Database::getInstance();
|
$db = Database::getInstance();
|
||||||
@@ -23,25 +23,86 @@ $licenseTypes = $db->getAllLicenseTypes();
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="licence-license-choice">
|
<div class="licence-license-choice">
|
||||||
|
<?php if ($accessTypeId === '1'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">J'autorise que mon TFE soit disponible en libre accès. Je suis conscient·e des responsabilités légales.</p>
|
||||||
|
|
||||||
|
<div class="admin-form-group">
|
||||||
|
<label class="admin-checkbox-label">
|
||||||
|
<input type="checkbox" name="cc2r" value="1"
|
||||||
|
<?= $cc2r ? 'checked' : '' ?>>
|
||||||
|
J'accepte les conditions collectives de réutilisation (CC2r)
|
||||||
|
</label>
|
||||||
|
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="licence-or-separator"><span>et / ou</span></div>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
||||||
$selected = $licenseId; $placeholder = '— Sélectionner —';
|
$selected = $licenseId; $placeholder = '— Sélectionner —'; $required = false;
|
||||||
include APP_ROOT . '/templates/partials/form/select-field.php';
|
include APP_ROOT . '/templates/partials/form/select-field.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
||||||
$value = htmlspecialchars($licenseCustom);
|
$value = htmlspecialchars($licenseCustom);
|
||||||
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés...';
|
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés…';
|
||||||
include APP_ROOT . '/templates/partials/form/text-field.php';
|
include APP_ROOT . '/templates/partials/form/text-field.php';
|
||||||
?>
|
?>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<?php elseif ($accessTypeId === '2'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">Mon TFE est accessible sur place et sur la plateforme xamxam par la communauté erg. J'autorise une (ré-)utilisation dans un contexte académique au sein de l'erg.</p>
|
||||||
|
|
||||||
|
<div class="admin-form-group">
|
||||||
|
<label class="admin-checkbox-label">
|
||||||
|
<input type="checkbox" name="want_license" value="1"
|
||||||
|
hx-post="/partage/licence-fragment"
|
||||||
|
hx-target=".licence-license-choice"
|
||||||
|
hx-swap="outerHTML"
|
||||||
|
hx-include="closest fieldset"
|
||||||
|
<?= $wantLicense ? 'checked' : '' ?>>
|
||||||
|
<strong>Je souhaite appliquer une licence sur mon TFE</strong>
|
||||||
|
</label>
|
||||||
|
<small>Par défaut, aucune licence spécifique n'est appliquée. Cochez pour en choisir une.</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ($wantLicense): ?>
|
||||||
<div class="admin-form-group">
|
<div class="admin-form-group">
|
||||||
<label class="admin-checkbox-label">
|
<label class="admin-checkbox-label">
|
||||||
<input type="checkbox" name="cc2r" value="1"
|
<input type="checkbox" name="cc2r" value="1"
|
||||||
<?= $cc2r ? 'checked' : '' ?>>
|
<?= $cc2r ? 'checked' : '' ?>>
|
||||||
J'accepte les Conditions Collectives de Réutilisation (CC2r)
|
J'accepte les conditions collectives de réutilisation (CC2r)
|
||||||
</label>
|
</label>
|
||||||
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
<small><a href="https://cc2r.net/" target="_blank" rel="noopener">En savoir plus sur la CC2r ↗</a></small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$name = 'license_id'; $label = 'Licence :'; $options = $licenseTypes;
|
||||||
|
$selected = $licenseId; $placeholder = '— Sélectionner —'; $required = false;
|
||||||
|
include APP_ROOT . '/templates/partials/form/select-field.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$name = 'license_custom'; $label = 'Ou précisez une autre licence :';
|
||||||
|
$value = htmlspecialchars($licenseCustom);
|
||||||
|
$hint = 'Ex: CC BY-NC 4.0, Tous droits réservés…';
|
||||||
|
include APP_ROOT . '/templates/partials/form/text-field.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<p class="licence-note"><em>Je suis conscient·e des obligations légales venant avec la licence choisie et acquiesce avoir lu la documentation prévue à cet effet par l'erg, ainsi qu'avoir discuté des enjeux des licences avec l'équipe pédagogique.</em></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<?php elseif ($accessTypeId === '3'): ?>
|
||||||
|
<fieldset class="licence-options-fieldset">
|
||||||
|
<legend>Options de licence</legend>
|
||||||
|
<p class="licence-note">Mon TFE n'est pas disponible en physique ni sur le site. Une note descriptive est visible publiquement.</p>
|
||||||
|
<p class="licence-note"><em>Aucune licence n'est applicable.</em></p>
|
||||||
|
</fieldset>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1065,6 +1065,32 @@
|
|||||||
+%%%%%%% diff from: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
+%%%%%%% diff from: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
||||||
+\\\\\\\ to: mrtoqozz a1fbaf50 "server-side upload progress: poll /admin/actions/upload-progress.php via token; progress file written during PeerTube uploads" (rebased revision)
|
+\\\\\\\ to: mrtoqozz a1fbaf50 "server-side upload progress: poll /admin/actions/upload-progress.php via token; progress file written during PeerTube uploads" (rebased revision)
|
||||||
++ $linkName = $link['name'] ?? '';
|
++ $linkName = $link['name'] ?? '';
|
||||||
|
++ $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff from: mrtoqozz a1fbaf50 "server-side upload progress: poll /admin/actions/upload-progress.php via token; progress file written during PeerTube uploads" (rebased revision)
|
||||||
|
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ to: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
||||||
|
- $linkName = $link['name'] ?? '';
|
||||||
|
- $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff from: somsyvxz 14a3cd10 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebase destination)
|
||||||
|
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ to: pnyrukop 065bd011 "Added details and summary to the license choosing element." (rebased revision)
|
||||||
|
$linkName = $link['name'] ?? '';
|
||||||
|
$linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
$linkLockedYear = $link['locked_year'] ?? null;
|
||||||
|
+%%%%%%% diff from: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
||||||
|
+\\\\\\\ to: pnyrukop 12bfbc93 "Added details and summary to the license choosing element." (rebased revision)
|
||||||
|
++ $linkName = $link['name'] ?? '';
|
||||||
|
++ $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff from: pnyrukop 12bfbc93 "Added details and summary to the license choosing element." (rebased revision)
|
||||||
|
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ to: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
||||||
|
- $linkName = $link['name'] ?? '';
|
||||||
|
- $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff from: somsyvxz 14a3cd10 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebase destination)
|
||||||
|
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ to: yupunuzo d7e461fa "refactor licence fragment: Libre→CC2r+licence, Interne→opt-in want_license, Interdit→none" (rebased revision)
|
||||||
|
$linkName = $link['name'] ?? '';
|
||||||
|
$linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
|
$linkLockedYear = $link['locked_year'] ?? null;
|
||||||
|
+%%%%%%% diff from: somsyvxz 249f7943 "Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder" (rebased revision)
|
||||||
|
+\\\\\\\ to: yupunuzo c830a93c "refactor licence fragment: Libre→CC2r+licence, Interne→opt-in want_license, Interdit→none" (rebased revision)
|
||||||
|
++ $linkName = $link['name'] ?? '';
|
||||||
++ $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
++ $linkExpiresVal = $link['expires_at'] ? date('Y-m-d\TH:i', strtotime($link['expires_at'])) : '';
|
||||||
?>
|
?>
|
||||||
<tr class="admin-table-row" onclick="event.stopPropagation(); window.open('/partage/<?= urlencode($link['slug']) ?>', '_blank')" style="cursor:pointer">
|
<tr class="admin-table-row" onclick="event.stopPropagation(); window.open('/partage/<?= urlencode($link['slug']) ?>', '_blank')" style="cursor:pointer">
|
||||||
|
|||||||
@@ -35,8 +35,9 @@
|
|||||||
<p><a href="/admin/add.php" class="btn btn--secondary">Retour au formulaire</a></p>
|
<p><a href="/admin/add.php" class="btn btn--secondary">Retour au formulaire</a></p>
|
||||||
|
|
||||||
<?php elseif ($thesis): ?>
|
<?php elseif ($thesis): ?>
|
||||||
|
<!-- ═══════════ Identité ═══════════ -->
|
||||||
<section>
|
<section>
|
||||||
<h2>Informations de base</h2>
|
<h2>Identité</h2>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Identifiant</dt><dd><?= htmlspecialchars($thesis['identifier']) ?></dd>
|
<dt>Identifiant</dt><dd><?= htmlspecialchars($thesis['identifier']) ?></dd>
|
||||||
<dt>Titre</dt><dd><?= htmlspecialchars($thesis['title']) ?></dd>
|
<dt>Titre</dt><dd><?= htmlspecialchars($thesis['title']) ?></dd>
|
||||||
@@ -44,101 +45,221 @@
|
|||||||
<dt>Sous-titre</dt><dd><?= htmlspecialchars($thesis['subtitle']) ?></dd>
|
<dt>Sous-titre</dt><dd><?= htmlspecialchars($thesis['subtitle']) ?></dd>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<dt>Auteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['authors']) ?></dd>
|
<dt>Auteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['authors']) ?></dd>
|
||||||
<dt>Année</dt><dd><?= htmlspecialchars($thesis['year']) ?></dd>
|
<?php if (!empty($thesis['contact_interne'])): ?>
|
||||||
|
<dt>Contact (interne)</dt><dd><?= htmlspecialchars($thesis['contact_interne']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<dt>Contact public</dt><dd><?= !empty($thesis['contact_public']) ? 'Oui' : 'Non' ?></dd>
|
||||||
|
<dt>Année</dt><dd><?= htmlspecialchars((string)$thesis['year']) ?></dd>
|
||||||
|
<dt>Objet</dt><dd><?= htmlspecialchars($thesis['objet'] ?? 'tfe') ?></dd>
|
||||||
|
<?php if ($thesis['is_doctoral']): ?>
|
||||||
|
<dt>Doctoral</dt><dd>Oui</dd>
|
||||||
|
<?php endif; ?>
|
||||||
</dl>
|
</dl>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- ═══════════ Cadre académique ═══════════ -->
|
||||||
<section>
|
<section>
|
||||||
<h2>Détails académiques</h2>
|
<h2>Cadre académique</h2>
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Orientation</dt><dd><?= htmlspecialchars($thesis['orientation'] ?? '–') ?></dd>
|
<dt>Orientation</dt><dd><?= htmlspecialchars($thesis['orientation'] ?? '–') ?></dd>
|
||||||
<dt>Atelier pratique</dt><dd><?= htmlspecialchars($thesis['ap_program'] ?? '–') ?></dd>
|
<dt>Atelier Pratique</dt><dd><?= htmlspecialchars($thesis['ap_program'] ?? '–') ?></dd>
|
||||||
<dt>Finalité</dt><dd><?= htmlspecialchars($thesis['finality_type'] ?? '–') ?></dd>
|
<dt>Finalité</dt><dd><?= htmlspecialchars($thesis['finality_type'] ?? '–') ?></dd>
|
||||||
<?php if ($thesis['supervisors']): ?>
|
|
||||||
<dt>Promoteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['supervisors']) ?></dd>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if (!empty($thesis['jury_promoteurs_ulb'])): ?>
|
|
||||||
<dt>Promoteur·ice(s) ULB</dt><dd><?= htmlspecialchars($thesis['jury_promoteurs_ulb']) ?></dd>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if (!empty($thesis['jury_lecteurs_internes'])): ?>
|
|
||||||
<dt>Lecteur·ices (interne)</dt><dd><?= htmlspecialchars($thesis['jury_lecteurs_internes']) ?></dd>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if (!empty($thesis['jury_lecteurs_externes'])): ?>
|
|
||||||
<dt>Lecteur·ices (externe)</dt><dd><?= htmlspecialchars($thesis['jury_lecteurs_externes']) ?></dd>
|
|
||||||
<?php endif; ?>
|
|
||||||
</dl>
|
</dl>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- ═══════════ Jury ═══════════ -->
|
||||||
|
<?php
|
||||||
|
$hasJury = $thesis['jury_president']
|
||||||
|
|| $thesis['jury_promoteurs']
|
||||||
|
|| $thesis['jury_promoteurs_ulb']
|
||||||
|
|| $thesis['jury_lecteurs_internes']
|
||||||
|
|| $thesis['jury_lecteurs_externes']
|
||||||
|
|| $thesis['supervisors'];
|
||||||
|
?>
|
||||||
|
<?php if ($hasJury): ?>
|
||||||
|
<section>
|
||||||
|
<h2>Jury</h2>
|
||||||
|
<dl>
|
||||||
|
<?php if ($thesis['jury_president']): ?>
|
||||||
|
<dt>Président·e</dt><dd><?= htmlspecialchars($thesis['jury_president']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['jury_promoteurs']): ?>
|
||||||
|
<dt>Promoteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['jury_promoteurs']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['jury_promoteurs_ulb']): ?>
|
||||||
|
<dt>Promoteur·ice(s) ULB</dt><dd><?= htmlspecialchars($thesis['jury_promoteurs_ulb']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['jury_lecteurs_internes']): ?>
|
||||||
|
<dt>Lecteur·ice(s) interne</dt><dd><?= htmlspecialchars($thesis['jury_lecteurs_internes']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['jury_lecteurs_externes']): ?>
|
||||||
|
<dt>Lecteur·ice(s) externe</dt><dd><?= htmlspecialchars($thesis['jury_lecteurs_externes']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['supervisors'] && !$thesis['jury_promoteurs']): ?>
|
||||||
|
<dt>Promoteur·ice(s)</dt><dd><?= htmlspecialchars($thesis['supervisors']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['jury_points'] !== null): ?>
|
||||||
|
<dt>Note du jury</dt><dd><?= htmlspecialchars($thesis['jury_points']) ?>/20</dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
</dl>
|
||||||
|
</section>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<!-- ═══════════ Contenu ═══════════ -->
|
||||||
<section>
|
<section>
|
||||||
<h2>Contenu</h2>
|
<h2>Contenu</h2>
|
||||||
<dl>
|
<dl>
|
||||||
|
<dt>Synopsis</dt>
|
||||||
|
<dd class="recap-synopsis"><?= nl2br(htmlspecialchars($thesis['synopsis'] ?? '–')) ?></dd>
|
||||||
|
|
||||||
|
<?php if ($thesis['context_note']): ?>
|
||||||
|
<dt>Note contextuelle</dt>
|
||||||
|
<dd class="recap-long-text"><?= nl2br(htmlspecialchars($thesis['context_note'])) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if ($thesis['languages']): ?>
|
<?php if ($thesis['languages']): ?>
|
||||||
<dt>Langue(s)</dt><dd><?= htmlspecialchars($thesis['languages']) ?></dd>
|
<dt>Langue(s)</dt><dd><?= htmlspecialchars($thesis['languages']) ?></dd>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if ($thesis['formats']): ?>
|
<?php if ($thesis['formats']): ?>
|
||||||
<dt>Format(s)</dt><dd><?= htmlspecialchars($thesis['formats']) ?></dd>
|
<dt>Format(s)</dt><dd><?= htmlspecialchars($thesis['formats']) ?></dd>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if ($thesis['keywords']): ?>
|
<?php if ($thesis['keywords']): ?>
|
||||||
<dt>Mots-clés</dt><dd><?= htmlspecialchars($thesis['keywords']) ?></dd>
|
<dt>Mots-clés</dt><dd><?= htmlspecialchars($thesis['keywords']) ?></dd>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if ($thesis['baiu_link']): ?>
|
<?php if ($thesis['baiu_link']): ?>
|
||||||
<dt>Lien</dt><dd><a href="<?= htmlspecialchars($thesis['baiu_link']) ?>" target="_blank" rel="noopener"><?= htmlspecialchars($thesis['baiu_link']) ?></a></dd>
|
<dt>Lien BAIU</dt><dd><a href="<?= htmlspecialchars($thesis['baiu_link']) ?>" target="_blank" rel="noopener"><?= htmlspecialchars($thesis['baiu_link']) ?></a></dd>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</dl>
|
</dl>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- ═══════════ Accès et licence ═══════════ -->
|
||||||
|
<section>
|
||||||
|
<h2>Accès et licence</h2>
|
||||||
|
<dl>
|
||||||
|
<dt>Degré d'ouverture</dt><dd><?= htmlspecialchars($thesis['access_type'] ?? '–') ?></dd>
|
||||||
|
|
||||||
|
<?php if ($thesis['license_type']): ?>
|
||||||
|
<dt>Licence</dt><dd><?= htmlspecialchars($thesis['license_type']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if ($thesis['license_custom']): ?>
|
||||||
|
<dt>Licence personnalisée</dt><dd><?= htmlspecialchars($thesis['license_custom']) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<dt>CC2r</dt><dd><?= !empty($thesis['cc2r']) ? 'Acceptée' : 'Non' ?></dd>
|
||||||
|
|
||||||
|
<dt>Exemplaire BAIU</dt><dd><?= !empty($thesis['exemplaire_baiu']) ? 'Oui' : 'Non' ?></dd>
|
||||||
|
<dt>Exemplaire ERG</dt><dd><?= !empty($thesis['exemplaire_erg']) ? 'Oui' : 'Non' ?></dd>
|
||||||
|
</dl>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ═══════════ Dates et publication ═══════════ -->
|
||||||
|
<section>
|
||||||
|
<h2>Dates et publication</h2>
|
||||||
|
<dl>
|
||||||
|
<?php if ($thesis['submitted_at']): ?>
|
||||||
|
<dt>Soumis le</dt><dd><?= date('d/m/Y à H:i', strtotime($thesis['submitted_at'])) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['defense_date']): ?>
|
||||||
|
<dt>Date de défense</dt><dd><?= date('d/m/Y', strtotime($thesis['defense_date'])) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($thesis['published_at']): ?>
|
||||||
|
<dt>Publié le</dt><dd><?= date('d/m/Y à H:i', strtotime($thesis['published_at'])) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
<dt>Publié</dt><dd><?= !empty($thesis['is_published']) ? 'Oui' : 'Non' ?></dd>
|
||||||
|
<?php if ($thesis['jury_note_added']): ?>
|
||||||
|
<dt>Note du jury ajoutée</dt><dd><?= date('d/m/Y', strtotime($thesis['jury_note_added'])) ?></dd>
|
||||||
|
<?php endif; ?>
|
||||||
|
</dl>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ═══════════ Remarques ═══════════ -->
|
||||||
|
<?php if (!empty($thesis['remarks'])): ?>
|
||||||
|
<section>
|
||||||
|
<h2>Remarques</h2>
|
||||||
|
<p class="recap-long-text"><?= nl2br(htmlspecialchars($thesis['remarks'])) ?></p>
|
||||||
|
</section>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<!-- ═══════════ Fichiers ═══════════ -->
|
||||||
<?php if (!empty($files)): ?>
|
<?php if (!empty($files)): ?>
|
||||||
<section>
|
<section>
|
||||||
<h2>Fichiers</h2>
|
<h2>Fichiers (<?= count($files) ?>)</h2>
|
||||||
<ul class="recap-file-list">
|
<ul class="recap-files-list" role="list">
|
||||||
<?php foreach ($files as $f): ?>
|
<?php foreach ($files as $f): ?>
|
||||||
<?php
|
<?php
|
||||||
$mime = $f['mime_type'] ?? '';
|
$mime = $f['mime_type'] ?? '';
|
||||||
$isImage = str_starts_with($mime, 'image/');
|
|
||||||
$filePath = $f['file_path'] ?? '';
|
$filePath = $f['file_path'] ?? '';
|
||||||
|
$fileName = htmlspecialchars($f['file_name'] ?? basename($filePath));
|
||||||
|
$fileType = htmlspecialchars($f['file_type']);
|
||||||
|
$displayLabel = $f['display_label'] ?? $f['description'] ?? '';
|
||||||
|
$isImage = str_starts_with($mime, 'image/');
|
||||||
$isPeerTube = str_starts_with($filePath, 'peertube_ids:');
|
$isPeerTube = str_starts_with($filePath, 'peertube_ids:');
|
||||||
|
$isExternal = str_starts_with($filePath, 'http://') || str_starts_with($filePath, 'https://');
|
||||||
|
|
||||||
if ($isPeerTube) {
|
if ($isPeerTube) {
|
||||||
$_ptUuid = substr($filePath, strlen('peertube_ids:'));
|
|
||||||
require_once APP_ROOT . '/src/PeerTubeService.php';
|
require_once APP_ROOT . '/src/PeerTubeService.php';
|
||||||
$_ptDb = new Database();
|
$_ptDb = new Database();
|
||||||
$_ptS = PeerTubeService::getSettings($_ptDb);
|
$_ptUuid = substr($filePath, strlen('peertube_ids:'));
|
||||||
// Only link to watch page for public (1) and unlisted (2) videos
|
$_ptS = PeerTubeService::getSettings($_ptDb);
|
||||||
if ((int)$_ptS['privacy'] <= 2) {
|
$mediaUrl = ((int)$_ptS['privacy'] <= 2)
|
||||||
$mediaUrl = PeerTubeService::getWatchUrl($_ptDb, $_ptUuid);
|
? PeerTubeService::getWatchUrl($_ptDb, $_ptUuid)
|
||||||
} else {
|
: '#';
|
||||||
$mediaUrl = '#';
|
} elseif ($isExternal) {
|
||||||
}
|
$mediaUrl = htmlspecialchars($filePath);
|
||||||
} else {
|
} else {
|
||||||
$mediaUrl = '/media?path=' . urlencode($filePath);
|
$mediaUrl = '/media?path=' . urlencode($filePath);
|
||||||
}
|
}
|
||||||
$fileName = htmlspecialchars($f['file_name'] ?? basename($filePath));
|
|
||||||
$fileType = htmlspecialchars($f['file_type']);
|
$typeIcon = match (true) {
|
||||||
|
$isPeerTube && $fileType === 'video' => '🎬',
|
||||||
|
$isPeerTube && $fileType === 'audio' => '🔊',
|
||||||
|
$fileType === 'cover' => '🖼️',
|
||||||
|
$fileType === 'note_intention' => '📝',
|
||||||
|
$fileType === 'main' || ($mime === 'application/pdf') => '📄',
|
||||||
|
$fileType === 'video' || str_starts_with($mime, 'video/') => '🎬',
|
||||||
|
$fileType === 'audio' || str_starts_with($mime, 'audio/') => '🔊',
|
||||||
|
$isImage => '🖼️',
|
||||||
|
$fileType === 'caption' => '💬',
|
||||||
|
$fileType === 'annex' => '📎',
|
||||||
|
$fileType === 'website' => '🌐',
|
||||||
|
default => '📎',
|
||||||
|
};
|
||||||
?>
|
?>
|
||||||
<li class="recap-file-item">
|
<li class="recap-files-list-item">
|
||||||
<?php if ($isImage): ?>
|
<figure class="recap-file-figure">
|
||||||
<a href="<?= $mediaUrl ?>" target="_blank" rel="noopener" class="recap-file-thumb-link">
|
<?php if ($isImage && !$isPeerTube): ?>
|
||||||
<img src="<?= $mediaUrl ?>" alt="<?= $fileName ?>" class="recap-file-thumb" loading="lazy">
|
<img src="<?= $mediaUrl ?>" alt="<?= $fileName ?>" class="recap-file-thumb" loading="lazy">
|
||||||
</a>
|
<?php else: ?>
|
||||||
<?php else: ?>
|
<span class="recap-file-icon"><?= $typeIcon ?></span>
|
||||||
<span class="recap-file-icon">
|
<?php endif; ?>
|
||||||
<?php
|
<figcaption class="recap-file-caption">
|
||||||
if ($isPeerTube && $f['file_type'] === 'video') echo '🎬';
|
<div class="recap-file-name-row">
|
||||||
elseif ($isPeerTube && $f['file_type'] === 'audio') echo '🎵';
|
<?php if ($isPeerTube && $mediaUrl !== '#'): ?>
|
||||||
elseif ($mime === 'application/pdf') echo '📄';
|
<a href="<?= $mediaUrl ?>" target="_blank" rel="noopener" class="recap-file-name"><?= $fileName ?></a>
|
||||||
elseif (str_starts_with($mime, 'video/')) echo '🎬';
|
<?php elseif ($isExternal): ?>
|
||||||
elseif (str_starts_with($mime, 'audio/')) echo '🎵';
|
<a href="<?= $mediaUrl ?>" target="_blank" rel="noopener" class="recap-file-name"><?= $fileName ?></a>
|
||||||
elseif (in_array($mime, ['application/zip','application/x-zip-compressed'])) echo '🗜️';
|
<?php else: ?>
|
||||||
elseif (str_ends_with($f['file_name'] ?? '', '.vtt')) echo '💬';
|
<a href="<?= $mediaUrl ?>" target="_blank" rel="noopener" class="recap-file-name"><?= $fileName ?></a>
|
||||||
else echo '📎';
|
<?php endif; ?>
|
||||||
?>
|
</div>
|
||||||
</span>
|
<?php if ($isPeerTube): ?>
|
||||||
<?php endif; ?>
|
<div class="recap-file-peertube-meta">
|
||||||
<div class="recap-file-meta">
|
<span class="recap-file-peertube-id">ID : <?= htmlspecialchars($_ptUuid) ?></span>
|
||||||
<a href="<?= $mediaUrl ?>" target="_blank" rel="noopener" class="recap-file-name"><?= $fileName ?></a>
|
</div>
|
||||||
<span class="recap-file-type-badge"><?= $fileType ?></span>
|
<?php endif; ?>
|
||||||
<span class="recap-file-size"><?= formatFileSize($f['file_size']) ?></span>
|
<?php if ($displayLabel): ?>
|
||||||
<span class="recap-file-date"><?= date('d/m/Y H:i', strtotime($f['uploaded_at'])) ?></span>
|
<div class="recap-file-label"><?= htmlspecialchars($displayLabel) ?></div>
|
||||||
</div>
|
<?php endif; ?>
|
||||||
|
<div class="recap-file-meta-row">
|
||||||
|
<span class="recap-file-meta"><?= formatFileSize($f['file_size']) ?></span>
|
||||||
|
<span class="recap-file-meta"><?= date('d/m/Y H:i', strtotime($f['uploaded_at'])) ?></span>
|
||||||
|
</div>
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
</li>
|
</li>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -61,8 +61,15 @@ $adminMode = $adminMode ?? false;
|
|||||||
hx-swap="outerHTML"
|
hx-swap="outerHTML"
|
||||||
hx-include="closest fieldset"
|
hx-include="closest fieldset"
|
||||||
<?= (string)$selectedAccess === '1' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
<?= (string)$selectedAccess === '1' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
||||||
<strong>🔓 Libre</strong> — Mon TFE est en libre accès à tout le monde sur la plateforme des TFE ainsi que dans la bibliothèque de l'erg.
|
<strong>🔓 Libre</strong>
|
||||||
|
<br>
|
||||||
</label>
|
</label>
|
||||||
|
<details>
|
||||||
|
<summary> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path></svg> Info</summary>
|
||||||
|
<p>
|
||||||
|
Mon TFE est en libre accès à tout le monde sur la plateforme des TFE ainsi que dans la bibliothèque de l’erg. Je suis conscient des responsabilités et obligations légales qui viennent avec une diffusion externe – et acquiesce avoir lu la documentation prévue à cet effet par l'erg, ainsi qu'avoir discuté des enjeux d'une publication avec l'équipe pédagogique. J'accepte de partager mes droits de diffusion avec l'erg, ce uniquement dans le cadre d'une diffusion sur la plateforme xamxam.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
@@ -75,8 +82,16 @@ $adminMode = $adminMode ?? false;
|
|||||||
hx-swap="outerHTML"
|
hx-swap="outerHTML"
|
||||||
hx-include="closest fieldset"
|
hx-include="closest fieldset"
|
||||||
<?= (string)$selectedAccess === '2' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
<?= (string)$selectedAccess === '2' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
||||||
<strong>🔒 Interne</strong> — Mon TFE n'est accessible que sur place en physique. Une note descriptive est disponible sur le site.
|
<strong>🔒 Interne</strong>
|
||||||
</label>
|
</label>
|
||||||
|
<br>
|
||||||
|
<details>
|
||||||
|
<summary> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path></svg> Info</summary>
|
||||||
|
<p>
|
||||||
|
Mon TFE et ma note d'intention ne sont accessibles que sur place en physique ainsi que sur la plateforme xamxam par la communauté erg. Une note descriptive est disponible sur le site à toustes. J’autorise une (ré-)utilisation et diffusion dans un contexte académique et didactique au sein de l'erg.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
@@ -89,8 +104,16 @@ $adminMode = $adminMode ?? false;
|
|||||||
hx-swap="outerHTML"
|
hx-swap="outerHTML"
|
||||||
hx-include="closest fieldset"
|
hx-include="closest fieldset"
|
||||||
<?= (string)$selectedAccess === '3' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
<?= (string)$selectedAccess === '3' ? 'checked' : '' ?> <?= $adminMode ? '' : 'required' ?>>
|
||||||
<strong>🚫 Interdit</strong> — Mon TFE n'est pas disponible en physique ni sur le site. Une note descriptive est disponible sur le site.
|
<strong>🚫 Interdit</strong>
|
||||||
|
|
||||||
</label>
|
</label>
|
||||||
|
<br>
|
||||||
|
<details>
|
||||||
|
<summary> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path></svg> Info</summary>
|
||||||
|
<p>
|
||||||
|
Mon TFE est en libre accès à tout le monde sur la plateforme des TFE ainsi que dans la bibliothèque de l’erg. Je suis conscient des responsabilités et obligations légales qui viennent avec une diffusion externe – et acquiesce avoir lu la documentation prévue à cet effet par l'erg, ainsi qu'avoir discuté des enjeux d'une publication avec l'équipe pédagogique. J'accepte de partager mes droits de diffusion avec l'erg, ce uniquement dans le cadre d'une diffusion sur la plateforme xamxam.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<p class="licence-note"><em>L'auteur·ice peut, à tout moment, décider de restreindre son propre choix. Iel ne peut par contre pas l'ouvrir.</em></p>
|
<p class="licence-note"><em>L'auteur·ice peut, à tout moment, décider de restreindre son propre choix. Iel ne peut par contre pas l'ouvrir.</em></p>
|
||||||
|
|||||||
255
qq
Normal file
255
qq
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
[1m[38;5;2m@[0m [1m[38;5;13mpkn[38;5;8mwmmky[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;14m2026-05-11 14:44:19[39m [38;5;12m7e8[38;5;8m166d7[39m[0m
|
||||||
|
│ [1m[38;5;3m(no description set)[39m[0m
|
||||||
|
○ [1m[38;5;5mkm[0m[38;5;8mxvkmqm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 14:36:01[39m [1m[38;5;4m3f7[0m[38;5;8mb2961[39m
|
||||||
|
│ [38;5;2m(empty)[39m wrap licence fragment content in nested fieldset with legend
|
||||||
|
○ [1m[38;5;5myup[0m[38;5;8munuzo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 14:36:01[39m [1m[38;5;4m678[0m[38;5;8mf1d3c[39m
|
||||||
|
│ refactor licence fragment: Libre→CC2r+licence, Interne→opt-in want_license, Interdit→none
|
||||||
|
○ [1m[38;5;5mpny[0m[38;5;8mrukop[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 14:24:27[39m [1m[38;5;4m8cc[0m[38;5;8m0bc34[39m
|
||||||
|
│ Added details and summary to the license choosing element.
|
||||||
|
○ [1m[38;5;5mll[0m[38;5;8mmtqprz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:55:19[39m [1m[38;5;4mf0[0m[38;5;8mbf86cb[39m
|
||||||
|
│ [38;5;2m(empty)[39m guard syncOrderInput against undefined pond instance during FilePond init
|
||||||
|
○ [1m[38;5;5mmr[0m[38;5;8mtoqozz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:55:19[39m [1m[38;5;4mb5[0m[38;5;8m31602f[39m
|
||||||
|
│ server-side upload progress: poll /admin/actions/upload-progress.php via token; progress file written during PeerTube uploads
|
||||||
|
○ [1m[38;5;5mnw[0m[38;5;8mozruss[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:38:35[39m [1m[38;5;4m41[0m[38;5;8m5a03cb[39m
|
||||||
|
│ decorelate formats from fichiers: no HTMX toggles, all slots always visible; progress bar 25/75 split; sticky formats fieldset
|
||||||
|
○ [1m[38;5;5mqv[0m[38;5;8mnunynl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:33:20[39m [1m[38;5;4m12[0m[38;5;8m09931c[39m
|
||||||
|
│ upload progress bar: fieldset layout, accent colors, file name display, completion animation, 800ms delay before redirect
|
||||||
|
○ [1m[38;5;5mql[0m[38;5;8mvmyvuo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:24:09[39m [1m[38;5;4m24[0m[38;5;8me1048a[39m
|
||||||
|
│ Bump peertube embed audio player height + remove figure for iframes in tfe.php
|
||||||
|
○ [1m[38;5;5mtx[0m[38;5;8mzqmwnx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:10:01[39m [1m[38;5;4mb75[0m[38;5;8m4732c[39m
|
||||||
|
│ fix PeerTube upload: switch to simple multipart POST /api/v1/videos/upload with CURLFile; remove resumable protocol
|
||||||
|
○ [1m[38;5;5msu[0m[38;5;8mrwmkqz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 13:00:07[39m [1m[38;5;4m1b3[0m[38;5;8m4dd14[39m
|
||||||
|
│ fix PeerTube upload: pass original filename in init body; chunk Content-Type → application/octet-stream
|
||||||
|
○ [1m[38;5;5muss[0m[38;5;8mkovxu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:53:57[39m [1m[38;5;4m8c0[0m[38;5;8mf90fe[39m
|
||||||
|
│ fix PeerTube init: remove waitTranscoding, add category+commentsEnabled; switch PATCH back to POSTFIELDS; remove verbose logging; clean curl_close
|
||||||
|
○ [1m[38;5;5mnll[0m[38;5;8mmqxnz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:50:44[39m [1m[38;5;4m68[0m[38;5;8m6be3c3[39m
|
||||||
|
│ fix PeerTube PATCH: use CURLOPT_INFILE stream for binary body; global CURL_HTTP_VERSION_2_0; fix chunkNum off-by-one
|
||||||
|
○ [1m[38;5;5mmxq[0m[38;5;8mulkkl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:46:02[39m [1m[38;5;4m3f2[0m[38;5;8m8ed35[39m
|
||||||
|
│ fix PeerTube PATCH: force HTTP/2 (CURL_HTTP_VERSION_2_0) to match init connection
|
||||||
|
○ [1m[38;5;5moll[0m[38;5;8mozskx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:43:41[39m [1m[38;5;4mff[0m[38;5;8m9070c4[39m
|
||||||
|
│ debug PeerTube PATCH 400: let curl negotiate HTTP version, log raw hex body
|
||||||
|
○ [1m[38;5;5mlu[0m[38;5;8mxqovts[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:42:45[39m [1m[38;5;4m83[0m[38;5;8m7f6ef9[39m
|
||||||
|
│ debug PeerTube PATCH 400: force HTTP/1.1, set CURLOPT_INFILESIZE, log verbose tail
|
||||||
|
○ [1m[38;5;5mmos[0m[38;5;8mupsso[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:40:24[39m [1m[38;5;4m59[0m[38;5;8m89baac[39m
|
||||||
|
│ fix PeerTube upload: force HTTP/1.1 for PATCH chunks; remove deprecated CURLOPT_BINARYTRANSFER
|
||||||
|
○ [1m[38;5;5mnn[0m[38;5;8moxlkll[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:38:56[39m [1m[38;5;4md9[0m[38;5;8m357537[39m
|
||||||
|
│ fix PeerTube upload: add CURLOPT_VERBOSE debug; use BINARYTRANSFER for chunk body
|
||||||
|
○ [1m[38;5;5myxk[0m[38;5;8mvwkqy[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:35:54[39m [1m[38;5;4m7ea[0m[38;5;8m832f1[39m
|
||||||
|
│ fix PeerTube upload: Google-resumable (Location header, PATCH), +debug logging
|
||||||
|
○ [1m[38;5;5mkk[0m[38;5;8mxkwlvw[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:21:45[39m [1m[38;5;4md1[0m[38;5;8m213cf9[39m
|
||||||
|
│ fix PeerTube upload: use Google-resumable protocol (Location header + PATCH) instead of PUT; capture response headers; ensure chunk size multiple of 256KB
|
||||||
|
○ [1m[38;5;5musx[0m[38;5;8mlqwxk[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 12:09:14[39m [1m[38;5;4m7e0[0m[38;5;8m28d3f[39m
|
||||||
|
│ Cleanup acces fichier section
|
||||||
|
○ [1m[38;5;5mom[0m[38;5;8mwsuqoy[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:40:50[39m [1m[38;5;4m56[0m[38;5;8mab779e[39m
|
||||||
|
│ move Restrictions d'accès aux fichiers from contenus.php to acces.php
|
||||||
|
○ [1m[38;5;5musm[0m[38;5;8myqlwr[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:35:11[39m [1m[38;5;4m03[0m[38;5;8mc9d317[39m
|
||||||
|
│ cleanup: merge SMTP fields into single fieldset, rename to Emails
|
||||||
|
○ [1m[38;5;5mrxw[0m[38;5;8mmppwn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:28:58[39m [1m[38;5;4m5a[0m[38;5;8m45cb02[39m
|
||||||
|
│ fix: remove alt labels, fix curl_close deprecation, fix PeerTube description param
|
||||||
|
○ [1m[38;5;5mmqo[0m[38;5;8myqups[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:24:57[39m [1m[38;5;4m42[0m[38;5;8m722c21[39m
|
||||||
|
│ feat: PeerTube channel by name, test button, always-visible FilePond pools
|
||||||
|
○ [1m[38;5;5mqm[0m[38;5;8moswsvt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:15:06[39m [1m[38;5;4m679[0m[38;5;8m120b6[39m
|
||||||
|
│ feat: shared SMTP credentials + resumable PeerTube upload + embed improvements
|
||||||
|
○ [1m[38;5;5msx[0m[38;5;8mpsrqsl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 11:01:25[39m [1m[38;5;4mfd[0m[38;5;8m3ad3d3[39m
|
||||||
|
│ feat: add PeerTube alternate audio/video labels and FilePond pools
|
||||||
|
○ [1m[38;5;5mqr[0m[38;5;8mtmmwro[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 10:31:19[39m [1m[38;5;4m2f[0m[38;5;8mb392f6[39m
|
||||||
|
│ fix: make schema.sql fully idempotent — add IF NOT EXISTS to all CREATE INDEX, CREATE TRIGGER, and CREATE VIEW statements
|
||||||
|
○ [1m[38;5;5mpy[0m[38;5;8mlyqurz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 04:45:23[39m [1m[38;5;4m674[0m[38;5;8m5734d[39m
|
||||||
|
│ feat(backup): deploy cron-based SQLite backups to production
|
||||||
|
○ [1m[38;5;5mpqno[0m[38;5;8mvwxx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:43:09[39m [1m[38;5;4m16[0m[38;5;8m4df763[39m
|
||||||
|
│ fix(production): fix multiple remote server errors from nginx logs
|
||||||
|
○ [1m[38;5;5mrxp[0m[38;5;8mvwzkt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:43:09[39m [1m[38;5;4mcf[0m[38;5;8mc55073[39m
|
||||||
|
│ feat(admin): add htmx toast feedback for settings checkboxes in contenus.php
|
||||||
|
○ [1m[38;5;5mss[0m[38;5;8mtzwlpk[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m677[0m[38;5;8mf5050[39m
|
||||||
|
│ feat(deploy): upload deploy-server.sh, run migrations, fix migrate.sh server layout
|
||||||
|
○ [1m[38;5;5mmy[0m[38;5;8msnnsru[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4md6[0m[38;5;8m548157[39m
|
||||||
|
│ feat(deploy): upload and run deploy-server.sh before permission verification, run migrations
|
||||||
|
○ [1m[38;5;5munnm[0m[38;5;8morqw[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m0f[0m[38;5;8mf5abbe[39m
|
||||||
|
│ feat(deploy): upload and run deploy-server.sh before permission verification
|
||||||
|
○ [1m[38;5;5mrqr[0m[38;5;8mkkkuo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m17[0m[38;5;8m8a8577[39m
|
||||||
|
│ feat(deploy): add deploy-verify-permissions recipe to check ownership/permissions after rsync
|
||||||
|
○ [1m[38;5;5mkp[0m[38;5;8mvxplms[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4mac[0m[38;5;8m53d0da[39m
|
||||||
|
│ fix: settings handler was treating hidden value="0" as truthy
|
||||||
|
○ [1m[38;5;5mku[0m[38;5;8mslmqps[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m97[0m[38;5;8mabb41b[39m
|
||||||
|
│ fix: use HTMX auto-save with hidden value=0 inputs in separate fieldsets
|
||||||
|
○ [1m[38;5;5mqq[0m[38;5;8mssmzsl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4mbd4[0m[38;5;8md5bff[39m
|
||||||
|
│ fix: split formulaire section into separate forms to avoid cross-resets
|
||||||
|
○ [1m[38;5;5mtm[0m[38;5;8mklpprq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m7a[0m[38;5;8m2525e0[39m
|
||||||
|
│ fix: replace HTMX auto-save checkboxes with regular form + Enregistrer button
|
||||||
|
○ [1m[38;5;5mrs[0m[38;5;8mwkvuzm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m61[0m[38;5;8m8356af[39m
|
||||||
|
│ fix: settings checkboxes could not be unchecked + could not be checked independently
|
||||||
|
○ [1m[38;5;5mws[0m[38;5;8mtuyzym[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:43[39m [1m[38;5;4m18d[0m[38;5;8m9bd1a[39m
|
||||||
|
│ feat: implement SQLite backup & data integrity plan (Phases 2-4)
|
||||||
|
○ [1m[38;5;5mou[0m[38;5;8mqzmwvn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4m28[0m[38;5;8m608d2c[39m
|
||||||
|
│ feat: implement SQLite backup & data integrity plan (Phases 2-4)
|
||||||
|
○ [1m[38;5;5mps[0m[38;5;8mvklxsu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4mc7[0m[38;5;8m012c91[39m
|
||||||
|
│ fix: exclude entire var/ from rsync --delete to preserve logs
|
||||||
|
○ [1m[38;5;5mnlv[0m[38;5;8msnzkz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4m9c[0m[38;5;8m4138fa[39m
|
||||||
|
│ fix: add hx-swap="none" to admin auto-save checkboxes to prevent page swap
|
||||||
|
○ [1m[38;5;5molz[0m[38;5;8mzwmwr[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4mae[0m[38;5;8m12c463[39m
|
||||||
|
│ feat: require 3 mots-clés in partage, language asterisk toggle, admin auto-save checkboxes
|
||||||
|
○ [1m[38;5;5mnq[0m[38;5;8mmqrqmo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4mf65[0m[38;5;8m44c5d[39m
|
||||||
|
│ fix: obfuscate email in contact links, raise rate limits, make Libre toggleable
|
||||||
|
○ [1m[38;5;5mry[0m[38;5;8mqustol[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4med[0m[38;5;8mfc1fd0[39m
|
||||||
|
│ import dialog: add Terminé button, fix padding, make success permanent, avoid POST resend
|
||||||
|
○ [1m[38;5;5msns[0m[38;5;8mxswsz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4m4b[0m[38;5;8me7b931[39m
|
||||||
|
│ fix: jury-fieldset.php calling old() with wrong signature for partage
|
||||||
|
○ [1m[38;5;5mwp[0m[38;5;8mspurnq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4mc3[0m[38;5;8m61702d[39m
|
||||||
|
│ Make Auteur(s) and Accès columns sortable alphabetically in admin list
|
||||||
|
○ [1m[38;5;5mzx[0m[38;5;8mryvzkv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-11 03:35:42[39m [1m[38;5;4md2[0m[38;5;8m570bc3[39m
|
||||||
|
│ Improve recap page + fix CSV import for jury roles
|
||||||
|
○ [1m[38;5;5mvqx[0m[38;5;8mpnkox[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 22:20:29[39m [1m[38;5;4m9d[0m[38;5;8md791cd[39m
|
||||||
|
│ fix migration 028, promoteurice repopulation, DB bootstrap
|
||||||
|
○ [1m[38;5;5mxz[0m[38;5;8mnsyswm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 22:18:05[39m [1m[38;5;4mb9[0m[38;5;8m52709e[39m
|
||||||
|
│ FilePond production hardening
|
||||||
|
○ [1m[38;5;5mvqn[0m[38;5;8monzxp[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:31:56[39m [1m[38;5;4m99[0m[38;5;8mc51201[39m
|
||||||
|
│ remove accept attributes from FilePond inputs, rely on beforeAddFile validation
|
||||||
|
○ [1m[38;5;5mrl[0m[38;5;8mqsxozn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:29:40[39m [1m[38;5;4m9b[0m[38;5;8m9445fe[39m
|
||||||
|
│ fix file validation: use extension-based check in beforeAddFile, drop plugin
|
||||||
|
○ [1m[38;5;5mwm[0m[38;5;8mzntpxp[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:25:45[39m [1m[38;5;4mfa[0m[38;5;8m1697bf[39m
|
||||||
|
│ add filepond-plugin-file-validate-type + server-side file warnings
|
||||||
|
○ [1m[38;5;5mstm[0m[38;5;8muuwmv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:19:58[39m [1m[38;5;4mccd[0m[38;5;8mf1c36[39m
|
||||||
|
│ add server-side video/audio size limits (2 GB) and fix missing annexe queue validation
|
||||||
|
○ [1m[38;5;5mtq[0m[38;5;8mwpzqtq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:10:51[39m [1m[38;5;4m25[0m[38;5;8m24574a[39m
|
||||||
|
│ [38;5;3m(no description set)[39m
|
||||||
|
○ [1m[38;5;5mwv[0m[38;5;8mkvvpmv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:35[39m [1m[38;5;4mdc[0m[38;5;8m099a5f[39m
|
||||||
|
│ fix annexe validation, FilePond type validation, and styling
|
||||||
|
○ [1m[38;5;5mrp[0m[38;5;8mtplqsr[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:35[39m [1m[38;5;4m70[0m[38;5;8m3b5dc2[39m
|
||||||
|
│ Add FilePond pools for couverture, note_intention, video, audio
|
||||||
|
○ [1m[38;5;5mzmv[0m[38;5;8mkxops[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:35[39m [1m[38;5;4m39[0m[38;5;8mce6dbf[39m
|
||||||
|
│ [38;5;3m(no description set)[39m
|
||||||
|
○ [1m[38;5;5myuu[0m[38;5;8mqpnwp[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m55[0m[38;5;8m8d7c06[39m
|
||||||
|
│ Fix FilePond integration: decouple format extras from main file inputs
|
||||||
|
○ [1m[38;5;5mztz[0m[38;5;8mtkrsu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m01[0m[38;5;8m7e2657[39m
|
||||||
|
│ [38;5;3m(no description set)[39m
|
||||||
|
○ [1m[38;5;5mqw[0m[38;5;8mltvwqq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4mfe[0m[38;5;8m503dcd[39m
|
||||||
|
│ Replace custom file-upload-queue.js with FilePond
|
||||||
|
○ [1m[38;5;5mpno[0m[38;5;8mtuyzv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m19[0m[38;5;8m1d2d7a[39m
|
||||||
|
│ [38;5;3m(no description set)[39m
|
||||||
|
○ [1m[38;5;5mur[0m[38;5;8mrtosru[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m02[0m[38;5;8m272555[39m
|
||||||
|
│ fix: stop checkbox click in admin index from navigating to recapitulatif
|
||||||
|
○ [1m[38;5;5mym[0m[38;5;8mrzpvln[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m2e[0m[38;5;8mc34999[39m
|
||||||
|
│ fix: spurious HTMX console warnings from checkbox-list default hx-include
|
||||||
|
○ [1m[38;5;5mmuzs[0m[38;5;8mwpkw[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m40[0m[38;5;8m4696bf[39m
|
||||||
|
│ fix: repair form submission with queued files + add comprehensive debug logging
|
||||||
|
○ [1m[38;5;5mow[0m[38;5;8mnwlmpo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m6e[0m[38;5;8m99f3e9[39m
|
||||||
|
│ Replace HTMX+PHP file upload queues with client-side JS
|
||||||
|
○ [1m[38;5;5mxl[0m[38;5;8mprulto[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m52[0m[38;5;8mee3530[39m
|
||||||
|
│ Replace HTMX+PHP file upload queues with client-side JS
|
||||||
|
○ [1m[38;5;5mqu[0m[38;5;8mkzomwx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4m0e[0m[38;5;8m31760f[39m
|
||||||
|
│ Replace HTMX+PHP file upload queues with client-side JS
|
||||||
|
○ [1m[38;5;5mmqn[0m[38;5;8mvolnz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4mdb3[0m[38;5;8m00c32[39m
|
||||||
|
│ Replace HTMX+PHP file upload queues with client-side JS
|
||||||
|
○ [1m[38;5;5mut[0m[38;5;8mnzmtom[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 21:06:34[39m [1m[38;5;4me2[0m[38;5;8mcd7804[39m
|
||||||
|
│ Replace HTMX+PHP file upload queues with client-side JS
|
||||||
|
○ [1m[38;5;5myr[0m[38;5;8mpmtrsy[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 16:35:04[39m [1m[38;5;4m0b5[0m[38;5;8m9d667[39m
|
||||||
|
│ fix: scoped HTMX file validation, add validation to TFE/PeerTube inputs
|
||||||
|
○ [1m[38;5;5mmxv[0m[38;5;8mvqust[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 16:32:34[39m [1m[38;5;4ma6[0m[38;5;8m6ff5c1[39m
|
||||||
|
│ refactor: session-based incremental TFE upload via HTMX, drop SortableJS
|
||||||
|
○ [1m[38;5;5muv[0m[38;5;8mnvvyny[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 15:55:35[39m [1m[38;5;4m04[0m[38;5;8mc1c3c6[39m
|
||||||
|
│ fix: req annexes, add HTMX inline file validation (MIME/size)
|
||||||
|
○ [1m[38;5;5myz[0m[38;5;8mtqkpzz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 15:31:02[39m [1m[38;5;4mdd6[0m[38;5;8m4d5c9[39m
|
||||||
|
│ fix: TFE and annexes files not saved, plus keyword validation and file preview CSS
|
||||||
|
○ [1m[38;5;5mro[0m[38;5;8mqtyzln[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 15:05:24[39m [1m[38;5;4m94[0m[38;5;8mf0df20[39m
|
||||||
|
│ feat: obfuscate all email addresses and mailto links as HTML entities
|
||||||
|
○ [1m[38;5;5msv[0m[38;5;8mprwkko[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:51:25[39m [1m[38;5;4ma9[0m[38;5;8m0b8b4d[39m
|
||||||
|
│ fix: add help email, preserve file names on validation error, license fix
|
||||||
|
○ [1m[38;5;5mkv[0m[38;5;8myyvksn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:51:25[39m [1m[38;5;4mbb[0m[38;5;8mfd786c[39m
|
||||||
|
│ fix: add help email, preserve file names on validation error, license fix
|
||||||
|
○ [1m[38;5;5mmou[0m[38;5;8mmuszm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mab[0m[38;5;8m4601b9[39m
|
||||||
|
│ Fix language-search fragment
|
||||||
|
○ [1m[38;5;5mxvq[0m[38;5;8monoyt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m64[0m[38;5;8mb18fdb[39m
|
||||||
|
│ Add sidebar TOC, simplify Données Secondaires section
|
||||||
|
○ [1m[38;5;5mty[0m[38;5;8motlpxt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m22[0m[38;5;8m799820[39m
|
||||||
|
│ Add Mots-clés and Langues management to contenus page
|
||||||
|
○ [1m[38;5;5msnt[0m[38;5;8mroxlt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m47[0m[38;5;8m670245[39m
|
||||||
|
│ Move Formulaire settings to contenus, remove delete-all TFE
|
||||||
|
○ [1m[38;5;5mqxu[0m[38;5;8mprqpt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m1b5[0m[38;5;8md0db6[39m
|
||||||
|
│ Add language-search component for Autre Langue input + active search in lists
|
||||||
|
○ [1m[38;5;5mstt[0m[38;5;8mrwkly[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m586[0m[38;5;8m23625[39m
|
||||||
|
│ CSV importer: boolean and ap variants/typos
|
||||||
|
○ [1m[38;5;5mpnt[0m[38;5;8mwsqvs[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mb83b[0m[38;5;8m316e[39m
|
||||||
|
│ Rename author_email→contact_interne, author_show_contact→contact_public across view/controllers/templates
|
||||||
|
○ [1m[38;5;5mvpw[0m[38;5;8muyvyv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m43[0m[38;5;8mcf6b4b[39m
|
||||||
|
│ Fix: email clearing in findOrCreateAuthor, htmlspecialchars(null) crash in old(), dead contact_interne field, access_type_id radio clearing
|
||||||
|
○ [1m[38;5;5msz[0m[38;5;8mktqmnn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m80[0m[38;5;8m9d77b1[39m
|
||||||
|
│ Error tests, FK violations fix
|
||||||
|
○ [1m[38;5;5munnn[0m[38;5;8mvyqs[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m6c[0m[38;5;8ma873c8[39m
|
||||||
|
│ Admin mobile block: fix inline style beating media query
|
||||||
|
○ [1m[38;5;5mnz[0m[38;5;8mllwsxo[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mba[0m[38;5;8m41cc9e[39m
|
||||||
|
│ Fix bulk form nesting, remove count bar, stopPropagation on actions
|
||||||
|
○ [1m[38;5;5mvu[0m[38;5;8mmvtlyz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mef[0m[38;5;8md01b93[39m
|
||||||
|
│ Rename Liens étudiant·e, add link name + edit dialog
|
||||||
|
○ [1m[38;5;5mso[0m[38;5;8mmsyvxz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mc8[0m[38;5;8mbe0aae[39m
|
||||||
|
│ Bulk bar anti-shift, tags icons, AP no-wrap, credits reorder
|
||||||
|
○ [1m[38;5;5mzl[0m[38;5;8mkousvq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m73[0m[38;5;8mef6301[39m
|
||||||
|
│ Add back buttons, row click navigation, remove Voir button
|
||||||
|
○ [1m[38;5;5mzmu[0m[38;5;8myukuk[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mdb0[0m[38;5;8m21566[39m
|
||||||
|
│ Replace emoji/text buttons with Phosphor SVG icons, add credits
|
||||||
|
○ [1m[38;5;5mkx[0m[38;5;8mwyyswm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m92[0m[38;5;8mcea357[39m
|
||||||
|
│ Replace large admin index script with minimal JS
|
||||||
|
○ [1m[38;5;5mpkr[0m[38;5;8mnmpks[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m30[0m[38;5;8mef10fd[39m
|
||||||
|
│ Move export DB to Exporter modal, color stats
|
||||||
|
○ [1m[38;5;5mtu[0m[38;5;8mrvpxsq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mb2[0m[38;5;8mb09243[39m
|
||||||
|
│ Refactor: Admin index
|
||||||
|
○ [1m[38;5;5myxp[0m[38;5;8mntrsp[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mdf[0m[38;5;8mf6e2af[39m
|
||||||
|
│ add explanation hint to is_published checkbox in Backoffice fieldset
|
||||||
|
○ [1m[38;5;5mnt[0m[38;5;8mmqzyop[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mf6b[0m[38;5;8m4ac09[39m
|
||||||
|
│ Merge Publication fieldset's is_published checkbox into Backoffice fieldset
|
||||||
|
○ [1m[38;5;5mrt[0m[38;5;8mqxvoqk[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mcc6[0m[38;5;8m5b385[39m
|
||||||
|
│ Remove duration_pages/duration_minutes/file_size_info; rename cc4r → cc2r in DB and code
|
||||||
|
○ [1m[38;5;5mkl[0m[38;5;8mpxpwlm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mad[0m[38;5;8mf080d1[39m
|
||||||
|
│ fix: resolve partage form submission issues
|
||||||
|
○ [1m[38;5;5mru[0m[38;5;8mznqknn[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m8e[0m[38;5;8mebf684[39m
|
||||||
|
│ css: moved + tweaked styles to common.css
|
||||||
|
○ [1m[38;5;5mmt[0m[38;5;8mtylpmt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mcb[0m[38;5;8mef12b5[39m
|
||||||
|
│ link creation: fieldset with checkboxes for objet restriction, TFE checked by default
|
||||||
|
○ [1m[38;5;5mww[0m[38;5;8mrwtomz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mdd1[0m[38;5;8m33522[39m
|
||||||
|
│ switch thesis-add-header to grid layout: title | badge, subtitle spans full width
|
||||||
|
○ [1m[38;5;5moo[0m[38;5;8mlsxuow[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4md7[0m[38;5;8mff6b42[39m
|
||||||
|
│ Update: subtitle below header + top gradient
|
||||||
|
○ [1m[38;5;5mvn[0m[38;5;8mprsrzm[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m23[0m[38;5;8mec2c7b[39m
|
||||||
|
│ remove duplicate Image de couverture in edit form — moved cover preview+removal into fichiers-fragment.php, removed duplicate from edit-existing-files-block
|
||||||
|
○ [1m[38;5;5mztk[0m[38;5;8mmwwkl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mc0[0m[38;5;8m668225[39m
|
||||||
|
│ .env and todo
|
||||||
|
○ [1m[38;5;5mtoq[0m[38;5;8mvqlop[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m1f[0m[38;5;8mdd450f[39m
|
||||||
|
│ overtype editor rounded corners
|
||||||
|
○ [1m[38;5;5mms[0m[38;5;8mwkvnyl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4md8[0m[38;5;8m7158db[39m
|
||||||
|
│ Cleanup and normalize headers
|
||||||
|
○ [1m[38;5;5mux[0m[38;5;8mqyvyvt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4mf1[0m[38;5;8me2651f[39m
|
||||||
|
│ refactor public search bar
|
||||||
|
○ [1m[38;5;5mxvt[0m[38;5;8mqzyom[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m585[0m[38;5;8m21915[39m
|
||||||
|
│ Redesign focus rings
|
||||||
|
○ [1m[38;5;5mvr[0m[38;5;8mqmwvrx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:26:45[39m [1m[38;5;4m10[0m[38;5;8mcfa469[39m
|
||||||
|
│ unify form element styles in common.css
|
||||||
|
○ [1m[38;5;5mrv[0m[38;5;8mvmuxsz[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-10 14:25:53[39m [1m[38;5;4m0be[0m[38;5;8m7f533[39m
|
||||||
|
│ style: tweaking admin section + some public
|
||||||
|
○ [1m[38;5;5mtow[0m[38;5;8mstynu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4mb7f[0m[38;5;8mf2776[39m
|
||||||
|
│ EDIT THIS → refactor: unify edit mode Format+Fichiers with add/partage HTMX fragment
|
||||||
|
○ [1m[38;5;5mqnt[0m[38;5;8mtznqt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4m3c[0m[38;5;8mdd3893[39m
|
||||||
|
│ Refactor: Form improvements and cleanup: note contextuel, annexes, fichiers
|
||||||
|
○ [1m[38;5;5mwq[0m[38;5;8mmrrrwu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4ma8[0m[38;5;8maeb0d6[39m
|
||||||
|
│ feat: dual upload system — direct file storage + PeerTube API integration
|
||||||
|
○ [1m[38;5;5mnsn[0m[38;5;8murqzv[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4m5f[0m[38;5;8mbd6243[39m
|
||||||
|
│ fix: justfile shebang recipes indentation (spaces → tabs)
|
||||||
|
○ [1m[38;5;5mrqz[0m[38;5;8myxzyt[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4m4c[0m[38;5;8m030bd5[39m
|
||||||
|
│ Refactor + feat: unify format/fichiers HTMX fragment, reorder format types, add file constraints, fix admin auth
|
||||||
|
○ [1m[38;5;5mmuzr[0m[38;5;8muvwl[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:44:48[39m [1m[38;5;4m7b[0m[38;5;8medda02[39m
|
||||||
|
│ Encrypt SMTP password at rest with AES-256-GCM
|
||||||
|
○ [1m[38;5;5mov[0m[38;5;8mqmwmol[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-09 14:42:07[39m [1m[38;5;4m62[0m[38;5;8m7b0c4e[39m
|
||||||
|
│ Remove required from all admin add/edit form inputs
|
||||||
|
○ [1m[38;5;5mvpo[0m[38;5;8mmqrst[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:25[39m [1m[38;5;4mb833[0m[38;5;8m1a08[39m
|
||||||
|
│ fix: replace .php-suffixed public URLs blocked by nginx catch-all
|
||||||
|
○ [1m[38;5;5mqnx[0m[38;5;8mltqyq[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:25[39m [1m[38;5;4m189[0m[38;5;8mf4368[39m
|
||||||
|
│ fix: 403 on /language-autre-fragment.php — add explicit nginx location block
|
||||||
|
○ [1m[38;5;5mnsl[0m[38;5;8mznwmk[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:25[39m [1m[38;5;4m6b[0m[38;5;8ma13e00[39m
|
||||||
|
│ test: add ShareLinkTest + PureLogicTest (TDD), fix coverMap undefined in SearchController
|
||||||
|
○ [1m[38;5;5mnv[0m[38;5;8mntmkyx[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:25[39m [1m[38;5;4m15[0m[38;5;8md54fa1[39m
|
||||||
|
│ add Néerlandais language option and make language_autre conditionally required
|
||||||
|
○ [1m[38;5;5mqxq[0m[38;5;8myzmzp[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:25[39m [1m[38;5;4mf3[0m[38;5;8md96155[39m
|
||||||
|
│ merge banners into covers: remove banner field, migrate files, add covers to search/home/repertoire cards
|
||||||
|
○ [1m[38;5;5mrxn[0m[38;5;8mnnvpu[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-08 22:58:05[39m [1m[38;5;4me3[0m[38;5;8m896811[39m
|
||||||
|
│ Fix migrations and deploy issues + errors + linting
|
||||||
|
[1m[38;5;14m◆[0m [1m[38;5;5mpqnt[0m[38;5;8mkzml[39m [38;5;3mpontoporeia@happyngreen.fr[39m [38;5;6m2026-05-07 23:39:41[39m [38;5;5mmain[39m [1m[38;5;4mbdd[0m[38;5;8m95341[39m
|
||||||
|
│ Extract shared TFE form partial — single source of truth for add/edit/partage
|
||||||
|
~
|
||||||
Reference in New Issue
Block a user