#region UxReference [C:3] [TYPE ADR] [SEMANTICS ux, reference, task, status, monitoring] @BRIEF UX interaction reference — операторский центр просмотра статусов всех фоновых задач superset-tools. Описывает персону, потоки взаимодействия, состояния интерфейса и сценарии восстановления. **Feature Branch**: `034-task-status-center` **Created**: 2026-06-18 | **Status**: Draft ## 1. User Persona & Context * **Who is the user?**: DevOps-инженер или администратор superset-tools, отвечающий за мониторинг фоновых операций: переводы контента БД, миграции дашбордов между средами, резервное копирование, LLM-валидацию дашбордов. * **What is their goal?**: В одном месте быстро оценить состояние всех фоновых задач системы — что выполняется, что ждёт очереди, что упало; найти конкретную задачу и перейти к её логам для диагностики. * **Context**: Работа в браузере (десктоп, планшет) в корпоративной сети. Пользователь может находиться на любой странице superset-tools и перейти в раздел «Отчёты» (`/reports`) через навигацию. Страница `/reports` перерабатывается: существующий список отчётов дополняется сводной панелью и real-time обновлениями. ## 2. The "Happy Path" Narrative Администратор открывает раздел «Отчёты» (`/reports`) из бокового меню. Страница загружается мгновенно: в верхней части — сводная панель с цветными счётчиками: «Выполняется: 3 перевода, 1 миграция», «Упало: 2 валидации». Ниже — знакомый список отчётов (задач), по умолчанию активные сверху. Администратор замечает, что миграция дашборда «Отчёт по энергопотреблению» выполняется уже 15 минут — кликает по задаче, открывается Task Drawer с живыми логами. Пока администратор изучает логи, в сводке счётчик «Выполняется» уменьшается — бекап только что завершился успешно, и администратор видит это без перезагрузки страницы. ## 3. Interface Mockups ### UI Layout & Flow **Page**: `/reports` — переработанный раздел «Отчёты» (Task Status Center) * **Layout**: Одноколоночный, максимальная ширина 7xl, с отступами. Три зоны по вертикали: 1. **PageHeader** — заголовок «Центр статусов» с кнопкой ручного обновления (на случай проблем с WebSocket). 2. **Summary Panel** — горизонтальная панель сводки: сетка из карточек (2-3 строки × 4-6 колонок), каждая карточка = тип задачи × статус, показывает количество задач. Цвета: running — синий/primary, pending — серый/muted, success — зелёный/success, failed — красный/destructive, awaiting_input — жёлтый/warning. 3. **Task List** — основная область: фильтры (горизонтальная панель) + таблица/список задач с пагинацией. * **Key Elements**: * **Summary Card**: Кликабельная карточка сводки. При клике — фильтрует список задач по типу и статусу карточки. Пример: клик по карточке «Миграция / Выполняется (3)» → список показывает только выполняющиеся миграции. * **Filter Bar**: Горизонтальная панель фильтров над списком. Содержит: выпадающий список типов задач (multi-select), выпадающий список статусов (multi-select), текстовое поле поиска, селект временного диапазона (последний час / сегодня / неделя / всё время). * **Task Row**: Строка задачи в списке. Содержит: иконку типа, название/идентификатор задачи, статус-бейдж, время запуска (относительное: «2 мин назад»), длительность, название связанного ресурса (дашборда/конфигурации). При наведении — тултип с подробностями. При клике — открывает Task Drawer. * **Connection Indicator**: Маленький индикатор в углу экрана (зелёный = connected, жёлтый = reconnecting, красный = disconnected). При клике показывает статус соединения и время последнего обновления. * **Contract Mapping**: * **`@UX_STATE`**: * **idle** — страница загружена, данные актуальны, WebSocket подключён. * **loading** — первоначальная загрузка: скелетон-заглушки (pulse-анимация) вместо сводки и списка. * **empty** — нет ни одной задачи в системе: пустое состояние с иконкой и пояснительным текстом. * **disconnected** — WebSocket разорван: индикатор красный, баннер «Соединение потеряно. Переподключение...», данные последнего известного состояния заморожены. * **reconnecting** — WebSocket переподключается: индикатор жёлтый с анимацией. * **error** — ошибка загрузки данных: баннер с сообщением об ошибке и кнопкой «Повторить». * **`@UX_FEEDBACK`**: * Изменение статуса задачи в списке — анимированное обновление (плавное изменение цвета бейджа). * Новая задача появляется в списке — анимированное появление (slide-in сверху). * Завершение задачи — кратковременное выделение строки (зелёное/красное) и обновление счётчика в сводке. * Ошибка фильтрации — инлайн-сообщение «Нет задач, соответствующих фильтрам» с кнопкой «Сбросить фильтры». * **`@UX_RECOVERY`**: * Разрыв WebSocket → автоматический reconnect с экспоненциальной задержкой (1с, 2с, 4с, 8с, макс 30с). Кнопка «Подключиться сейчас» для ручного reconnect. * Ошибка загрузки → кнопка «Повторить загрузку». * Пустой результат поиска → кнопка «Сбросить фильтры». * **`@UX_REACTIVITY`**: Сводка и список — производные от модели (`TaskCenterModel` в `.svelte.ts`). Модель подписывается на WebSocket `/ws/task-events` через `$effect`. Данные сводки — `$derived` от полного списка задач в модели. Фильтры — `$state` атомы модели, изменение любого фильтра пересчитывает отфильтрованный список через `$derived`. * **Screen Model**: `TaskCenterModel` (`frontend/src/lib/models/TaskCenterModel.svelte.ts`) — [TYPE Model], объявляет `@STATE` (screenState, tasks, summary, filters), `@ACTION` (applyFilter, clearFilters, selectTask, refresh), `@INVARIANT` (активные задачи всегда сверху, счётчики сводки = агрегация tasks). * **States**: * **Idle/Default**: Сводка и список загружены, индикатор соединения зелёный, фильтры пустые (показываются все задачи, активные сверху). * **Loading**: Вся страница — skeleton placeholder: 4 карточки-скелетона в сводке, 10 строк-скелетонов в списке. * **Empty**: Иконка (inbox) + текст «Нет активных задач» + ссылки «Запустить перевод», «Запустить миграцию», «Запустить бекап». * **Disconnected**: Данные последнего известного состояния остаются видимыми, индикатор красный, баннер сверху: «Соединение потеряно. Попытка переподключения... [Подключиться сейчас]». * **Error**: Баннер с ошибкой + кнопка «Повторить». Сводка и список скрыты или показывают последние кешированные данные с пометкой «Данные могут быть неактуальны». ## 4. The "Error" Experience **Philosophy**: Не просто сообщать об ошибке — направлять оператора к решению. Каждый сценарий отказа имеет путь восстановления. **Semantic Requirement**: Every documented failure path here should map to `@UX_RECOVERY` and, where relevant, `@UX_FEEDBACK` in the generated component contracts. ### Scenario A: WebSocket разрыв соединения * **User Action**: Сетевой сбой, перезапуск backend, или таймаут бездействия. * **System Response**: * Индикатор соединения меняется на жёлтый (Reconnecting) с анимацией пульсации. * Через 2 секунды неудачных попыток — баннер «Соединение потеряно. Попытка переподключения... [Подключиться сейчас]». * Данные последнего известного состояния остаются на экране с пометкой «Обновлено: 2 мин назад». * **Recovery**: Автоматический reconnect с экспоненциальной задержкой (1с → 2с → 4с → 8с → ... макс 30с). Кнопка «Подключиться сейчас» для немедленной попытки. ### Scenario B: Ошибка загрузки начальных данных * **User Action**: Открытие страницы, а backend API недоступен (503). * **System Response**: * Баннер: «Не удалось загрузить данные задач. Сервер временно недоступен.» * Кнопка «Повторить загрузку». * **Recovery**: Ручная повторная попытка. Автоматический retry через 10 секунд с уведомлением. ### Scenario C: Пустой результат фильтрации * **User Action**: Применил фильтр «Тип: Бекап, Статус: Выполняется», но выполняющихся бекапов нет. * **System Response**: * Вместо списка — EmptyState с текстом «Нет выполняющихся бекапов». * Кнопка «Сбросить фильтры» возвращает к полному списку. * **Recovery**: Оператор сбрасывает фильтры одним кликом. ### Scenario D: Задача упала — быстрый переход к логам * **User Action**: Оператор видит красный бейдж «FAILED» на задаче. * **System Response**: Строка задачи подсвечена красным слева (destructive ring border). * **Recovery**: Клик по задаче → открывается Task Drawer, скроллится к последней ошибке в логах. Кнопка «Перезапустить» в Task Drawer (если тип задачи поддерживает перезапуск). ## 5. Tone & Voice * **Style**: Деловой, лаконичный, технический. Русский язык. * **Terminology**: «Задача» (не job), «Выполняется» (не in progress), «Упала» (не error/failed в UI), «Ожидает» (не pending), «Ожидает ввода» (не awaiting input). Иконки типов: перевод (globe), миграция (arrows-right-left), бекап (archive), валидация (shield-check), документация (file-text). #endregion UxReference