feat(sf-fe-a8): Section 3.2 Планировки + 3.3 Остатки/Velocity + CompetitorTable drawer pattern #357
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#357
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/sf-fe-a8-section3-2-3-3-competitors"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
SF Frontend Wave 3 §A8 (combined §A9 CompetitorTable redesign).
Files (2)
frontend/src/components/site-finder/analysis/Section3SettingsAndCompetitors.tsx:Section32Layouts(3.2): wraps<BestLayoutsBlock cadNum={cad} />Section33RemainVelocity(3.3): 3-col gridPipeline24moBlock+VelocityBlock+MarketTrendBlock(each conditional on non-null field)CompetitorDetailDrawer:<Drawer side="right" width="420px"/>+ Badge (status/class) + KPI cells (distance / flat_count / district / ready_dt)selectedCompetitorstate,onRowClick→ drawer (not navigate)frontend/src/components/site-finder/CompetitorTable.tsx(existing):onRowClick?: (competitor: ParcelAnalysisCompetitor) => voidprop addedposition: sticky; left: 0(bothth+td) — no bleed на horizontal scrollonRowClick, hover highlight только когда handler setReal data flow
useParcelAnalyzeQuery(B5) —score_breakdown.competitors/best_layouts/pipeline_24mo/velocity/market_trendConstraints
useParcelAnalyzeQueryhookVerify post-deploy
/site-finder/analysis/66:41:0204016:10→Part of plan vault
code/patterns/SiteFinder_Frontend_Migration_Plan_May18.md§A8 + §A9.Deep Code Review — verdict: APPROVE
Files reviewed: 2 (P2: 2) · +389/-57 · Risk: Low · Reversibility: Easy revert
Sub-component imports (all verified against current main)
BestLayoutsBlock({ cadNum })—<BestLayoutsBlock cadNum={cad}/>matchesProps.cadNum(line 651) ✓Pipeline24moBlock({ data: Pipeline24mo })— guarded byhasPipeline+ non-null assert ✓VelocityBlock({ velocity: Velocity | null | undefined })— prop signature compatible withdata.velocity(Velocity | null) ✓MarketTrendBlock({ trend?: MarketTrend | null })— direct pass through ✓Drawer({ open, onClose, side, width, children })— all 4 props passed, drawer is A11y-ready (focus trap + ESC + body scroll lock) ✓Badgevariants used (success | warning | info | neutral) all valid perBadgeVariantunion ✓Sticky column z-index
thfirst cell:position: sticky; left: 0; zIndex: 1; background: #f6f7f9— overlays otherth(default z=0) ✓tdfirst cell:position: sticky; left: 0; background: rowBg(matches dynamic row bg incl.sameDistricthighlight) — no bleed-through on horizontal scroll ✓boxShadow: 2px 0 4px rgba(0,0,0,0.04)for separation cue ✓background: rowBg) ✓Backward compat — CompetitorTable
onRowClick?: ...optional → sole legacy callerMarketTab.tsx:242-245does not passonRowClickand remains type-correctonRowClick: legacy renders unchanged (no pointer, no hover highlight)Other findings
section-3 / -3-1 / -3-2 / -3-3(A4 scrollspy intact) ✓repeat(auto-fit, minmax(280px, 1fr))— degrades gracefully at narrow widths ✓isEmptyshort-circuits with localized fallback ✓any✓data: ParcelAnalysisfrom B5 ✓Nits (non-blocking)
Rulericon used for "Срок сдачи" — semanticallyCalendarwould be more idiomatic#e0e7ff,#f6f7f9) inside CompetitorTable.tsx — but these are scoped to a pre-existing legacy file already containing inline hex, not new violations introduced by this PRMerging via squash.