ken_nogi/NodeSrv/apps/app-portal/src/adminView.js
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。
NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは
別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter
インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 15:37:06 +09:00

63 lines
1.6 KiB
JavaScript

function escapeHtml(value) {
return String(value)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
function renderLoginPage(errorMessage) {
const errorHtml = errorMessage ? `<p class="error">${escapeHtml(errorMessage)}</p>` : '';
return `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>App Portal Admin Login</title>
</head>
<body>
<h1>Admin Login</h1>
${errorHtml}
<form method="POST" action="/admin/login">
<input type="password" name="masterKey" placeholder="Master Key" required>
<button type="submit">Login</button>
</form>
</body>
</html>`;
}
function renderAdminPage(emails, errorMessage) {
const errorHtml = errorMessage ? `<p class="error">${escapeHtml(errorMessage)}</p>` : '';
const rows = emails
.map(
(email) => `<li>
${escapeHtml(email)}
<form method="POST" action="/admin/allowlist/remove" style="display:inline">
<input type="hidden" name="email" value="${escapeHtml(email)}">
<button type="submit">削除</button>
</form>
</li>`
)
.join('\n');
return `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Allowlist Admin</title>
</head>
<body>
<h1>Allowlist Admin</h1>
${errorHtml}
<ul>${rows}</ul>
<form method="POST" action="/admin/allowlist/add">
<input type="email" name="email" placeholder="user@example.com" required>
<button type="submit">追加</button>
</form>
<form method="POST" action="/admin/logout">
<button type="submit">ログアウト</button>
</form>
</body>
</html>`;
}
module.exports = { renderLoginPage, renderAdminPage };