(medium) MarketTrendBlock.tsx/LABEL_COLORS: бейдж тренда всегда серый — ключи карты не совпадают с label из бэкенда #1460

Closed
opened 2026-06-15 05:55:59 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: report · Файл: frontend/src/components/site-finder/MarketTrendBlock.tsx:9-14, 85-88, 147-162

MarketTrendBlock.tsx:9-14 — LABEL_COLORS ключуется короткими строками ('Сильный рост', 'Умеренный рост', 'Стагнация', 'Падение'). Бэкенд (parcels.py:2251-2257) кладёт в market_trend.label ТОЛЬКО длинные строки: 'Сильный рост — рынок растёт быстрее инфляции', 'Умеренный рост — стабильный спрос', 'Стагнация — рынок остыл', 'Падение — риск переоценки'. Lookup LABEL_COLORS[trend.label] (line 85) — строгое сравнение по полному ключу, нормализации нет, тип label: string (site-finder.ts:184) → всегда дефолт { bg:'#f3f4f6', color:'#374151' } (серый). Импакт: цветовая дифференциация бейджа тренда (зелёный/красный) потеряна, все тренды рисуются нейтральным серым (текст бейджа корректен). Чинить: нормализовать ключ перед lookup — const baseKey = trend.label.split(' — ')[0]; LABEL_COLORS[baseKey] ?? default — либо startsWith-поиск. Доп.: цвета захардкожены мимо ui-tokens — перевести на --success-soft/--danger-soft.

Почему баг: Подтверждено по коду: единственный продьюсер market_trend.label — parcels.py:2250-2264 — пишет только длинные строки с тире и пояснением; во фронте нет нормализации (split/startsWith), сравнение строгое по полному значению ключа объекта. Тип label: string (site-finder.ts:183). Значит ветка ?? default срабатывает на 100% реальных данных.

Как чинить: Сопоставлять по префиксу/базовой части: например trend.label.split(' — ')[0] или startsWith по ключам LABEL_COLORS; либо завести отдельное короткое поле label_short на бэкенде и ключевать им.


