Модалка подтверждения расчёта и закрепление кнопок действий

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

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

⟨/⟩ Исходник

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

По итогам ручного тестирования карточки ТС:

  1. При нажатии «Сохранить и рассчитать» всплывает модалка подтверждения операции. Модалка чисто информационная — не запрашивает у пользователя решения, просто сообщает о ходе/результате. При этом она перекрывает собой кнопки «Сохранить и рассчитать» и «Отменить» внизу карточки — их не видно, пока модалка не закрыта. Модалку приходится закрывать вручную, хотя сообщать ей, по сути, нечего, на что нужно было бы реагировать.
  2. Кнопки действий («Сохранить и рассчитать», «Отменить») на длинной странице (много полей, как у специальных автомобилей с развёрнутым блоком «Результаты расчёта») уезжают за пределы видимой области экрана при прокрутке — к ним приходится прокручивать страницу отдельно.

2. Разбор

Решение опирается на то, что уже умеет окно операции (openOperation(), Ntr/65_Ui/html/shell.js:729-749 до правки): показывало два шага («Сохранение» → «Расчёт») и при ошибке — ссылку «Открыть лог ошибок», при успехе — просто текст «Расчёт выполнен». То есть содержательна только ссылка на лог при ошибке; текст успеха и сам пошаговый индикатор — чистое дублирование того, что уже видно по бейджам «Статус расчёта»/«Статус обработки» на карточке.

По п. 1 (модалка). Решение (а) из названных направлений: самогаснущее уведомление. В кодовой базе уже есть готовый механизм — showNotice() (shell.js:718-727), используемый, например, для «Сведения о ТС обновлены из АИС ОИА ПЭО». Переиспользуется без изменений. Единственная содержательная часть прежнего окна — ссылка на лог ошибок — переносится в постоянное место: рядом с полем «Ошибка» в группе «Результаты расчёта», видна всё время, пока ошибка актуальна, а не только в момент, сразу следующий за нажатием «Сохранить и рассчитать». Это и есть направление (б) в применении не к дате/времени расчёта, а к самому логу — тот же принцип («сигнал — постоянная часть экрана карточки, а не всплывающее окно»), применённый к действительно содержательной части, а не к тексту успеха.

По п. 2 (закрепление кнопок). Подтверждён прецедент .footer (shell.css:352) — .actions закрепляется тем же приёмом. Конфликта с .op-panel больше нет: он упраздняется вместе с окном операции (п. 1), остаётся только .log-drawer (открывается по клику, не висит на экране постоянно) — пересечения с закреплёнными кнопками нет.

3. Blast radius

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

Документ Правка
Карточка транспортного средства раздел «Поведение»: окно операции → самогаснущее уведомление + постоянная ссылка на лог у поля «Ошибка»; кнопки действий закреплены у угла экрана

3.2. Прототип

Файл Правка
Ntr/65_Ui/html/shell.js обработчик [data-save-calc] — openOperation(...) заменён на showNotice(...); функция openOperation() удалена; setStatus() добавляет иконку .log-icon.calc рядом с бейджем «Статус расчёта», только при статусе «Успешно выполнен»; setError() добавляет отдельную иконку .log-icon.error рядом с полем «Ошибка», только при ошибке — условия показа не пересекаются
Ntr/65_Ui/html/shell.css .actions — position: fixed по образцу .footer; CSS-классы .op-panel/.op-head/.op-steps/.op-step/.op-arrow/.op-mark/.op-desc удалены (не используются); .op-close сохранён — общий класс для крестика закрытия, используется openConfirm/openLog; добавлены .log-icon/.log-icon.calc/.log-icon.error

4. План

  1. shell.css — .actions закреплена у угла экрана; удалены неиспользуемые .op-panel-классы.
  2. shell.js — обработчик сохранения вызывает showNotice() вместо openOperation(); openOperation() удалена; setError() добавляет постоянную ссылку на лог.
  3. VehicleCard.cs — раздел «Поведение» согласован с новым поведением.
  4. Собрать (dotnet build, build-html.cmd).
  5. Зафиксировать «Итог».

5. Acceptance criteria

6. Итог

Реализовано. showNotice() переиспользован для подтверждения; окно операции (openOperation(), .op-panel и связанные CSS-классы) удалено; .actions закреплена у угла экрана по образцу .footer. Доступ к логу — две отдельные иконки (.log-icon .calc у статуса расчёта — только при «Успешно выполнен»; .log-icon .error у поля «Ошибка» — только при ошибке), условия показа не пересекаются. Итерация решения прошла путь ссылка-только-при-ошибке (ошибочно, поймано пользователем) → общая ссылка при любом исходе → две раздельные иконки → иконка лога расчёта сужена до случая реального успеха (была видна и при ошибке — тоже поймано пользователем). Иконки выровнены по DOM-паттерну .hint/addHintSpan (прямые дети .row, не вложены в .val); иконка лога расчёта — зелёная галочка ✓ (var(--green)), не произвольная буква. Сборка и генерация сайта прошли без ошибок.

Связанные артефакты

Документы