Move rendering into private templates

Add an explicit template renderer with HTML views and partials for the app, bootstrap, package, and catalog pages. Move shared reporting setup into config/reporting.php and relocate stylesheet assets under css/.
This commit is contained in:
www-data
2026-05-26 12:50:26 +02:00
parent 2f2e8869d6
commit 475765e31f
55 changed files with 2328 additions and 1175 deletions
+229
View File
@@ -0,0 +1,229 @@
<!doctype html>
<html lang="{{language}}">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet" href="/css/styles.css?v={{style_version}}">
</head>
<body>
<div class="page">
{{{header_html}}}
<main class="page-main dashboard-main">
<section class="panel">
<h2>{{download_settings_label}}</h2>
<form method="post" action="/admin-config?lang={{language_url}}" class="admin-form-grid">
<input type="hidden" name="action" value="update_config">
<label>
{{racket_zip_chunk_label}}<br>
<input type="number" name="racket_zip_max_base64_kb" min="1" step="1" value="{{racket_zip_max_base64_kb}}" required>
</label>
<label>
{{package_zip_chunk_label}}<br>
<input type="number" name="package_zip_max_base64_kb" min="1" step="1" value="{{package_zip_max_base64_kb}}" required>
</label>
<button type="submit">{{save_configuration_label}}</button>
</form>
<p class="small">{{chunk_size_hint}}</p>
<table>
<tr>
<th>{{racket_zip_chunk_label}}</th>
<td>{{{racket_zip_base64_chunk_size}}}</td>
<td>{{{racket_zip_effective_binary_chunk}}}</td>
</tr>
<tr>
<th>{{package_zip_chunk_label}}</th>
<td>{{{package_zip_base64_chunk_size}}}</td>
<td>{{{package_zip_effective_binary_chunk}}}</td>
</tr>
<tr>
<th>{{racket_zip_source_label}}</th>
<td><code>config/racket.zip</code></td>
<td>{{{racket_zip_file_size}}}</td>
</tr>
<tr>
<th>{{racket_parts_label}}</th>
<td><code>{{racket_part_count}}</code></td>
<td>{{racket_parts_status}}</td>
</tr>
</table>
</section>
<section class="panel">
<h2>{{maintenance_label}}</h2>
<fieldset>
<legend>{{next_tokens_label}}</legend>
<form method="post" action="/admin-config?lang={{language_url}}">
<input type="hidden" name="action" value="cleanup_tokens">
<button type="submit">{{remove_expired_tokens_label}}</button>
</form>
<p class="small">{{cleanup_help}}</p>
<h3>{{current_next_tokens_label}}</h3>
{{{current_tokens_html}}}
</fieldset>
</section>
</main>
</div>
</body>
</html>
===
{
"translations": {
"app.title": {
"en": "Racket sandbox",
"nl": "Racket sandbox"
},
"app.manage_prompts": {
"en": "Manage prompts",
"nl": "Prompts beheren"
},
"app.user_management": {
"en": "User management",
"nl": "Gebruikersbeheer"
},
"app.configuration": {
"en": "Configuration",
"nl": "Configuratie"
},
"app.logout": {
"en": "Logout",
"nl": "Uitloggen"
},
"app.language": {
"en": "Language",
"nl": "Taal"
},
"app.logged_in_as": {
"en": "Logged in as:",
"nl": "Ingelogd als:"
},
"app.admin": {
"en": "Admin",
"nl": "Admin"
},
"app.back_to_sandbox": {
"en": "Back to Racket sandbox",
"nl": "Terug naar Racket sandbox"
},
"app.download_settings": {
"en": "Download settings",
"nl": "Downloadinstellingen"
},
"app.maintenance": {
"en": "Maintenance",
"nl": "Onderhoud"
},
"app.next_tokens": {
"en": "Next tokens",
"nl": "Next-tokens"
},
"app.current_next_tokens": {
"en": "Next tokens",
"nl": "Next-tokens"
},
"app.token": {
"en": "Token",
"nl": "Token"
},
"app.created_at": {
"en": "Created at",
"nl": "Aangemaakt op"
},
"app.expires_at": {
"en": "Expires at",
"nl": "Verloopt op"
},
"app.no_current_next_tokens": {
"en": "No next tokens.",
"nl": "Geen next-tokens."
},
"app.remove_expired_tokens": {
"en": "Remove expired next tokens",
"nl": "Verlopen next-tokens verwijderen"
},
"app.racket_zip_chunk_kb": {
"en": "Racket installation max base64 chunk size (KiB)",
"nl": "Maximale base64-chunkgrootte Racket-installatie (KiB)"
},
"app.package_zip_chunk_kb": {
"en": "Package/module max base64 chunk size (KiB)",
"nl": "Maximale base64-chunkgrootte packages/modules (KiB)"
},
"app.save_configuration": {
"en": "Save configuration",
"nl": "Configuratie opslaan"
},
"app.configuration_saved": {
"en": "Configuration saved.",
"nl": "Configuratie opgeslagen."
},
"app.configuration_saved_with_parts": {
"en": "Configuration saved. Racket installation parts regenerated: {{count}}",
"nl": "Configuratie opgeslagen. Racket-installatie parts opnieuw gemaakt: {{count}}"
},
"app.racket_parts_regenerated": {
"en": "Racket installation parts regenerated: {{count}}",
"nl": "Racket-installatie parts opnieuw gemaakt: {{count}}"
},
"app.chunk_size_hint_v2": {
"en": "Values are maximum base64 payload sizes in KiB. A {{chunk_size}} KiB binary chunk becomes {{base64_chunk_size}} KiB base64. Racket installation parts are regenerated when this configuration is saved.",
"nl": "Waarden zijn maximale base64-payloadgroottes in KiB. Een binaire chunk van {{chunk_size}} KiB wordt {{base64_chunk_size}} KiB base64. Racket-installatie parts worden opnieuw gemaakt wanneer deze configuratie wordt opgeslagen."
},
"app.effective_binary_chunk": {
"en": "Effective binary chunk",
"nl": "Effectieve binaire chunk"
},
"app.effective_binary_chunk_bytes": {
"en": "Effective binary chunk: {{bytes}} bytes",
"nl": "Effectieve binaire chunk: {{bytes}} bytes"
},
"app.base64_chunk_size_kib": {
"en": "{{size}} KiB",
"nl": "{{size}} KiB"
},
"app.file_size_bytes": {
"en": "{{bytes}} bytes",
"nl": "{{bytes}} bytes"
},
"app.racket_zip_source": {
"en": "Racket installation source",
"nl": "Bronbestand Racket-installatie"
},
"app.racket_parts": {
"en": "Racket installation parts",
"nl": "Racket-installatie parts"
},
"app.racket_parts_current": {
"en": "current",
"nl": "actueel"
},
"app.racket_parts_current_with_date": {
"en": "current, {{created_at}}",
"nl": "actueel, {{created_at}}"
},
"app.racket_parts_missing": {
"en": "missing or outdated; save configuration to regenerate",
"nl": "ontbreken of verouderd; sla configuratie op om opnieuw te maken"
},
"app.expired_tokens_removed": {
"en": "Expired next tokens removed: {{count}}",
"nl": "Verlopen next-tokens verwijderd: {{count}}"
},
"app.cleanup_help": {
"en": "Expired links should return an outdated information message to the AI agent. Cleanup only removes old token rows from SQLite.",
"nl": "Verlopen links moeten een melding over verouderde informatie aan de AI-agent teruggeven. Opruimen verwijdert alleen oude tokenrijen uit SQLite."
}
}
}