fix(sf-03): CompetitorTable Status column + filter tabs #278

Merged
lekss361 merged 1 commit from fix/sf-03-competitor-table-status into main 2026-05-17 10:50:27 +00:00
Owner

Summary

SF FixList #3 — CompetitorTable теперь показывает статус ЖК (Строящиеся/Сданные) с цветным badge + filter tabs.

Depends on backend PR #276 (SF #2) — добавит site_status/ready_dt в /analyze response. До его deploy все badges будут null/.

Изменения

  • frontend/src/types/site-finder.tsParcelAnalysisCompetitor extended с site_status?: string | null и ready_dt?: string | null (backward compat, additive)
  • frontend/src/components/site-finder/CompetitorTable.tsx:
    • Status column с <StatusBadge> (green=Строящиеся, slate=Сданные, zinc=null)
    • Filter tabs row: Все (N) | Строящиеся (N) | Сданные (N) с useState<"all"|"building"|"ready">
    • Filter применяется ДО slice(0, 20) → footer показывает filtered.length
  • Vault: fixes/Fix_SF_CompetitorTable_Status_May17.md

Test plan

  • Open parcel в site-finder → Market tab → Competitors block — Status column visible
  • До deploy PR #276 → badges null/. После deploy → правильные цвета
  • Filter tabs toggle (Строящиеся/Сданные filter rows)
  • tsc strict pass

⚠️ Review note: worker использовал inline hex colors (#d1fae5/#065f46) для badges. По .claude/rules/frontend.md лучше использовать Tailwind utility classes (bg-emerald-100 text-emerald-700) — reviewer может попросить refactor. Это P3 cleanup, можно follow-up PR (item #19 в epic #271).

Related: epic #271 item #3 (Wave 1, last item) · Depends on #276

## Summary SF FixList #3 — CompetitorTable теперь показывает статус ЖК (Строящиеся/Сданные) с цветным badge + filter tabs. Depends on backend **PR #276** (SF #2) — добавит `site_status`/`ready_dt` в `/analyze` response. До его deploy все badges будут null/`—`. ## Изменения - `frontend/src/types/site-finder.ts` — `ParcelAnalysisCompetitor` extended с `site_status?: string | null` и `ready_dt?: string | null` (backward compat, additive) - `frontend/src/components/site-finder/CompetitorTable.tsx`: - **Status column** с `<StatusBadge>` (green=Строящиеся, slate=Сданные, zinc=null) - **Filter tabs row**: `Все (N) | Строящиеся (N) | Сданные (N)` с `useState<"all"|"building"|"ready">` - Filter применяется ДО `slice(0, 20)` → footer показывает `filtered.length` - Vault: `fixes/Fix_SF_CompetitorTable_Status_May17.md` ## Test plan - [ ] Open parcel в site-finder → Market tab → Competitors block — Status column visible - [ ] До deploy PR #276 → badges null/`—`. После deploy → правильные цвета - [ ] Filter tabs toggle (Строящиеся/Сданные filter rows) - [ ] tsc strict pass ⚠️ **Review note:** worker использовал inline hex colors (`#d1fae5`/`#065f46`) для badges. По `.claude/rules/frontend.md` лучше использовать Tailwind utility classes (`bg-emerald-100 text-emerald-700`) — reviewer может попросить refactor. Это P3 cleanup, можно follow-up PR (item #19 в epic #271). Related: epic #271 item #3 (Wave 1, last item) · Depends on #276
lekss361 added 1 commit 2026-05-17 10:43:04 +00:00
fix(sf-03): CompetitorTable Status column + filter tabs
Some checks failed
CI / backend (pull_request) Failing after 49s
CI / frontend (pull_request) Successful in 1m55s
98323027aa
После backend PR #276 (site_status в /analyze) — frontend показывает
статус строящиеся/сданные с цветным badge и фильтр-tabs наверху таблицы.

TS type extended manually (backward compat) — codegen подхватит после
backend deploy.

Closes (epic part) #271 item 3
lekss361 merged commit 102ef88d56 into main 2026-05-17 10:50:27 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE.

Что проверено:

  • Types extension additive + optional → backward compat OK
  • Filter logic: competitors.filter(...).slice(0, 20) — correct order, counts от полного списка (не filtered) — tabs показывают true totals
  • Footer fix: filtered.length consistent с filter применением
  • Empty state differentiated (filter empty vs no competitors at all) — good UX
  • Types: literal union "all"|"building"|"ready" — type-safe

Inline hex vs Tailwind (author-flagged):
Acknowledged. Existing CompetitorTable.tsx уже full inline-styles (CLASS_COLORS: Record<string, string> с hex, все style={{ ... }}) → worker consistent с existing pattern, не regression. Tailwind migration требует refactor всего файла — отдельный chore (item #19 в epic #271, P3).

Smoke checklist после deploy:

  • /site-finder → парсель → Market tab → Competitors block → колонка "Статус" видна
  • До deploy backend PR #276 → все badges показывают (null state)
  • После PR #276 deploy → green/slate badges для Строящиеся/Сданные
  • Filter tabs toggle: counts матчат, "Нет конкурентов по выбранному фильтру" при пустом filter result

Minor follow-ups (non-blocking, P3):

  • Tailwind migration всего CompetitorTable (item #19)
  • A11y: aria-selected / role="tab" для filter buttons
  • Magic strings "Строящиеся"/"Сданные" — можно вынести в const enum при следующем refactor (tightly coupled с backend Pydantic, acceptable trade-off)
Merged via deep-code-reviewer — verdict APPROVE. **Что проверено:** - Types extension additive + optional → backward compat OK - Filter logic: `competitors.filter(...).slice(0, 20)` — correct order, counts от полного списка (не filtered) — tabs показывают true totals - Footer fix: `filtered.length` consistent с filter применением - Empty state differentiated (filter empty vs no competitors at all) — good UX - Types: literal union `"all"|"building"|"ready"` — type-safe **Inline hex vs Tailwind (author-flagged):** Acknowledged. Existing CompetitorTable.tsx уже full inline-styles (`CLASS_COLORS: Record<string, string>` с hex, все `style={{ ... }}`) → worker consistent с existing pattern, не regression. Tailwind migration требует refactor всего файла — отдельный chore (item #19 в epic #271, P3). **Smoke checklist после deploy:** - [ ] `/site-finder` → парсель → Market tab → Competitors block → колонка "Статус" видна - [ ] До deploy backend PR #276 → все badges показывают `—` (null state) - [ ] После PR #276 deploy → green/slate badges для Строящиеся/Сданные - [ ] Filter tabs toggle: counts матчат, "Нет конкурентов по выбранному фильтру" при пустом filter result **Minor follow-ups (non-blocking, P3):** - Tailwind migration всего CompetitorTable (item #19) - A11y: `aria-selected` / `role="tab"` для filter buttons - Magic strings `"Строящиеся"`/`"Сданные"` — можно вынести в const enum при следующем refactor (tightly coupled с backend Pydantic, acceptable trade-off)
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#278
No description provided.