diff --git a/TODO.md b/TODO.md index b13cf9b..22bf6b2 100644 --- a/TODO.md +++ b/TODO.md @@ -104,12 +104,14 @@ - [x] Pentest controles uitgevoerd (30/30) - [x] WCAG 2.1 AA accessibility tests (25/25) - [x] Thema editor (thema's net zo bewerkbaar maken als plugins): bestandsbrowser zijbalk, nieuw bestand, uploaden, verwijderen, verplaatsen, SCSS compileren vanuit editor, thema activeren/verwijderen, nieuw thema met basis-kopie, uniforme thema-structuur -- [x] Content editor (content consistent met plugins en thema's): bestandsbrowser zijbalk naast bestaande lijst weergave, nieuw bestand/map, uploaden, verwijderen, verplaatsen, mappen beheer, layout/plugins selectie, git/backup integratie in editor zijbalk +- [x] Content editor (content consistent met plugins en thema's): bestandsbrowser zijbalk nu op /admin/content (vervangt tabelweergave), nieuw bestand/map, uploaden, verwijderen, verplaatsen, mappen beheer, layout/plugins selectie, git/backup integratie in editor zijbalk; oude tabelweergave verhuisd naar /admin/content-list - [x] Uniformiteit: scanEditorFiles() unified scanner (scanPluginFiles/scanThemeFiles/scanContentFiles als dunne wrappers) - [x] Media invoegen in editor: ?theme= scope voor media-list endpoint + _media-modal.twig - [x] Bug: thema-naam niet overgenomen bij kopiëren — title in theme.json wordt overschreven met nieuwe themanaam; README.md krijgt nieuwe header - [x] Bug: mappen met `_` prefix zichtbaar in frontend navigatie — scanDirectory/searchInDirectory/scanForPageTitles skippen nu `_` prefix (consistente filtering met `.` en `-`) -- [x] Bug: images in markdown niet weergegeven — processContent() herschrijft lokale image/link URLs naar /-media/ endpoint (relatief, /content/, subdir); externe URLs ongewijzigd gelaten +- [x] Bug: images in markdown niet weergegeven — processContent() herschrijft lokale image/link URLs naar /-media/ endpoint (relatief, /content/, subdir, custom-grootte syntax); externe URLs ongewijzigd gelaten +- [x] UX: /admin/content is nu de boom-editor (plugin-file-tree structuur); oude tabelweergave op /admin/content-list met "Boom weergave"/"Lijst weergave" knoppen +- [x] UX: image-grootte knop in editor-toolbar (markdown) — selecteer , klik knop, breedte/hoogte dialog, {:width=... height=...} syntax toevoegen/vervangen - [x] Handleidingen in guide/ bijgewerkt (thema-beheer.md NL+EN volledig herschreven met thema-editor uitleg; content-beheer.md NL+EN volledig herschreven met content-editor uitleg) - [x] Verslag gemaakt (docs/release-notes/v2.6.2.md) - [x] Versie verhoogd naar 2.6.2 diff --git a/admin/src/AdminAuth.php b/admin/src/AdminAuth.php index 3886abf..0f6cf1f 100644 --- a/admin/src/AdminAuth.php +++ b/admin/src/AdminAuth.php @@ -16,7 +16,7 @@ class AdminAuth */ public const ROLE_PERMISSIONS = [ 'admin' => ['*'], - 'content-manager' => ['dashboard', 'content', 'content-files', 'content-edit', 'content-new', 'content-delete', 'content-file-upload', 'content-file-delete', 'content-file-move', 'content-dir-create', 'content-dir-create-in', 'content-dir-rename', 'content-dir-rename-in', 'content-dir-delete', 'content-dir-delete-in', 'content-move', 'content-backup', 'content-restore', 'content-git-init', 'content-git-commit', 'content-git-restore', 'guide', 'logout'], + 'content-manager' => ['dashboard', 'content', 'content-list', 'content-files', 'content-edit', 'content-new', 'content-delete', 'content-file-upload', 'content-file-delete', 'content-file-move', 'content-dir-create', 'content-dir-create-in', 'content-dir-rename', 'content-dir-rename-in', 'content-dir-delete', 'content-dir-delete-in', 'content-move', 'content-backup', 'content-restore', 'content-git-init', 'content-git-commit', 'content-git-restore', 'guide', 'logout'], 'bi-manager' => ['dashboard', 'statistics', 'logs', 'guide', 'logout'], 'site-admin' => ['dashboard', 'theme', 'theme-new', 'theme-edit', 'theme-file-upload', 'theme-file-delete', 'theme-file-move', 'theme-activate', 'theme-delete', 'theme-scss', 'plugins', 'plugins-new', 'plugins-edit', 'plugins-config', 'plugins-toggle', 'plugins-delete', 'statistics', 'logs', 'update', 'guide', 'logout'], ]; diff --git a/admin/theme/default/assets/js/editor-toolbar.js b/admin/theme/default/assets/js/editor-toolbar.js index 5500e80..9bf8093 100644 --- a/admin/theme/default/assets/js/editor-toolbar.js +++ b/admin/theme/default/assets/js/editor-toolbar.js @@ -42,6 +42,7 @@ { cmd: 'quote', icon: 'bi-chat-quote', title: 'Citaat' }, null, { cmd: 'hr', icon: 'bi-hr', title: 'Horizontale lijn' }, + { cmd: 'image-size', icon: 'bi-arrows-angle-expand', title: 'Afbeelding grootte' }, null, { cmd: 'media', icon: 'bi-images', title: 'Media invoegen' } ], @@ -152,6 +153,43 @@ modal.show(); } break; + case 'image-size': + // Set width/height on a markdown image: {:width="W" height="H"} + var selImg = editor.getSelection(); + if (!selImg) { + // No selection — ask the user to select an image first + alert('Selecteer eerst een afbeelding in de editor () om de grootte in te stellen.'); + editor.focus(); + break; + } + // Match  optionally followed by {:...} + var imgMatch = selImg.match(/^!\[([^\]]*)\]\(([^)]+)\)(\s*\{:([^}]*)\})?/); + if (!imgMatch) { + alert('Selectie is geen afbeelding. Selecteer een afbeelding in markdown formaat: '); + editor.focus(); + break; + } + var alt = imgMatch[1]; + var url = imgMatch[2]; + // Parse existing width/height from the {:...} block + var existingAttrs = imgMatch[4] || ''; + var existingW = (existingAttrs.match(/width\s*=\s*"([^"]*)"/) || [])[1] || ''; + var existingH = (existingAttrs.match(/height\s*=\s*"([^"]*)"/) || [])[1] || ''; + var width = prompt('Breedte (px of %, leeg = niet instellen):', existingW); + if (width === null) { editor.focus(); break; } + var height = prompt('Hoogte (px of %, leeg = niet instellen):', existingH); + if (height === null) { editor.focus(); break; } + // Build the {:width=... height=...} suffix + var attrs = []; + if (width.trim() !== '') attrs.push('width="' + width.replace(/"/g, '') + '"'); + if (height.trim() !== '') attrs.push('height="' + height.replace(/"/g, '') + '"'); + var replacement = ''; + if (attrs.length > 0) { + replacement += '{:' + attrs.join(' ') + '}'; + } + editor.replaceSelection(replacement); + editor.focus(); + break; } } diff --git a/admin/theme/default/views/pages/content-dir-form.twig b/admin/theme/default/views/pages/content-dir-form.twig index 38e6b12..75e3993 100644 --- a/admin/theme/default/views/pages/content-dir-form.twig +++ b/admin/theme/default/views/pages/content-dir-form.twig @@ -17,7 +17,7 @@ - {{ ta.cancel|default('Annuleren') }} + {{ ta.cancel|default('Annuleren') }} {% endblock %} \ No newline at end of file diff --git a/admin/theme/default/views/pages/content-dir-rename-form.twig b/admin/theme/default/views/pages/content-dir-rename-form.twig index ca5175b..7f7ed81 100644 --- a/admin/theme/default/views/pages/content-dir-rename-form.twig +++ b/admin/theme/default/views/pages/content-dir-rename-form.twig @@ -5,7 +5,7 @@ {% block content %}
@@ -28,7 +28,7 @@ - {{ ta.cancel|default('Annuleren') }} + {{ ta.cancel|default('Annuleren') }} {% endblock %} \ No newline at end of file diff --git a/admin/theme/default/views/pages/content-edit.twig b/admin/theme/default/views/pages/content-edit.twig index 2386b2f..5e12e1a 100644 --- a/admin/theme/default/views/pages/content-edit.twig +++ b/admin/theme/default/views/pages/content-edit.twig @@ -71,7 +71,7 @@ {{ ta.preview|default('Preview') }} {% endif %} - {{ ta.back|default('Terug') }} + {{ ta.back|default('Terug') }} diff --git a/admin/theme/default/views/pages/content-files.twig b/admin/theme/default/views/pages/content-files.twig index 2e95e1f..a2e3a01 100644 --- a/admin/theme/default/views/pages/content-files.twig +++ b/admin/theme/default/views/pages/content-files.twig @@ -49,7 +49,7 @@ {% endif %} {% else %} - @@ -159,7 +159,7 @@ - + {{ ta.list_view|default('Lijst weergave') }} @@ -228,7 +228,7 @@ {% if loop.last %}