fix(scrapers/ui): дедуп queryKey cian test-auth + a11y (th scope, табы ARIA, статус-точки aria-label)
All checks were successful
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / openapi-codegen-check (pull_request) Has been skipped

- cian/page.tsx: отдельный queryKey ["cian-test-auth", "manual"] для ручного
  testAuthQuery в CianCookiesSection — устраняет кросс-контаминацию с автопуллингом
  useTestAuth() (refetchInterval:60s) и ручной кнопкой "Test Current Session"
- RunsTable.tsx, ScraperPage.tsx (RunsLogSection), ProxyHealthCard.tsx:
  scope="col" на все <th> в thead — соответствие WCAG SC 1.3.1 (Info and Relationships)
- Topbar.tsx: aria-current="page" на активный nav-link вместо tablist/tabpanel —
  корректный паттерн для link-based навигации между отдельными страницами
- ProxyHealthCard.tsx: role="img" + aria-label на цветовые dot-индикаторы статуса
  browser-инстансов — цвет больше не единственный носитель смысла (WCAG 1.4.1)
This commit is contained in:
bot-backend 2026-06-20 10:14:58 +03:00
parent 7639dfe5fd
commit fa65c3f212
5 changed files with 26 additions and 23 deletions

View file

@ -325,16 +325,16 @@ function RunsLogSection({ source }: RunsLogSectionProps) {
<table className="runs-table">
<thead>
<tr>
<th>#</th>
<th>Статус</th>
<th>Старт</th>
<th>Heartbeat</th>
<th>Anchors</th>
<th>Lots</th>
<th>Houses</th>
<th>Detail</th>
<th>Errors</th>
<th>Действие</th>
<th scope="col">#</th>
<th scope="col">Статус</th>
<th scope="col">Старт</th>
<th scope="col">Heartbeat</th>
<th scope="col">Anchors</th>
<th scope="col">Lots</th>
<th scope="col">Houses</th>
<th scope="col">Detail</th>
<th scope="col">Errors</th>
<th scope="col">Действие</th>
</tr>
</thead>
<tbody>

View file

@ -238,7 +238,7 @@ function CianCookiesSection() {
});
const testAuthQuery = useQuery({
queryKey: ["cian-test-auth"],
queryKey: ["cian-test-auth", "manual"],
queryFn: () =>
apiFetch<TestAuthResp>("/api/v1/admin/scrape/cian/test-auth"),
enabled: false,

View file

@ -279,6 +279,8 @@ export function SystemHealthSection() {
{name}:
</span>
<span
role="img"
aria-label={ok ? "статус: доступен" : "статус: недоступен"}
style={{
width: 8,
height: 8,
@ -299,11 +301,11 @@ export function SystemHealthSection() {
<table className="runs-table">
<thead>
<tr>
<th>Провайдер</th>
<th>Прокси (host:port)</th>
<th>Текущий IP</th>
<th>Режим</th>
<th>Действие</th>
<th scope="col">Провайдер</th>
<th scope="col">Прокси (host:port)</th>
<th scope="col">Текущий IP</th>
<th scope="col">Режим</th>
<th scope="col">Действие</th>
</tr>
</thead>
<tbody>

View file

@ -238,13 +238,13 @@ export function RunsTable({ source }: RunsTableProps) {
<table className="runs-table">
<thead>
<tr>
<th>#</th>
<th>Тип</th>
<th>Статус</th>
<th>Старт</th>
<th>Финиш</th>
<th>Лоты / Ошибки</th>
<th>Действие</th>
<th scope="col">#</th>
<th scope="col">Тип</th>
<th scope="col">Статус</th>
<th scope="col">Старт</th>
<th scope="col">Финиш</th>
<th scope="col">Лоты / Ошибки</th>
<th scope="col">Действие</th>
</tr>
</thead>
<tbody>

View file

@ -140,6 +140,7 @@ export function Topbar({ active }: TopbarProps) {
key={item.key}
href={`${API_BASE_URL}${item.href}`}
className={item.key === active ? "is-active" : undefined}
aria-current={item.key === active ? "page" : undefined}
>
{item.label}
</a>