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.messagequando 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 comline-clamp-1. - Badges inferiores — “Obrigatório” quando
defaultIsMandatory; rótulo de Tipo de critério padrão (booleano, intervalo numérico, valor exato) quandodefaultCriterionKindestá 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 compageSize50.
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
analysisTypeIdna 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
analysisTypeId1 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
nullquando não definido no create/update. - Checkbox Ativo — Persiste
isActiveno 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. - Salvar —
POST /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.
- Atualizar —
PUT /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
AlertDialogcom 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ção —
DELETE /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.