feat: jury composition + banner image upload

- migration 004: thesis_supervisors.role + is_external; view adds jury_president/jury_promoteurs/jury_lecteurs
- migration 005: theses.banner_path; view exposes t.banner_path and t.license_id
- Database: getThesisJury(), setThesisJury(), setBannerPath()
- admin/add.php: jury fieldset (président/promoteur/lecteurs + externe checkboxes, JS add/remove rows); banner file input
- admin/edit.php: jury fieldset pre-populated from DB; banner preview + remove checkbox + upload; multipart form
- admin/actions/formulaire.php: parse jury fields → setThesisJury(); banner upload to banners/
- tfe.php: three conditional jury rows (président·e, promoteur·ice, lecteur·ices)
- schema.sql: updated thesis_supervisors, theses, v_theses_full, v_theses_public definitions
- admin.css: fieldset, jury-row, jury-entry, btn-remove styles
This commit is contained in:
Pontoporeia
2026-03-24 13:25:23 +01:00
parent d87348c388
commit cefceb046c
12 changed files with 569 additions and 138 deletions

View File

@@ -584,3 +584,60 @@ html, body {
flex-direction: column;
gap: 1.5rem;
}
/* Jury fieldset */
.admin-fieldset {
border: 1px solid #333;
border-radius: 4px;
padding: 1rem 1.25rem;
margin: .5rem 0 1rem;
background: rgba(255,255,255,.02);
}
.admin-fieldset-legend {
font-size: .82rem;
font-weight: 600;
letter-spacing: .04em;
text-transform: uppercase;
color: var(--admin-text-muted);
padding: 0 .5rem;
}
.admin-jury-row {
display: flex;
align-items: center;
gap: .75rem;
flex-wrap: wrap;
}
.admin-jury-list {
display: flex;
flex-direction: column;
gap: .5rem;
}
.admin-jury-entry {
display: flex;
align-items: center;
gap: .75rem;
flex-wrap: wrap;
}
.admin-jury-ext {
white-space: nowrap;
}
.admin-btn-remove {
background: none;
border: 1px solid #555;
color: var(--admin-text-muted);
border-radius: 3px;
padding: .2rem .45rem;
font-size: .8rem;
cursor: pointer;
line-height: 1;
}
.admin-btn-remove:hover {
border-color: #e55;
color: #e55;
}