v0.1.31: админский UI /admin, юзерский UI без слова «тенант»

This commit is contained in:
“Naeel”
2026-08-14 10:19:35 +04:00
parent e83ae1e376
commit afa9a1a7e4
5 changed files with 443 additions and 15 deletions
+9 -13
View File
@@ -374,17 +374,17 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
<button class="btn btn-primary" style="width:100%" onclick="doLogin()">Войти</button>
<p style="font-size:12px;color:var(--text-secondary);margin-top:16px">
Для демо используйте token: demo-ui-shared-sqs-ngcloud-2026.<br>
Для личного tenant-а используйте API token из панели Nubes.
Для личного аккаунта используйте API token из панели Nubes.
</p>
<div style="margin-top:24px;text-align:left;font-size:12px;color:var(--text-secondary);border-top:1px solid var(--border);padding-top:16px;line-height:1.7">
<div style="font-weight:700;color:var(--text-primary);margin-bottom:6px;letter-spacing:0.5px">Информация о сервисе</div>
<div>Endpoint: <span style="color:var(--accent);font-family:monospace">https://sqs.containerk8s.dev.nubes.ru</span></div>
<div>Health: <span style="font-family:monospace">GET /health</span> · Метрики: <span style="font-family:monospace">GET /metrics</span></div>
<div>SQS API: <span style="font-family:monospace">POST /</span> (AWS Signature V4, регион <span style="font-family:monospace">us-east-1</span>)</div>
<div>Admin API: <span style="font-family:monospace">POST /admin/tenants</span> (Bearer token)</div>
<div>Админ-консоль: <a href="/admin">/admin</a> (вход по admin-токену)</div>
<div>Realm: <span style="font-family:monospace">iot-naeel</span> · Persistence: Managed Redis</div>
<div>Версия: <span id="svc-version" style="font-family:monospace">—</span></div>
<div>Образ: <span style="font-family:monospace">naeel/shared-sqs:v0.1.29</span></div>
<div>Образ: <span style="font-family:monospace">naeel/shared-sqs:v0.1.31</span></div>
<div style="margin-top:8px;color:var(--warning)">Статус: тестирование</div>
</div>
</div>
@@ -413,7 +413,7 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
<!-- ===== CREATE TENANT MODAL ===== -->
<div id="modal-create" class="modal-overlay hidden" onclick="if(event.target===this)closeModal()">
<div class="modal">
<h2>Создать тенанта</h2>
<h2>Создать аккаунт</h2>
<div class="form-group">
<label for="ct-name">Имя</label>
<input id="ct-name" placeholder="my-service">
@@ -435,7 +435,7 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
<div class="modal">
<h2>Credentials</h2>
<div class="creds-hint">
<p class="warn">⚠ Сохраните ключи — это креды вашего тенанта для AWS CLI/SDK.</p>
<p class="warn">⚠ Сохраните ключи — это креды вашего аккаунта для AWS CLI/SDK.</p>
<p><strong>Зачем:</strong> приложения подключаются к SQS API по протоколу AWS (подпись Signature V4). Токен входа в консоль для этого не подходит.</p>
<p><strong>Что делать:</strong> укажите ключи одним из двух способов:</p>
<p class="creds-sub">Способ 1 — переменные окружения:</p>
@@ -660,10 +660,6 @@ function renderDashboard(health, tenants) {
const el = document.getElementById('view-dashboard');
el.innerHTML = `
<div class="stats-grid">
<div class="stat-card">
<div class="stat-value">${health.tenant_count || 0}</div>
<div class="stat-label">Тенанты</div>
</div>
<div class="stat-card">
<div class="stat-value">${health.queue_count || 0}</div>
<div class="stat-label">Очереди</div>
@@ -683,7 +679,7 @@ function renderDashboard(health, tenants) {
</div>
<div class="card">
<div class="toolbar">
<h2>Мой tenant</h2>
<h2>Мой аккаунт</h2>
<div style="display:flex;gap:12px;align-items:center">
<div class="auto-refresh">
<span>⟳ 10с</span>
@@ -711,7 +707,7 @@ function renderDashboard(health, tenants) {
<td style="font-size:12px;color:var(--text-secondary)">${fmtDate(t.created_at)}</td>
</tr>
`).join('')}
${(!tenants || tenants.length === 0) ? '<tr><td colspan="4" style="text-align:center;color:var(--text-secondary);padding:32px">Tenant не найден</td></tr>' : ''}
${(!tenants || tenants.length === 0) ? '<tr><td colspan="4" style="text-align:center;color:var(--text-secondary);padding:32px">Аккаунт не найден</td></tr>' : ''}
</tbody>
</table>
</div>
@@ -746,7 +742,7 @@ function renderTenant(tenant, queues) {
const totalMsgs = (queues || []).reduce((s, q) => s + q.messages + q.not_visible, 0);
el.innerHTML = `
<div class="breadcrumb">
<a href="#" onclick="event.preventDefault();showDashboard()">Мой tenant</a>
<a href="#" onclick="event.preventDefault();showDashboard()">Мой аккаунт</a>
<span>›</span>
${esc(tenant.name)}
</div>
@@ -875,7 +871,7 @@ function showCredentials() {
// deleteTenant — DELETE /tenants/{id} с подтверждением
function deleteTenant(id, name) {
if (!confirm('Удалить тенанта "' + name + '"?\nВсе его очереди будут удалены.')) return;
if (!confirm('Удалить аккаунт "' + name + '"?\nВсе очереди будут удалены.')) return;
api('/tenants/' + id, { method: 'DELETE' })
.then(() => loadDashboard())
.catch(err => alert('Ошибка удаления: ' + err.message));