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
+462
View File
@@ -0,0 +1,462 @@
<!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 prompt-workbench">
<aside class="prompt-sidebar panel">
<div class="prompt-tabs" role="tablist" aria-label="Prompt lists">
<button type="button" class="prompt-tab {{defaults_tab_active_class}}" data-tab="defaults" role="tab" aria-selected="{{defaults_tab_selected}}">
{{available_defaults_label}}
</button>
<button type="button" class="prompt-tab {{personal_tab_active_class}}" data-tab="personal" role="tab" aria-selected="{{personal_tab_selected}}">
{{your_prompts_label}}
</button>
</div>
<section class="prompt-tab-panel {{defaults_tab_active_class}}" id="tab-defaults" role="tabpanel">
{{{default_admin_notice_html}}}
<div class="sidebar-actions">
<form method="post" action="/prompts?lang={{language_url}}&mode=personal">
<input type="hidden" name="action" value="copy_all_defaults">
<input type="hidden" name="language" value="{{language}}">
<button type="submit">{{copy_all_label}}</button>
</form>
</div>
<div class="prompt-list">
{{{default_prompts_html}}}
{{{no_defaults_html}}}
</div>
{{{create_default_html}}}
</section>
<section class="prompt-tab-panel {{personal_tab_active_class}}" id="tab-personal" role="tabpanel">
<div class="prompt-list">
{{{personal_prompts_html}}}
{{{no_personal_html}}}
</div>
<details class="create-drawer">
<summary>{{create_personal_label}}</summary>
<form method="post" action="/prompts?lang={{language_url}}&mode=personal">
<input type="hidden" name="action" value="create_prompt">
<label>{{name_label}}<br><input type="text" name="name"></label>
<label>{{language_label}}<br>
<select name="language">
{{{language_options_html}}}
</select>
</label>
<label>{{prompt_content_label}}<br><textarea name="content" rows="7"></textarea></label>
<button type="submit">{{create_personal_label}}</button>
</form>
</details>
</section>
</aside>
<section id="promptViewer" class="prompt-viewer panel is-empty">
<div class="viewer-empty">
{{select_prompt_label}}
</div>
<div class="viewer-shell">
<div class="viewer-header">
<div>
<div class="viewer-title" id="viewerTitle">{{prompt_label}}</div>
<div class="version-meta" id="viewerMeta"></div>
</div>
<button type="button" id="editPromptButton">{{edit_label}}</button>
</div>
<pre id="viewerContent" class="viewer-content"></pre>
</div>
</section>
</main>
<footer class="page-footer">
<a href="/">{{back_label}}</a>
</footer>
</div>
<div id="promptModalBackdrop" class="modal-backdrop">
<div class="prompt-modal">
<form id="promptModalForm" class="edit-mode" method="post" action="/prompts?lang={{language_url}}&mode={{mode_url}}">
<div class="modal-header">
<div>
<div class="modal-title" id="modalTitle">{{prompt_label}}</div>
<div class="version-meta" id="modalMeta"></div>
</div>
<button type="button" id="cancelEditButton">{{close_label}}</button>
</div>
<div class="modal-toolbar">
<button type="button" id="versionNewerButton">{{newer_previous_label}}</button>
<button type="button" id="versionOlderButton">{{older_previous_label}}</button>
<label>
{{diff_view_label}}
<select id="diffMode">
<option value="plain">{{diff_plain_label}}</option>
<option value="all" selected>{{diff_all_label}}</option>
<option value="same">{{diff_same_label}}</option>
<option value="added">{{diff_added_label}}</option>
<option value="deleted">{{diff_deleted_label}}</option>
<option value="changed">{{diff_changed_label}}</option>
</select>
</label>
<span id="versionIndicator" class="version-meta"></span>
</div>
<div class="modal-body">
<div class="edit-pane">
<div class="modal-form-grid">
<label>
{{name_label}}<br>
<input type="text" id="modalName" name="name">
</label>
<label>
{{language_label}}<br>
<select id="modalLanguage" name="language">
{{{language_options_plain_html}}}
</select>
</label>
</div>
<div id="defaultKeyRow" class="default-key-row">
<label>
{{default_key_label}}<br>
<input type="text" id="modalDefaultKey" name="default_key">
</label>
</div>
<label class="content-label">
<span>{{prompt_content_label}}</span>
<textarea id="modalContent" name="content"></textarea>
</label>
</div>
<div class="version-pane">
<div>
<strong>{{previous_version_label}}</strong>
<div id="selectedVersionMeta" class="version-meta"></div>
</div>
<div class="version-content" id="versionContent"></div>
</div>
</div>
<div class="modal-footer">
<input type="hidden" id="modalAction" name="action" value="">
<input type="hidden" id="modalPromptId" name="prompt_id" value="">
<input type="hidden" id="modalDefaultId" name="default_id" value="">
<label>
<input type="checkbox" name="create_version" value="1" checked>
{{store_version_label}}
</label>
<label>
{{version_note_label}}
<input type="text" name="version_note" value="editor edit">
</label>
<button type="submit">{{save_label}}</button>
<button type="button" id="snapshotButton">{{store_snapshot_label}}</button>
<button type="button" id="restoreVersionButton">{{restore_version_label}}</button>
<button type="button" id="deleteVersionButton">{{delete_version_label}}</button>
</div>
</form>
</div>
</div>
<form id="modalAuxForm" method="post" action="/prompts?lang={{language_url}}&mode={{mode_url}}" class="hidden">
<input type="hidden" id="auxAction" name="action" value="">
<input type="hidden" id="auxPromptId" name="prompt_id" value="">
<input type="hidden" id="auxDefaultId" name="default_id" value="">
<input type="hidden" id="auxVersionNo" name="version_no" value="">
<input type="hidden" id="auxVersionNote" name="version_note" value="">
</form>
<script type="application/json" id="promptDataJson">
{{{prompt_data_json}}}
</script>
<script type="application/json" id="promptTextJson">
{{{prompt_text_json}}}
</script>
<script src="/js/prompt-editor.js?v={{prompt_editor_version}}" defer></script>
</body>
</html>
===
{
"translations": {
"prompts.title": {
"en": "Prompt administration",
"nl": "Promptbeheer"
},
"prompts.back": {
"en": "Back to Racket sandbox",
"nl": "Terug naar Racket sandbox"
},
"prompts.your_prompts": {
"en": "Your prompts",
"nl": "Jouw prompts"
},
"prompts.default_admin": {
"en": "Default prompt administration",
"nl": "Standaardpromptbeheer"
},
"prompts.language": {
"en": "Language",
"nl": "Taal"
},
"prompts.available_defaults": {
"en": "Available default prompts",
"nl": "Beschikbare standaardprompts"
},
"prompts.default_admin_badge": {
"en": "Admin default prompts",
"nl": "Admin standaardprompts"
},
"prompts.default_admin_hint": {
"en": "Defaults are shared with every user and can be copied into personal prompts.",
"nl": "Standaarden worden gedeeld met alle gebruikers en kunnen naar persoonlijke prompts worden gekopieerd."
},
"prompts.copy_all": {
"en": "Copy all",
"nl": "Alles kopieren"
},
"prompts.copy": {
"en": "copy",
"nl": "kopieer"
},
"prompts.delete": {
"en": "delete",
"nl": "verwijder"
},
"prompts.create_default": {
"en": "Create default prompt",
"nl": "Standaardprompt maken"
},
"prompts.create_personal": {
"en": "Create personal prompt",
"nl": "Persoonlijke prompt maken"
},
"prompts.name": {
"en": "Name",
"nl": "Naam"
},
"prompts.default_key": {
"en": "Default key",
"nl": "Standaardsleutel"
},
"prompts.prompt_content": {
"en": "Prompt content",
"nl": "Promptinhoud"
},
"prompts.no_defaults": {
"en": "No default prompts for this language yet.",
"nl": "Nog geen standaardprompts voor deze taal."
},
"prompts.no_personal": {
"en": "No personal prompts yet for this language.",
"nl": "Nog geen persoonlijke prompts voor deze taal."
},
"prompts.select_prompt": {
"en": "Select a prompt on the left to view it.",
"nl": "Selecteer links een prompt om deze te bekijken."
},
"prompts.edit": {
"en": "Edit",
"nl": "Bewerk"
},
"prompts.close": {
"en": "Close",
"nl": "Sluiten"
},
"prompts.newer_previous": {
"en": "newer previous version",
"nl": "nieuwere vorige versie"
},
"prompts.older_previous": {
"en": "older previous version",
"nl": "oudere vorige versie"
},
"prompts.diff_view": {
"en": "Diff view:",
"nl": "Verschilweergave:"
},
"prompts.diff_plain": {
"en": "text, no diff",
"nl": "tekst, geen verschil"
},
"prompts.diff_all": {
"en": "all diff",
"nl": "alle verschillen"
},
"prompts.diff_same": {
"en": "unchanged only",
"nl": "alleen ongewijzigd"
},
"prompts.diff_added": {
"en": "additions only",
"nl": "alleen toevoegingen"
},
"prompts.diff_deleted": {
"en": "deletions only",
"nl": "alleen verwijderingen"
},
"prompts.diff_changed": {
"en": "changes only",
"nl": "alleen wijzigingen"
},
"prompts.previous_version": {
"en": "Previous version",
"nl": "Vorige versie"
},
"prompts.store_version": {
"en": "store this edit as a new version",
"nl": "bewaar deze bewerking als nieuwe versie"
},
"prompts.version_note": {
"en": "Version note:",
"nl": "Versienotitie:"
},
"prompts.save": {
"en": "Save",
"nl": "Opslaan"
},
"prompts.store_snapshot": {
"en": "Store snapshot",
"nl": "Snapshot bewaren"
},
"prompts.restore_version": {
"en": "Restore selected version",
"nl": "Geselecteerde versie herstellen"
},
"prompts.delete_version": {
"en": "Delete selected version",
"nl": "Geselecteerde versie verwijderen"
},
"prompts.prompt": {
"en": "Prompt",
"nl": "Prompt"
},
"prompts.prompt_not_found": {
"en": "Prompt not found",
"nl": "Prompt niet gevonden"
},
"prompts.no_previous_versions": {
"en": "No previous versions stored.",
"nl": "Geen vorige versies opgeslagen."
},
"prompts.no_lines_for_view": {
"en": "No lines for this view.",
"nl": "Geen regels voor deze weergave."
},
"prompts.restore_version_confirm": {
"en": "Restore version",
"nl": "Versie herstellen"
},
"prompts.delete_version_confirm": {
"en": "Delete version",
"nl": "Versie verwijderen"
},
"prompts.delete_default_confirm": {
"en": "Delete default prompt {{name}}?",
"nl": "Standaardprompt {{name}} verwijderen?"
},
"prompts.delete_prompt_confirm": {
"en": "Delete prompt {{name}}?",
"nl": "Prompt {{name}} verwijderen?"
},
"prompts.default_metadata": {
"en": "{{default_key}} · {{updated_at}}",
"nl": "{{default_key}} · {{updated_at}}"
},
"prompts.personal_metadata": {
"en": "{{language}} · {{updated_at}}",
"nl": "{{language}} · {{updated_at}}"
},
"prompts.default_prompt_prefix": {
"en": "Default prompt: ",
"nl": "Standaardprompt: "
},
"prompts.prompt_prefix": {
"en": "Prompt: ",
"nl": "Prompt: "
},
"prompts.created": {
"en": "created",
"nl": "gemaakt"
},
"prompts.updated": {
"en": "updated",
"nl": "bijgewerkt"
},
"prompts.default_prompt": {
"en": "default prompt",
"nl": "standaardprompt"
},
"prompts.version": {
"en": "version",
"nl": "versie"
},
"prompts.showing_version": {
"en": "showing version",
"nl": "toont versie"
},
"prompts.of": {
"en": "of",
"nl": "van"
},
"prompts.old": {
"en": "old",
"nl": "oud"
},
"prompts.new": {
"en": "new",
"nl": "nieuw"
},
"prompts.unknown_action": {
"en": "Unknown action: {{action}}",
"nl": "Onbekende actie: {{action}}"
},
"app.admin": {
"en": "admin",
"nl": "admin"
},
"app.user_management": {
"en": "User management",
"nl": "Gebruikersbeheer"
},
"app.configuration": {
"en": "Configuration",
"nl": "Configuratie"
},
"app.logout": {
"en": "Logout",
"nl": "Uitloggen"
}
}
}