diff --git a/TODO.md b/TODO.md index b90679a..3e5cb94 100644 --- a/TODO.md +++ b/TODO.md @@ -1,16 +1,10 @@ # TODO -## Paramètres page cleanup -- [x] Remove card syntax (`.admin-settings-section` border/radius containers) -- [x] Replace pill toggles with native semantic checkboxes inside `
` -- [x] Move "delete all TFE" danger zone into Maintenance section -- [x] Use `
` for danger zones (semantic, with `` instead of `
`) -- [x] Update CSS: new `.param-*` classes for flat semantic layout -- [x] Exclude parametres sections from generic `.admin-body main > section` card styling via `aria-labelledby` prefix - -## Add TFE: admin/student mode toggle -- [x] Add `?mode=student` query param to same add.php page -- [x] Student mode: no admin header/nav, just the form with a back-link -- [x] Admin mode: full admin header/nav, with "Mode étudiant ↗" toggle link (opens in new tab) -- [x] Auth guard stays the same — still requires admin login -- [x] Add `.student-body`, `.thesis-add-header`, `.mode-toggle`, `.form-footer` CSS +- [x] Make thanks.php respect student mode (no header, centered "add new form" button) + - [x] Add hidden input `student_mode` in add.php form when in student mode + - [x] Append `mode=student` to thanks redirect in formulaire.php + - [x] Update thanks.php to detect student mode, hide header, show centered button +- [x] Cleanup public/admin/add.php — standardise fieldsets and add licence explanation sections from docs PDF + - [x] Organise all fields into `
/` blocks: Informations du TFE, Composition du jury, Cadre académique, Fichiers, Métadonnées complémentaires + - [x] Remove double-wrapping of jury-fieldset (it has its own `
`) + - [x] Add "Degrés d'ouverture et licences" section (Libre / Interne / Interdit + Généralités) wrapped in `if ($studentMode)` — hidden in admin diff --git a/docs/Proposition procédure licences_V2.pdf b/docs/Proposition procédure licences_V2.pdf new file mode 100644 index 0000000..92dd512 Binary files /dev/null and b/docs/Proposition procédure licences_V2.pdf differ diff --git a/public/admin/actions/formulaire.php b/public/admin/actions/formulaire.php index e25833b..5309a3e 100644 --- a/public/admin/actions/formulaire.php +++ b/public/admin/actions/formulaire.php @@ -9,6 +9,8 @@ ini_set('error_log', 'error.log'); AdminAuth::requireLogin(); +$studentMode = isset($_POST['student_mode']) && $_POST['student_mode'] === '1'; + // Verify CSRF token if (!isset($_POST['csrf_token'], $_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { @@ -26,7 +28,11 @@ try { unset($_SESSION['csrf_token']); - header('Location: ../thanks.php?id=' . urlencode($thesisId)); + $redirect = '../thanks.php?id=' . urlencode($thesisId); + if ($studentMode) { + $redirect .= '&mode=student'; + } + header('Location: ' . $redirect); exit(); } catch (Exception $e) { @@ -35,11 +41,16 @@ try { App::flash('error', $e->getMessage()); $_SESSION['form_data'] = $_POST; + $redirect = '../add.php'; + if ($studentMode) { + $redirect .= '?mode=student'; + } + $autofocusField = ThesisCreateController::autofocusFieldForError($e->getMessage()); if ($autofocusField !== null) { App::flashAutofocus($autofocusField); } - header('Location: ../add.php'); + header('Location: ' . $redirect); exit(); } diff --git a/public/admin/add.php b/public/admin/add.php index f45e202..d8d9390 100644 --- a/public/admin/add.php +++ b/public/admin/add.php @@ -23,11 +23,9 @@ try { $formData = $_SESSION['form_data'] ?? []; unset($_SESSION['form_data']); $autofocusField = App::consumeAutofocus(); -// Flash error consumed by the flash-messages partial below. /** * Merge autofocus into the $attrs array for a given field. - * Only adds the attribute when $autofocusField matches $fieldName. */ function withAutofocus(string $fieldName, array $attrs = []): array { global $autofocusField; @@ -74,83 +72,147 @@ if ($studentMode) {
"> + + + - - - 'name']); include APP_ROOT . '/templates/partials/form/text-field.php'; ?> - 'email']; include APP_ROOT . '/templates/partials/form/text-field.php'; ?> + +
+ Informations du TFE - -
- - Si cette case est cochée, votre contact apparaîtra sur la page publique de votre TFE. -
+ + + 'name']); include APP_ROOT . '/templates/partials/form/text-field.php'; ?> + 'email']; include APP_ROOT . '/templates/partials/form/text-field.php'; ?> +
+ + Si cette case est cochée, votre contact apparaîtra sur la page publique de votre TFE. +
+ +
+ + +
+
+ + - 2000, 'max' => date('Y') + 1]); - include APP_ROOT . '/templates/partials/form/text-field.php'; - ?> + +
+ Cadre académique - + 2000, 'max' => date('Y') + 1]); + include APP_ROOT . '/templates/partials/form/text-field.php'; + ?> - + + + - + + - + +
- + +
+ Fichiers - + + + +
- -
- - -
+ +
+ Métadonnées complémentaires - + - + - + - + $at['id'], 'name' => $at['name']]; + }, $enabledAccessTypes); + $defaultAccessType = 2; + $selectedAccessType = isset($formData['access_type_id']) + ? (int)$formData['access_type_id'] + : $defaultAccessType; + $name = 'access_type_id'; + $label = 'Visibilité / Accès :'; + $options = $accessOptions; + $selected = $selectedAccessType; + $placeholder = null; + $required = true; + $attrs = []; + include APP_ROOT . '/templates/partials/form/select-field.php'; + ?> +
- + + +
+ Degrés d'ouverture et licences - +
+

Je veux que mon TFE soit disponible sous les conditions suivantes :

- $at['id'], 'name' => $at['name']]; - }, $enabledAccessTypes); - // Default: Interne (id=2) - $defaultAccessType = 2; - $selectedAccessType = isset($formData['access_type_id']) - ? (int)$formData['access_type_id'] - : $defaultAccessType; - $name = 'access_type_id'; - $label = 'Visibilité / Accès :'; - $options = $accessOptions; - $selected = $selectedAccessType; - $placeholder = null; - $required = true; - $attrs = []; - include APP_ROOT . '/templates/partials/form/select-field.php'; - ?> +
+

🔓 Libre

+

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·e 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.

+
    +
  • +
  • +
+

Au moins une des deux cases doit être cochée pour le degré Libre.

+
+ +
+

🔒 Interne

+

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.

+

La diffusion limitée est protégée par le cadre académique/didactique, le travail pourrait donc être diffusé en interne et être cité par d'autres étudiant·es sans implications légales pour l'auteur·ice ni pour l'école.

+
    +
  • +
  • +
+

Au moins une des deux cases doit être cochée.

+
+ +
+

🚫 Interdit

+

Mon TFE n'est pas disponible en physique ni sur le site. Une note descriptive est disponible sur le site.

+
+
+ +
+

Généralités

+
    +
  • L'auteur·ice peut décider entre trois degrés de partage de son travail : libre, interne, interdit.
  • +
  • L'auteur·ice peut, à tout moment, décider de restreindre le degré d'accès à son travail. Il ne peut néanmoins pas l'ouvrir davantage.
  • +
  • Le choix effectué dans ce formulaire sera d'application une semaine après la soutenance orale de l'auteur·ice. Celui-ci peut donc décider de restreindre ce choix avant sa publication (mais pas l'ouvrir).
  • +
  • L'erg se réserve le droit de restreindre le degré d'ouverture du TFE – ce en accord avec le règlement.
  • +
  • Dans tous les cas, l'auteur·ice garde les droits d'auteurs, de diffusion, d'utilisation, etc. de son travail – sauf si la licence choisie restreindrait ses droits.
  • +
  • La diffusion « xamxam » est indépendante de la diffusion à la BAIU.
  • +
+
+
+