Skip to main content

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:
    • hideProductActions e sectionTitle como novos parâmetros opcionais em ShowCaseDetailLayout (o heading hoje é hardcoded, não parametrizado).
    • productCount sempre min(4, items.length), nunca detail.totalItems diretamente — ver context/bug-productcount-crash-grid-detalhe.md (bug crítico identificado na sessão de grilling).
    • sectionTitle e productCountText são dois parâmetros distintos — ver context/bug-textos-secao-produtos-conflito.md.
    • Sem link "Todos os produtos" para showCaseType == ShowCaseType.sellerStock — ver context/gap-todos-produtos-sellerstock.md.
    • finalDateRange do campo de data passa a ser condicional (30 dias para SellerStock, 31 para Store) — ver context/decisoes-menores-limpeza-e-dtos.md, ponto 3.

Arquivos a modificar

ArquivoModificaçã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.dartappBarTitle, 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.dart
    • sectionTitle não informado → exibe o texto default 'Confira os produtos adicionados'
    • sectionTitle customizado → exibe o texto informado
    • hideProductActions = truepostGridContent não é renderizado
    • hideProductActions = false (default) → comportamento atual mantido
  • test/screens/show_case/show_case_detail/show_case_detail_screen_test.dart
    • showCaseType == ShowCaseType.store: título = catalogName, heading = 'Confira os produtos adicionados', botão ADICIONAR PRODUTOS visível, ícones de remoção visíveis
    • showCaseType == 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, showCaseItems com 4 itens → productCount == 4 (não 87); nenhuma exceção lançada ao construir a grid
    • showCaseType == ShowCaseType.sellerStock com totalItems = 87onViewAllProducts == null (sem link "Todos os produtos", mesmo com mais de 4 itens)
    • finalDateRange: showCaseType == ShowCaseType.storehoje + 31 dias; showCaseType == ShowCaseType.sellerStockhoje + 30 dias

Critérios de aceite (RF-04, parte visual)

  1. O App parseia showCaseType e totalItems em ShowCaseDetailResponse (herdado da subtask 01; validar leitura na tela aqui).
  2. showCaseType == ShowCaseType.store: layout e comportamento atuais mantidos (nome editável, seleção/remoção de produtos, botão ADICIONAR PRODUTOS).
  3. showCaseType == ShowCaseType.sellerStock: título da AppBar = Estoque da loja.
  4. showCaseType == ShowCaseType.sellerStock: campo Nome com valor fixo Estoque da loja, desabilitado para edição.
  5. showCaseType == ShowCaseType.sellerStock: seção de produtos com label Confira os produtos e contagem "{totalItems} produtos recomendados".
  6. showCaseType == ShowCaseType.sellerStock: no máximo 4 cards de produtos, sem link Todos os produtos mesmo com totalItems > 4.
  7. showCaseType == ShowCaseType.sellerStock: sem botão ADICIONAR PRODUTOS, sem ícones de remoção.
  8. showCaseType == ShowCaseType.sellerStock: campo Data de expiração permite seleção até 30 dias a partir de hoje (diferente dos 31 dias de showCaseType == ShowCaseType.store).

Definição de Pronto (Definition of Done)

  • ShowCaseDetailLayout com os 2 novos parâmetros opcionais, sem quebrar os outros usos existentes (brand/recommend detail).
  • ShowCaseDetailScreen com toda a lógica condicional de renderização.
  • Nenhum RangeError possível — coberto por teste de regressão específico.
  • flutter analyze sem erros novos.
  • flutter test executando os testes listados acima, 100% verdes.
  • Projeto compila.
  • Validação visual manual (ou golden test) comparando com context/image-3.png para showCaseType == ShowCaseType.sellerStock.