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
+60 -128
View File
@@ -9,11 +9,9 @@ require_once __DIR__ . '/private/auth.php';
require_once __DIR__ . '/private/header.php';
require_once __DIR__ . '/private/languagestore.php';
require_once __DIR__ . '/private/usersettings.php';
require_once __DIR__ . '/private/viewdata.php';
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
ini_set('log_errors', '1');
error_reporting(E_ALL);
require_once __DIR__ . '/config/reporting.php';
$DB_FILE = __DIR__ . '/data/racket-sandbox.sqlite';
@@ -30,11 +28,11 @@ function h($s)
return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
function t($key, $fallback = null)
function t($key, $fallback = null, $values = array())
{
global $languageStore, $language;
return $languageStore->translate($key, $language, $fallback);
return $languageStore->translateFormat($key, $language, $values, $fallback);
}
function post_value($name, $default = '')
@@ -77,37 +75,7 @@ $language = resolve_user_language(
$languageStore->supportedLanguages()
);
$languageStore->seedDefaults(array(
'app.title' => array('en' => 'Racket sandbox', 'nl' => 'Racket sandbox'),
'app.manage_prompts' => array('en' => 'Manage prompts', 'nl' => 'Prompts beheren'),
'app.user_management' => array('en' => 'User management', 'nl' => 'Gebruikersbeheer'),
'app.logout' => array('en' => 'Logout', 'nl' => 'Uitloggen'),
'app.language' => array('en' => 'Language', 'nl' => 'Taal'),
'app.logged_in_as' => array('en' => 'Logged in as:', 'nl' => 'Ingelogd als:'),
'app.admin' => array('en' => 'Admin', 'nl' => 'Admin'),
'app.enabled' => array('en' => 'Enabled', 'nl' => 'Ingeschakeld'),
'app.full_name' => array('en' => 'Full name', 'nl' => 'Volledige naam'),
'app.email' => array('en' => 'Email', 'nl' => 'E-mail'),
'app.password' => array('en' => 'Password', 'nl' => 'Wachtwoord'),
'app.new_password' => array('en' => 'New password', 'nl' => 'Nieuw wachtwoord'),
'app.created' => array('en' => 'Created', 'nl' => 'Gemaakt'),
'app.last_login' => array('en' => 'Last login', 'nl' => 'Laatste login'),
'app.actions' => array('en' => 'Actions', 'nl' => 'Acties'),
'app.create_user' => array('en' => 'Create user', 'nl' => 'Gebruiker aanmaken'),
'app.update_user' => array('en' => 'Update user', 'nl' => 'Gebruiker aanpassen'),
'app.change_password' => array('en' => 'Change password', 'nl' => 'Wachtwoord wijzigen'),
'app.delete_user' => array('en' => 'Delete user', 'nl' => 'Gebruiker verwijderen'),
'app.delete_user_confirm' => array('en' => 'Delete user', 'nl' => 'Gebruiker verwijderen'),
'app.cannot_delete_self' => array('en' => 'You cannot delete your own account.', 'nl' => 'Je kunt je eigen account niet verwijderen.'),
'app.cannot_disable_self' => array('en' => 'You cannot disable your own account.', 'nl' => 'Je kunt je eigen account niet uitschakelen.'),
'app.cannot_remove_own_admin' => array('en' => 'You cannot remove your own admin rights.', 'nl' => 'Je kunt je eigen adminrechten niet verwijderen.'),
'app.user_created' => array('en' => 'User created.', 'nl' => 'Gebruiker aangemaakt.'),
'app.user_updated' => array('en' => 'User updated.', 'nl' => 'Gebruiker aangepast.'),
'app.password_changed' => array('en' => 'Password changed.', 'nl' => 'Wachtwoord gewijzigd.'),
'app.user_deleted' => array('en' => 'User deleted.', 'nl' => 'Gebruiker verwijderd.'),
'app.back_to_sandbox' => array('en' => 'Back to Racket sandbox', 'nl' => 'Terug naar Racket sandbox'),
'app.configuration' => array('en' => 'Configuration', 'nl' => 'Configuratie'),
));
seed_template_translations($languageStore, 'users.html');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = post_value('action');
@@ -169,20 +137,46 @@ foreach ($languageStore->supportedLanguages() as $lang) {
}
header('Content-Type: text/html; charset=utf-8');
?>
<!doctype html>
<html lang="<?= h($language) ?>">
<head>
<meta charset="utf-8">
<title><?= h(t('app.user_management', 'User management')) ?></title>
<link rel="stylesheet" href="/styles.css">
</head>
<body>
$userRowsHtml = '';
<div class="page">
foreach ($users as $managedUser) {
if ($managedUser->id() !== $currentUser->id()) {
$deleteHtml = RacketSandboxTemplate::renderFile('partials/user-delete-form.html', array(
'language_url' => rawurlencode($language),
'confirm_json' => json_encode(t('app.delete_user_confirm', 'Delete user {{email}}?', array(
'email' => $managedUser->email(),
)), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT),
'email' => $managedUser->email(),
'user_id' => $managedUser->id(),
'delete_user_label' => t('app.delete_user', 'Delete user'),
));
} else {
$deleteHtml = RacketSandboxTemplate::renderFile('partials/user-self-note.html', array(
'cannot_delete_self' => t('app.cannot_delete_self', 'You cannot delete your own account.'),
));
}
<?php
render_app_header(array(
$userRowsHtml .= RacketSandboxTemplate::renderFile('partials/user-row.html', array(
'language_url' => rawurlencode($language),
'user_id' => $managedUser->id(),
'full_name_label' => t('app.full_name', 'Full name'),
'full_name' => $managedUser->fullName(),
'email_label' => t('app.email', 'Email'),
'email' => $managedUser->email(),
'admin_label' => t('app.admin', 'Admin'),
'enabled_label' => t('app.enabled', 'Enabled'),
'is_admin_checked' => $managedUser->isAdmin() ? ' checked' : '',
'is_enabled_checked' => $managedUser->isEnabled() ? ' checked' : '',
'created_at' => fmt_time($managedUser->createdAt()),
'last_login_at' => fmt_time($managedUser->lastLoginAt()),
'update_user_label' => t('app.update_user', 'Update user'),
'new_password_label' => t('app.new_password', 'New password'),
'change_password_label' => t('app.change_password', 'Change password'),
'delete_html' => $deleteHtml,
)) . "\n";
}
$headerHtml = app_header_html(array(
'title' => t('app.user_management', 'User management'),
'nav_items' => array(
array('label' => t('app.back_to_sandbox', 'Back to Racket sandbox'), 'url' => '/?lang=' . rawurlencode($language)),
@@ -215,83 +209,21 @@ render_app_header(array(
'message' => $message,
'error' => $error,
));
?>
<main class="page-main dashboard-main">
<section class="panel">
<h2><?= h(t('app.create_user', 'Create user')) ?></h2>
<form method="post" action="/users?lang=<?= h($language) ?>" class="admin-form-grid">
<input type="hidden" name="action" value="create_user">
<label><?= h(t('app.full_name', 'Full name')) ?><br><input type="text" name="full_name" required></label>
<label><?= h(t('app.email', 'Email')) ?><br><input type="email" name="email" required></label>
<label><?= h(t('app.password', 'Password')) ?><br><input type="password" name="password" autocomplete="new-password" required></label>
<label><input type="checkbox" name="is_admin" value="1"> <?= h(t('app.admin', 'Admin')) ?></label>
<label><input type="checkbox" name="is_enabled" value="1" checked> <?= h(t('app.enabled', 'Enabled')) ?></label>
<button type="submit"><?= h(t('app.create_user', 'Create user')) ?></button>
</form>
</section>
<section class="panel">
<h2><?= h(t('app.user_management', 'User management')) ?></h2>
<table>
<thead>
<tr>
<th><?= h(t('app.full_name', 'Full name')) ?></th>
<th><?= h(t('app.email', 'Email')) ?></th>
<th><?= h(t('app.admin', 'Admin')) ?></th>
<th><?= h(t('app.enabled', 'Enabled')) ?></th>
<th><?= h(t('app.created', 'Created')) ?></th>
<th><?= h(t('app.last_login', 'Last login')) ?></th>
<th><?= h(t('app.actions', 'Actions')) ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $managedUser): ?>
<tr>
<td colspan="7">
<form method="post" action="/users?lang=<?= h($language) ?>" class="user-row-form">
<input type="hidden" name="action" value="update_user">
<input type="hidden" name="user_id" value="<?= h($managedUser->id()) ?>">
<label><?= h(t('app.full_name', 'Full name')) ?><br><input type="text" name="full_name" value="<?= h($managedUser->fullName()) ?>" required></label>
<label><?= h(t('app.email', 'Email')) ?><br><input type="email" name="email" value="<?= h($managedUser->email()) ?>" required></label>
<label><input type="checkbox" name="is_admin" value="1" <?= $managedUser->isAdmin() ? 'checked' : '' ?>> <?= h(t('app.admin', 'Admin')) ?></label>
<label><input type="checkbox" name="is_enabled" value="1" <?= $managedUser->isEnabled() ? 'checked' : '' ?>> <?= h(t('app.enabled', 'Enabled')) ?></label>
<span><?= h(fmt_time($managedUser->createdAt())) ?></span>
<span><?= h(fmt_time($managedUser->lastLoginAt())) ?></span>
<button type="submit"><?= h(t('app.update_user', 'Update user')) ?></button>
</form>
<div class="user-row-actions">
<form method="post" action="/users?lang=<?= h($language) ?>">
<input type="hidden" name="action" value="set_password">
<input type="hidden" name="email" value="<?= h($managedUser->email()) ?>">
<label><?= h(t('app.new_password', 'New password')) ?><br><input type="password" name="password" autocomplete="new-password"></label>
<button type="submit"><?= h(t('app.change_password', 'Change password')) ?></button>
</form>
<?php if ($managedUser->id() !== $currentUser->id()): ?>
<form method="post" action="/users?lang=<?= h($language) ?>"
onsubmit="return confirm('<?= h(t('app.delete_user_confirm', 'Delete user')) ?> <?= h($managedUser->email()) ?>?');">
<input type="hidden" name="action" value="delete_user">
<input type="hidden" name="user_id" value="<?= h($managedUser->id()) ?>">
<button type="submit"><?= h(t('app.delete_user', 'Delete user')) ?></button>
</form>
<?php else: ?>
<p class="small"><?= h(t('app.cannot_delete_self', 'You cannot delete your own account.')) ?></p>
<?php endif; ?>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</section>
</main>
</div>
</body>
</html>
echo RacketSandboxTemplate::renderFile('users.html', array(
'language' => $language,
'language_url' => rawurlencode($language),
'title' => t('app.user_management', 'User management'),
'header_html' => $headerHtml,
'create_user_label' => t('app.create_user', 'Create user'),
'full_name_label' => t('app.full_name', 'Full name'),
'email_label' => t('app.email', 'Email'),
'password_label' => t('app.password', 'Password'),
'admin_label' => t('app.admin', 'Admin'),
'enabled_label' => t('app.enabled', 'Enabled'),
'user_management_label' => t('app.user_management', 'User management'),
'created_label' => t('app.created', 'Created'),
'last_login_label' => t('app.last_login', 'Last login'),
'actions_label' => t('app.actions', 'Actions'),
'user_rows_html' => $userRowsHtml,
));