feat(tradein): страница «доля квартир дома в продаже» — % слайдер, адреса, карта #2058

Merged
lekss361 merged 1 commit from feat/tradein-sale-share-page into main 2026-06-28 14:53:39 +00:00
Owner

Summary

Клиентская страница gendsgn.ru/trade-in/sale-share поверх уже смерженного API /api/v1/buildings/*. Пользователь крутит порог % и видит дома вторичного рынка, где доля выставленных на продажу квартир ≥ порога — списком адресов и на карте, с клик-дровером объявлений.

  • API/типы: apiFetch из lib/api.ts (basePath + session + RBAC через Caddy/RouteGuard); типы вручную в types/sale-share.ts зеркалят schemas/buildings.py (для tradein нет codegen). Все nullable-поля (sale_share_pct, active_secondary, …) обработаны.
  • Карта: Leaflet 1.9.4 через тот же CDN+SRI паттерн, что MapPicker/MapCard (без новой npm-зависимости), next/dynamic ssr:false. Маркеры — цвет+размер по sale_share_pct (green→red), бейджи is_emergency и over_100, hover/click синхронят список и карту.
  • UX: баннер покрытия (вкл. состояние «данные ещё загружаются» при buildings_with_denominator===0); ползунок % с гистограммой распределения; фильтры (город/цена/год/тип/сортировка) в query-key; сортируемый список; drawer с активной вторичкой и ссылками на источник; loading/empty/error; мобилка.
  • RBAC: auth/roles.yaml paths: /trade-in/** уже покрывает маршрут и API — бэкенд не трогаю. Добавлен пункт в Topbar.
  • XSS: source_url через safeUrl() (только http/https) + target=_blank rel="noopener noreferrer".

11 файлов, +1611. Без Tailwind (приложение на обычном CSS) — стили в .ss-* блоке trade-in.css.

Test plan

  • npx tsc --noEmit → exit 0
  • CI=true npm run build → success, маршрут /sale-share сгенерирован (7.31 kB)
  • pre-commit hooks passed; XSS-grep чистый (нет dangerouslySetInnerHTML/@ts-ignore; новый код без any)
  • Визуальная проверка на реальных данных — после прогона ГАР-loader'а (на старте список пуст → баннер покрытия)

Часть серии: страница (PR3). Знаменатель заполнит ГАР-loader (отдельный PR).

## Summary Клиентская страница **`gendsgn.ru/trade-in/sale-share`** поверх уже смерженного API `/api/v1/buildings/*`. Пользователь крутит порог **%** и видит дома вторичного рынка, где доля выставленных на продажу квартир ≥ порога — списком адресов и на карте, с клик-дровером объявлений. - **API/типы:** `apiFetch` из `lib/api.ts` (basePath + session + RBAC через Caddy/RouteGuard); типы вручную в `types/sale-share.ts` зеркалят `schemas/buildings.py` (для tradein нет codegen). Все nullable-поля (`sale_share_pct`, `active_secondary`, …) обработаны. - **Карта:** Leaflet 1.9.4 через тот же CDN+SRI паттерн, что `MapPicker`/`MapCard` (без новой npm-зависимости), `next/dynamic ssr:false`. Маркеры — цвет+размер по `sale_share_pct` (green→red), бейджи `is_emergency` и `over_100`, hover/click синхронят список и карту. - **UX:** баннер покрытия (вкл. состояние «данные ещё загружаются» при `buildings_with_denominator===0`); ползунок % с гистограммой распределения; фильтры (город/цена/год/тип/сортировка) в query-key; сортируемый список; drawer с активной вторичкой и ссылками на источник; loading/empty/error; мобилка. - **RBAC:** `auth/roles.yaml` `paths: /trade-in/**` уже покрывает маршрут и API — бэкенд не трогаю. Добавлен пункт в `Topbar`. - **XSS:** `source_url` через `safeUrl()` (только http/https) + `target=_blank rel="noopener noreferrer"`. 11 файлов, +1611. Без Tailwind (приложение на обычном CSS) — стили в `.ss-*` блоке `trade-in.css`. ## Test plan - [x] `npx tsc --noEmit` → exit 0 - [x] `CI=true npm run build` → success, маршрут `/sale-share` сгенерирован (7.31 kB) - [x] pre-commit hooks passed; XSS-grep чистый (нет `dangerouslySetInnerHTML`/`@ts-ignore`; новый код без `any`) - [ ] Визуальная проверка на реальных данных — после прогона ГАР-loader'а (на старте список пуст → баннер покрытия) Часть серии: страница (PR3). Знаменатель заполнит ГАР-loader (отдельный PR).
lekss361 added 1 commit 2026-06-28 14:43:05 +00:00
feat(tradein): страница «доля квартир дома в продаже» — % слайдер, адреса, карта
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
7f436630a9
lekss361 merged commit f8112b420d into main 2026-06-28 14:53:39 +00:00
lekss361 deleted branch feat/tradein-sale-share-page 2026-06-28 14:53:39 +00:00
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#2058
No description provided.