Ревью PR #3328:
- HistoryView: «Показано N из M сделок» брало M из street-deals, а строки —
из sales-vs-listings; после гашения пустого коридора выходило «из —».
Знаменатель убран, как в 05 РЫНОК;
- обе подписи склоняются через pluralRu («3 фактические сделки», «2 сделки»);
- цвет дельты медианы сделок считается по знаку (mapSources.deltaColor):
зелёным красились и минус, и прочерк — это второй причинный узел жалобы
«−100% зелёным»;
- подпись полосы совпала с карточкой 1 буквально («ПО СДЕЛКАМ РОСРЕЕСТРА»);
- тест: убран тавтологичный assert про EmptyTableNote (её рисует пустой
dealRows, а не guard), добавлены кейсы на футер 04 и на цвет дельты.
Бэкенд по контракту не умеет отдать null в street-deals: «сделок на улице
нет» приезжает как count=0 с нулевыми ценами. Витрина сохраняла этот ноль
через ?? и показывала его как данные — «0,00 млн ₽ · −100% к цене
объявления» зелёным и диапазон «0,00 – 0,00».
- usableStreetDeals() схлопывает пустую оболочку в null на границе мапперов
(mapSources / mapSummary / mapHistory / mapResultPanel) — дальше null уже
везде означает «нет данных», отдельного состояния заводить не нужно;
- футер таблицы сделок брал N и M из РАЗНЫХ выборок (строки — actual_deals
оценки, знаменатель — коридор по улице), выходило «Показано 10 из 3»;
тотала у той же выборки в ответе нет, поэтому знаменатель убран;
- в deals-only ветке (n_analogs=0) полоса диапазона строилась из ДКП-цен,
но была подписана «В ОБЪЯВЛЕНИЯХ» — подпись согласована с карточкой 1.
Closes#3320