4.7 KiB
4.7 KiB
Quickstart — 023-ux-melhorias-imoveis
Guia de desenvolvimento local para implementar as melhorias de UX/UI na página /imoveis.
Pré-requisitos
- Docker + Docker Compose em execução
- Branch:
023-ux-melhorias-imoveis(ou trabalhar direto emmaster)
# Verificar que os containers estão rodando
docker-compose ps
# Backend: http://localhost:5000
# Frontend: http://localhost:5174
Sprint 1 — Ordem de Trabalho Recomendada
1. Backend: parâmetro q
# Editar a rota
code backend/app/routes/properties.py
# Após editar, reiniciar o backend
docker-compose restart backend
# Testar manualmente
curl "http://localhost:5000/api/v1/properties?q=jardins" | python -m json.tool | head -30
curl "http://localhost:5000/api/v1/properties?q=AP-0042" | python -m json.tool | head -10
curl "http://localhost:5000/api/v1/properties?q=Rua+das+Flores&sort=price_asc" | python -m json.tool
2. Frontend: refactor PropertyRowCard
O frontend tem hot reload — editar e salvar recarrega automaticamente em http://localhost:5174/imoveis.
# Verificar TypeScript após edições
docker-compose exec frontend npx tsc --noEmit
Cheklist de validação do refactor semântico:
- Abrir DevTools → Elements → procurar
<a>→ confirmar que não há<button>filho - Clicar no card (área de texto) → navega para detalhes
- Clicar em "Entre em contato" → abre modal (não navega)
- Clicar em "Comparar" → adiciona à barra de comparação
- Tab pelo teclado: foca em "Ver detalhes" → "Entre em contato" → "Comparar" independentemente
3. Frontend: SearchBar + integração
# Criar o novo componente
code frontend/src/components/SearchBar.tsx
# Verificar que q aparece na URL ao digitar
# http://localhost:5174/imoveis → digitar no campo → URL deve mudar para ?q=termo
Sprint 2 — Ordem de Trabalho Recomendada
1. Backend: parâmetro sort
docker-compose restart backend
# Testar ordenação
curl "http://localhost:5000/api/v1/properties?sort=price_asc&per_page=5" | \
python -c "import sys,json; d=json.load(sys.stdin); [print(i['price']) for i in d['items']]"
curl "http://localhost:5000/api/v1/properties?sort=price_desc&per_page=5" | \
python -c "import sys,json; d=json.load(sys.stdin); [print(i['price']) for i in d['items']]"
2. Frontend: PropertyGridCard
code frontend/src/components/PropertyGridCard.tsx
# Testar em http://localhost:5174/imoveis — ativar toggle de Grade
3. Frontend: ActiveFiltersBar
code frontend/src/components/ActiveFiltersBar.tsx
# Testar: aplicar filtro cidade → chip aparece → clicar × → filtro removido
Sprint 3 — Ordem de Trabalho Recomendada
# Animações: adicionar keyframe em index.css
code frontend/src/index.css
# Badges: testar com imóvel is_featured = true
curl "http://localhost:5000/api/v1/properties?per_page=50" | \
python -c "import sys,json; d=json.load(sys.stdin); [print(i['title']) for i in d['items'] if i.get('is_featured')]"
# Se não houver imóveis com is_featured=true, setar um via psql:
docker-compose exec db psql -U postgres -d saas_imobiliaria \
-c "UPDATE properties SET is_featured = true WHERE id = (SELECT id FROM properties LIMIT 1);"
Testes Backend
# Rodar testes existentes
docker-compose exec backend uv run pytest tests/ -v
# Rodar apenas testes de properties (quando criados para q e sort)
docker-compose exec backend uv run pytest tests/test_properties.py -v -k "search or sort"
Checklist de Validação Final (todos os sprints)
Semântica HTML
# Verificar no browser: DevTools → Console
document.querySelectorAll('a button, a a').length
# Deve retornar 0
Busca textual
?q=jardinsfiltra imóveis com "Jardins" no título/endereço/bairro?q=AP-0042encontra imóvel pelo código- Campo vazio → sem parâmetro
qna URL - Caracteres especiais:
?q=São+Paulonão causa erro
Ordenação
?sort=price_asc→ preços crescentes?sort=price_desc→ preços decrescentes?sort=area_desc→ áreas decrescentes?sort=newest→ mais recentes primeiro- Valor inválido (
?sort=invalid) → sem erro, usa default
Visualização
- Toggle Lista → cards horizontais
- Toggle Grade → grid de 1/2/3 colunas
- Recarregar página → preferência mantida
Mobile (testar com DevTools simulando iPhone)
- Carrossel: botões prev/next visíveis sem hover
- Card não trunca texto em 768px
- Drawer de filtros abre corretamente
Error state
- Desligar backend → mensagem de erro aparece
- Clicar "Tentar novamente" → refaz o request