Apresentando um novo menu suspenso de ações do Composer para "Post Type"

Redesenho do Composer atrás de enable_new_composer_actions

Isso introduz uma experiência de composer redesenhada e a libera atrás de uma nova mudança futura alfa. Com a flag desligada (padrão), nada muda visivelmente. Os administradores podem optar por participar através da página de administração de mudanças futuras.

O que muda quando a flag está ligada

  • Menu suspenso de ações unificado. O menu suspenso composer-actions do SelectKit legado é substituído por um novo componente Glimmer/DMenu (composer-actions-new.gjs). Ele ainda exibe todas as mesmas linhas de troca de modo (responder ao tópico, responder como novo tópico, criar MP, etc.) com rótulos e ícones mais claros.

  • Alternâncias ao vivo com as ações. Sussurro / sem bump / não listado agora são renderizados como itens <DToggleSwitch> na parte inferior desse mesmo menu suspenso — sem um menu de botão combinado separado. O estado da alternância sobrevive às trocas de modo (ex.: ativar sussurro → trocar de responder ao tópico para responder ao post → ainda sussurrando).

  • Pílula indicadora de sussurro. Um pequeno botão à direita do gatilho do menu suspenso mostra o estado atual do sussurro em duas variantes visuais: --public (cor terciária, ícone de olho, „A resposta será visível“) e --whispering (fundo primário-médio / primário-muito-baixo, ícone de olho-riscado, „Sussurrando“). Clicar nele alterna o sussurro — mesmo caminho de código que a alternância dentro do menu suspenso, para que os dois permaneçam sincronizados. O próprio ícone do gatilho também troca para far-eye-slash quando sussurrando.

  • UX de edição. Ao editar um post, o menu suspenso colapsa para um rótulo estático, sem caret (ícone de lápis + „Editar post“). O botão „Adicionar motivo de edição“ que antes vivia em outro lugar na interface do composer é incorporado a esse gatilho estático como um botão clicável „Descreva sua edição“; clicar nele troca o rótulo por uma entrada de texto vinculada a composer.editReason e foca nela.

    • editing
  • Interface do Composer. O texto/span .action-title é removido — o próprio gatilho do menu suspenso mostra o modo atual.

  • Links de Post/Tópico agora aparecerão apenas quando necessário. Um link de tópico será renderizado ao navegar para fora do tópico, e o link do post será renderizado ao rolar para longe do post / navegar para fora.

Notas para autores de plugins

O novo componente não é uma subclasse do SelectKit, então as antigas APIs de extensão não o alcançam. Para suportar ambos os estados da flag nesta fase alfa, os plugins devem registrar ambas as APIs:

API Antiga (funciona apenas no componente antigo) API Nova (funciona apenas no novo componente)
api.modifySelectKit("composer-actions").appendContent(...) api.registerValueTransformer("composer-actions-content", ({ value, context }) => { value.push(...); return value; })
api.modifyClass("component:composer-actions", { fooSelected(options, model) { ... } }) api.registerBehaviorTransformer("composer-actions-on-select", ({ context, next }) => { if (context.actionId === "foo") { ...; return; } next(); })

A forma da linha ({ name, description, icon, id }) é idêntica em ambos. O transformador de comportamento recebe { actionId, options, model } em seu contexto.

:double_exclamation_mark: Plugins que registram apenas os antigos hooks desaparecerão silenciosamente do composer no momento em que um administrador habilitar a flag. Plugins que registram apenas os novos transformadores serão invisíveis enquanto a flag estiver desligada (o padrão para todos na mesclagem).

Referências:

  • discourse-post-voting/extend-composer-actions.js — exemplo de trabalho de registro duplo (no núcleo)

  • discourse-staff-alias — PR separado adiciona registro duplo lá

  • transformers.js — os dois novos nomes de transformadores

Notas de lançamento

  • O status da flag é alfa — opt-in para testes internos.

  • Plugins que integram com ações do composer devem adicionar registro duplo antes que isso seja promovido para beta/estável.

  • Os testes cobrem ambos os estados: as especificações de aceitação/sistema existentes cobrem flag-desligada; arquivos irmãos *-new-test.js cobrem flag-ligada (mais os seletores DOM do novo componente para o menu suspenso unificado, itens de alternância, indicador de sussurro e spans de rótulo dividido).

8 curtidas