refactor form structure per new spec + fix

- split jury into interne/externe/ULB,
- remove president from student form,
- add language_autre,
- split duration into pages+minutes+annexes,
- move licence to degrés d'ouverture with CC2r,
- add license_custom,
- filter PACS from student AP list,
- editable généralités help block,
- Libre toggle per settings

Fix:
- missing comma after cc4r column in schema.sql
- remove duplicate form footer from partage template
- remove couverture from student files fieldset; add promoteur ULB conditional disable via JS on Approfondi
- promoteur ULB: remove 'si applicable', make required when visible
This commit is contained in:
Pontoporeia
2026-05-07 17:52:46 +02:00
parent dce0e0b301
commit 24d68dda59
21 changed files with 694 additions and 381 deletions

View File

@@ -175,7 +175,7 @@ class ThesisEditController
'finality_id' => intval($post['finality'] ?? 0),
'synopsis' => trim($post['synopsis'] ?? ''),
'context_note' => trim($post['context_note'] ?? ''),
'file_size_info' => trim($post['duration_info'] ?? ''),
'file_size_info' => $this->buildFileSizeInfo($post),
'baiu_link' => trim($post['lien'] ?? ''),
'license_id' => filter_var($post['license_id'] ?? '', FILTER_VALIDATE_INT) ?: null,
'access_type_id' => filter_var($post['access_type_id'] ?? '', FILTER_VALIDATE_INT) ?: null,
@@ -184,7 +184,8 @@ class ThesisEditController
'jury_points' => $post['jury_points'] ?? null,
'exemplaire_baiu' => !empty($post['exemplaire_baiu']),
'exemplaire_erg' => !empty($post['exemplaire_erg']),
'cc4r' => !empty($post['cc4r']),
'cc4r' => !empty($post['cc2r']),
'license_custom' => trim($post['license_custom'] ?? ''),
]);
// ── 2. Authors (alphabetically sorted) ─────────────────────────────
@@ -545,6 +546,43 @@ class ThesisEditController
{
$members = [];
// Promoteur interne
if (!empty(trim($post['jury_promoteur'] ?? ''))) {
$members[] = [
'name' => trim($post['jury_promoteur']),
'role' => 'promoteur',
'is_external' => 0,
'is_ulb' => 0,
];
}
// Promoteur ULB
if (!empty(trim($post['jury_promoteur_ulb_name'] ?? ''))) {
$members[] = [
'name' => trim($post['jury_promoteur_ulb_name']),
'role' => 'promoteur',
'is_external' => 1,
'is_ulb' => 1,
];
}
// Lecteurs internes
foreach ($post['jury_lecteur_interne'] ?? [] as $name) {
$name = trim($name);
if ($name !== '') {
$members[] = ['name' => $name, 'role' => 'lecteur', 'is_external' => 0];
}
}
// Lecteurs externes
foreach ($post['jury_lecteur_externe'] ?? [] as $name) {
$name = trim($name);
if ($name !== '') {
$members[] = ['name' => $name, 'role' => 'lecteur', 'is_external' => 1];
}
}
// President (optional, admin-only)
if (!empty(trim($post['jury_president'] ?? ''))) {
$members[] = [
'name' => trim($post['jury_president']),
@@ -553,26 +591,41 @@ class ThesisEditController
];
}
if (!empty(trim($post['jury_promoteur'] ?? ''))) {
$members[] = [
'name' => trim($post['jury_promoteur']),
'role' => 'promoteur',
'is_external' => isset($post['jury_promoteur_ext']) ? 1 : 0,
'is_ulb' => isset($post['jury_promoteur_ulb']) ? 1 : 0,
];
}
foreach ($post['jury_lecteurs'] ?? [] as $i => $name) {
$name = trim($name);
if ($name !== '') {
$members[] = [
'name' => $name,
'role' => 'lecteur',
'is_external' => isset($post['jury_lecteurs_ext'][$i]) ? 1 : 0,
];
// Backwards compat: old jury_lecteurs[]
if (isset($post['jury_lecteurs'])) {
foreach ($post['jury_lecteurs'] ?? [] as $i => $name) {
$name = trim($name);
if ($name !== '') {
$members[] = [
'name' => $name,
'role' => 'lecteur',
'is_external' => isset($post['jury_lecteurs_ext'][$i]) ? 1 : 0,
];
}
}
}
return $members;
}
/**
* Build file_size_info from separate duration fields.
*/
private function buildFileSizeInfo(array $post): string
{
$pages = trim($post['duration_pages'] ?? '');
$minutes = trim($post['duration_minutes'] ?? '');
$info = '';
if ($pages !== '' && $minutes !== '') {
$info = $pages . ' pages + ' . $minutes . ' minutes';
} elseif ($minutes !== '') {
$info = $minutes . ' minutes';
} elseif ($pages !== '') {
$info = $pages . ' pages';
}
if (!empty($post['has_annexes'])) {
$info = $info ? $info . ' + annexe(s)' : 'Annexe(s)';
}
return $info;
}
}