Направление работ: AdmLk Код раздела: 2.1.2 Раздел: Настройки > Основные > Опции Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 31.07.26
1. Назначение
Раздел обеспечивает сотруднику админского кабинета просмотр и фильтрацию списка опций, а также создание новой опции.
В списке сотрудник видит, в каких сферах используется опция, задан ли для нее диапазон, какое установлено значение по умолчанию и в каком статусе находится опция.
2. Ключевые понятия
Опция — настройка, которая отображается в общем списке и может использоваться в одной или нескольких сферах.
Сфера — раздел настроек, с которым связаны опции и по которому сотрудник может отфильтровать список.
Опция с диапазоном — опция с включенным признаком «Диапазон», для которой задается значение по умолчанию.
Архивная опция — опция, для которой при создании включен признак «Архив».
3. Scope
Входит
S1: Открытие и просмотр списка опций.
S2: Поиск и фильтрация опций по сферам и признаку архивности.
S3: Создание опции и настройка ее признаков.
S4: Валидация формы создания опции.
S5: Адаптация экрана для поддерживаемых разрешений.
Не входит
- Создание, редактирование и настройка сфер — 2.1.1 «Сферы».
4. BR
Указаны в пункте 4 раздела Back: 8.2.1 Сферы и Опции.
5. Функциональные требования (UC + FR)
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR2.1.2-1 | Сотрудник открывает раздел «Опции» | Интерфейс показывает заголовок «Опции», путь «Основные > Опции» и действие возврата на предыдущий уровень настроек. | 1 | Реализовано OQ2.1.2-16 | |
| S1: FR2.1.2-2 | Сотрудник просматривает элементы управления списком | Интерфейс показывает поле «Найти», фильтр «Сферы», признак архивности для скрытия или отображения архивных опций и действие добавления опции. | 1 | Реализовано OQ2.1.2-14, OQ2.1.2-16 | |
| S1: FR2.1.2-3 | Сотрудник просматривает список опций | Интерфейс показывает таблицу с колонками «Название», «Используется в сферах», «Диапазон», «Значение по умолчанию» и «Статус». Для каждой опции отображаются ее название, связанные сферы, состояние признака «Диапазон», значение по умолчанию при его наличии и текущий статус. Привязка опций к сферам выполняется в разделе 2.1.1 «Сферы». | 1 | Частично OQ2.1.2-6, OQ2.1.2-7 | |
| S2: FR2.1.2-4 | Сотрудник вводит название опции в поле «Найти» | Интерфейс выполняет поиск по названию и фильтрует список опций по введенному значению. | 1 | Частично OQ2.1.2-9 | |
| S2: FR2.1.2-5 | Сотрудник открывает фильтр «Сферы» | Интерфейс показывает вариант «Все» и список доступных сфер с возможностью выбрать несколько значений. По умолчанию в поле фильтра отображается «Все сферы». | 1 | Частично OQ2.1.2-8 | |
| S2: FR2.1.2-6 | Сотрудник выбирает одну или несколько сфер | Интерфейс фильтрует список и показывает опции, соответствующие выбранным сферам. | 1 | Реализовано OQ2.1.2-16 | |
| S3: FR2.1.2-7 | Сотрудник выбирает действие добавления опции | Интерфейс открывает боковую панель «Создание опции» с полем «Название», переключателями «Диапазон» и «Архив», действием закрытия и кнопкой «Сохранить». | 1 | Реализовано OQ2.1.2-17 | |
| S3: FR2.1.2-8 | Сотрудник включает признак «Диапазон» | Интерфейс показывает поле «Значение по умолчанию». При выключенном признаке поле не отображается. | 1 | Реализовано OQ2.1.2-17 | |
| S3: FR2.1.2-9 | Сотрудник задает признак «Архив» | Интерфейс позволяет включить или выключить признак «Архив» для создаваемой опции. | 1 | Реализовано OQ2.1.2-17 | |
| S3: FR2.1.2-10 | Сотрудник закрывает форму создания | Интерфейс закрывает боковую панель создания опции. | 1 | Реализовано OQ2.1.2-17 | |
| S3: FR2.1.2-11 | Сотрудник сохраняет заполненную форму | Интерфейс передает валидные данные формы для создания опции по действию «Сохранить». | 1 | Частично OQ2.1.2-4 | |
| S4: FR2.1.2-12 | Сотрудник не заполнил название опции | Интерфейс оставляет действие «Сохранить» недоступным, пока обязательное поле «Название» не заполнено. | 1 | Реализовано OQ2.1.2-17 | |
| S4: FR2.1.2-13 | Сотрудник включил признак «Диапазон», но не указал значение по умолчанию | Интерфейс оставляет действие «Сохранить» недоступным, пока поле «Значение по умолчанию» не заполнено. | 1 | Не реализовано OQ2.1.2-2 | |
| S4: FR2.1.2-14 | Сотрудник вводит название, которое полностью совпадает с названием существующей опции | Интерфейс не позволяет создать опцию с полностью совпадающим названием, показывает у поля «Название» ошибку «Опция с таким названием уже существует» и оставляет действие «Сохранить» недоступным. | 1 | Частично OQ2.1.2-5 | |
| S5: FR2.1.2-15 | Сотрудник открывает раздел «Опции» на поддерживаемом устройстве | Интерфейс адаптирует страницу раздела, таблицу, фильтры и боковую панель создания для desktop, laptop и tablet. | 1 | Не реализовано OQ2.1.2-3 |
6. Открытые вопросы
Пин контекста: BRD 2.1.2 «Опции» v0.1 · репозиторий
musbooking.weblk.adminpanel· commitb0d9185/ веткаmain· дата сверки 2026-09-03 · якорь:pages/settings/main/options.vue,widgets/options/ui/OptionsWidget.vue,features/option-list/ui/OptionsList.vue,features/option-drawer/(ui/OptionDrawer.vue,model/useOptionDrawer.ts,model/store.ts),entities/option/(lib/option.getters.ts,model/useOptionQueries.ts,store/options.api.ts),shared/api/OptionsService.ts,shared/api-contracts/options/options.schema.ts,shared/ui/data-table/DataTable.vue,shared/ui/drawer/SimpleDrawer.vue,shared/ui/fields/SelectField.vue,shared/ui/button/{BackButton,AddActionButton,ArchiveActionButton}.vue,shared/ui/toggle/ToggleSwitch.vue,features/header-breadcrumbs/,shared/lib/useSafeBack.ts,layouts/default.vue,pages/settings/main/index.vueСводка: 16 вопросов — Open бизнесу 5 · Open разработке 9 · Подтверждено 2. Отрезано находок обратного прохода: 1. Маршрутизация без сверки с гайдбуком (гайдбук на вход не передавался — там, где нужно решение «как должно быть», вопрос уходит бизнесу со статусом Open, а не закрывается сам). Главное: раздел реализован и работает — 8 требований из 15 подтверждены полностью, ещё 5 расходятся в деталях. Два требования не выполнены. Ключевая находка — OQ2.1.2-2: валидация FR2.1.2-13 отсутствует в коде, и сотрудник может создать диапазонную опцию с пустым значением по умолчанию; это единственное расхождение, где поведение прямо противоречит требованию, остальные — расхождения по текстам и по объёму. Второе — OQ2.1.2-3: адаптива под desktop/laptop/tablet в разделе нет ни в каком виде, хотя в соседних разделах AdmLk он уже сделан и в коде помечен ссылками на FR. Отдельно стоит внимания OQ2.1.2-10: в коде полностью работает редактирование опции, которого в Scope BRD нет вообще — это самая крупная часть реализации, не описанная документом. Об обходе: обход полный по репозиторию (поиск поoption/Option/опци*во всех слоях —pages/,widgets/,features/,entities/,shared/,layouts/,plugins/,server/,generated/,lib/,app/), усечения нет. Проверено за пределами якорей: хлебные крошки и заголовок раздела (features/header-breadcrumbs/,shared/ui/button/BackButton.vue,shared/lib/useSafeBack.ts), общая таблица (shared/ui/data-table/DataTable.vue), общий drawer (shared/ui/drawer/SimpleDrawer.vue), фильтр-селект (shared/ui/fields/SelectField.vue), обработка ошибок API (shared/api/BaseApiService.ts,plugins/api.gateway.client.ts) и настройка адаптива (plugins/vuetify.ts,layouts/default.vue). Гипотеза «строка «Все сферы» из FR2.1.2-5 всё-таки есть в коде» проверена отдельно и не подтвердилась: строка встречается только в разделе «Промокоды» (features/promo-code-drawer/model/usePromoCodeDrawer.options.ts:153,features/promo-code-list/ui/PromoCodesList.vue:464,469,477), к фильтру опций отношения не имеет. Автотестов раздела в репозитории нет (файлов*.spec.*/*.test.*не найдено), поэтому все выводы — по чтению кода. Отрезана 1 находка обратного прохода: пропshow-header-infoпередаётся списком (features/option-list/ui/OptionsList.vue:52), объявлен в общей таблице (shared/ui/data-table/DataTable.vue:70,86), но в её шаблоне не используется — то есть ни на что не влияет; на требования BRD это не выходит и в вопросы не вынесено.
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ2.1.2-1 | ||||||
| OQ2.1.2-2 | Код FR2.1.2-13 | Требование говорит: пока при включённом признаке «Диапазон» не заполнено «Значение по умолчанию», действие «Сохранить» остаётся недоступным. В коде этой проверки нет вообще. Форма считается заполненной верно при одном условии: название непустое и не совпадает с уже существующим. «Значение по умолчанию» в проверке не участвует. Поэтому сотрудник включает «Диапазон», оставляет поле пустым, нажимает доступную кнопку «Сохранить» — и опция уходит на бэкенд с признаком диапазона и пустым значением по умолчанию. В списке она потом отображается с включённым «Диапазоном» и пустой ячейкой «Значение по умолчанию»: в справочнике появляется заведомо недонастроенная запись, и заметить это можно только глазами. Это единственное место в разделе, где поведение прямо противоречит требованию, а не расходится по формулировке. \ features/option-drawer/model/useOptionDrawer.ts:62 (условие «форма заполнена верно»), features/option-drawer/ui/OptionDrawer.vue:61 (кнопка «Сохранить» завязана только на это условие), features/option-drawer/model/store.ts:40,47 (на бэкенд уходит пустое значение), features/option-list/ui/OptionsList.vue:59-61 (пустая ячейка в списке) | Разработка | Open | (А) Дописать в условие валидности формы проверку «при включённом «Диапазоне» значение по умолчанию заполнено» (рекомендуется) — правка в одну строку ровно там, где уже собраны остальные проверки, кнопка «Сохранить» к этому условию уже привязана, править интерфейс не нужно. (Б) Если диапазонная опция без значения по умолчанию — допустимая ситуация, то надо снимать само требование FR2.1.2-13, и это решение бизнеса, а не правка кода; но тогда в BRD нужно описать, что показывать в колонке «Значение по умолчанию» для таких опций. Связать с OQ2.1.2-4: пока ошибка сохранения не выводится, любая пропущенная валидация выглядит для сотрудника как «кнопка не работает». | |
| OQ2.1.2-3 | Код FR2.1.2-15 | Требование говорит: страница раздела, таблица, фильтры и боковая панель создания адаптируются под desktop, laptop и tablet. В коде адаптива в разделе нет ни в одном из четырёх мест: ни в странице, ни в виджете, ни в списке с фильтрами, ни в drawer нет ни одной адаптивной точки — ни медиазапросов, ни работы с брейкпоинтами. Наоборот, размеры заданы жёстко: поле «Найти» зафиксировано на 360 пикселей (минимум и максимум совпадают, сжаться не может), фильтр «Сферы» — 240 пикселей, боковая панель — 460 пикселей, таблица — фиксированной высоты, а её заголовки запрещено переносить по словам. Единственный адаптив в приложении — общий отступ страницы для экранов уже 640 пикселей, то есть телефон, а не tablet/laptop/desktop из требования. Для сравнения: в соседних разделах AdmLk адаптив уже сделан и в коде прямо помечен ссылками на требования — то есть в разделе «Опции» это пропуск, а не отсутствие практики в проекте. \ отсутствие адаптива — features/option-list/ui/OptionsList.vue, features/option-drawer/ui/OptionDrawer.vue, widgets/options/ui/OptionsWidget.vue, pages/settings/main/options.vue, shared/ui/data-table/DataTable.vue (медиазапросов и брейкпоинтов нет ни в одном), брейкпоинты не настроены и глобально — plugins/vuetify.ts:6-13; жёсткие размеры — features/option-list/ui/OptionsList.vue:13,30, features/option-drawer/ui/OptionDrawer.vue:7, shared/ui/data-table/DataTable.vue:83,199; единственный медиазапрос приложения — layouts/default.vue:43-46,56-58; сделанный адаптив соседних разделов — features/mailing-drawer/ui/MailingDrawer.vue:3, features/review-moderation-list/ui/ReviewModerationList.vue:57,454, features/orders-report-advanced-filters/ui/OrdersReportAdvancedFilters.vue:215,351 | Разработка | Open | (А) Реализовать адаптив, переиспользовав подход соседних разделов (рекомендуется) — там он уже написан и привязан к требованиям, поэтому это не исследовательская задача, а перенос готового решения; начать стоит с панели фильтров, потому что 360 + 240 пикселей фиксированной ширины плюс две кнопки в один ряд на tablet гарантированно не помещаются. (Б) Если tablet для сервисного кабинета не поддерживается — снять FR2.1.2-15 и убрать S5 из Scope, но это решение бизнеса: сейчас требование заявлено весом 1, то есть как обязательное к релизу. | |
| OQ2.1.2-4 | Код FR2.1.2-11 | Требование говорит: по действию «Сохранить» интерфейс передаёт валидные данные формы для создания опции. В коде данные передаются корректно, но сценарий отказа обрывается: если бэкенд отклонит создание, текст ошибки записывается во внутреннее состояние и нигде не выводится. Сотрудник видит следующее: панель осталась открытой, поля заполнены, кнопка снова активна, никаких сообщений нет. Отличить «не сохранилось» от «сохранилось, но панель не закрылась» невозможно, и естественная реакция — нажать «Сохранить» ещё раз. Механизм показа сообщений в приложении есть и используется в других разделах, а форма опции к нему не подключена; в соседнем разделе «Сферы» ошибка сохранения выводится прямо в форме. \ ошибка записывается, но не выводится — features/option-drawer/model/store.ts:52-57; в панели и списке нет ни вывода ошибки, ни уведомления — features/option-drawer/ui/OptionDrawer.vue, features/option-list/ui/OptionsList.vue; панель остаётся открытой при отказе — features/option-drawer/ui/OptionDrawer.vue:109-114; ошибка доходит до фронта — plugins/api.gateway.client.ts:112-135, shared/api/BaseApiService.ts:166-171; как сделано в соседнем разделе — features/sphere-drawer/ui/SphereDrawer.vue:50, features/sphere-drawer/model/useSphereDrawer.ts:483 | Разработка | Open | (А) Выводить ошибку сохранения — в форме, как в разделе «Сферы», либо через общий механизм уведомлений (рекомендуется) — текст ошибки уже собран и лежит в состоянии, нужно только показать его; без этого не работает ни один сценарий отказа, включая отклонённый бэкендом дубль названия из OQ2.1.2-5. (Б) Оставить как есть и описать в BRD, что при отказе бэкенда интерфейс ничего не сообщает — не рекомендуется: это скрытая потеря данных формы с точки зрения сотрудника. Связать с OQ2.1.2-2. | |
| OQ2.1.2-5 | Код FR2.1.2-14 | Требование говорит: интерфейс не позволяет создать опцию с полностью совпадающим названием, показывает у поля ошибку «Опция с таким названием уже существует» и оставляет «Сохранить» недоступной. В коде все три названные части есть — проверка, ровно эта формулировка ошибки и блокировка кнопки. Расхождения в том, как проверка устроена. Первое: она работает только на стороне интерфейса и сверяется со списком опций, который считается актуальным пять минут. Если в этот интервал опцию с таким названием создал другой сотрудник, интерфейс дубль не заметит, отправит запрос — а отказ бэкенда, если он вообще есть, сотруднику не покажется (OQ2.1.2-4). То есть «не позволяет создать» держится на кэше, а не на гарантии. Второе: сравнение идёт без учёта регистра и краевых пробелов, поэтому «Парковка» и «парковка» считаются одним названием — строже, чем «полностью совпадает» в требовании. Само поведение выглядит разумным, но в BRD оно не описано. \ проверка и сравнение без регистра — features/option-drawer/model/useOptionDrawer.ts:42-51; текст ошибки — features/option-drawer/model/useOptionDrawer.ts:20, вывод у поля — features/option-drawer/ui/OptionDrawer.vue:21-22; блокировка кнопки — features/option-drawer/model/useOptionDrawer.ts:54-62; источник списка для проверки и срок его актуальности — features/option-drawer/model/useOptionDrawer.ts:25, entities/option/model/useOptionQueries.ts:21-26 | Разработка | Open | (А) Считать источником правды бэкенд: проверку в интерфейсе оставить как быструю подсказку, а отказ бэкенда по дублю — показывать у поля тем же текстом (рекомендуется) — уникальность справочника нельзя гарантировать на стороне клиента, а нужный вывод ошибки всё равно требуется по OQ2.1.2-4, то есть работы совмещаются. (Б) Оставить проверку только клиентской, но дописать в FR2.1.2-14 два уточнения: сравнение не учитывает регистр и лишние пробелы, и проверка идёт по загруженному списку. Уточнение про регистр — вопрос формулировки требования, его достаточно согласовать с бизнесом при правке BRD. | |
| OQ2.1.2-6 | Код FR2.1.2-3 | Требование говорит: в таблице пять колонок — «Название», «Используется в сферах», «Диапазон», «Значение по умолчанию», «Статус», — и для каждой опции показывается в том числе её текущий статус. В коде все пять колонок есть и данные в них те, что описаны, но два текста расходятся с BRD. Первое: заголовок третьей колонки в коде — «Используется в сферах:», с двоеточием на конце, хотя это заголовок таблицы, а не подпись перед значением. Второе, более существенное: статус выводится не текстом, а иконкой глаза — открытый глаз для действующей опции, зачёркнутый для архивной, — и дополнительно строка архивной опции показывается приглушённой. Слова «Архив» или «Активна» в списке нет нигде. То есть сотрудник различает статус по иконке, а требование говорит про «текущий статус», не уточняя формат; проверить, то ли это, чего ждал бизнес, по BRD нельзя. \ состав и заголовки колонок — features/option-list/ui/OptionsList.vue:172-190 (двоеточие — :177); вывод статуса иконкой — :69-73; приглушение архивной строки — :192-194, shared/ui/data-table/DataTable.vue:246-249 | Бизнес | Open | (А) Подтвердить иконку как формат статуса и дописать это в FR2.1.2-3, указав, что означает каждая из двух иконок (рекомендуется) — так работает и соседний раздел, поведение уже в интерфейсе, и дешевле описать его, чем ловить как расхождение на приёмке; заодно убрать двоеточие из заголовка колонки — это явная опечатка. (Б) Если статус должен читаться словом (например, «Активна» / «Архив»), это доработка списка: колонка есть, меняется только содержимое ячейки. Первым нужно решение бизнеса о формате — оно определяет, есть ли здесь работа для разработки. | |
| OQ2.1.2-7 | Код FR2.1.2-3 | Требование говорит: в списке отображается состояние признака «Диапазон». В коде оно отображается предметом, который выглядит как переключатель: скруглённая полоса 44×24 с круглым бегунком, тёмная во включённом состоянии, светлая в выключенном. Это статичный индикатор, кликом он ничего не переключает. Рядом, в форме создания, «Диапазон» — настоящий переключатель почти того же вида (48×26, тот же бегунок, та же логика цвета). Строки таблицы при этом кликабельны, так что нажатие на «переключатель» в списке не переключит признак, а откроет боковую панель опции. Ожидание «сейчас переключу здесь же» ломается молча — это не расхождение с текстом требования, а расхождение между тем, что элемент обещает, и тем, что делает. \ индикатор в списке и его вид — features/option-list/ui/OptionsList.vue:63-67,227-255; настоящий переключатель в форме — features/option-drawer/ui/OptionDrawer.vue:26-29, shared/ui/toggle/ToggleSwitch.vue:30-33,47-52; кликабельность строк — features/option-list/ui/OptionsList.vue:53-54 | Разработка | Open | (А) Заменить индикатор на элемент, который не читается как переключатель — галочка, точка, короткий текст (рекомендуется) — правка только в разметке ячейки, данные и логика не затрагиваются; форма остаётся единственным местом, где признак меняют, что соответствует Scope BRD. (Б) Сделать индикатор рабочим переключателем прямо в списке — но это новая операция «изменить признак из списка», которой в BRD нет, и её надо сначала заводить как требование. Связать с OQ2.1.2-10: там же вопрос про изменение опции из списка в целом. | |
| OQ2.1.2-8 | Код FR2.1.2-5 | Требование говорит: фильтр показывает вариант «Все» и список доступных сфер с множественным выбором, а по умолчанию в поле фильтра отображается «Все сферы». В коде сам фильтр собран как описано: пункт «Все» первым, за ним сферы, выбор нескольких значений с галочками, «Все» выделяет и снимает весь список. Расходится подпись: строки «Все сферы» в разделе нет — для состояния «ничего не выбрано / выбрано всё» задан текст «Все», а над полем стоит подпись «Сферы». Отдельно: подпись выбранного значения выводится только когда что-то выбрано, поэтому при пустом фильтре — то есть ровно «по умолчанию» из требования — в поле не появляется даже «Все», сотрудник видит только подпись «Сферы». Строка «Все сферы» в проекте есть, но в другом разделе и к этому фильтру не относится. \ состав фильтра — features/option-list/ui/OptionsList.vue:15-31,130-138; текст «Все» и подпись «Сферы» — :20,29; когда выводится подпись выбранного — shared/ui/fields/SelectField.vue:31-33,273-279; «Все сферы» в другом разделе — features/promo-code-drawer/model/usePromoCodeDrawer.options.ts:153 | Бизнес | Open | (А) Согласовать одну формулировку и привести к ней и BRD, и интерфейс (рекомендуется) — если правильный текст «Все сферы», это правка одного значения в коде; если достаточно «Все» при подписи «Сферы» — правка одного слова в FR2.1.2-5. Дороже всего оставить расхождение: на приёмке оно всплывёт как дефект интерфейса. (Б) Заодно решить, должно ли поле при пустом фильтре показывать выбранный текст или достаточно подписи «Сферы» — сейчас требование говорит «отображается», а поле пустое, и это уже не только про формулировку. | |
| OQ2.1.2-9 | Код FR2.1.2-4 | Требование говорит: интерфейс выполняет поиск по названию и фильтрует список по введённому значению. В коде поиск по названию работает, но ищет не только по нему: строка сверяется ещё и с названиями сфер, в которых используется опция. Практическое следствие — в результатах появляются опции, в названии которых введённого текста нет: набрав название сферы, сотрудник получит все её опции. Само по себе это удобно и, возможно, так и задумано, но требование описывает поиск только по названию, поэтому по BRD такой результат читается как ошибка фильтрации. Поиск, как и остальные фильтры, применяется к уже загруженному списку. \ условие поиска — features/option-list/ui/OptionsList.vue:159-166 (сверка с названиями сфер — :164); откуда берутся названия сфер — :112-127 | Бизнес | Open | (А) Подтвердить поиск и по названиям сфер и дописать это в FR2.1.2-4 (рекомендуется) — поведение уже в интерфейсе и выглядит осмысленным для справочника, где сферы — главный признак опции; в описании требования достаточно одной фразы. (Б) Если поиск должен работать строго по названию опции, убрать сверку со сферами — правка в одну строку. Первым нужно решение бизнеса: без него нельзя сказать, дефект это или недокументированная возможность. | |
| OQ2.1.2-10 | Код вне BRD | Что нашли: в коде полностью реализовано редактирование существующей опции, которого в BRD нет. Scope раздела содержит только «Создание опции» (S3), а в списке кликабельна каждая строка: нажатие открывает ту же боковую панель, но с заголовком «Редактирование опции» и заполненными полями, и сохранение вызывает у бэкенда обновление опции, а не создание. Через эту же форму опцию можно отправить в архив и вернуть из архива — переключателем «Архив» у уже существующей записи. Это расходится и с разделом «Ключевые понятия», где архивной названа опция, «для которой при создании включен признак «Архив»». По объёму это самая крупная часть реализации, не описанная документом: не деталь поведения, а целый пользовательский сценарий и две операции над справочником. Без него в BRD раздел выглядит только как список и создание, хотя фактически это полноценный редактор справочника. \ вход в редактирование из списка — features/option-list/ui/OptionsList.vue:53-54, widgets/options/ui/OptionsWidget.vue:5,39-42; режим и заголовок формы — features/option-drawer/ui/OptionDrawer.vue:6, features/option-drawer/model/useOptionDrawer.ts:28,77-89; обновление на бэкенде — features/option-drawer/model/store.ts:35-42, shared/api/OptionsService.ts:50-59; архивирование существующей опции тем же переключателем — features/option-drawer/ui/OptionDrawer.vue:46-51 | Разработка | Open | (А) Описать редактирование отдельными требованиями — вход из списка, состав полей, изменение признака «Архив» у существующей опции — и добавить их в Scope (рекомендуется) — код уже написан, поэтому это не оценка новых работ, а фиксация факта; без неё сценарий не покрыт ни требованиями, ни приёмкой, и любая правка формы рискует его сломать незамеченно. (Б) Если редактирование в этом разделе не предполагалось, надо сначала выяснить, откуда он взялся, и только потом решать — убирать или оставлять; в этом случае вопрос уходит бизнесу. Порождает уточнение к «Ключевым понятиям»: признак «Архив» включается не только при создании. Связать с OQ2.1.2-7. | |
| OQ2.1.2-11 | Код вне BRD | Что нашли: таблица опций умеет две вещи, которых в FR2.1.2-3 нет. Первая — постраничный вывод: по умолчанию 25 строк на странице, сотрудник может переключить на 10, 50 или 100. Вторая — сортировка: сортируются все колонки, включая «Используется в сферах», для которой написан отдельный порядок сравнения. То есть поведение списка при большом справочнике заметно богаче описанного: BRD говорит только «показывает таблицу с колонками», и по нему нельзя понять ни того, что список разбивается на страницы, ни того, какой порядок строк считается правильным по умолчанию. \ постраничный вывод — features/option-list/ui/OptionsList.vue:49-50, shared/ui/data-table/DataTable.vue:9-10,87-88; сортировка всех колонок по умолчанию — shared/ui/data-table/DataTable.vue:150-161 (sortable: c.sortable ?? true); отдельный порядок сравнения для колонки сфер — features/option-list/ui/OptionsList.vue:179 | Разработка | Open | (А) Дописать в FR2.1.2-3 постраничный вывод с размером страницы по умолчанию и сортировку колонок (рекомендуется) — оба поведения приходят из общей таблицы админ-панели и никуда не денутся; описать их дешевле, чем каждый раз объяснять на приёмке. Заодно зафиксировать порядок строк по умолчанию: сейчас он не задан и определяется ответом бэкенда. (Б) Оставить недокументированным — приемлемо только если справочник опций заведомо мал, но тогда стоит убрать переключатель размера страницы, чтобы не показывать сотруднику лишний элемент. | |
| OQ2.1.2-12 | Код вне BRD | Что нашли: в разделе есть готовая, но нигде не подключённая функциональность. Первое — отдельные операции «отправить опцию в архив» и «вернуть опцию из архива»: они описаны и в сервисе обращения к бэкенду, и в слое хранения, но не вызываются ни из одного экрана. Архивность сейчас меняется только переключателем в форме, то есть через полное обновление опции. Второе — «Описание» опции: поле есть в контракте бэкенда, есть в параметрах создания и обновления, для него написана функция чтения — но в форме такого поля нет, и оно никогда не заполняется и не показывается. Это не расхождение с BRD, а незакрытый код: либо остаток от прежнего замысла, либо задел под требования, которых в документе нет. \ операции архивирования и восстановления объявлены и не используются — shared/api/OptionsService.ts:62-68, entities/option/store/options.api.ts:53-61; «Описание» в контракте и параметрах — shared/api-contracts/options/options.schema.ts:10,27, entities/option/store/options.api.ts:33,44, функция чтения — entities/option/lib/option.getters.ts:16-19; в форме поля нет — features/option-drawer/ui/OptionDrawer.vue:12-42, features/option-drawer/model/store.ts:9-14 | Разработка | Open | (А) Убрать неиспользуемое либо подключить осознанно (рекомендуется) — держать в справочнике два способа архивировать опцию, из которых работает один, и поле «Описание», которое нельзя ни заполнить, ни увидеть, дороже, чем убрать: следующий разработчик будет считать это рабочим контрактом. (Б) Если «Описание» и отдельное архивирование нужны — они должны появиться в BRD как требования, и это вопрос бизнеса о наполнении справочника, а не техническая уборка. Связать с OQ2.1.2-10: архивирование существующей опции сейчас идёт через форму редактирования. | |
| OQ2.1.2-13 | Код вне BRD | Что нашли: поиск и оба фильтра работают целиком в браузере по заранее загруженному списку. Раздел запрашивает у бэкенда все опции без параметров — и затем отбирает нужные у себя. При этом обращение к бэкенду умеет фильтровать на своей стороне: у него предусмотрены отбор по сфере и по признаку архивности, ровно те, что нужны разделу, — но раздел их не передаёт. Пока справочник небольшой, разницы не видно; при росте это означает, что на каждое открытие раздела выгружается весь справочник, а постраничный вывод из OQ2.1.2-11 работает по уже полученным данным, а не по запросу. Заодно на этом же загруженном списке держится проверка дубля названия из OQ2.1.2-5. На требования BRD это не выходит — там про источник фильтрации ничего не сказано, — но определяет, как раздел поведёт себя при росте справочника. \ запрос без параметров — features/option-list/ui/OptionsList.vue:99; отбор в браузере — :141-169; серверные параметры отбора предусмотрены и не используются — shared/api/OptionsService.ts:17-35, entities/option/model/useOptionQueries.ts:11-26, entities/option/store/options.api.ts:19-28 | Разработка | Open | (А) Оставить как есть и зафиксировать это решением по разделу (рекомендуется, если справочник опций измеряется десятками записей) — клиентская фильтрация даёт мгновенный отклик и меньше запросов, менять её без причины не стоит. (Б) Если справочник может вырасти до сотен записей, переводить отбор по сфере и архивности на бэкенд — параметры там уже есть, поэтому это подключение, а не разработка контракта; вместе с этим придётся переводить на бэкенд и постраничный вывод, и проверку дубля названия. Решение нужно принять до того, как справочник вырастет: потом это переделка трёх связанных мест. | |
| OQ2.1.2-14 | Код FR2.1.2-2 | Что нашли: признак архивности в списке есть и переключается, но BRD не говорит, в каком состоянии он должен быть при открытии раздела, а код выбрал показывать архивные опции сразу — при входе список содержит и действующие, и архивные, приглушённые. Действие в панели предлагает их скрыть. Для справочника это спорный выбор по умолчанию: сотрудник чаще работает с действующими опциями, а архив нужен точечно; к тому же архивные записи попадают в результаты поиска и фильтра по сферам. Расхождением с требованием это не назвать — требование про состояние по умолчанию молчит, — но выбор сделан кодом, а не документом. \ состояние по умолчанию — features/option-list/ui/OptionsList.vue:104; как применяется — :144-146; переключатель и его подписи — :34, shared/ui/button/ArchiveActionButton.vue:3-4,19-29; приглушение архивных строк — features/option-list/ui/OptionsList.vue:192-194 | Бизнес | Open | (А) Зафиксировать в FR2.1.2-2 состояние признака по умолчанию (рекомендуется) — и, если по умолчанию архив надо скрывать, это правка одного значения в коде; сейчас поведение не описано, поэтому проверить его на приёмке нечем. (Б) Оставить показ архивных по умолчанию, но тогда стоит явно описать в BRD, что архивные опции участвуют в поиске и фильтре по сферам, — иначе это выглядит как дефект фильтрации. | |
| OQ2.1.2-15 | BRD 2.1.2, раздел 5 и раздел 6 | Проблема: в таблице требований колонка «BR» пуста во всех пятнадцати строках, хотя раздел 4 прямо отсылает к пункту 4 раздела Back: 8.2.1 «Сферы и Опции». Из-за этого ни одно требование интерфейса нельзя проследить до конкретного бизнес-правила: при сверке нечем проверить, полон ли набор требований и не противоречит ли он бэкенду. Это особенно заметно там, где спор идёт о правиле, а не об интерфейсе, — например, допустима ли диапазонная опция без значения по умолчанию (OQ2.1.2-2) или как трактовать «полностью совпадающее название» (OQ2.1.2-5): ответ должен быть в BR, а ссылки на него нет. Кроме того, в разделе 6 осталась пустая строка-заготовка OQ2.1.2-1 без содержания. \ BRD 2.1.2 v0.1, раздел 5 (колонка «BR» — пуста во всех 15 строках), раздел 4 (ссылка на Back: 8.2.1), раздел 6 (строка OQ2.1.2-1) | Бизнес | Open | (А) Проставить в колонке «BR» ссылки на конкретные правила Back: 8.2.1 и убрать либо заполнить пустую заготовку OQ2.1.2-1 (рекомендуется) — без этого раздел нельзя сверить с бэкендом, а часть вопросов выше нельзя закрыть по существу: нет документа, к которому апеллировать. (Б) Если для интерфейсных требований раздела сквозная привязка к BR не предполагается, зафиксировать это в шапке BRD — тогда сплошная пустая колонка перестанет читаться как незаполненный документ. | |
| OQ2.1.2-16 | Код FR2.1.2-1, FR2.1.2-2, FR2.1.2-6 | Что подтверждено: точка входа в раздел и управление списком работают так, как описано, — все три требования веса 1 закрыты полностью. Заголовок «Опции» выводится над страницей вместе с действием возврата, и возврат ведёт именно на предыдущий уровень настроек — «Основные», а не «куда-нибудь назад по истории браузера»: путь раздела прописан в карте иерархии явно. Путь «Основные > Опции» показывается в шапке: цепочка собирается по адресу страницы, служебный корень «Настройки» из неё убирается, «Основные» остаётся ссылкой на уровень выше. В панели над списком есть все четыре заявленных элемента — поле «Найти», фильтр «Сферы», переключатель архивности и действие добавления опции. Фильтрация по сферам отбирает опции, привязанные хотя бы к одной из выбранных сфер, — это соответствует формулировке «соответствующие выбранным сферам». \ заголовок и возврат — shared/ui/button/BackButton.vue:2-9,51-57,60-65, layouts/default.vue:14-16, pages/settings/main/options.vue:8-12, карта иерархии — shared/lib/useSafeBack.ts:24,73-87; путь раздела — features/header-breadcrumbs/model/useHeaderBreadcrumbs.ts:55-85, features/header-breadcrumbs/ui/HeaderBreadcrumbs.vue:8-21, подписи — pages/settings/main/index.vue:8, pages/settings/main/options.vue:10; элементы панели — features/option-list/ui/OptionsList.vue:6-14,15-31,34,35; фильтрация по сферам — :148-157 | Разработка | Подтверждено | Изменений не требуется. Подтверждение зафиксировано как база: если FR2.1.2-3, FR2.1.2-5 или FR2.1.2-15 будут дорабатываться, панель фильтров и путь раздела трогать не нужно — расхождения там в других местах. | — |
| OQ2.1.2-17 | Код FR2.1.2-7, FR2.1.2-8, FR2.1.2-9, FR2.1.2-10, FR2.1.2-12 | Что подтверждено: форма создания опции соответствует BRD по составу и по двум из трёх правил валидации — пять требований веса 1 закрыты полностью. Боковая панель открывается с заголовком «Создание опции» именно в режиме создания и содержит всё перечисленное: поле «Название», переключатели «Диапазон» и «Архив», действие закрытия в шапке и кнопку «Сохранить». Поле «Значение по умолчанию» появляется строго при включённом «Диапазоне» и скрывается при выключенном; при этом, если признак выключить, ранее введённое значение на бэкенд не уходит — отправляется пустое, то есть скрытых данных за формой не остаётся. Закрытие панели работает и сбрасывает форму, так что следующее открытие начинается с чистых полей. Кнопка «Сохранить» недоступна, пока «Название» не заполнено, и остаётся заблокированной на время запроса. Незакрытым в форме остаётся только одно правило — валидация значения по умолчанию, OQ2.1.2-2. \ панель и её состав — features/option-drawer/ui/OptionDrawer.vue:4-8,15-23,26-29,46-51,56-65, действие закрытия — shared/ui/drawer/SimpleDrawer.vue:23-25,67-69; показ поля по признаку — features/option-drawer/ui/OptionDrawer.vue:31, отправка пустого значения при выключенном признаке — features/option-drawer/model/store.ts:40,47; сброс формы при закрытии — features/option-drawer/ui/OptionDrawer.vue:100-106, features/option-drawer/model/useOptionDrawer.ts:65-74; блокировка «Сохранить» по названию и на время запроса — features/option-drawer/model/useOptionDrawer.ts:62, features/option-drawer/ui/OptionDrawer.vue:61,64 | Разработка | Подтверждено | Изменений не требуется. Подтверждение важно для оценки OQ2.1.2-2: каркас формы и механика блокировки кнопки готовы и проверены, недостающая валидация добавляется в уже существующее условие — отдельных работ по форме это не требует. | — |