From 0fe5c75eaebcc08728b9742ca2bc6d9216b09cdf Mon Sep 17 00:00:00 2001 From: Edwin Noorlander Date: Wed, 29 Jul 2026 15:53:35 +0200 Subject: [PATCH] v1.9.1: fix world map rendering and resolve eight small TODO items World map: - Fix zero-padded ISO numeric ids leaving 31 countries unrendered (Brazil, Australia, Belgium, Austria, Algeria and more) - Fix Russia and Fiji smearing across the full map width at the antimeridian by unwrapping ring longitudes and drawing them at both edges - Crop to 84N-60S, add evenodd fill rule, 174 countries rendered Improvements: - Logger::tail() reads backwards in chunks instead of loading the whole file - External links get rel=noopener noreferrer in footer and Markdown content - formatDisplayName() cleaned up and guarded against empty input - Export statistics as CSV (Excel BOM) or JSON - GeoIP database auto-updates when older than 35 days - Editor shortcuts Ctrl/Cmd+S to save and Ctrl/Cmd+N for a new page - Live search filter in the admin content browser - Content versioning with timestamped .bak copies in content/-backups/ Also removes eight stale TODO entries that were already implemented --- TODO.md | 34 ++- admin/templates/pages/content-edit.php | 2 +- admin/templates/pages/content.php | 54 +++- admin/templates/pages/statistics.php | 18 +- cli/generate-world-map.php | 325 +++++++++++++++++------- cms/core/class/CodePressCMS.php | 61 ++++- cms/core/class/Logger.php | 65 ++++- cms/templates/assets/footer.mustache | 6 +- public/admin.php | 107 ++++++++ public/assets/img/world-map.svg | 330 ++++++++++++++----------- public/assets/js/editor-toolbar.js | 33 +++ version.php | 18 +- 12 files changed, 772 insertions(+), 281 deletions(-) diff --git a/TODO.md b/TODO.md index 630acbc..c318f1e 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,19 @@ ## ✅ Voltooid (recent) +### Opschoning & kleine verbeteringen (v1.9.1) +- [x] Wereldkaart: nul-opgevulde ISO-nummers werden niet herkend, waardoor 31 landen ontbraken (o.a. Brazilië, Australië, België, Oostenrijk, Algerije) +- [x] Wereldkaart: Rusland en Fiji smeerden over de datumgrens uit over de volle 360°; ringen worden nu ontvouwen en aan beide randen getekend +- [x] Wereldkaart: bijgesneden op 84°N–60°Z, `fill-rule="evenodd"` voor enclaves, 174 landen +- [x] `Logger::tail()` leest het bestand nu achterwaarts in blokken i.p.v. volledig in het geheugen +- [x] Externe links krijgen `rel="noopener noreferrer"` — in de footer en automatisch in Markdown-content via `ExternalLinkExtension` +- [x] `formatDisplayName()` opgeschoond en beveiligd tegen lege invoer (PHP-waarschuwing verholpen) +- [x] Statistieken exporteren als CSV (met BOM voor Excel) of JSON +- [x] GeoIP-database werkt zichzelf automatisch bij als hij ouder is dan 35 dagen +- [x] Sneltoetsen in de editor: Ctrl/Cmd+S opslaan, Ctrl/Cmd+N nieuwe pagina +- [x] Zoekfilter in de admin content browser (live, met teller en Escape om te wissen) +- [x] Content versioning: bij elke save een tijdgestempelde `.bak` in `content/-backups/`, laatste 5 versies per bestand + ### Statistieken & GeoIP (v1.9.0) - [x] `GeoIP` class met providerketen: lokaal (DB-IP Lite) → MaxMind `.mmdb` → externe API, met automatische fallback - [x] Eigen pure-PHP MMDB-lezer (`MMDBReader`), geen Composer-afhankelijkheid nodig @@ -81,22 +94,14 @@ - [ ] **autoLinkPageTitles()** — Regex kan geneste `` tags produceren (`CodePressCMS.php`) - [ ] **MQTT wachtwoord** — Credentials in plain text JSON (`MQTTTracker.php`) - [ ] **Markdown editor** — WYSIWYG/split-view Markdown editor integreren in content-edit (bijv. EasyMDE, SimpleMDE, of Toast UI Editor). Live preview, toolbar met opmaakknoppen, drag & drop afbeeldingen -- [ ] **Plugin activeren/deactiveren** — Toggle knop per plugin in admin Plugins pagina. Schrijft `enabled: true/false` naar plugin `config.json` - [ ] **Plugin API** — Uitgebreide API voor plugins zodat ze kunnen inhaken op CMS events (hooks/filters): `onPageLoad`, `onBeforeRender`, `onAfterRender`, `onSearch`, `onMenuBuild` ### Medium -- [ ] **Taalwisselaar verliest pagina** — Wisselen van taal navigeert altijd naar homepage (`header.mustache`) -- [ ] **ctime is geen creatietijd op Linux** — `stat()` ctime is inode-wijzigingstijd (`CodePressCMS.php`) -- [ ] **getGuidePage() dupliceert markdown parsing** — Zelfde CommonMark setup als `parseMarkdown()` -- [ ] **HTMLBlock ontbrekende ``** — Niet-gesloten tags bij null-check -- [ ] **formatDisplayName() redundante logica** — Dubbele checks en overtollige str_replace -- [ ] **Plugin configuratie editor** — Per-plugin config.json bewerken vanuit admin panel -- [ ] **Admin activity log** — Logboek van alle admin acties (wie deed wat wanneer) met viewer in dashboard +- [ ] **ctime is geen creatietijd op Linux** — `stat()` ctime is inode-wijzigingstijd. Deels ondervangen: frontmatter `created` heeft voorrang en de footer verbergt de datum als beide gelijk zijn (`CodePressCMS.php`) - [ ] **Wachtwoord wijzigen eigen account** — Apart formulier voor ingelogde gebruiker om eigen wachtwoord te wijzigen (met huidig wachtwoord verificatie) -- [ ] **Admin thema** — Admin sidebar kleur overnemen van site thema config (`header_color`) -- [ ] **Map aanmaken/verwijderen** — Directory management in admin Content pagina - [ ] **Bestand uploaden** — Uploaden naar andere mappen dan `-assets/` via admin Content pagina - [ ] **Content preview** — Live preview van Markdown/HTML content naast de editor +- [ ] **Backups terugzetten** — Versies uit `content/-backups/` bekijken en herstellen vanuit de admin ### Laag - [ ] **Geen type hints** — Ontbrekende type declarations op properties en methoden @@ -105,17 +110,10 @@ - [ ] **style.css is Bootstrap** — Bestandsnaam is misleidend, Bootstrap wordt mogelijk dubbel geladen - [ ] **Geen error handling op `file_get_contents()`** — Meerdere calls zonder return-check - [ ] **Logger slikt fouten** — `@file_put_contents()` met error suppression -- [ ] **Logger tail() leest heel bestand** — Geheugenprobleem bij grote logbestanden -- [ ] **Externe links missen `rel="noreferrer"`** -- [ ] **Zoekformulier mist aria-label** - [ ] **mobile.css override Bootstrap utilities** met `!important` -- [ ] **Content versioning** — Simpele file-based backup bij elke save (bijv. `.bak` bestanden) -- [ ] **Zoeken in admin** — Zoekfunctie binnen de admin content browser - [ ] **Drag & drop** — Bestanden herordenen/verplaatsen via drag & drop -- [ ] **Keyboard shortcuts** — Ctrl+S om op te slaan in editor, Ctrl+N voor nieuw bestand - [ ] **Dark mode** — Admin panel dark mode toggle - [ ] **Responsive admin** — Admin sidebar inklapbaar op mobiel (nu is het gestacked) - [ ] **stats.json bij hoog verkeer** — Nu één schrijfactie met LOCK_EX per request. Bij veel verkeer eventueel opsplitsen naar dagbestanden of APCu - [ ] **Steden op de kaart** — Nu alleen landniveau; met een City-database ook stippen per stad plotten -- [ ] **Statistieken exporteren** — CSV/JSON export van bezoekersstatistieken -- [ ] **Automatische GeoIP-update** — Maandelijkse cron/schedule i.p.v. handmatig op de knop drukken +- [ ] **Kleine landen op de kaart** — Natural Earth 110m bevat geen Monaco, Vaticaanstad, Liechtenstein en Singapore; eventueel 50m-dataset gebruiken diff --git a/admin/templates/pages/content-edit.php b/admin/templates/pages/content-edit.php index 633031a..c87540f 100644 --- a/admin/templates/pages/content-edit.php +++ b/admin/templates/pages/content-edit.php @@ -45,7 +45,7 @@
- diff --git a/admin/templates/pages/content.php b/admin/templates/pages/content.php index 3fe769c..e3c9e85 100644 --- a/admin/templates/pages/content.php +++ b/admin/templates/pages/content.php @@ -57,6 +57,14 @@
+
+
+ + + +
+
@@ -73,7 +81,7 @@ - + + + +
Geen bestanden gevonden.
@@ -134,11 +142,55 @@
Geen resultaten voor deze filter.
+ +