feat: roles, permissions, grille full-width, SSO display name

- Admin/roles : tableau des roles avec edition par role (/admin/role/<nom>)
- Permissions par role : cases a cocher groupees (Articles, Acces & lecture)
- Nouvelles capacites : propose/validate/publish articles (own/all), view_previews
- Nom technique auto-genere depuis le label (JS + fallback serveur)
- Blocage suppression du dernier administrateur
- user_capabilities table ajoutee en DB
- Navbar : dropdown unique (nom + Mon identite + Administration + Deconnexion)
- SSO callback : preserve le nom personnalise, ne l ecrase plus a la connexion
- Grille articles : CSS Grid auto-fill full-width, hauteur uniforme par ligne
- CSP : add_files.js et post_confirm.js externalises
This commit is contained in:
Cedric Abonnel
2026-05-12 15:51:06 +02:00
parent 5275edfd20
commit 1d2e3d9a24
15 changed files with 1029 additions and 332 deletions
+30 -12
View File
@@ -119,22 +119,40 @@ function hasRole(string $role): bool
// Capacités connues — clé => label affiché dans l'admin
const KNOWN_CAPABILITIES = [
'view_sources_own' => 'Voir les sources de ses propres articles',
'view_sources_all' => 'Voir les sources de tous les articles',
'view_drafts_own' => 'Voir ses articles non publiés',
'view_drafts_all' => 'Voir tous les articles non publiés',
'edit_articles_own' => 'Modifier ses propres articles',
'edit_articles_all' => 'Modifier tous les articles',
'rate_articles' => 'Noter des articles',
'propose_articles' => 'Proposer des articles',
'validate_articles_all' => 'Valider des articles',
'validate_articles_own' => 'Valider ses articles uniquement',
'publish_articles_all' => 'Publier des articles',
'publish_articles_own' => 'Publier ses articles uniquement',
'edit_articles_all' => 'Modifier des articles',
'edit_articles_own' => 'Modifier ses articles uniquement',
'rate_articles' => 'Noter des articles',
'view_previews' => 'Lire des avant-premières',
'view_drafts_all' => 'Voir tous les brouillons',
'view_drafts_own' => 'Voir ses brouillons',
'view_sources_all' => 'Voir les sources (tous les articles)',
'view_sources_own' => 'Voir les sources de ses articles',
];
// Groupes pour l'interface d'administration
// 'single' => pas de variante own/all
const CAPABILITY_GROUPS = [
['label' => 'Sources & métadonnées', 'own' => 'view_sources_own', 'all' => 'view_sources_all'],
['label' => 'Articles non publiés', 'own' => 'view_drafts_own', 'all' => 'view_drafts_all'],
['label' => 'Modification', 'own' => 'edit_articles_own', 'all' => 'edit_articles_all'],
['label' => 'Noter des articles', 'single' => 'rate_articles'],
'Articles' => [
'propose_articles',
'validate_articles_all',
'validate_articles_own',
'publish_articles_all',
'publish_articles_own',
'edit_articles_all',
'edit_articles_own',
],
'Accès & lecture' => [
'rate_articles',
'view_previews',
'view_drafts_all',
'view_drafts_own',
'view_sources_all',
'view_sources_own',
],
];
function currentUserCapabilities(): array