- условие самообновления — доменный предикат store.State.IsObservable() вместо фазы catched; один поллер на поверхность, интервалы 5 с и 15 с - отказ тика отвечает 200 и самозавершающимся фрагментом с корневым id цели вместо 404/500, который htmx не свопит - заведён ADR-2026-08-10-observability-is-not-terminality, переписан раздел «Живой поллинг» в конвенции веб-UI
69 lines
5.1 KiB
Markdown
69 lines
5.1 KiB
Markdown
## MODIFIED Requirements
|
|
|
|
### Requirement: Живой прогресс активных загрузок
|
|
|
|
Веб-UI SHALL показывать прогресс, скорость и ETA активных (`downloading`)
|
|
загрузок на главной без перезагрузки страницы, обновляя их тем же
|
|
самообновлением, которым обновляется сама карточка (см. `web-ui`,
|
|
«Самообновление живой задачи»). Обновление MUST NOT сбрасывать клиентские
|
|
фильтр, поиск и прокрутку.
|
|
|
|
Когда задача покидает состояние `downloading`, показ скорости и ETA SHALL
|
|
прекращаться: вне качания эти величины смысла не имеют. Снимок при этом
|
|
продолжает питать прочие живые значения карточки и страницы — размер и рейтинг
|
|
раздачи, — и прекращение показа цифр качания MUST NOT означать прекращения
|
|
обновления поверхности: она продолжает отражать смену состояния, пока задача
|
|
наблюдаема.
|
|
|
|
Живые цифры MUST браться из снимка воркера; при отсутствии данных по задаче
|
|
поверхность деградирует без них, не ломая остального отображения.
|
|
|
|
#### Scenario: Прогресс растёт без перезагрузки
|
|
|
|
- **WHEN** загрузка качается и пользователь смотрит на главную
|
|
- **THEN** её прогресс-бар, скорость и ETA обновляются на месте без
|
|
перезагрузки страницы
|
|
|
|
#### Scenario: Клиентское состояние сохраняется
|
|
|
|
- **WHEN** применён фильтр или поиск и происходит фоновое обновление
|
|
- **THEN** выбранный фильтр, текст поиска и позиция прокрутки не сбрасываются
|
|
|
|
#### Scenario: Завершение убирает цифры качания, но не обновление
|
|
|
|
- **WHEN** загрузка переходит из `downloading` в другое наблюдаемое состояние
|
|
- **THEN** блок прогресса, скорости и ETA с карточки исчезает
|
|
- **AND** карточка продолжает обновляться и приносит новое состояние
|
|
- **AND** размер и рейтинг раздачи по-прежнему берутся из снимка
|
|
|
|
### Requirement: Секция раздачи на странице загрузки
|
|
|
|
Страница `/download/{id}` SHALL показывать секцию «Раздача» с живой статистикой
|
|
(рейтинг, число сидов и пиров, объём отданного, скорость отдачи) для задач,
|
|
чей торрент сидирует. Если живых данных по задаче нет, секция SHALL
|
|
отсутствовать либо явно показывать «нет данных», не ломая остальную страницу.
|
|
|
|
Секция MUST NOT опрашивать сервер самостоятельно: она лежит внутри области,
|
|
которую страница обновляет целиком, и собственный опрос секции подменял бы
|
|
разметку страницы. Её цифры SHALL приходить с тиком самообновления страницы
|
|
(см. `web-ui`, «Самообновление живой задачи»), а частота их обновления
|
|
SHALL совпадать с частотой обновления страницы.
|
|
|
|
#### Scenario: Сидирующая задача показывает раздачу
|
|
|
|
- **WHEN** открыта страница задачи, торрент которой раздаётся
|
|
- **THEN** в секции «Раздача» видны рейтинг, сиды/пиры, отдано и скорость отдачи
|
|
|
|
#### Scenario: Нет живых данных — секция деградирует
|
|
|
|
- **WHEN** открыта страница задачи, торрента которой нет в qBittorrent
|
|
- **THEN** секция «Раздача» отсутствует или показывает «нет данных», а
|
|
распознавание, файлы и история отображаются нормально
|
|
|
|
#### Scenario: Секция обновляется тиком страницы
|
|
|
|
- **GIVEN** открыта страница наблюдаемой задачи, чья раздача сидирует
|
|
- **WHEN** страница отрисована
|
|
- **THEN** секция «Раздача» не несёт собственного опроса
|
|
- **AND** её цифры обновляются вместе с остальной страницей
|