Pular para o conteúdo principal

Tipos de análises

Homologação da rota /analises: listagem em grelha com filtros e resumo, cadastro e edição no diálogo Novo tipo de análise / Editar tipo de análise, e remoção com confirmação. Marque cada item ao validar.


Listagem e cartões

  • Carregamento — Enquanto isLoading, aparece o estado “A carregar...” sem lista duplicada.
  • Erro na listagem — Em falha da API, mensagem “Erro ao carregar tipos de análise” e texto adicional (error.message quando existir).
  • Cartão por tipo — Nome, código (badge), categoria (badge com cor/ícone: Físico-Quím./Microbiológ./Organolép. conforme analysisTypeId; tipos 1 e 2 partilham estilo físico-químico).
  • Estado ativo/inativo — Badge “Ativo” ou “Inativo”; cartões inativos com opacidade reduzida (opacity-60).
  • Descrição e metodologia — Exibidas quando preenchidas; descrição com line-clamp-2, metodologia com line-clamp-1.
  • Badges inferiores — “Obrigatório” quando defaultIsMandatory; rótulo de Tipo de critério padrão (booleano, intervalo numérico, valor exato) quando defaultCriterionKind está definido.
  • Lista vazia — Com filtros sem resultados, cartão com ícone, “Nenhum tipo de análise encontrado” e sugestão de ajustar filtros ou cadastrar.
  • Paginação — Com total > 0, controlo de página, intervalo “de–até” e total coerentes com pageSize 50.

Busca e filtros

  • Busca com debounce — O termo só influencia a API após ~350 ms sem digitar; evita requisições excessivas.
  • Busca reinicia página — Ao mudar o termo (após debounce), a página volta a 1.
  • Filtro por categoria — “Todas” ou um tipo específico (Físico-Quím., Quím., Microbiológ., Organolép., Outro) filtra analysisTypeId na API e reinicia página.
  • Filtro por status — “Todos”, “Ativos” (isActive=true), “Inativos” (isActive=false) aplicam o filtro correto e reiniciam página.
  • Combinações — Busca + categoria + status funcionam em conjunto.

Resumo (cartões superiores)

  • Total — Contagem global do resumo (/api/analysis-types/summary).
  • Ativos — Contagem de tipos ativos no resumo.
  • Físico-Quím. — Soma dos totais por tipo com analysisTypeId 1 e 2 (como na UI).
  • Microbiológ. — Contagem para tipo 3.
  • Organolép. — Contagem para tipo 4.
  • Tipo “Outro” (99) — Não tem cartão dedicado no resumo; validar se contagens globais e listagem cobrem itens desta categoria.
  • Loading do resumo — Exibe “-” nos números enquanto carrega.

Diálogo — novo tipo de análise

  • Abrir — Botão “Novo Tipo de Análise” / “Novo Tipo” (mobile) abre o diálogo com título “Novo tipo de análise” e formulário vazio nos valores padrão.
  • Valores padrão — Categoria inicial 1 (Físico-Quím.), critério padrão “Não definido”, Ativo marcado, Obrigatório por padrão desmarcado, código e nome vazios.
  • Código — Obrigatório; máximo 50 caracteres; mensagem Zod se vazio ou exceder.
  • Nome — Obrigatório; máximo 150 caracteres; mensagem Zod se vazio ou exceder.
  • Categoria de análise — Select com tipos 1, 2, 3, 4 e 99 (rótulos de ANALYSIS_TYPE_LABELS); valor inválido rejeitado pela validação.
  • Tipo de critério padrão — Opção “Não definido” ou um dos três tipos (booleano, intervalo numérico, valor exato); enviado como null quando não definido no create/update.
  • Checkbox Ativo — Persiste isActive no DTO.
  • Checkbox Obrigatório por padrão — Persiste defaultIsMandatory.
  • Descrição e metodologia — Opcionais; no create, strings vazias após trim não são enviadas (undefined); no update, strings vazias podem ser enviadas como "" conforme DTO.
  • SalvarPOST /api/analysis-types; toast de sucesso; diálogo fecha; lista e resumo atualizam (invalidateQueries).
  • Erro ao salvar — Toast destrutivo com mensagem da API quando disponível; diálogo permanece aberto.
  • Cancelar / fechar — Fecha sem gravar; botão desabilitado durante envio.
  • Estado do botão Salvar — Texto “Salvando...” e disabled durante isPending.

Diálogo — editar tipo de análise

  • Abrir pela lista — Ícone lápis abre o mesmo diálogo com título “Editar tipo de análise” e campos preenchidos a partir do registo.
  • Hidratação — Código, nome, categoria, critério, flags e textos refletem o item; tipo de análise desconhecido na lista cai no fallback categoria 1 no formulário.
  • AtualizarPUT /api/analysis-types/{id}; toast de sucesso; fecho e atualização da lista/resumo.
  • Erro ao atualizar — Mesmo padrão de toast destrutivo que no create.

Remoção

  • Abrir confirmação — Ícone lixeira abre AlertDialog com título “Remover tipo de análise?” e texto com nome, código e aviso de irreversibilidade e vínculos (fórmulas/produtos).
  • Cancelar — Fecha sem apagar; botão Cancelar desabilitado durante isPending.
  • Confirmar remoçãoDELETE /api/analysis-types/{id}; toast “Tipo de análise removido.”; lista e resumo atualizam.
  • Erro ao remover — API recusa (ex.: vínculos); toast “Não foi possível remover” com mensagem; diálogo pode ser fechado ou mantido conforme fluxo atual.
  • Estado “Removendo...” — Botão destrutivo mostra texto de loading e fica disabled.

Permissões e segurança

  • Acesso — Utilizador com QualityView (guard na rota) acede à página; sem permissão, bloqueio ou negação coerente com a app.
  • Token inválido / 401 — Comportamento alinhado ao restante do cliente API.

Regressão e dados

  • Código e nome com acentos — Gravam e aparecem corretamente nos cartões.
  • Limite de caracteres — Front bloqueia >50 (código) e >150 (nome); API deve validar consistência.
  • Reabrir diálogo após fechar — Chave do componente evita estado “preso” entre novo e edição; validar troca rápida entre dois itens para editar.

Atualize se o resumo passar a incluir “Outro” (99) ou novos filtros/ordenação na listagem.