feat #58 : wizard multi-étapes création/édition article #59

Merged
cedricAbonnel merged 5 commits from feat/wizard-multi-step into main 2026-05-14 19:50:33 +00:00
Owner

Résumé

Implémentation complète du ticket #58 — remplace le formulaire unique par un wizard multi-étapes.

  • Création : 5 étapes (Contenu → Publication → Catégorie → Tags → SEO & Validation)
  • Édition : 6 étapes (idem + Diff & Confirmation)
  • Auto-sauvegarde en brouillon (debounce 3 s) visible dans l'en-tête
  • Tags plats sans catégorie, détection depuis le texte (ABR, CamelCase, noms propres)
  • Plan Markdown dynamique dans la colonne droite de l'éditeur
  • Aperçu SEO live (titre, description, URL)
  • Diff ligne à ligne avant validation en mode édition

Fichiers modifiés

Fichier Nature
src/ArticleManager.php +6 méthodes brouillon overlay
public/.htaccess Routes /new/{uuid}/{1-5} et /edit/{uuid}/{1-6}
public/index.php Wizard complet (create + edit)
public/assets/js/wizard.js Autosave, TOC, pills tags, scroll curseur
templates/wizard/ nav.php + step1..6.php

Plan de test

  • Créer un article via /new — valider les 5 étapes
  • Vérifier la reprise du brouillon après rechargement page 1
  • Éditer un article existant — vérifier le diff en étape 6
  • Vérifier autosave (indicateur Brouillon sauvegardé)
  • Vérifier le plan TOC dynamique dans l'éditeur
  • Vérifier les suggestions de tags (existants + détectés dans le texte)

Closes #58

## Résumé Implémentation complète du ticket #58 — remplace le formulaire unique par un wizard multi-étapes. - **Création** : 5 étapes (Contenu → Publication → Catégorie → Tags → SEO & Validation) - **Édition** : 6 étapes (idem + Diff & Confirmation) - Auto-sauvegarde en brouillon (debounce 3 s) visible dans l'en-tête - Tags plats sans catégorie, détection depuis le texte (ABR, CamelCase, noms propres) - Plan Markdown dynamique dans la colonne droite de l'éditeur - Aperçu SEO live (titre, description, URL) - Diff ligne à ligne avant validation en mode édition ## Fichiers modifiés | Fichier | Nature | |---|---| | `src/ArticleManager.php` | +6 méthodes brouillon overlay | | `public/.htaccess` | Routes /new/{uuid}/{1-5} et /edit/{uuid}/{1-6} | | `public/index.php` | Wizard complet (create + edit) | | `public/assets/js/wizard.js` | Autosave, TOC, pills tags, scroll curseur | | `templates/wizard/` | nav.php + step1..6.php | ## Plan de test - [ ] Créer un article via /new — valider les 5 étapes - [ ] Vérifier la reprise du brouillon après rechargement page 1 - [ ] Éditer un article existant — vérifier le diff en étape 6 - [ ] Vérifier autosave (indicateur Brouillon sauvegardé) - [ ] Vérifier le plan TOC dynamique dans l'éditeur - [ ] Vérifier les suggestions de tags (existants + détectés dans le texte) Closes #58
cedricAbonnel added 4 commits 2026-05-14 19:48:18 +00:00
- ArticleManager::getSearchIndex() : rebuild automatique si un UUID
  référencé dans search_index.json n'existe plus sur le disque (article
  supprimé hors CMS via rsync ou suppression manuelle). Même logique que
  getBySlug() qui nettoie déjà le slug_index à la volée.

- bootstrap.php : lire SESSION_NAME depuis $_ENV avant session_start(),
  permettant de personnaliser le nom du cookie de session via le .env.

- oidc/{start,callback,me}.php : inverser l'ordre des require pour charger
  config.php (dotenv) avant bootstrap.php, condition nécessaire pour que
  SESSION_NAME soit disponible au démarrage de la session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contexte : sur abonnel.fr, session_start() était appelé sur chaque
requête PHP (y compris bots), créant ~17 000 fichiers de session/jour
dans un répertoire custom non nettoyé par le cron Debian. Les workers
PHP-FPM grossissaient en mémoire et le pool saturait (1 188 erreurs
503 en 30 minutes).

Changements :

public/index.php
- session_start() uniquement si le cookie de session existe déjà ou si
  la requête est POST. Les bots (GET sans cookie) ne créent plus de
  session.
- CSRF commentaires migré de $_SESSION['comment_csrf'] vers un double-
  submit cookie (_csrf_c, SameSite=Strict, HttpOnly). La session n'est
  plus requise pour les visiteurs anonymes qui postent un commentaire.

templates/comments_section.php
- Génère le token CSRF et le pose en cookie (_csrf_c) au lieu de
  l'écrire en session.

public/.htaccess
- Règle Apache 410 Gone pour toute URL contenant un paramètre ?do=
  (anciens paramètres DokuWiki : do=media, do=export_pdf…). Traité par
  Apache en 2ms sans toucher PHP-FPM.

public/oidc/{start,callback,me}.php
- Correction du bug introduit par 0b8077e : config.php (qui utilise
  BASE_PATH) était chargé avant bootstrap.php (qui définit BASE_PATH).
  Fix : define('BASE_PATH', …) ajouté avant le require config.php.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le formulaire unique par un wizard 5 étapes (création) et
6 étapes (édition) avec auto-sauvegarde en brouillon, détection de
tags depuis le texte (TagSuggester), aperçu SEO, diff avant validation
et plan Markdown dynamique dans l'éditeur.

Détail des changements :
- ArticleManager : +6 méthodes (updatePartialMeta, saveDraftOverlay,
  getDraftOverlay, hasDraftOverlay, discardDraftOverlay, commitDraftOverlay)
- .htaccess : routes /new/{uuid}/{1-5} et /edit/{uuid}/{1-6}
- index.php : cases create et edit réécrits en switch($step),
  nouveau case autosave_draft et edit_discard_draft
- assets/js/wizard.js : autosave debounce, auto-resize textarea,
  scroll curseur, plan TOC dynamique, toggle pills tags
- templates/wizard/ : nav.php + step1..6.php

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cedricAbonnel added 1 commit 2026-05-14 19:48:41 +00:00
cedricAbonnel merged commit 6200444e6d into main 2026-05-14 19:50:33 +00:00
cedricAbonnel deleted branch feat/wizard-multi-step 2026-05-14 19:50:34 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#59