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:
@@ -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,
|
||||
));
|
||||
|
||||
Reference in New Issue
Block a user