Независимость маски и отбора в окне подбора модификаций

Запрос на изменение Версия: 0.2 done

Маска окна подбора модификаций больше не хранится и не восстанавливается — формируется заново из данных АИС при каждом открытии. «Отфильтрованные» и «Отобранные» — независимые списки, связанные только явными действиями пользователя (чекбокс добавляет и блокирует строку, «×»/«Очистить» в «Отобранных» удаляют и разблокируют).

⟨/⟩ Исходник

1. Источник (как есть)

При разборе реального прототипа (скриншот окна подбора для ТС со способом «эксперт», уже применённой модификацией) обнаружено: «Отфильтрованные» показывали весь справочник без сужения (1204 строки, «Alfa Romeo» первой), потому что действовавшая ветка правила 3 («группа сохранена способом «эксперт», сохранённой маски нет») даёт пустую маску — это прямое следствие OQ-19 (маску негде хранить), а не баг. Разбор показал более глубокую проблему: вся модель «маска либо восстанавливается, либо собирается автоуточнением, либо пустая» в принципе не нужна, если развести две вещи — что показывает поиск (маска → «Отфильтрованные») и что уже решено пользователем («Отобранные») — и сделать их независимыми.

2. Разбор

Принятые решения (обсуждение с пользователем):

  1. Маска — чистая функция от данных АИС, без хранения. Формируется заново при каждом открытии окна, тем же автоуточнением (DetectBrandIn → DetectModel → остаток), независимо от способа подбора и от содержимого «Отобранных». Закрывает OQ-19 (хранить нечего) и OQ-22 (рассинхронизация с группой невозможна, раз маска не хранится вовсе).
  2. «Отфильтрованные» и «Отобранные» — независимые списки. Смена маски пересчитывает «Отфильтрованные», но не трогает «Отобранные». Исключение — однократное копирование при открытии окна (правило 1: текущая группа → «Отобранные»).
  3. Связь списков — только через явные действия, однонаправленно. Чекбокс в «Отфильтрованных» добавляет строку в «Отобранные» и блокирует её (серая, недоступна для повторного действия) — а не переключает. «Выбрать все» — массовый аналог того же действия. Кнопка «Снять» в «Отфильтрованных» убрана как бессмысленная при такой модели. «×» / «Очистить» в «Отобранных» — единственный путь убрать запись; после удаления строка в «Отфильтрованных» разблокируется, если всё ещё проходит текущую маску.
  4. Счётчик «Отфильтровано: N» включает заблокированные строки — N всегда равен числу строк по маске, вне зависимости от того, отобраны они или нет.
  5. Не решено в этом CR, зафиксировано как OQ-24. Смена вида ТС/топлива через «Обновить из АИС» может сделать уже отобранные модификации не соответствующими новому виду/топливу — сбрасывать ли «Отобранные» в этом случае, не решено.

3. Blast radius

3.1. Спецификация

Документ Правка
Nts/65_Ui/ModificationSelectionModal.cs правила 1, 3 (переписано), 3а/3б (новые), 4 (дополнено), 8 (убрано упоминание сохранения маски — противоречило новому правилу 3, найдено doc); таблица интерфейсных элементов; раздел «Поведение»; абзац «Открытые вопросы» (убраны закрытые темы)
Nts/60_Epics/NtsFuelCalc/EPIC_NtsFuelCalc.cs AC-C2 переформулирован; OQ-19, OQ-22 закрыты («снят»); OQ-24 добавлен

3.2. Прототип

Файл Правка
Ntr/65_Ui/html/shell.js, функция openNormTool убрать ветки восстановления/пустой маски (hasRestored, NORM_FILTERS), маска — всегда автоуточнение; блокировка строки после добавления в «Отобранные» вместо чекбокса-тумблера; убрать кнопку «Снять»

4. План

  1. ModificationSelectionModal.cs, EPIC_NtsFuelCalc.cs — правки спецификации (сделано).
  2. Прототип: shell.js — убрать персистентность маски (NORM_FILTERS), переписать openNormTool на всегда-автоуточнение и блокировку строк.
  3. Собрать (dotnet build, build-html.cmd).
  4. testovich — реальным выполнением: ТС со способом «эксперт» и ранее применённой модификацией вне маски (кейс Alfa Romeo) — «Отобранные» показывают её независимо от маски; блокировка/разблокировка строк при добавлении/удалении.
  5. Зафиксировать «Итог».

5. Acceptance criteria

6. Итог

Реализовано в Ntr/65_Ui/html/shell.js (openNormTool): убрано хранение/восстановление маски (NORM_FILTERS, hasRestored); автоуточнение теперь безусловное при каждом открытии; чекбокс в «Отфильтрованных» только добавляет и блокирует строку; кнопка «Снять» убрана; «×»/«Очистить» в «Отобранных» удаляют и разблокируют. doc нашёл и исправлены 3 находки в спеке до реализации (правило 8 противоречило правилу 3; абзац «Открытые вопросы» не обновлён; blast radius не упоминал правило 8). testovich реальным выполнением подтвердил соответствие всем AC, включая ключевой сценарий (способ «эксперт», ранее отобранная модификация не совпадает с автоуточнённой маской — «Отфильтрованные» сузились, «Отобранные» не изменились). Находок нет.