Subtask 03 — Detalhe: Adaptação Visual por showCaseType
Task pai: 197313 — Ajuste de layout nova vitrine
Ordem de execução: 03 de 07
Depende de: 01b — Ajuste Enum String (usa ShowCaseType/totalItems do model)
Objetivo
Adaptar a renderização da tela de detalhe (ShowCaseDetailScreen + ShowCaseDetailLayout) para variar por showCaseType, sem alterar ainda as regras de negócio do controller (isso é a subtask 04). Cobre: título da AppBar, nome fixo, heading da seção de produtos, texto de contagem, grid sempre capada em 4 itens (correção do bug de crash), ausência do link "Todos os produtos" para SellerStock, e o limite de data de expiração condicional (30 vs. 31 dias).
Requisitos atendidos
- RF-04 — Detalhe da vitrine condicionado ao
showCaseType: AC1, AC2, AC3, AC4, AC5, AC6, AC7, AC13.
Relação com o design doc
- Decisão #4 — Detalhe Condicional por
showCaseType(desing-doc.md), parte visual:hideProductActionsesectionTitlecomo novos parâmetros opcionais emShowCaseDetailLayout(o heading hoje é hardcoded, não parametrizado).productCountsempremin(4, items.length), nuncadetail.totalItemsdiretamente — vercontext/bug-productcount-crash-grid-detalhe.md(bug crítico identificado na sessão de grilling).sectionTitleeproductCountTextsão dois parâmetros distintos — vercontext/bug-textos-secao-produtos-conflito.md.- Sem link "Todos os produtos" para
showCaseType == ShowCaseType.sellerStock— vercontext/gap-todos-produtos-sellerstock.md. finalDateRangedo campo de data passa a ser condicional (30 dias para SellerStock, 31 para Store) — vercontext/decisoes-menores-limpeza-e-dtos.md, ponto 3.
Arquivos a modificar
| Arquivo | Modificação |
|---|---|
lib/screens/show_case/widgets/show_case_detail_layout.dart | + hideProductActions (bool, default false), + sectionTitle (String, default 'Confira os produtos adicionados', substitui o ZZTextNew hardcoded). Não quebra os outros usos do layout (brand, recommend). |
lib/screens/show_case/show_case_detail/show_case_detail_screen.dart | appBarTitle, sectionTitle, productCountText, productCount, onViewAllProducts, hideProductActions passam a ser condicionados a controller.detail.value?.showCaseType. _HeaderContent: finalDateRange do ZZDateFormField condicional por tipo. |
Testes unitários a criar
Testes de widget (testWidgets) seguindo o padrão de flutter_test já usado no projeto.
test/screens/show_case/widgets/show_case_detail_layout_test.dartsectionTitlenão informado → exibe o texto default'Confira os produtos adicionados'sectionTitlecustomizado → exibe o texto informadohideProductActions = true→postGridContentnão é renderizadohideProductActions = false(default) → comportamento atual mantido
test/screens/show_case/show_case_detail/show_case_detail_screen_test.dartshowCaseType == ShowCaseType.store: título =catalogName, heading ='Confira os produtos adicionados', botãoADICIONAR PRODUTOSvisível, ícones de remoção visíveisshowCaseType == ShowCaseType.sellerStock: título ='Estoque da loja', nome exibido como'Estoque da loja'desabilitado, heading ='Confira os produtos', contagem ='{totalItems} produtos recomendados', sem botão adicionar, sem ícones de remoção- Teste de regressão do crash:
totalItems = 87,showCaseItemscom 4 itens →productCount == 4(não87); nenhuma exceção lançada ao construir a grid showCaseType == ShowCaseType.sellerStockcomtotalItems = 87→onViewAllProducts == null(sem link "Todos os produtos", mesmo com mais de 4 itens)finalDateRange:showCaseType == ShowCaseType.store→hoje + 31 dias;showCaseType == ShowCaseType.sellerStock→hoje + 30 dias