vasyansk
be408a216c
feat(web): Selectel service-user account form (IAM credentials)
...
Replace the single API-key field with 4 IAM service-user fields
(username, password, account_id, project_name) matching the new
backend contract; map 400 "invalid provider credentials" to a
user-facing message.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
2026-07-04 20:23:34 +07:00
vasyansk
7256adf637
fix(web): scope Suspense to page body; guard formatConfig against null config
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-04 16:12:21 +07:00
vasyansk
8c35aed8f2
perf(web): route-level code-splitting; harden channel config rendering
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
2026-07-04 16:04:17 +07:00
vasyansk
34422420ca
feat(web): расписание, каналы уведомлений, история проверок, drift-badge
2026-07-04 14:40:29 +07:00
vasyansk
45259b9720
feat(web,api): клиент/хуки расписания/каналов/истории + lastCheckStatus в domainResponse
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
2026-07-04 14:24:02 +07:00
vasyansk
901eb51e2a
fix(auth): серверная проверка длины пароля, loading-guard и различение ошибок на auth-страницах
2026-07-03 21:33:03 +07:00
vasyansk
5a4d560e70
feat(web): Login/Register страницы, protected routes, logout
...
- ProtectedRoute: loading -> спиннер, !user -> /login, иначе children
- LoginPage/RegisterPage: field+react-hook-form/zod, ошибка через role=alert,
редирект на /domains при успехе/уже авторизован
- main.tsx: AuthProvider + QueryCache/MutationCache onError -> notifyUnauthorized
на UnauthorizedError (сброс сессии из кода вне React-дерева)
- AuthContext: logout и notifyUnauthorized чистят react-query кэш (qc.clear())
- Layout: email пользователя + кнопка Выйти
- App: /login и /register публичные (авторизованный -> /domains), остальное
под ProtectedRoute
Починка page-тестов (Accounts/Domains/Templates/DomainDiff/App): AuthProvider
+ мок api.auth.me, спай-ассерты обновлены под projectId-первым-аргументом
сигнатур api.* (T5).
2026-07-03 21:21:29 +07:00
vasyansk
222d6c0453
fix(web): null-guard в мутациях (no active project), AuthContext различает 401 и ошибки сервера
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
2026-07-03 21:07:48 +07:00
vasyansk
b5d9e8f7ab
feat(web): AuthContext + клиент под cookie-сессии, projectId из контекста
2026-07-03 21:00:18 +07:00
vasyansk
388bf4aeb6
fix(web): валидация записей шаблона — пустые values не уходят в API, ошибки видимы
2026-07-03 18:10:10 +07:00
vasyansk
99e09d35fb
feat(web): TemplatesPage + RecordEditor — CRUD шаблонов с редактором записей
2026-07-03 18:02:08 +07:00
vasyansk
4e91211a89
feat(web): AccountsPage — CRUD учёток, secret-форма, инструкция Selectel
2026-07-03 17:52:59 +07:00
vasyansk
ef003230fa
fix(web): DomainsPage показывает ошибки привязки шаблона и удаления
2026-07-03 17:49:48 +07:00
vasyansk
0ce15d30a8
feat(web): DomainsPage — список, импорт зон, привязка шаблона
2026-07-03 17:43:49 +07:00
vasyansk
1412da9a31
feat(web): DiffView + DomainDiffPage с prune-guard по умолчанию выключенным
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
2026-07-03 17:32:20 +07:00
vasyansk
267ffc4ed9
fix(web): Domain.templateId опционален (Go omitempty), String() на error
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-03 17:19:51 +07:00
vasyansk
6f82036e38
feat(web): типизированный API-клиент, типы DTO, TanStack Query хуки
2026-07-03 17:14:11 +07:00
vasyansk
41242973e1
feat(web): scaffold Vite+React+TS, Tailwind v4, shadcn, router, тёмная console-тема
2026-07-03 17:06:23 +07:00