Направление работ: Mobile
Код раздела: 2.3.1
Раздел: Поиск > Список вариантов > Фильтрация списка
Статус: Готов
Ответственный: Панкова Л.А.
Версия: 0.1
Обновлено: 15.07.26
1. Назначение
Раздел описывает экран мобильного приложения, на котором пользователь уточняет список площадок по дополнительным параметрам, чтобы быстрее найти подходящий вариант.
2. Ключевые понятия
Фильтрация списка - отбор площадок по выбранным пользователем условиям.
Сфера и опции - выбранное направление и связанный с ним набор доступных групп и параметров фильтрации.
3. Scope
Входит
S1: Фильтрация списка
S2: Взаимоисключающий сценарий фильтрации
S3: Выбор “Хотя бы один из выбранных фильтров”
S4: Дополнительное состояние экрана
Не входит
4. BR
Указаны в пункте 4 разделов Back 8.2.1 Сферы и Опции, Back 2.2 Площадки партнеров, Back 2.6 Цены и Back 3.2 Процессинг заказов.
5. Функциональные требования (UC + FR)
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR2.3.1-1 | Пользователь открывает фильтрацию списка. | Интерфейс открывает экран “Фильтры” для списка вариантов выбранной сферы. | 1 | Реализовано OQ2.3.1-11 | |
| S1: FR2.3.1-2 | Интерфейс получил доступные параметры фильтрации. | Интерфейс всегда отображает группу “Основные” и диапазоны “Стоимость бронирования” и “Площадь”. Остальные группы и параметры интерфейс отображает динамически в соответствии с ответом Back для выбранной сферы. Например, могут быть доступны группы “Удобства”, “Интерьер”, “Оборудование”, “Сервис” и т. д. | 1 | Реализовано OQ2.3.1-12 | |
| S1: FR2.3.1-3 | Пользователь выбирает основной фильтр. | В группе “Основные” интерфейс позволяет выбрать один вариант: “Показывать занятые”, “Без заявки”, “Без предоплаты” или “Частичная оплата баллами”. | 1 | Не реализовано OQ2.3.1-8 | |
| S1: FR2.3.1-4 | Пользователь задает диапазон стоимости или площади. | Интерфейс позволяет указать минимальное и максимальное значения для “Стоимости бронирования” и “Площади” с помощью полей и ползунков диапазона. | 1 | Реализовано OQ2.3.1-13 | |
| S1: FR2.3.1-5 | Пользователь выбирает параметры динамической группы. | Интерфейс отображает до четырех полученных от Back тегов и позволяет выбрать или отменить выбор каждого тега. Если в группе доступно больше четырех тегов, интерфейс отображает действие “Все (N)” с общим количеством тегов. По действию “Все (N)” интерфейс открывает окно со всеми тегами группы, вариантом “Хотя бы один из выбранных фильтров” и действием “Применить”. | 1 | Не реализовано OQ2.3.1-4 | |
| S1: FR2.3.1-6 | Пользователь изменяет выбранные фильтры. | Интерфейс отображает выбранное состояние основных, диапазонных и теговых фильтров. После каждого изменения интерфейс обновляет счетчик “Найдено X из Y вариантов”. | 1 | Частично OQ2.3.1-6 | |
| S1: FR2.3.1-7 | Пользователь применяет фильтры. | По действию “Продолжить” интерфейс применяет выбранные фильтры и возвращает пользователя в раздел Mobile 2.3 “Список вариантов”. | 1 | Не реализовано OQ2.3.1-1 | |
| S1: FR2.3.1-8 | Пользователь сбрасывает фильтры. | По действию “Очистить” интерфейс сбрасывает все выбранные основные, диапазонные и теговые фильтры и обновляет счетчик найденных вариантов. | 1 | Не реализовано OQ2.3.1-2 | |
| S2: FR2.3.1-9 | Пользователь выбирает условия в нескольких группах. | Интерфейс применяет строгую фильтрацию между группами: площадка должна одновременно соответствовать условиям каждой группы, в которой выбраны фильтры. Внутри теговой группы по умолчанию площадка должна одновременно содержать все выбранные теги. | 1 | Частично OQ2.3.1-3 | |
| S2: FR2.3.1-10 | Пользователь изменяет основной, диапазонный или теговый фильтр. | Интерфейс сохраняет видимыми все возможные теги и динамически пересчитывает количество подходящих вариантов в скобках у каждого тега. Если подходящих вариантов по тегу нет, интерфейс отображает значение “0” и делает тег недоступным для выбора, не скрывая его. | 1 | Частично OQ2.3.1-7 | |
| S3: FR2.3.1-11 | Пользователь выбирает “Хотя бы один из выбранных фильтров” внутри теговой группы и применяет выбор. | Интерфейс учитывает площадки, соответствующие хотя бы одному выбранному тегу этой группы. Для остальных групп сохраняются заданные в них условия фильтрации. | 1 | Не реализовано OQ2.3.1-5 | |
| S4: FR2.3.1-12 | Загружаются доступные параметры фильтрации. | При открытии экрана интерфейс отображает состояние загрузки с плейсхолдерами параметров до получения доступных групп и значений от Back. | 1 | Частично OQ2.3.1-9 |
6. Открытые вопросы
Пин: BRD 2.3.1 v0.1 · репозиторий
booking.mobile.flutter· commitdad0c65/ веткаdev· дата сверки 2026-07-15 · якорьlib/src/feature/rooms_search/Сводка: 13 вопросов — Open 9 (бизнесу 1 · разработке 8) · Закрывает PM 1 · Подтверждено 3. Отрезано находок обратного прохода: 4 (сортировка и строка поиска — принадлежат Mobile 2.3; неверные ярлыки событий аналитики; незаполненная mock-реализация фильтра). Маршрутизация без сверки с гайдбуком (гайдбук на вход не передавался — спорные требования отнесены бизнесу как «подтвердить нечем»).
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ2.3.1-1 | Код FR2.3.1-7 | Требование говорит: по кнопке «Продолжить» выбранные фильтры применяются к списку вариантов, и пользователь возвращается в раздел 2.3. В коде: обработчик кнопки «Продолжить» пустой, а обработчик применения фильтров в списке вариантов полностью закомментирован (ничего не делает); само событие применения даже не несёт данных фильтра. Нажатие «Продолжить» не применяет фильтры, не закрывает шторку и не обновляет список. rooms_filter_modal.dart:377; rooms_search_bloc.dart:88-94,390-429 | Разработка (Владислав) | Open | Разблокирующий: пока это не сделано, ни один фильтр не влияет на список. (А, рекоменд.) реализовать применение — передать выбранные значения фильтра в поиск списка и закрыть шторку; (Б) временно скрыть кнопку, если функция не готова. Связать с OQ2.3.1-3, OQ2.3.1-10. | реализовать применение — передать выбранные значения фильтра в поиск списка и закрыть шторку |
| OQ2.3.1-2 | Код FR2.3.1-8 | Требование говорит: по кнопке «Очистить» сбрасываются все выбранные фильтры (основные, диапазоны, теги) и обновляется счётчик найденных вариантов. В коде: обработчик кнопки «Очистить» пустой — нажатие ничего не сбрасывает и не обновляет счётчик. rooms_filter_modal.dart:378 | Разработка (Владислав) | Open | (А, рекоменд.) реализовать сброс состояния фильтра к значениям по умолчанию с перезапросом счётчика; (Б) скрыть кнопку до реализации. | реализовать сброс состояния фильтра к значениям по умолчанию с перезапросом счётчика |
| OQ2.3.1-3 | Код FR2.3.1-9 | Требование говорит: строгая фильтрация между группами (площадка удовлетворяет условиям каждой группы, где что-то выбрано), а внутри теговой группы по умолчанию — содержит все выбранные теги. В коде: выбранные пользователем теги вообще не отправляются на бэкенд — поле со списком тегов в запросе всегда пустое, признак «хотя бы один» жёстко выставлен в «нет». Теговая фильтрация не срабатывает; совместность условий между группами цены/площади/основных решается на бэкенде и в этом коде не проверяется. rooms_filter_cubit.dart:54-63,233-246; filter_request.dart:23 | Разработка (Владислав) | Open | (А, рекоменд.) передавать выбранные теги в запрос фильтрации; поведение «И между группами» подтвердить на бэкенде (вне этого репозитория). (Б) если фильтрация по тегам не входит в эту версию — согласовать урезание требования. Связать с OQ2.3.1-1. | передавать выбранные теги в запрос фильтрации |
| OQ2.3.1-4 | Код FR2.3.1-5 | Требование говорит: показывать до четырёх тегов в группе; при большем числе — действие «Все (N)» с общим числом тегов, открывающее окно со всеми тегами группы, опцией «Хотя бы один из выбранных фильтров» и кнопкой «Применить». В коде: показываются сразу все теги без ограничения в четыре; ссылка «Все(N)» отрисована, но не имеет обработчика — нажатие не открывает никакого окна; отдельного окна со всеми тегами, опцией «хотя бы один» и кнопкой «Применить» нет. Число N считается по тегам с ненулевым количеством, а не по всем тегам группы. rooms_filter_modal.dart:293-308; section_title.dart:45-57 | Разработка (Владислав) | Open | (А, рекоменд.) реализовать окно «Все теги» с показом до 4 в группе, опцией «хотя бы один» и кнопкой «Применить»; привязать обработчик к «Все(N)». (Б) согласовать с бизнесом показ всех тегов без сворачивания. Связать с OQ2.3.1-5. | реализовать окно «Все теги» с показом до 4 в группе, опцией «хотя бы один» и кнопкой «Применить»; привязать обработчик к «Все(N)» |
| OQ2.3.1-5 | Код FR2.3.1-11 | Требование говорит: при выборе «Хотя бы один из выбранных фильтров» внутри теговой группы учитываются площадки, подходящие хотя бы под один тег группы, а для остальных групп условия сохраняются. В коде: признак «хотя бы один» есть в модели и в запросе, но нигде не переключается пользователем (в интерфейсе нет такого элемента) и всегда отправляется как «нет». Сценарий S3 не реализован. rooms_filter_cubit.dart:63,246; filter_state_model.dart:27 | Разработка (Владислав) | Open | (А, рекоменд.) добавить переключатель «хотя бы один» в окно тегов (см. OQ2.3.1-4) и передавать его в запрос. (Б) согласовать перенос сценария S3 в следующую версию. Связать с OQ2.3.1-4. | добавить переключатель «хотя бы один» в окно тегов (см. OQ2.3.1-4) и передавать его в запрос. |
| OQ2.3.1-6 | Код FR2.3.1-6 | Требование говорит: интерфейс показывает выбранное состояние основных, диапазонных и теговых фильтров и после каждого изменения обновляет счётчик «Найдено X из Y вариантов». В коде: выбранное состояние отображается для всех трёх видов фильтров; счётчик есть, но с текстом «X из Y вариантов» (без слова «Найдено») и обновляется только при смене чекбоксов и диапазонов — при выборе/снятии тега счётчик не пересчитывается, потому что выбор тега не вызывает новый запрос. button_panel.dart:88-96; rooms_filter_cubit.dart:94-137 | Разработка (Владислав) | Open | (А, рекоменд.) пересчитывать счётчик и при изменении тегов (перезапрос при выборе тега); текст привести к «Найдено X из Y». (Б) если пересчёт по тегам до применения не нужен — согласовать с бизнесом. Связать с OQ2.3.1-3. | пересчитывать счётчик и при изменении тегов (перезапрос при выборе тега); текст привести к «Найдено X из Y» |
| OQ2.3.1-7 | Код FR2.3.1-10 | Требование говорит: все возможные теги остаются видимыми, у каждого динамически пересчитывается число в скобках; при нуле тег показывает «0», становится недоступным, но не скрывается. В коде: число в скобках у тегов есть; пустые теги (0) делаются недоступными и по умолчанию остаются видимыми — это совпадает. Но: (1) пересчёт количества у тегов происходит при смене диапазонов и чекбоксов, а при выборе тега — нет; (2) есть дополнительный переключатель «Показывать все», который прячет пустые теги (тег с нулём исчезает) — это противоречит требованию «не скрывая его». filters_chips.dart:44-57; rooms_filter_modal.dart:69-91; rooms_filter_cubit.dart:139-149 | Разработка (Владислав) | Open | (А, рекоменд.) пересчитывать количества и при выборе тега; поведение переключателя «Показывать все» согласовать с бизнесом — убрать скрытие пустых тегов либо зафиксировать как допустимое отклонение от требования. (Б) оставить как есть и поправить формулировку требования. | пересчитывать количества и при выборе тега |
| OQ2.3.1-8 | Код FR2.3.1-3 | Требование говорит: в группе «Основные» можно выбрать один вариант из четырёх («Показывать занятые», «Без заявки», «Без предоплаты», «Частичная оплата баллами»). В коде: это четыре независимых флажка — их можно включить одновременно, взаимного исключения нет. rooms_filter_modal.dart:147-217; filter_state_model.dart:23-26 | Бизнес (Герман) | Open | Нужно продуктовое решение: (А) это действительно единичный (взаимоисключающий) выбор — тогда переделать в код одиночного выбора; (Б, рекоменд.) опции независимы и требование сформулировано неточно — тогда поправить BRD (параметры выглядят независимыми по смыслу). | это действительно единичный (взаимоисключающий) выбор — тогда переделать в код одиночного выбора |
| OQ2.3.1-9 | Код FR2.3.1-12 | Требование говорит: при открытии экрана показывается состояние загрузки с плейсхолдерами параметров, пока не пришли группы и значения от Back. В коде: состояние загрузки есть, но вместо плейсхолдеров параметров отрисовывается стандартная тех-заглушка Flutter (пустой прямоугольник с крестом); та же заглушка мелькает на весь экран при каждом изменении фильтра (чекбокс/диапазон) во время перезапроса. rooms_filter_modal.dart:124-130 | Разработка (Владислав) | Open | (А, рекоменд.) заменить тех-заглушку на скелетон параметров фильтра; не показывать полноэкранную загрузку при точечных изменениях. (Б) согласовать упрощённый индикатор загрузки. | заменить тех-заглушку на скелетон параметров фильтра |
| OQ2.3.1-10 | Код вне BRD | Проблема: вокруг фильтрации есть мёртвый и дублирующий код: параллельная реализация фильтра RoomsFilterBloc заведена в экране списка, но её обработчики закомментированы; старые версии шторки rooms_filter_modal_old.dart и rooms_filter_modal_dev.dart не используются; обработчик применения фильтров в списке пустой (см. OQ2.3.1-1). Это затрудняет сопровождение и скрывает, какой путь фильтрации живой. rooms_filter_bloc.dart:26-46; rooms_search_screen.dart:47-48; rooms_search_bloc.dart:390-429 | Разработка (Владислав) | Закрывает PM | Закрываю сам: удалить неиспользуемые реализации и мёртвые ветки после реализации применения фильтров → тикет в Bitrix. Связать с OQ2.3.1-1. | Почистить код |
| OQ2.3.1-11 | Код FR2.3.1-1 | Что подтверждено: по нажатию иконки фильтров открывается шторка «Фильтры» для выбранной сферы и города (идентификаторы берутся из параметров поиска). rooms_search_screen.dart:495-515 | — | Подтверждено | Расхождения нет. | |
| OQ2.3.1-12 | Код FR2.3.1-2 | Что подтверждено: всегда отображаются группа «Основные» и два диапазона — «Площадь» и «Стоимость бронирования»; остальные группы и теги приходят динамически из ответа бэкенда (метод FiltersMobile) и отрисовываются по выбранной сфере. rooms_filter_modal.dart:146-293; partner_zone_repository.dart:85-118 | — | Подтверждено | Расхождения нет. | |
| OQ2.3.1-13 | Код FR2.3.1-4 | Что подтверждено: для «Стоимости бронирования» и «Площади» есть поля ввода минимума и максимума и ползунок диапазона; ввод ограничен цифрами и диапазоном, изменение поля/ползунка пересчитывает результат. filter_slider.dart:179-297; rooms_filter_cubit.dart:205-286 | — | Подтверждено | Расхождения нет. |