deep-audit «армия ботов 2» · verify+harden, confidence 0.96 · unit U95

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/site-finder/MarketTrendBlock.tsx:9-14, 85-88, 147-162` MarketTrendBlock.tsx:9-14 — LABEL_COLORS ключуется короткими строками ('Сильный рост', 'Умеренный рост', 'Стагнация', 'Падение'). Бэкенд (parcels.py:2251-2257) кладёт в market_trend.label ТОЛЬКО длинные строки: 'Сильный рост — рынок растёт быстрее инфляции', 'Умеренный рост — стабильный спрос', 'Стагнация — рынок остыл', 'Падение — риск переоценки'. Lookup LABEL_COLORS[trend.label] (line 85) — строгое сравнение по полному ключу, нормализации нет, тип label: string (site-finder.ts:184) → всегда дефолт { bg:'#f3f4f6', color:'#374151' } (серый). Импакт: цветовая дифференциация бейджа тренда (зелёный/красный) потеряна, все тренды рисуются нейтральным серым (текст бейджа корректен). Чинить: нормализовать ключ перед lookup — const baseKey = trend.label.split(' — ')[0]; LABEL_COLORS[baseKey] ?? default — либо startsWith-поиск. Доп.: цвета захардкожены мимо ui-tokens — перевести на --success-soft/--danger-soft. **Почему баг:** Подтверждено по коду: единственный продьюсер market_trend.label — parcels.py:2250-2264 — пишет только длинные строки с тире и пояснением; во фронте нет нормализации (split/startsWith), сравнение строгое по полному значению ключа объекта. Тип label: string (site-finder.ts:183). Значит ветка ?? default срабатывает на 100% реальных данных. **Как чинить:** Сопоставлять по префиксу/базовой части: например trend.label.split(' — ')[0] или startsWith по ключам LABEL_COLORS; либо завести отдельное короткое поле label_short на бэкенде и ключевать им. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.96 · unit U95</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:59 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:08 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/components/site-finder/MarketTrendBlock.tsx:9-14LABEL_COLORS ключуется короткими строками («Сильный рост», «Умеренный рост», «Стагнация», «Падение»). Lookup строгий: LABEL_COLORS[trend.label] ?? { bg:'#f3f4f6', color:'#374151' } (стр. 85-88), без нормализации; бейдж рендерит {trend.label} стр. 161. Бэкенд backend/app/api/v1/parcels.py:2226-2240 кладёт в market_trend.label ТОЛЬКО длинные строки: «Сильный рост — рынок растёт быстрее инфляции», «Умеренный рост — стабильный спрос», «Стагнация — рынок остыл», «Падение — риск переоценки».

Корень: Ключи LABEL_COLORS (короткие) ≠ значения label (длинные, с « — …»). Строгий lookup → ветка ?? default (серый) срабатывает на 100% реальных данных; цветовая дифференциация бейджа (зелёный/синий/жёлтый/красный) потеряна. Подтверждено: единственный продьюсер label — parcels.py:2226-2240, других значений нет.

Что править:

  • Нормализовать ключ перед lookup: const baseKey = trend.label.split(" — ")[0]; LABEL_COLORS[baseKey] ?? default — либо startsWith-поиск по ключам.
  • Доп.: цвета захардкожены мимо ui-tokens (стр. 10-13) — перевести на --success-soft/--accent-soft/--warn-soft/--danger-soft (см. .claude/rules/ui-tokens.md).

Что посмотреть:

  • Код: MarketTrendBlock.tsx:9-14, 85-88, 161; parcels.py:2226-2240 (продьюсер label); тип MarketTrend.label в frontend/src/types/site-finder.ts.
  • Vault: domains/ui/components/Component_SiteFinder_Page.md (MarketTrendBlock — Props, label-badge).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/site-finder/MarketTrendBlock.tsx:9-14` — `LABEL_COLORS` ключуется короткими строками («Сильный рост», «Умеренный рост», «Стагнация», «Падение»). Lookup строгий: `LABEL_COLORS[trend.label] ?? { bg:'#f3f4f6', color:'#374151' }` (стр. 85-88), без нормализации; бейдж рендерит `{trend.label}` стр. 161. Бэкенд `backend/app/api/v1/parcels.py:2226-2240` кладёт в `market_trend.label` ТОЛЬКО длинные строки: «Сильный рост — рынок растёт быстрее инфляции», «Умеренный рост — стабильный спрос», «Стагнация — рынок остыл», «Падение — риск переоценки». **Корень:** Ключи `LABEL_COLORS` (короткие) ≠ значения `label` (длинные, с « — …»). Строгий lookup → ветка `?? default` (серый) срабатывает на 100% реальных данных; цветовая дифференциация бейджа (зелёный/синий/жёлтый/красный) потеряна. Подтверждено: единственный продьюсер `label` — parcels.py:2226-2240, других значений нет. **Что править:** - Нормализовать ключ перед lookup: `const baseKey = trend.label.split(" — ")[0]; LABEL_COLORS[baseKey] ?? default` — либо startsWith-поиск по ключам. - Доп.: цвета захардкожены мимо ui-tokens (стр. 10-13) — перевести на `--success-soft`/`--accent-soft`/`--warn-soft`/`--danger-soft` (см. `.claude/rules/ui-tokens.md`). **Что посмотреть:** - Код: `MarketTrendBlock.tsx:9-14, 85-88, 161`; `parcels.py:2226-2240` (продьюсер label); тип `MarketTrend.label` в `frontend/src/types/site-finder.ts`. - Vault: `domains/ui/components/Component_SiteFinder_Page.md` (MarketTrendBlock — Props, label-badge).
Sign in to join this conversation.
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#1460
No description provided.