feat(concept): picker «выбери дом» + каталог-эндпоинт — Stage 3b, финал #1965 #2030

Merged
bot-backend merged 1 commit from feat/concept-house-picker-1965-stage3b into main 2026-06-27 22:08:58 +00:00
Collaborator

#1965 Stage 3b (эпик #1953) — финал фичи: UI выбора типов домов вместо авто max-FAR-застройки. code-reviewer APPROVE. Аддитивно.

Что

  • GET /api/v1/concepts/house-types (concepts.py) — каталог как single source of truth (без хардкода на фронте); схемы HouseTypeCatalog/HouseTypeCatalogItem (1:1 с catalog.py). Тест пинит: ключи каталога == available_section_types() (защита от 422-дрейфа picker↔валидатор).
  • HouseProgramPicker.tsx (new): тумблер «Авто (max-FAR)» (дефолт → building_program опущен → greedy без изменений) / «Выбрать дома» (строки каталога: count 1-50 / floors 1-40, дефолт-этажность из каталога, helper-текст footprint/класс). Смонтирован в Section7 + /concept.
  • building_program wiring (useHouseTypes TanStack): в pick-режиме с непустым списком → [{section_type,floors,count}] в create_concept; иначе undefined → greedy byte-identical (no-regression проверено с обеих сторон).
  • Partial-fit: placed_count<requested_count → нейтральная нота «Разместилось N из M секций» (только program-режим, null-safe).
  • api-types.ts перегенерён (byte-stable).

Качество

  • ruff ; mypy чисто; no :name::type; backend pytest -k concept/house_type 16 passed; tsc/next lint/prettier 3.9.0 clean.
  • Reviewer подтвердил airtight no-regression (auto/empty → omit key → falsy backend check → greedy не тронут), light-токены, Lucide.

Закрывает #1965 целиком (Stage 1 консолидация + Stage 2 живой 3D-пересчёт + Stage 3 каталог/выбор домов). Closes #1965.

#1965 Stage 3b (эпик #1953) — **финал фичи**: UI выбора типов домов вместо авто max-FAR-застройки. code-reviewer ✅ APPROVE. Аддитивно. ## Что - **`GET /api/v1/concepts/house-types`** (concepts.py) — каталог как single source of truth (без хардкода на фронте); схемы `HouseTypeCatalog`/`HouseTypeCatalogItem` (1:1 с catalog.py). Тест пинит: ключи каталога == `available_section_types()` (защита от 422-дрейфа picker↔валидатор). - **`HouseProgramPicker.tsx`** (new): тумблер «Авто (max-FAR)» (дефолт → building_program опущен → greedy без изменений) / «Выбрать дома» (строки каталога: count 1-50 / floors 1-40, дефолт-этажность из каталога, helper-текст footprint/класс). Смонтирован в Section7 + /concept. - **building_program wiring** (`useHouseTypes` TanStack): в pick-режиме с непустым списком → `[{section_type,floors,count}]` в create_concept; иначе `undefined` → greedy byte-identical (no-regression проверено с обеих сторон). - **Partial-fit**: `placed_count<requested_count` → нейтральная нота «Разместилось N из M секций» (только program-режим, null-safe). - api-types.ts перегенерён (byte-stable). ## Качество - ruff ✅; mypy чисто; no `:name::type`; backend `pytest -k concept/house_type` **16 passed**; tsc/next lint/prettier 3.9.0 clean. - Reviewer подтвердил airtight no-regression (auto/empty → omit key → falsy backend check → greedy не тронут), light-токены, Lucide. **Закрывает #1965 целиком** (Stage 1 консолидация + Stage 2 живой 3D-пересчёт + Stage 3 каталог/выбор домов). Closes #1965.
bot-backend added 1 commit 2026-06-27 21:54:05 +00:00
feat(concept): фронт-пикер типовых домов (#1965 Stage 3b)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Successful in 1m1s
CI / openapi-codegen-check (pull_request) Successful in 1m55s
CI / backend-tests (pull_request) Successful in 14m9s
c55eb4f4d4
Финальная часть эпика #1953: пользователь выбирает типовые дома
(тип × этажность × число секций) вместо авто max-FAR раскладки, формируя
building_program из Stage 3a.

Бэкенд:
- GET /api/v1/concepts/house-types — read-only каталог HOUSE_TYPES
  (section_type, label_ru, footprint w×d + sqm, default_floors, housing_class)
  как single source of truth; фронт ничего не хардкодит.
- Схема HouseTypeCatalog / HouseTypeCatalogItem в schemas/concept.py.
- Тесты эндпоинта: полнота каталога + совпадение ключей с available_section_types.

Кодген: api-types.ts перегенерён (dump OpenAPI → openapi-typescript →
project-local prettier 3.9.0); 2-й прогон без диффа.

Фронтенд:
- useHouseTypes() (TanStack useQuery, staleTime Infinity) в concept-api.ts;
  building_program в ConceptInput, placed_count/requested_count в ConceptVariant.
- HouseProgramPicker: toggle «Авто (max-FAR)» (default, program omit → greedy)
  vs «Выбрать дома» (список каталожных типов, count 1-50 / floors 1-40, дефолт
  из каталога; габариты/этажность/класс как подсказка). Смонтирован в
  Section7Concept и на странице /concept.
- Partial-fit заметка в ConceptVariantsResult: при placed<requested честное
  «Разместилось N из M секций — участок вмещает меньше» (нейтрально, не ошибка).
bot-backend merged commit 2fb34112b5 into main 2026-06-27 22:08:58 +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#2030
No description provided.