Commit Graph

82 Commits

Author SHA1 Message Date
cedricAbonnel d329872404 Merge pull request 'v1.6.12 — image de couverture modifiable en édition' (#80) from dev into main
Merge pull request 'v1.6.12 — image de couverture modifiable en édition' (#80) from dev into main
2026-05-15 21:09:45 +00:00
cedricAbonnel 88cc67d945 feat : image de couverture modifiable en mode édition (v1.6.12)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 23:08:14 +02:00
cedricAbonnel 8a42dfe981 Merge pull request 'v1.6.11 — slug immuable en édition' (#79) from dev into main
Merge pull request 'v1.6.11 — slug immuable en édition' (#79) from dev into main
2026-05-15 20:58:15 +00:00
cedricAbonnel 6092cf940d docs : consignes déploiement abonnel.fr — sudo, www-data, .sessions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 22:56:34 +02:00
cedricAbonnel 5b16fb465b fix : slug immuable en édition — suppression de la propagation auto (v1.6.11)
En mode édition, le slug ne doit jamais changer. Suppression du
hidden[slug] dans step6.php et du bloc qui le sauvegardait dans
le draft overlay avant commitDraftOverlay().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 22:42:49 +02:00
cedricAbonnel 5203b2c514 Merge pull request 'v1.6.10 — fix suppression article (permissions répertoire)' (#78) from dev into main
Merge pull request 'v1.6.10 — fix suppression article (permissions répertoire)' (#78) from dev into main
2026-05-15 20:30:49 +00:00
cedricAbonnel 996ab3e508 fix : suppression article — permissions répertoire et gestion d'erreur (v1.6.10)
- mkArticleDir() crée les répertoires avec chmod 0775 explicite (bypass umask)
- delete() retourne bool et détecte l'échec sans reconstruire les index
- removeDir() supprime les warnings PHP (@unlink, @rmdir, @scandir)
- post_view.php affiche un message d'erreur si delete_failed=1
- index.php redirige vers l'article avec ?delete_failed=1 si échec

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 22:27:24 +02:00
cedricAbonnel 8af2c8e20b Merge pull request 'v1.6.9 — tri titre/date dans admin/articles' (#77) from dev into main
Merge PR #77 : v1.6.9
2026-05-15 19:20:19 +00:00
cedricAbonnel 04a7713286 feat : tri par titre et date dans /admin/articles (v1.6.9)
En-têtes "Titre" et "Date" cliquables, indicateur ↑/↓, paramètres sort/dir
préservés lors du filtrage. Tri appliqué après filtres côté PHP.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 21:14:22 +02:00
cedricAbonnel 3ddfc1dcf3 Merge pull request 'v1.6.8 — scripts CSP-conformes, densité L/M/S, RSS XML' (#76) from dev into main
Merge PR #76 : v1.6.8
2026-05-15 19:09:09 +00:00
cedricAbonnel fa00f61ee0 chore : version 1.6.8 — scripts CSP-conformes, densité M par défaut
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 21:08:23 +02:00
cedricAbonnel 8889110133 fix : densité M par défaut (au lieu de L)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 21:07:36 +02:00
cedricAbonnel 3e856dc476 fix : externaliser tous les scripts inline (CSP script-src 'self')
Tous les <script> inline et event handlers inline bloqués par la CSP sont
déplacés vers des fichiers JS statiques servis par 'self' :
- density-fouc.js  : anti-FOUC densité (chargé en <head>)
- density.js       : widget L/M/S
- trending-home.js : AJAX "Meilleures audiences" (RSS XML)
- admin-stats.js   : groupes AS + pages trending (RSS XML)
- admin.js         : bookAddArticle + bulk-delete (onclick/onchange → listeners)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 21:00:26 +02:00
cedricAbonnel 58a110d5b9 fix : densité L/M/S — injection <style> dynamique dans <head>
Remplace body[data-density] + CSS externe par un élément <style id="density-fouc">
injecté dynamiquement dans <head>, insensible aux problèmes de spécificité et de cache CSS.
Remplace aussi closest() par une boucle parentNode et dataset par getAttribute.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 20:49:08 +02:00
cedricAbonnel 5e88d44129 fix : densité L/M/S — widget fixe haut-droite, CSS !important
- Widget retiré du hero-search, replacé en position:fixed top-right (sous navbar)
- max-width !important pour garantir l'override de Bootstrap sur main.container-fluid
- transition douce sur main, caché en < 576px

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 20:35:59 +02:00
cedricAbonnel a55e22f1f4 feat : sélecteur de densité L/M/S sur la page liste (v1.6.7)
Boutons [L][M][S] dans la barre de recherche hero : pleine largeur (défaut),
980 px centré, 660 px compact. Préférence localStorage. Anti-FOUC inline dans layout.php.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 20:24:28 +02:00
cedricAbonnel 5cea473d17 feat : "Meilleures audiences" + admin/stats pages via flux RSS XML (v1.6.6)
- post_list.php : section AJAX qui lit /trending?period=1h en XML (DOMParser) — plus de rendu PHP
- admin_stats.php : colonne "Pages les plus visitées" chargée en AJAX depuis /trending?period=14d XML
- index.php/stats : suppression de topGrouped pour /post/ ; seuls /book/ et ASN restent côté serveur

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 20:08:24 +02:00
cedricAbonnel 1d05138329 docs : deployment.md — bouton Mettre à jour (sudoers) + flux trending
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 18:27:28 +02:00
cedricAbonnel ee2b8a4ac7 docs : documenter la configuration sudoers pour le bouton Mettre à jour
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 18:26:16 +02:00
cedricAbonnel 556c2cfea9 Merge pull request 'release 1.6.5 : trending — seul /trending génère le cache' (#75) from dev into main
release 1.6.5 : trending — seul /trending génère le cache
2026-05-15 16:20:16 +00:00
cedricAbonnel e19d20ca17 refactor : trending — seul /trending génère le cache, les consommateurs lisent (v1.6.5)
Page d'accueil et /tendances lisent uniquement le cache trending_{period}.json
produit par le flux RSS /trending?period=…. Aucun parsing de logs en dehors du
flux RSS. Rubrique renommée "Meilleures audiences · 1 heure".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 18:19:10 +02:00
cedricAbonnel d0b486f11c Merge pull request 'release 1.6.4 : TrendingParser, flux RSS /trending, page /tendances' (#74) from dev into main
release 1.6.4 : TrendingParser, flux RSS /trending, page /tendances
2026-05-15 15:38:28 +00:00
cedricAbonnel 18b7194069 feat : TrendingParser + flux RSS tendances + page publique /tendances (v1.6.4)
- TrendingParser : lit les logs Apache, compte les visiteurs uniques (IPs, HTTP 200),
  supporte plusieurs préfixes (/post/, /book/) et un seul parse via topGrouped()
- /trending?period=… : flux RSS des 50 articles les plus consultés, 10 périodes
  de 10 min à 1 an, cache TTL adaptatif
- /tendances : page publique avec sélecteur de période, top 20 articles,
  tableau des flux RSS et section méthodologie
- /admin/stats : remplace AccessLogParser (hits) par TrendingParser (visiteurs uniques)
- Page d'accueil : rubrique Tendances alimentée par les logs 1h (fallback DB)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 17:38:06 +02:00
cedricAbonnel 21f6e75878 Merge pull request 'release 1.6.3 : UpdateChecker sudo + cache stats 60 s' (#73) from dev into main
release 1.6.3 : UpdateChecker sudo + cache stats 60 s
2026-05-15 14:12:28 +00:00
cedricAbonnel 2a60790006 Merge https://git.abonnel.fr/cedricAbonnel/folio into dev 2026-05-15 16:05:59 +02:00
cedricAbonnel 3647289f86 chore : version 1.6.3 — UpdateChecker sudo + cache stats 60 s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 16:05:21 +02:00
cedricAbonnel ea950f2c25 perf : cache 60 s pour les stats admin (logs Apache + lookup ASN)
Les données coûteuses (parsing des logs, batchLookup ASN) sont mises en cache
dans DATA_PATH/.stats_cache.json. Le cache expire après 60 secondes via filemtime.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 16:04:56 +02:00
cedricAbonnel af0a0bb9d5 feat : UpdateChecker délègue la mise à jour à un script sudo externe
Le bouton "Mettre à jour" appelle désormais `sudo /usr/local/bin/folio-upgrade.sh`
via exec() plutôt que d'exécuter git pull + composer + migrations directement en PHP.
Le script shell (template dans scripts/server/) gère la séquence complète : clone fresh,
permissions www-data, restauration .env, composer install, migrations SQL, .sessions,
safe.directory. Le journal de la dernière mise à jour est conservé dans DATA_PATH/.upgrade-log
et affiché en <details> dans l'admin.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 15:46:26 +02:00
cedricAbonnel 797937340a Merge pull request 'release 1.6.2 : gardes session OIDC, règle PHP-FPM www-data' (#72) from dev into main
Reviewed-on: #72
2026-05-15 12:39:41 +00:00
cedricAbonnel d5bba5e6e5 Merge branch 'main' into dev 2026-05-15 12:39:34 +00:00
cedricAbonnel 53dbce5bb0 fix : gardes session OIDC + règle PHP-FPM www-data (v1.6.2)
- oidc/start.php : arrêt immédiat (500) si session_start() échoue, évite
  un flux OIDC condamné à l'échec silencieux (ex. session.save_path absent)
- oidc/callback.php : même garde + error_log sur échec du contrôle de state
  pour faciliter le diagnostic (STATE absent/présent + session_id)
- consignes.md : règle PHP-FPM — toujours user=www-data, pas le compte admin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 14:34:39 +02:00
cedricAbonnel 4e262ddde8 Merge pull request 'release 1.6.1 : fix ordre require login/logout, data/site/ hors git' (#70) from dev into main
Merge PR #70 : release 1.6.1
2026-05-15 10:58:07 +00:00
cedricAbonnel 7737edf402 chore : version 1.6.1 — fix ordre require login/logout, data/site/ hors git
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 12:57:21 +02:00
cedricAbonnel 6d159e7dda fix : ordre require config→bootstrap dans login et logout, data/site/ hors git
- public/login/index.php, login/magic.php, logout.php : config/config.php
  chargé avant bootstrap.php pour que SESSION_NAME soit défini avant session_start()
- data/site/ retiré du suivi git (.gitignore corrigé) : contenu site-spécifique
  déjà présent dans varlog-data/site/ et fr.abonnel.www-data/site/
- CLAUDE.md : chemins articles corrigés (varlog-data/, fr.abonnel.www-data/)
- consignes.md : ajouté (architecture, workflow, règles, procédures déploiement)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 12:52:06 +02:00
cedricAbonnel ebf0e2df65 Merge pull request 'release 1.6.0 : bouton Mettre à jour, branche dev, guard git pull' (#69) from dev into main
release 1.6.0
2026-05-15 09:21:51 +00:00
cedricAbonnel 331e9c9ecd chore : version 1.6.0 — bouton Mettre à jour, branche dev, guard git pull
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 11:16:35 +02:00
cedricAbonnel 0280ef3ca1 docs : architecture articles git (varlog.git + abonnel-www.git), sync bidirectionnelle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 11:16:35 +02:00
cedricAbonnel eddde2165a fix : run_engine_update vérifie origin == folio_repo_url avant git pull
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 11:16:35 +02:00
cedricAbonnel 07d004b3f0 feat : bouton unique Mettre à jour (git pull + SQL + contenu), branche dev
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 11:16:35 +02:00
cedricAbonnel 5cb0e854fd Merge pull request 'release 1.5.0 : config admin FOLIO_REPO_URL, APP_TIMEZONE, push.sh protégé' (#68) from dev into main
release 1.5.0 : config admin FOLIO_REPO_URL, APP_TIMEZONE, push.sh protégé
2026-05-15 08:07:04 +00:00
cedricAbonnel 8f6c17f0f2 chore : version 1.5.0, push.sh bloque main, CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:55:16 +02:00
cedricAbonnel 5452fb4927 Merge pull request 'feat : FOLIO_REPO_URL et APP_TIMEZONE configurables depuis admin' (#67) from feat/folio-repo-url-admin-config into main
Reviewed-on: #67
2026-05-15 07:52:17 +00:00
cedricAbonnel de8785d088 fix : déplacer config mises à jour Folio dans l'onglet Site
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:48:40 +02:00
cedricAbonnel 4b5943c0a4 feat : FOLIO_REPO_URL et branche configurables depuis l'admin (dashboard)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:48:40 +02:00
cedricAbonnel a552f105cd fix : masquer bouton Vérifier si FOLIO_REPO_URL non configuré, message explicatif
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:48:40 +02:00
cedricAbonnel 16afec3039 fix : APP_TIMEZONE configurable (défaut Europe/Paris), FOLIO_REPO_URL dans .env.example
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:48:40 +02:00
cedricAbonnel 2d2148079d Merge pull request 'docs: ajouter README avec guide d'installation' (#56) from docs/readme-installation into main
docs: ajouter README avec guide d'installation (v1.4.0)

Fixes #55.
2026-05-15 07:44:28 +00:00
cedricAbonnel 3965be6854 docs : mettre à jour README — DATA_PATH, permissions, setup.sh
- Ajouter DATA_PATH dans le tableau des variables .env avec note prod
- Étape 6 : permissions sur DATA_PATH (hors document root) au lieu de data/
- Étape 7 : référencer $DATA_PATH/site_settings.json
- Mentionner scripts/setup.sh
- Structure : retirer data/ (géré par DATA_PATH), ajouter scripts/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:36:37 +02:00
cedricAbonnel e803d2d0a7 fix : DATA_PATH défini dans config/config.php (manquant à l'exécution)
bootstrap.php ne suffisait pas — index.php, feed.php et sitemap.php passent
par config/config.php. DATA_PATH est maintenant défini là, juste après le
chargement du .env. file.php charge désormais config/config.php.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 09:24:01 +02:00
cedricAbonnel 9069a64a0c Merge pull request 'feat : statistiques admin, livres, setup.sh, permissions rsync (v1.3.0)' (#66) from feat/books into main
feat/books → main
2026-05-15 07:18:49 +00:00