⟨/⟩ Nts/35_ChangeRequests/DOC_CR_2026_11_03_ModificationStaticWireframe.cs

113 строк · в начало

using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.ChangeRequests
{
    /// <summary>
    /// Статичный wireframe реестра и карточки модификаций ТС — витрина структуры экрана,
    /// без генератора, без реального сохранения, без общего пути сохранения с окном подбора.
    /// Сознательно урезанный объём по сравнению с тем, что заявлено «не реализовано» в CR
    /// `DOC_CR_2026_11_02_VehicleMarkAlias`.
    /// </summary>
    public class DOC_CR_2026_11_03_ModificationStaticWireframe : IChangeRequestDocument, IHasStructuralLinks, IFolder<NtsChangeRequestsFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>(),
            Rel.Uses<DOC_CR_2026_11_02_VehicleMarkAlias>(),
        };

        public static string _refName = "CR 2026-11-03: статичный wireframe реестра и карточки модификаций ТС";

        public string Name => "Статичный wireframe реестра и карточки модификаций ТС";

        public string Description =>
            @"Добавлен статичный (не генератором, без реального сохранения) wireframe для DOC_VehicleModificationRegistry и DOC_VehicleModificationCard — только структура экрана, намеренно без привязки к типовому механизму генератора и без общего пути сохранения с окном подбора модификаций. Явно сознательно урезанный объём, обсуждался с пользователем.";

        public string Version => "0.1";
        public string Status => "done";
        public string[] Comments => new string[0];

        public static string Source = $"""
            ## Источник (как есть)

            {SdaidAnchors.RefTo<DOC_CR_2026_11_02_VehicleMarkAlias>()} (раздел «Итог») прямо
            зафиксировал: «реестр и карточка модификаций ТС не реализованы в прототипе...
            путь «справочник → карточка» для модификаций остаётся без макета. Отдельная задача.»

            При разборе справочника модификаций в этой же сессии пользователь попросил показать
            реестр и карточку в прототипе. Полная реализация (генератор + типовой реестр +
            общая функция сохранения, переиспользуемая окном подбора) была оценена как отдельная,
            более крупная задача — три самостоятельных технических решения, не точечная правка.
            Пользователь выбрал: только статичный wireframe, в стиле уже существующего
            `vehicle-mark-aliases` (без генератора, без реального сохранения) — показать структуру
            экрана, явно не закрывая ни одну из трёх проблем.
            """;

        public static string Analysis = $"""
            ## Разбор

            1. **Обе страницы — ручная статика**, не продукт генератора
               (`tools/gen-prototype.py`): это осознанное отступление от общего правила «страницы
               прототипа — производный артефакт»
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>()}/
               {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>()} формально имеют таблицы
               «Описание полей»/«Описание колонок», пригодные для генерации, но страницы написаны
               руками — тот же приём, что уже применён для общих справочников
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>()}).
            2. **Сохранение не реализовано.** Кнопки «Сохранить»/«Создать»/«Импорт» — без
               обработчиков или ведут на статичную карточку; явный предупреждающий текст прямо на
               странице карточки объясняет, что общий путь сохранения с окном подбора
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()})
               не реализован — чтобы макет не читался как рабочая функциональность.
            3. **Что это меняет в формулировке предыдущего CR.** Утверждение
               {SdaidAnchors.RefTo<DOC_CR_2026_11_02_VehicleMarkAlias>()} «остаётся без макета»
               больше не точно — макет появился, просто не тот (без генератора/сохранения),
               который там подразумевался. Это не отменяет решение того CR (по-прежнему нет
               типового реестра/общего пути сохранения) — уточняет, что именно сделано сверх него.
            """;

        public static string BlastRadius = """
            ## Blast radius

            ### Спецификация

            | Документ | Правка |
            |---|---|
            | `Nts/65_Ui/VehicleModificationRegistry.cs` | добавлен раздел «Макет» (`Wireframe`, `SdaidHtml.IframeOf`/`LinkTo`) |
            | `Nts/65_Ui/VehicleModificationCard.cs` | добавлен раздел «Макет» (`Wireframe`) |
            | `Nts/65_Ui/html/references.html` | пункт «Марки, модели и модификации ТС» — ссылка вместо текста «макет не включён» |

            ### Прототип

            | Файл | Правка |
            |---|---|
            | `Nts/65_Ui/html/vehicle-modification-registry.html` | новый: статичная таблица, 3 демо-строки, «Создать»/«Импорт» без сохранения |
            | `Nts/65_Ui/html/vehicle-modification-card.html` | новый: статичная форма по составу полей спеки, «Сохранить»/«Отменить» без сохранения, предупреждающий текст |
            """;

        public static string Plan = """
            ## План

            1. `Wireframe`-разделы в двух UI-документах, статичные html-страницы (сделано).
            2. `references.html` — рабочая ссылка вместо текста-заглушки (сделано).
            3. Собрать (`dotnet build`, `build-html.cmd`) (сделано).
            4. Зафиксировать этот CR постфактум — найдено `doc` при финальном сквозном прогоне
               сессии: страницы были добавлены без CR, прямо противоречат «Итогу»
               `DOC_CR_2026_11_02_VehicleMarkAlias` (сделано).
            """;

        public static string Result = $"""
            ## Итог

            Выполнено. Зафиксирован постфактум — находка `doc` при финальном прогоне сессии:
            страницы `vehicle-modification-registry.html`/`vehicle-modification-card.html`
            появились в прототипе без CR, что прямо противоречило «Итогу»
            {SdaidAnchors.RefTo<DOC_CR_2026_11_02_VehicleMarkAlias>()} («остаётся без макета»).
            Этот CR закрывает трассируемость: откуда страницы взялись и почему это не
            отменяет решение прежнего CR (реестр/карточка по-прежнему не через генератор и без
            общего пути сохранения — сознательно урезанный объём).
            """;
    }
}