Skip to content

Lista inline de enquetes: atualiza a contagem da opção votada e adiciona o rótulo "Opções" - #475

Merged
gabrielhhaber merged 2 commits into
mainfrom
claude/poll-inline-fixes
Oct 12, 2026
Merged

gabrielhhaber merged 2 commits into
mainfrom
claude/poll-inline-fixes

Conversation

@gabrielhhaber

Copy link
Copy Markdown
Owner

Requested by Gabriel · project thread

Before: ao marcar uma opção na lista inline de uma enquete, o voto era enviado, mas a linha votada continuava com a contagem antiga (a atualização era ignorada enquanto a lista tinha o foco). A lista também não tinha nenhum texto antes dela.

After: a linha mostra a nova contagem e porcentagem logo após o voto, e um StaticText "Opções" precede a lista, sendo o primeiro item focável com Tab depois da lista de mensagens quando uma enquete está selecionada.

How: _reload_inline_poll deixa de sair cedo quando a lista tem o foco (só reescreve as linhas cujo texto mudou). Novo rótulo poll_inline_options_label (mostrado e escondido junto com a lista) em todos os idiomas, mais teste e entrada no changelog da versão ainda não lançada em todos os idiomas. Os catálogos foram editados à mão no formato do translations-update, que não pôde ser executado aqui.

🤖 Generated with Claude Code

https://claude.ai/code/session_01PfaAiU3k8WXCosafjCDWWt


Generated by Claude Code

…"Options"

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PfaAiU3k8WXCosafjCDWWt
@gabrielhhaber gabrielhhaber self-assigned this Oct 12, 2026

@pedro-hdias pedro-hdias left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review do PR #475: Lista inline de enquetes (Atualização de votos e rótulo "Opções")

Revisão técnica realizada com base nas diretrizes do repositório (CLAUDE.md) e nas habilidades em .agents/skills (accessible-ui, i18n-ui-string, write-test, extract-from-god-file, wppconnect-patch).


1. Status de CI & Catálogos de Tradução (i18n-ui-string / CLAUDE.md Regra 2) ❌ Bloqueante

  • Falha no CI: O job Run test suite falhou no teste tests/test_gettext_catalogs.py::test_all_authoritative_po_translations_match_runtime:
    ValueError: Stale catalogs: winzapp.pot, en-US/LC_MESSAGES/winzapp.po; run python -m winzapp_tools.translations update
    
  • Causa: Conforme mencionado na descrição do PR, os catálogos .po e .pot foram editados manualmente. O fluxo oficial de gettext do repositório (CLAUDE.md) exige:
    1. Inserir msgctxt "poll_inline_options_label" e msgid "Options" no PO de referência (translations/en-US/LC_MESSAGES/winzapp.po).
    2. Executar python -m winzapp_tools.translations update (ou uv run translations-update) para sincronizar metadados e assinaturas do template .pot e de todos os .po.
    3. Preencher as traduções em cada catálogo.
    4. Executar python -m winzapp_tools.translations compile (ou uv run translations-compile) para compilar os binários .mo e atualizar client/languages/winzapp.keys. Em builds congeladas (frozen/release), translation_catalog.py lê diretamente esses arquivos; sem a compilação, o aplicativo exibe o nome cru da chave (poll_inline_options_label).

2. Acessibilidade e Leitor de Telas (accessible-ui) ⚠️ Ressalva Conceitual

  • StaticText e Ordem de Foco (Tab):

    • Na descrição do PR e nos changelogs, afirma-se:

      "um StaticText 'Opções' precede a lista, sendo o primeiro item focável com Tab depois da lista de mensagens quando uma enquete está selecionada."

    • Comportamento real no Windows/wxWidgets: Controles nativos wx.StaticText (STATIC) não possuem WS_TABSTOP e não aceitam foco de teclado (AcceptsFocus() é False). Portanto, pressionar Tab a partir da lista de mensagens pula diretamente o texto estático e cai no _poll_inline_list (wx.ListCtrl).
    • Nome acessível do controle: Isso não prejudica a acessibilidade de navegação porque o próprio _poll_inline_list já define seu nome acessível em _create_inline_poll_list:
      lst.SetName(self.main_window.i18n.t("new_poll_options_list_label").rstrip(":"))
      Ao receber o foco via Tab, o leitor de tela (NVDA/JAWS) já anuncia "Opções da enquete" / "Poll options".
    • O wx.StaticText serve como um rótulo visual útil para usuários videntes e é legível via cursor de exploração/toque, mas o texto da descrição do PR e do changelog em inglês ("it is now announced with the label 'Options' before it") deve ser ajustado para não induzir a erro sobre o fluxo de navegação por Tab.
  • Atualização em tempo real de votos (_reload_inline_poll):

    • A lógica em _reload_inline_poll está correta:
      • Removeu o retorno prematuro quando wx.Window.FindFocus() is lst.
      • Utiliza Freeze() e Thaw() protegidos por bloco try/finally conforme orienta accessible-ui.
      • Reescreve exclusivamente as linhas cujo texto foi alterado (if lst.GetItemText(index) != text:), evitando que o leitor de tela repita linhas inalteradas.

3. Testes Automatizados (write-test / CLAUDE.md Regra 1) ✅ Aprovado

  • O teste adicionado em tests/test_polls.py (TestInlineReload):
    • Utiliza a Rota 2 da skill write-test (método desacoplado contra stubs enxutos _TextList e SimpleNamespace).
    • Não instancia janelas reais do wx, preservando a Regra 1 do CLAUDE.md (testes nunca abrem janelas para não interferir com o leitor de tela dos mantenedores).
    • Cobre a atualização dos percentuais e garante idempotência (nada é reescrito se os votos não mudarem).
    • Todos os 58 testes de tests/test_polls.py passam perfeitamente.

4. Modularidade e God Files (extract-from-god-file) ✅ Aprovado

  • As modificações permaneceram contidas no mixin modular client/ui/conversation_panel/poll_inline.py.
  • Nenhum god file (main.py, conversations.py) cresceu desnecessariamente.

5. Changelogs & Base da Branch (CLAUDE.md) ℹ️ Recomendação

  • As entradas de changelog foram incluídas nos 7 idiomas sob a versão não lançada V2.1.0.0.
  • A branch claude/poll-inline-fixes foi criada antes do merge do PR #474 (aac655d0). Recomenda-se fazer o rebase/merge com a main atualizada para garantir que o CI execute sobre o código mais recente.

Conclusão e Próximos Passos

A solução para a contagem de votos inline está muito bem implementada e o teste unitário segue o padrão do projeto. Para aprovação e merge:

  1. Executar o fluxo padrão de gettext (translations update + tradução + translations compile) e commitar as atualizações para corrigir o teste no CI.
  2. Atualizar o texto da descrição do PR e do changelog corrigindo a menção de que o StaticText seria focável por Tab.

@gabrielhhaber
gabrielhhaber marked this pull request as ready for review October 12, 2026 15:28
@gabrielhhaber
gabrielhhaber merged commit f47d80a into main Oct 12, 2026
2 checks passed
@github-actions
github-actions Bot deleted the claude/poll-inline-fixes branch October 12, 2026 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants