Skip to content

CdsSegmentedControl dispara envio de formulário indesejado #1086

@lucasn4s

Description

@lucasn4s

Resumo do problema

Quando CdsSegmentedControl é utilizado dentro de um formulário (ex.: envolvido por ShowForm de @sysvale/show), clicar em um botão de segmento faz o navegador realizar um envio nativo do formulário, resultando em recarregamento da página. Prints são muito bem-vindos.

Passos para reproduzir

  1. Criar um formulário usando ShowForm
  2. Adicionar um componente CdsSegmentedControl dentro do formulário
  3. Adicionar um manipulador de envio do formulário (ex.: para salvar dados)
  4. Clicar em qualquer segmento no controle segmentado

Qual o comportamento esperado?

O segmento deve ser selecionado sem afetar o formulário. O navegador NÃO deve disparar o envio do formulário ao clicar em um segmento.

Detalhes técnicos

  • Versão do Cuida: 3.155.0

Causa Raiz

Os botões do componente têm como padrão type="submit" (padrão HTML para botões). Em HTML, elementos <button> dentro de um <form> disparam o envio do formulário quando clicados, a menos que sejam explicitamente definidos como type="button".

Fonte: src/components/SegmentedControl.vue

<button
  v-for="(segment, index) in segments"
  :key="index"
  class="segment-control__button"
  ...
  @click="handleClick(segment, index)"
>

Nenhum atributo type é especificado, então o padrão é submit.

Correção Sugerida

Adicionar type="button" a todos os elementos de botão:

<button
  v-for="(segment, index) in segments"
  :key="index"
  class="segment-control__button"
  type="button"
  ...
  @click="handleClick(segment, index)"
>

Esta é a solução mais limpa e compatível com padrões que:

  • Previne envios de formulário indesejados
  • Mantém toda a funcionalidade existente
  • Não quebra acessibilidade ou navegação por teclado

Impacto

Qualquer formulário que usar CdsSegmentedControl disparará envio não intencional quando os segmentos forem clicados, causando recarregamento da página e potencial perda de estado do formulário.

Checklist de Testes

  • Controle segmentado funciona fora de formulários
  • Controle segmentado funciona dentro de formulários sem envio
  • Manipuladores de evento de clique ainda funcionam
  • Navegação por teclado funciona
  • Recursos de acessibilidade intactos
  • Testes existentes passam (ou são atualizados)

Contexto Adicional

Este é um problema comum com componentes de botão que não definem explicitamente type="button". Outros componentes baseados em botão no Cuida podem ter o mesmo problema e devem ser auditados.

Padrões Relacionados: MDN - Tipo de Botão

Metadata

Metadata

Assignees

No one assigned

    Labels

    julesMarca o Google Jules para investigação.🐛 BugAlgo não está funcionando

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions