feat(tgu-ui): запрет выбора конфликтных слотов + прохождение без подсветки

- конфликтные слоты нельзя добавить в выбор под бронь (клик по строке,
  Shift-диапазон, выбор полосы на карте, «выбрать все») — жёсткая блокировка;
  снятие выбора не блокируется (конфликт считается только для невыбранных)
- слоты одной полосы между собой не конфликтуют (groupOf) — иначе нельзя было
  бы набрать полосу поштучным кликом
- чекбокс «Конфликты» теперь и гасит, и блокирует выбор; выкл. — выбирать любые
- переход на прохождение (◀/▶) больше не подсвечивает никакой слот: активная
  подсветка строки — только по явному клику; добавлена прокрутка к началу прохода
- повторный Shift+клик по тому же концу снимает выделение (таблица и карта)
This commit is contained in:
Дмитрий Соловьев
2026-06-17 14:07:03 +03:00
parent c402f376c5
commit 354730fb6c
7 changed files with 220 additions and 63 deletions
@@ -12,6 +12,9 @@ type CoveragePanelProps = {
/** Тумблер следа покрытия на карте (D4 — локальный, вкл. по умолчанию). */
coverageOn: boolean;
onToggleCoverage: (on: boolean) => void;
/** Тумблер подсветки конфликтов выбора (тусклый слой) — рядом со следом на карте. */
showConflicts: boolean;
onToggleConflicts: (on: boolean) => void;
};
// Панель покрытия над списком слотов (D-D1): «забронировано NN% · с выбором MM%» + двухсегментный
@@ -23,6 +26,8 @@ export function CoveragePanel({
available,
coverageOn,
onToggleCoverage,
showConflicts,
onToggleConflicts,
}: CoveragePanelProps) {
const bookedPct = booked?.percent ?? 0;
const withPct = withSelection?.percent ?? bookedPct;
@@ -34,14 +39,27 @@ export function CoveragePanel({
<div className="tgu-coverage">
<div className="tgu-coverage__head">
<span className="tgu-coverage__title">Покрытие заявки</span>
<label className="tgu-coverage__toggle" title="Показывать след покрытия на карте">
<input
type="checkbox"
checked={coverageOn}
onChange={(event) => onToggleCoverage(event.target.checked)}
/>
След на карте
</label>
<div className="tgu-coverage__toggles">
<label className="tgu-coverage__toggle" title="Показывать след покрытия на карте">
<input
type="checkbox"
checked={coverageOn}
onChange={(event) => onToggleCoverage(event.target.checked)}
/>
След на карте
</label>
<label
className="tgu-coverage__toggle"
title="Гасить и блокировать выбор слотов, недоступных из-за текущего выбора (тот же КА, не хватает времени на манёвр). Выкл. — выбирать можно любые."
>
<input
type="checkbox"
checked={showConflicts}
onChange={(event) => onToggleConflicts(event.target.checked)}
/>
Конфликты
</label>
</div>
</div>
{!available ? (