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
+237
View File
@@ -0,0 +1,237 @@
<!doctype html>
<html lang="{{language}}">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet" href="/css/styles.css">
</head>
<body>
<div class="page">
{{{header_html}}}
<main class="page-main dashboard-main">
<section class="panel">
<h2>{{bootstrap_link_label}}</h2>
<fieldset>
<legend>{{generate_bootstrap_link_label}}</legend>
<div class="bootstrap-result-grid {{bootstrap_result_class}}">
<div>
<form method="post" action="/?lang={{language_url}}">
<input type="hidden" name="action" value="issue_bootstrap">
<label>
{{ttl_minutes_label}}<br>
<input type="number"
name="ttl_minutes"
value="{{bootstrap_ttl_minutes}}"
min="{{bootstrap_ttl_min_minutes}}"
max="{{bootstrap_ttl_max_minutes}}">
</label>
<p class="small">{{ttl_range_help}}</p>
<button type="submit">{{generate_bootstrap_link_label}}</button>
</form>
{{{generated_link_html}}}
</div>
{{{prompt_panel_html}}}
</div>
</fieldset>
</section>
</main>
</div>
<script src="/js/clipboard.js" defer></script>
<script src="/js/bootstrap-prompt.js" defer></script>
</body>
</html>
===
{
"translations": {
"app.title": {
"en": "Racket sandbox",
"nl": "Racket sandbox"
},
"app.manage_prompts": {
"en": "Manage prompts",
"nl": "Prompts beheren"
},
"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.bootstrap_link": {
"en": "Bootstrap link",
"nl": "Bootstraplink"
},
"app.generate_bootstrap_link": {
"en": "Generate bootstrap link",
"nl": "Bootstraplink genereren"
},
"app.ttl_minutes": {
"en": "TTL in minutes",
"nl": "TTL in minuten"
},
"app.ttl_range_help": {
"en": "Allowed range: 30 minutes to 8 hours.",
"nl": "Toegestaan bereik: 30 minuten tot 8 uur."
},
"app.generated_link": {
"en": "Generated link",
"nl": "Gegenereerde link"
},
"app.copy": {
"en": "Copy",
"nl": "Kopieer"
},
"app.copied": {
"en": "Copied",
"nl": "Gekopieerd"
},
"app.generated_link_help": {
"en": "Give this link to the AI agent. The agent should start from this link and then only follow links from the generated HTML pages.",
"nl": "Geef deze link aan de AI-agent. De agent moet vanaf deze link starten en daarna alleen links volgen vanuit de gegenereerde HTML-paginas."
},
"app.select_prompt": {
"en": "Select prompt",
"nl": "Prompt selecteren"
},
"app.copy_full_prompt": {
"en": "Copy full prompt",
"nl": "Volledige prompt kopieren"
},
"app.bootstrap_prompt_help": {
"en": "Choose one of your prompts. The placeholder {{bootstrap-racket-link}} is replaced by the generated bootstrap link.",
"nl": "Kies een van je prompts. De placeholder {{bootstrap-racket-link}} wordt vervangen door de gegenereerde bootstraplink."
},
"app.no_bootstrap_prompts": {
"en": "No personal prompts are available for this language. Copy a default prompt first from prompt management.",
"nl": "Er zijn geen persoonlijke prompts beschikbaar voor deze taal. Kopieer eerst een standaardprompt vanuit promptbeheer."
},
"app.user_management": {
"en": "User management",
"nl": "Gebruikersbeheer"
},
"app.configuration": {
"en": "Configuration",
"nl": "Configuratie"
},
"app.user_management_help": {
"en": "Users are registered manually by email address, full name and password. This page only manages existing users.",
"nl": "Gebruikers worden handmatig geregistreerd met e-mailadres, volledige naam en wachtwoord. Deze pagina beheert alleen bestaande gebruikers."
},
"app.id": {
"en": "ID",
"nl": "ID"
},
"app.full_name": {
"en": "Full name",
"nl": "Volledige naam"
},
"app.email": {
"en": "Email",
"nl": "E-mail"
},
"app.enabled": {
"en": "Enabled",
"nl": "Ingeschakeld"
},
"app.created": {
"en": "Created",
"nl": "Gemaakt"
},
"app.last_login": {
"en": "Last login",
"nl": "Laatste login"
},
"app.actions": {
"en": "Actions",
"nl": "Acties"
},
"app.yes": {
"en": "yes",
"nl": "ja"
},
"app.no": {
"en": "no",
"nl": "nee"
},
"app.save_flags": {
"en": "Save flags",
"nl": "Vlaggen opslaan"
},
"app.new_password": {
"en": "New password",
"nl": "Nieuw wachtwoord"
},
"app.change_password": {
"en": "Change password",
"nl": "Wachtwoord wijzigen"
},
"app.delete_user": {
"en": "Delete user",
"nl": "Gebruiker verwijderen"
},
"app.delete_user_confirm": {
"en": "Delete user",
"nl": "Gebruiker verwijderen"
},
"app.cannot_delete_self": {
"en": "You cannot delete your own account.",
"nl": "Je kunt je eigen account niet verwijderen."
},
"app.bootstrap_link_issued": {
"en": "Bootstrap link issued.",
"nl": "Bootstraplink aangemaakt."
},
"app.password_changed_for": {
"en": "Password changed for: {{email}}",
"nl": "Wachtwoord gewijzigd voor: {{email}}"
},
"app.user_flags_updated": {
"en": "User flags updated.",
"nl": "Gebruikersvlaggen bijgewerkt."
},
"app.user_deleted": {
"en": "User deleted.",
"nl": "Gebruiker verwijderd."
},
"app.admin_rights_required": {
"en": "Admin rights required.",
"nl": "Adminrechten vereist."
},
"app.cannot_remove_own_admin": {
"en": "You cannot remove your own admin rights.",
"nl": "Je kunt je eigen adminrechten niet verwijderen."
},
"app.cannot_disable_self": {
"en": "You cannot disable your own account.",
"nl": "Je kunt je eigen account niet uitschakelen."
},
"app.unknown_action": {
"en": "Unknown action: {{action}}",
"nl": "Onbekende actie: {{action}}"
}
}
}