v2.5.1: Admin theme refactor, Navigation plugin, user roles, guide restructure

- Reorganize admin into admin/theme/default/ (views + assets)
- Rename GuideNav to Navigation plugin (essential, protected)
- Plugin assets support (SCSS/CSS) loaded after theme CSS
- User roles: Admin, Content Manager, BI Manager, Site Admin
- Role-based access control (RBAC) for admin routes and sidebar
- Guide restructure: sub-topics in separate folders with sidebar nav
- Dynamic breadcrumb for homepage and subdirectories
- Fix theme path traversal (../../ -> ../) in admin.php
- Fix CodeMirror mode load order (xml -> css -> js -> htmlmixed -> php)
- Fix editor-toolbar.js null checks for plugin edit pages
- Layout select from theme.json with live frontmatter update
- Footer sticky at bottom of viewport (min-height: 100vh)
- Breadcrumb color fix (var(--nav-font) -> var(--header-bg))
- Remove language switcher from guide pages
- Update README.md and README.en.md
- Bump version to 2.5.1
This commit is contained in:
2026-08-10 15:36:29 +02:00
parent 0961b23b8d
commit cd498c8c3a
209 changed files with 11033 additions and 9125 deletions
@@ -0,0 +1,63 @@
{% extends "layouts/admin.twig" %}
{% block title %}Configuratie - CodePress Admin{% endblock %}
{% block content %}
<h2 class="mb-4"><i class="bi bi-sliders"></i> Configuratie</h2>
<form method="POST" action="/admin/config">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<div class="card shadow-sm mb-4">
<div class="card-header">Algemene instellingen</div>
<div class="card-body">
<div class="mb-3">
<label for="site_title" class="form-label">Site titel</label>
<input type="text" class="form-control" id="site_title" name="site_title" value="{{ config.site_title|default('CodePress') }}">
</div>
<div class="mb-3">
<label for="language_default" class="form-label">Standaard taal</label>
<select class="form-select" id="language_default" name="language_default">
<option value="nl" {{ config.language.default|default('nl') == 'nl' ? 'selected' : '' }}>Nederlands</option>
<option value="en" {{ config.language.default == 'en' ? 'selected' : '' }}>Engels</option>
<option value="de" {{ config.language.default == 'de' ? 'selected' : '' }}>Duits</option>
<option value="fr" {{ config.language.default == 'fr' ? 'selected' : '' }}>Frans</option>
</select>
</div>
</div>
</div>
<div class="card shadow-sm mb-4">
<div class="card-header">Auteur</div>
<div class="card-body">
<div class="mb-3">
<label for="author_name" class="form-label">Naam</label>
<input type="text" class="form-control" id="author_name" name="author_name" value="{{ config.author.name|default('') }}">
</div>
<div class="mb-3">
<label for="author_email" class="form-label">E-mail</label>
<input type="email" class="form-control" id="author_email" name="author_email" value="{{ config.author.email|default('') }}">
</div>
</div>
</div>
<div class="card shadow-sm mb-4">
<div class="card-header">Analytics & Logging</div>
<div class="card-body">
<div class="form-check form-switch mb-3">
<input class="form-check-input" type="checkbox" id="analytics_enabled" name="analytics_enabled" {{ config.analytics.enabled ? 'checked' : '' }}>
<label class="form-check-label" for="analytics_enabled">Analytics ingeschakeld</label>
</div>
<div class="form-check form-switch mb-3">
<input class="form-check-input" type="checkbox" id="logging_enabled" name="logging_enabled" {{ config.logging.enabled ? 'checked' : '' }}>
<label class="form-check-label" for="logging_enabled">Logging ingeschakeld</label>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-lg"></i> Opslaan
</button>
<a href="/admin/dashboard" class="btn btn-outline-secondary">Annuleren</a>
</form>
{% endblock %}