Gate STO workplace by role
Some checks failed
ci / test (push) Has been cancelled

This commit is contained in:
VPN SaaS Dev
2026-05-16 10:33:33 +09:00
parent 83ad880b9d
commit ac5845d5a0
10 changed files with 1612 additions and 593 deletions

103
web/sto.html Normal file
View File

@@ -0,0 +1,103 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#16806a" />
<title>Панель СТО</title>
<link rel="manifest" href="/manifest.webmanifest" />
<link rel="stylesheet" href="/static/styles.css" />
<script src="https://telegram.org/js/telegram-web-app.js"></script>
</head>
<body class="auth-required sto-page">
<div class="auth-overlay" id="authOverlay">
<div class="auth-panel">
<p class="eyebrow">CarPass</p>
<h1>Панель СТО</h1>
<p id="authMessage">Откройте страницу через Telegram-бота, чтобы подтвердить доступ к рабочему месту.</p>
<div class="auth-actions">
<a id="telegramLoginLink" class="telegram-login-link hidden" href="#" rel="noreferrer">Открыть в Telegram</a>
<button id="telegramRetryBtn" class="telegram-secondary-btn" type="button">Проверить вход</button>
</div>
<div id="telegramLoginSlot" class="telegram-login-slot"></div>
</div>
</div>
<main class="shell sto-shell">
<header class="topbar">
<div>
<p class="eyebrow">CarPass Business</p>
<h1>Панель СТО</h1>
</div>
<div class="top-actions">
<select id="centerSelect" aria-label="СТО"></select>
<button class="icon-btn" id="refreshBtn" title="Обновить" aria-label="Обновить"></button>
</div>
</header>
<section class="passport-panel sto-hero">
<div class="passport-head">
<div>
<p class="eyebrow">Рабочее место</p>
<h2 id="centerTitle">СТО</h2>
<small id="centerMeta">Загружаю доступ...</small>
</div>
<span class="trust-badge" id="roleBadge">Проверка</span>
</div>
</section>
<section class="stats mini-stats" id="dashboardStats"></section>
<section class="sto-grid">
<section class="workspace">
<div class="section-head">
<div>
<p class="eyebrow">Приемка</p>
<h2>Записи клиентов</h2>
</div>
</div>
<div id="appointmentsList" class="stack-list"></div>
</section>
<section class="workspace">
<div class="section-head">
<div>
<p class="eyebrow">Работы</p>
<h2>Заказ-наряды</h2>
</div>
</div>
<div id="workOrdersList" class="stack-list"></div>
</section>
<section class="workspace" id="staffPanel">
<div class="section-head">
<div>
<p class="eyebrow">Кадры</p>
<h2>Сотрудники</h2>
</div>
</div>
<form id="inviteForm" class="grid-form drawer-form staff-form">
<label>
Telegram ID сотрудника
<input name="telegram_id" type="number" required />
</label>
<label>
Роль
<select name="role">
<option value="mechanic">Механик</option>
<option value="receptionist">Администратор</option>
<option value="manager">Менеджер</option>
</select>
</label>
<button type="submit">Пригласить</button>
</form>
<div id="inviteResult" class="tip-card hidden"></div>
<div id="employeesList" class="stack-list"></div>
</section>
</section>
</main>
<div class="toast hidden" id="toast" role="status" aria-live="polite"></div>
<script src="/static/sto.js"></script>
</body>
</html>