Поиск, колоночные фильтры, варианты фильтров и «Найдено N из M» — с точной семантикой экрана (matchesSearch, MRT equals, faceting TanStack); регистр без зависимости от локали БД; пороги — цели, а не условие слияния; решения контроллера (три фазы/ветки, prefetch страницы 1, окружение тестов). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 KiB
Purpose
Поведение экрана свода 2 (/svod/2, вкладки «ССП» и «РФ») при загрузке строк страницами: для пользователя всё остаётся таким же, как до изменения (поиск, колоночные фильтры, варианты фильтров, «Найдено N из M», вкладки, прокрутка), а в памяти держится ограниченное окно строк. Плюс замеры производительности экрана: память, время до первых строк, шаг прокрутки.
ADDED Requirements
Requirement: Поведение для пользователя не меняется
Всё, что пользователь видит и делает на экране свода 2, SHALL остаться таким же, как до изменения, при тех же данных:
- набор и порядок строк при любых сочетаниях года, ССП/РФ, поиска и колоночных фильтров;
- варианты колоночных фильтров и числа в скобках у вариантов;
- подпись «Найдено N из M строк» и момент её показа;
- сброс колоночных фильтров;
- поведение вкладок, «Загрузить», «Обновить», «Перейти к задачам», единиц;
- колонки, форматирование и оформление.
Допустимые отличия:
- время ожидания ответа сервера после ввода поиска или выбора фильтра;
- пустые строки-заглушки на месте ещё не пришедших строк при быстрой прокрутке.
Scenario: Визуальный паритет
- WHEN на одних данных открыть GO «все» до и после изменения и сравнить первые экраны и три позиции горизонтальной прокрутки
- THEN значения ячеек, прочерки и оформление совпадают
Scenario: Сброс колоночных фильтров
- WHEN задан колоночный фильтр, и пользователь меняет строку поиска, год или выбор ССП/РФ
- THEN колоночные фильтры вкладки сбрасываются, как до изменения
Requirement: Загрузка строк страницами при прокрутке
После нажатия «Загрузить» или «Обновить» экран SHALL запрашивать с сервера страницы, покрывающие видимую область и по одной соседней странице с каждой стороны. При положении прокрутки в начале это страницы с offset=0 и offset=<размер страницы>; вторая запрашивается сразу, чтобы при подходе к её строкам не было заглушек. Вместе со страницами запрашиваются варианты фильтров. Полная длина полосы прокрутки SHALL соответствовать общему числу строк по текущим условиям. Строки, которые ещё не пришли, SHALL показываться пустыми строками-заглушками той же высоты: без значений и без прочерков. Когда видимая область доходит до незагруженных строк, экран SHALL их запросить и заменить заглушки данными без сдвига прокрутки. Экран SHALL NOT менять положение прокрутки программно: оно ведёт себя так же, как раньше при смене данных в той же таблице. В памяти SHALL держаться строки не более чем фиксированного числа страниц, независимо от общего числа строк.
Scenario: Первая загрузка «Все ССП/РФ»
- WHEN пользователь выбирает «Все ССП/РФ» на вкладке «ССП» и нажимает «Загрузить», а прокрутка в начале
- THEN экран запрашивает варианты фильтров и страницы
offset=0иoffset=<размер страницы>, показывает первые строки, а высота прокрутки соответствуетtotalстрокам
Scenario: Прокрутка в середину и в конец
- WHEN пользователь перетаскивает полосу прокрутки в середину, а затем в самый конец списка
- THEN в видимой области сначала могут быть заглушки, затем появляются строки с теми номерами по порядку, что и в полном списке, а последняя строка списка видна у нижнего края
Scenario: Память не растёт при прокрутке до конца
- WHEN пользователь прокручивает лист RF «все» до конца и обратно
- THEN число строк с данными, которые экран держит в памяти, не превышает предела (число страниц кэша × размер страницы)
Requirement: Поиск и колоночные фильтры через сервер
Изменение строки поиска (после существующей задержки ввода 300 мс) и изменение колоночного фильтра «Вид сметы», «Направление» или «ССП» SHALL перезапрашивать с сервера страницы видимой области и варианты фильтров, если по текущим году и ССП/РФ данные уже загружены. Если данные не загружены, запросов нет, как и сейчас. До прихода ответа экран SHALL показывать прежние строки. Ответ на устаревший запрос (после него условия уже поменялись) SHALL NOT попадать на экран. Варианты каждого колоночного фильтра SHALL совпадать с теми, что экран показывал до изменения: по строкам, найденным поиском и отобранным фильтрами двух других колонок, с числом строк у каждого варианта, без пустых значений, в прежнем порядке сортировки.
Scenario: Поиск
- WHEN данные загружены и пользователь вводит «аренда» в поле поиска
- THEN через 300 мс после последнего нажатия экран запрашивает строки и варианты с этим поиском и показывает тот же набор строк, что до изменения
Scenario: Варианты фильтра зависят от поиска и других фильтров
- WHEN задан поиск и выбран фильтр «Вид сметы»
- THEN в фильтрах «Направление» и «ССП» перечислены значения только из найденных строк этого вида сметы, с числами строк, а в фильтре «Вид сметы» — значения найденных строк без учёта его собственного выбора
Scenario: Быстрая смена условий
- WHEN пользователь вводит поиск и, не дожидаясь ответа, выбирает колоночный фильтр «Направление»
- THEN на экране остаются строки, отвечающие обоим условиям, а ответ на первый запрос не показывается
Requirement: Счётчик «Найдено N из M»
Подпись «Найдено N из M строк» SHALL вести себя как до изменения:
- N — число строк, найденных поиском, без учёта колоночных фильтров;
- M — число всех строк по текущим году и ССП/РФ;
- подпись видна, когда данные загружены, загрузка по «Загрузить»/«Обновить» не идёт, и N ≠ M;
- числа форматируются
ru-RU.
Scenario: Колоночный фильтр не меняет счётчик
- WHEN загружено 5 563 строки, поиск находит 300, и пользователь выбирает фильтр «Вид сметы», после которого видно 120 строк
- THEN подпись остаётся «Найдено 300 из 5 563 строк»
Requirement: Вкладки и обновление
Возврат на ранее загруженную вкладку SHALL показывать её строки, как до изменения. Запрос к серверу допускается только за страницами, которых нет в ограниченном кэше вкладки. «Обновить» SHALL перезапрашивать данные текущей вкладки с сервера. Смена года или ССП/РФ, как и сейчас, требует нажать «Загрузить». Свод 2 SHALL NOT сохранять полные ответы в общем кэше сводов. Поведение свода 1 не меняется.
Scenario: Переключение вкладок
- WHEN загружены «ССП» и «РФ» при прокрутке в начале, пользователь возвращается на «ССП»
- THEN строки «ССП» видны сразу, без запроса страниц
Scenario: Обновить
- WHEN пользователь нажимает «Обновить»
- THEN экран заново запрашивает варианты фильтров и страницы видимой области и показывает актуальные данные
Requirement: Ошибки загрузки
Если не удался запрос по «Загрузить», «Обновить», поиску или колоночному фильтру, экран SHALL показывать, как и при ошибке загрузки сейчас, сообщение об ошибке с кнопкой «Повторить». Если не удалась догрузка страницы при прокрутке, экран SHALL оставить на её месте заглушки, показать всплывающее уведомление и повторить запрос, когда эта область снова окажется в видимой зоне.
Scenario: Ошибка догрузки
- WHEN запрос страницы при прокрутке завершился ошибкой 500
- THEN уже показанные строки остаются, на месте страницы — заглушки, показано уведомление; при повторной прокрутке к этому месту запрос повторяется
Requirement: Замеры производительности экрана
Для GO и RF на масштабах 1 и 2 (роль dfip, CPU 1×, одни данные, один и тот же код сценариев для «до» — вершины AURORA-1842 — и «после») SHALL быть сняты и приведены в PR:
- память (
perf/e2e/scenarios/svod2-memory.spec.ts: GO «Все ССП/РФ» → «Загрузить» → RF «Все ССП/РФ» → «Загрузить» → GO, сборка мусора) —heap_used_mbв конечной точке; - время до первых строк —
first_rows_ms, от «Загрузить» до 20 строк с данными, заглушки не считаются; - шаг прокрутки —
main_thread_ms_per_step(масштаб 1) и доля кадров с заглушками.
Целевые значения:
- память на масштабе 1 — не больше 30 % «до», на масштабе 2 — не больше 1,25 значения «после» на масштабе 1;
- время до первых строк — не больше 50 % «до»;
- шаг прокрутки — не больше 1,10 значения «до».
Цифры условием слияния не являются: недобор оформляется follow-up задачей.
Scenario: Замер памяти
- WHEN
svod2-memory.spec.tsвыполнен для «до» и «после» на масштабах 1 и 2, по 3 повтора - THEN в PR приведены медианы
heap_used_mbпо точкам и их отношение к целевым значениям, недобор записан как follow-up
Scenario: Замер времени до первых строк и шага прокрутки
- WHEN
scroll.spec.tsсPERF_TARGETS='svod/svod2_*',PERF_ROLES=dfip,--grep-invert filterвыполнен для «до» и «после» - THEN в записях есть
first_rows_ms,main_thread_ms_per_stepи доля кадров с заглушками, а в PR приведено сравнение с целевыми значениями