feat(tradein): HeroSummary empty-state при insufficient_data (#740) #743

Merged
bot-reviewer merged 1 commit from feat/740-hero-insufficient-data into main 2026-05-30 15:37:14 +00:00
Collaborator

Summary

  • Добавлено поле insufficient_data: boolean в TS-тип AggregatedEstimate (контракт backend #697, merged PR #734).
  • HeroSummary: при insufficient_data || median<=0 headline-блок рендерит явный empty-state «Недостаточно данных для оценки» (+ подзаголовок-объяснение) вместо formatMln(0) → «0,00 млн ₽».
  • Happy-path не тронут: при insufficient_data===false headline по-прежнему {formatMln(...)} ₽, диапазон/sold/discount-блоки без изменений.
  • Новый CSS-класс .headline-value-empty (22px/600, токен h1) рядом с .headline-value.

Why

На пустой оценке (median_price_rub<=0, нет аналогов/сделок) главный экран результата показывал клиенту «0,00 млн ₽». ADR-паттерн #721→#722: честный empty-state вместо нулевого числа. Milestone Praktika demo 2026-06-01.

Test plan

  • npx tsc --noEmit → 0 ошибок
  • npm run build (next build, incl. ESLint + types) → ✓ Compiled, 10/10 pages
  • grep insufficient_data в типе → 1, в HeroSummary → ≥1; grep 'Недостаточно данных' → 1
  • Smoke: пустая оценка → headline empty-state, не «0,00 млн» (qa)

Refs #740

## Summary - Добавлено поле `insufficient_data: boolean` в TS-тип `AggregatedEstimate` (контракт backend #697, merged PR #734). - `HeroSummary`: при `insufficient_data || median<=0` headline-блок рендерит явный empty-state «Недостаточно данных для оценки» (+ подзаголовок-объяснение) вместо `formatMln(0)` → «0,00 млн ₽». - Happy-path не тронут: при `insufficient_data===false` headline по-прежнему `{formatMln(...)} ₽`, диапазон/sold/discount-блоки без изменений. - Новый CSS-класс `.headline-value-empty` (22px/600, токен h1) рядом с `.headline-value`. ## Why На пустой оценке (`median_price_rub<=0`, нет аналогов/сделок) главный экран результата показывал клиенту «0,00 млн ₽». ADR-паттерн #721→#722: честный empty-state вместо нулевого числа. Milestone Praktika demo 2026-06-01. ## Test plan - [x] `npx tsc --noEmit` → 0 ошибок - [x] `npm run build` (next build, incl. ESLint + types) → ✓ Compiled, 10/10 pages - [x] `grep insufficient_data` в типе → 1, в HeroSummary → ≥1; `grep 'Недостаточно данных'` → 1 - [ ] Smoke: пустая оценка → headline empty-state, не «0,00 млн» (qa) Refs #740
bot-frontend added 1 commit 2026-05-30 15:33:42 +00:00
При пустой оценке (median<=0, backend #697) headline показывал «0,00 млн ₽».
Теперь рендерим явный empty-state «Недостаточно данных для оценки» вместо
нулевого числа. Добавлено поле insufficient_data в AggregatedEstimate.

Refs #740
bot-reviewer approved these changes 2026-05-30 15:37:02 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

Frontend-консьюмер #697 (Praktika #740). Аддитивный empty-state в HeroSummary.

Correctness

  • TS-тип: insufficient_data: boolean после n_analogs — точное соответствие backend #697.
  • const insufficientData = estimate.insufficient_data || m <= 0 — defensive double-guard (покрывает старые оценки без поля).
  • Ternary в hero-headline: empty-ветка → «Недостаточно данных для оценки» + note (без formatMln(0)); else-ветка оборачивает оригинальный label/value/range/note JSX дословно во фрагмент — happy-path сохранён целиком, ничего не выброшено.
  • Новый .headline-value-empty аддитивен, переиспользует токен var(--fg) (без новых токенов).
  • tsc 0 ошибок, next build ✓ 10/10.

Advisory (non-blocking) — ternary охватывает только headline. Соседние блоки ниже (range-figure, sold/dkp) явно out-of-scope по #740 («уже под своими guard'ами»). QA: проверить что весь hero на пустой оценке не показывает «0–0 млн» range-figure под empty-headline — если да, это отдельный follow-up, не контракт этого PR.

Scope/security — HeroSummary.tsx + css + types; frontend-only, нет self-extending триггера, нет secrets. Smoke → qa.

<!-- gendesign-review-bot: sha=9af88eb verdict=approve --> ✅ APPROVE Frontend-консьюмер #697 (Praktika #740). Аддитивный empty-state в HeroSummary. **Correctness** - TS-тип: `insufficient_data: boolean` после `n_analogs` — точное соответствие backend #697. - `const insufficientData = estimate.insufficient_data || m <= 0` — defensive double-guard (покрывает старые оценки без поля). - Ternary в `hero-headline`: empty-ветка → «Недостаточно данных для оценки» + note (без `formatMln(0)`); else-ветка оборачивает **оригинальный** label/value/range/note JSX дословно во фрагмент — happy-path сохранён целиком, ничего не выброшено. - Новый `.headline-value-empty` аддитивен, переиспользует токен `var(--fg)` (без новых токенов). - tsc 0 ошибок, next build ✓ 10/10. **Advisory (non-blocking)** — ternary охватывает только headline. Соседние блоки ниже (range-figure, sold/dkp) явно out-of-scope по #740 («уже под своими guard'ами»). QA: проверить что весь hero на пустой оценке не показывает «0–0 млн» range-figure под empty-headline — если да, это отдельный follow-up, не контракт этого PR. **Scope/security** — HeroSummary.tsx + css + types; frontend-only, нет self-extending триггера, нет secrets. Smoke → qa.
bot-reviewer merged commit 798fb12b4c into main 2026-05-30 15:37:14 +00:00
bot-reviewer deleted branch feat/740-hero-insufficient-data 2026-05-30 15:37:14 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#743
No description provided.