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).

20 curtidas

O “link do tópico” está sendo renderizado com código HTML além do título do tópico…

Isso não pode estar certo.

Corrigido aqui → FIX: Do not render fancyTitle link in composer header by jordanvidrine · Pull Request #40500 · discourse/discourse · GitHub

4 curtidas

Seria possível não exibir a opção Alternar votação de postagem se o tipo de categoria selecionada não for Ideias, ou se as configurações da categoria não tiverem ativado o recurso de votação de postagem? : ))

5 curtidas

Isso faz sentido para mim. Acredito que possa ser uma regressão? Ou sempre foi assim, você sabe, @jordan.vidrine?

1 curtida

Sempre foi assim: o plugin de votação em posts é global no site, e não restrito por categoria. As configurações no nível da categoria servem apenas para definir o padrão, e não para impedir o uso do plugin.

Estamos em um estado de transição com o plugin de votação em posts… Acredito que precisaremos planejar uma migração para evitar quebrar o uso mais geral dele antes de restringi-lo a categorias específicas, apenas porque o tipo “ideias” é um conceito bastante recente.

2 curtidas

A boa notícia é que, enquanto isso, temos hooks para permitir isso em um componente de tema… isso funciona em um inicializador para mostrar o alternador apenas em uma categoria de ideias:

import { withPluginApi } from "discourse/lib/plugin-api";

export default {
    name: "hide-post-voting-toggle",
    after: "extend-composer-actions", 

    initialize() {
      withPluginApi((api) => {
        api.registerValueTransformer(
          "composer-actions-content",
          ({ value, context }) => {
            const category = context.composerModel?.category;
    
            if (!category?.isType("ideas")) {
              return value.filter((item) => item.id !== "togglePostVoting");
            }
    
            return value;
          }
        );
      });
    }
};

8 curtidas

No meu tablet, o menu suspenso fica escondido atrás do compositor.

1 curtida

Olá @Moin, obrigado por nos alertar sobre isso.

Não consegui reproduzir o problema do meu lado usando Chromium, Firefox ou Safari, e, infelizmente, o vídeo anexado não está tocando para mim.

Para nos ajudar a diagnosticar e investigar isso, você poderia fornecer mais alguns detalhes?

  • Sistema Operacional: (por exemplo, Android, iOS, Windows, macOS, Linux)

  • Navegador e Versão: (por exemplo, Chrome 125, Safari 17)

  • Versão do Discourse: Você pode encontrar isso no seu Painel de Administração ou seguindo este guia no Meta.

Uma coisa que você pode tentar agora:

Teste o comportamento no Modo Seguro adicionando /safe-mode ao final da URL do seu site (por exemplo, https://discourse.example.com/safe-mode).

  • Se o problema desaparecer: É provável que uma das personalizações do seu site (plugins, temas ou componentes) esteja causando um conflito.

  • Se o problema persistir: É um bug no núcleo, e os detalhes do navegador/dispositivo que você fornecer acima nos ajudarão a identificar e corrigi-lo.

Obrigado pela sua persistência, é muito apreciado, e por favor, nos avise se houver alguma dúvida sobre as informações que compartilhei aqui.

2 curtidas

Não acha meio bobo explicar os detalhes do modo de segurança e como encontrar minha versão do Discourse para mim?

Como você pode ver no vídeo acima (eu o carreguei novamente — não tenho certeza do motivo de ter falhado hoje), eu havia ativado o modo de segurança.

A versão atual é 2a08d5d (era diferente quando eu escrevi o relatório). Também consigo reproduzir o problema aqui — só escolhi meu fórum porque os administradores têm mais opções, então o menu oculto era mais visível. No Meta, é mal visível. Na maioria das vezes, parece que o botão não funciona de jeito nenhum.

Estou usando um Samsung Galaxy Tab S9 FE (Android 16) com Firefox.


Acabei de verificar no Chrome — parece ser o mesmo problema:

Normalmente, esse tipo de problema ocorre porque meu tablet tem “tamanho de desktop”, mas é touchscreen. Semelhante aos problemas aqui ou aqui

2 curtidas

Obrigado, esse contexto é útil.

Não tenho um tablet Android touchscreen, mas consigo reproduzir o problema no Firefox de forma confiável usando o botão de toque emulado.

Provisoriamente, pode ser resolvido com esta regra de estilo:

.composer-toggles-menu-content, .composer-actions-dropdown {
    z-index: 1100;
}

Vou atualizar o Discourse com esta correção pretendida e notificar quando as alterações forem mescladas. *Atualização: As alterações foram mescladas, você verá a correção na sua próxima implantação executando a versão d82dc7c ou mais recente.

Novamente, obrigado por relatar o problema.

3 curtidas

Obrigado!

Observação: como as edições na última mensagem já não elevam mais o tópico, uma edição não funciona bem como notificação. Um dos seus colegas disse certa vez que seria melhor publicar atualizações separadas. É interessante notar que vocês próprios nem sempre seguem essa prática.