Карточка модификации: общий путь сохранения для обеих точек входа
Карточка модификации ТС открывается из реестра и из окна подбора по одному и тому же пути создания/валидации записи — различия только в предзаполнении и поведении после сохранения. Прототип (openCreateModTool) приведён в соответствие: поля «Марка»/«Модель» стали выбором из справочника с возможностью ввода нового значения, как в спеке, вместо произвольного текста/datalist.
1. Источник (как есть)
При разборе прототипа окна подбора модификаций обнаружено: поля «Марка» и «Модель» в
форме «Создать модификация» (openCreateModTool, Ntr/65_Ui/html/shell.js) были
обычным текстовым вводом (у «Марки» — с HTML <datalist>-подсказками, у «Модели» —
вообще без них), хотя спека (VehicleModificationCard.cs, «Основные интерфейсные
элементы») описывает оба поля как «выбор существующей записи справочника или ввод
нового значения». При сохранении результат пушился плоской строкой прямо в
window.NTS_REF, минуя какое-либо понятие о записи VehicleMark/VehicleModel.
В обсуждении с пользователем встал более общий вопрос: «карточка модификации открывается из реестра и из окна подбора — значит ли это, что из окна подбора должна открываться отдельная, специально заточенная под эту задачу форма, а не та же карточка записи справочника?»
2. Разбор
Решение (обсуждение с пользователем): не «одна форма» против «две формы» буквально, а разделение по тому, что действительно обязано быть общим, а что — нет.
Общее, обязательно одно: сама операция создания/изменения записи VehicleModification
и связанных VehicleMark/VehicleModel — состав полей, валидация, правило «выбор или
создание новой записи». Два независимых места, создающих один и тот же тип записи —
источник дрейфа: ровно это уже произошло в прототипе (openCreateModTool обходил
доменную модель целиком, в отличие от того, что подразумевает спека).
Разное, по праву: то, что специфично для точки входа — предзаполнение (из окна
подбора вид ТС/топливо подставляются точно, марка/модель — предложением распознавания;
из реестра — пусто или значения редактируемой записи) и поведение после сохранения
(реестр → возврат в реестр; подбор → возврат в то же окно, новая запись доступна для
отбора, группа не применяется автоматически). Это уже было прописано в спеке
(VehicleModificationCard.cs, «Поведение») и остаётся в силе — явно подтверждено
отдельным абзацем в «Структуре экрана», чтобы не читалось как «различие только в
предзаполнении» (буквальная формулировка, с которой начался вопрос).
Если для задачи подбора в будущем понадобится что-то специфичное для контекста ТС (например, «Сохранить и отобрать» как отдельное действие) — это дополнение к общему пути (доп. кнопка/поведение поверх тех же создания/валидации), а не повод заводить вторую независимую реализацию. Такое дополнение в этом CR не вводится — спека его не описывает, это осталось бы домыслом без отдельного запроса пользователя.
3. Blast radius
3.1. Спецификация
| Документ | Правка |
|---|---|
Nts/65_Ui/VehicleModificationCard.cs |
«Структура экрана» — явный абзац: путь создания/валидации один у обеих точек входа, различие — предзаполнение и поведение после сохранения, не реализация |
3.2. Прототип
| Файл | Правка |
|---|---|
Ntr/65_Ui/html/shell.js, buildSelect |
новый опциональный параметр opts.allowCustom — непустой текст, не совпавший со списком, становится значением (Enter без совпадения, потеря фокуса) |
Ntr/65_Ui/html/shell.js, openCreateModTool |
поля «Марка»/«Модель» — buildSelect(..., {allowCustom:true}) вместо текста/<datalist>; «Модель» сужена выбранной маркой (modelsOfMark, как в окне подбора) |
4. План
VehicleModificationCard.cs— абзац про общий путь (сделано).shell.js—buildSelectсallowCustom;openCreateModToolна новые поля (сделано).- Собрать (
build-html.cmd). doc/testovich— проверка.- Зафиксировать «Итог».
5. Acceptance criteria
- AC-1. Спека явно утверждает общий путь создания/валидации записи модификации для обеих точек входа карточки.
- AC-2. Поле «Марка» в форме «Создать модификация» — выбор из списка марок или ввод нового значения (не просто текст с подсказками).
- AC-3. Поле «Модель» — выбор из списка моделей выбранной марки или ввод нового значения; список пересобирается при смене марки.
6. Итог
Спека: VehicleModificationCard.cs явно утверждает общий путь создания/валидации
записи для обеих точек входа. Прототип: buildSelect получил opts.allowCustom
(непустой текст без совпадения в списке фиксируется по Enter/потере фокуса — старое
поведение без этого флага не изменилось); openCreateModTool переведён на такие
buildSelect для «Марка»/«Модель», <datalist> и обычный текстовый ввод убраны,
«Модель» сужается выбранной маркой (modelsOfMark).
doc — без нарушений (одно стилистическое замечание: внутридокументная ссылка «см.
«Поведение»» голым текстом, не блокирует). testovich реальным выполнением (jsdom)
подтвердил все AC: выбор существующей записи, ввод новой с фиксацией по Enter/blur,
пересборка списка моделей при смене марки, отсутствие регрессии у прежних вызовов
buildSelect без allowCustom, корректное сохранение записи в NTS_REF.
После закрытия, по замечанию пользователя (не найдено ни doc, ни testovich):
список «Марка» показывал одну и ту же марку несколько раз (например, «Toyota» четыре
раза подряд) — marksList строился как NTS_BRANDS.map(b => b[1]) без уникализации,
а NTS_BRANDS — пары «ключ-алиас → каноническая марка» (один алиас маппится один в
один, но у марки несколько алиасов — у Toyota их 4, реальным подсчётом). Исправлено:
marksList — уникальные канонические значения, отсортированные по алфавиту (584 пары
→ 534 уникальные марки, подтверждено выполнением). testovich проверял выбор и ввод
конкретных значений, но не состав/уникальность самого списка опций — пробел в охвате
проверки, не в логике фикса.
Структурные связи
Использует
- Доменная сущность Марка ТС
- Доменная сущность Модель ТС
- Экран Карточка модификации ТС
- Экран Окно подбора модификаций