Usando o novo recurso de página inicial personalizada

Experimentando o novo recurso de página inicial personalizada: https://github.com/discourse/discourse/pull/26291 :tada:
@pmusaraj Eu me pergunto qual é a melhor abordagem para adicionar componentes?

  1. Então, adicionar o modificador de página inicial personalizada ativa a rota discovery.custom e mostra um alerta de informação padrão, renderizado no outlet custom-homepage:

  2. Eu adiciono um componente ao outlet e ele é renderizado em vez disso:

  3. No entanto, quando adiciono mais de um componente, recebo um erro:

  4. Posso adicionar mais componentes a outros outlets, no entanto. Aqui está uma visualização com os plugin outlets visíveis:

Então, eu me pergunto como o novo outlet deve funcionar:

  • De certa forma, eu não precisaria do outlet. Posso apenas usar os outros disponíveis e limitar os componentes à rota discovery.custom
  • Embora pareça que preciso colocar pelo menos um componente no outlet, caso contrário, o alerta padrão é renderizado? Colocar um template vazio lá não funciona.
  • Por outro lado, se eu pudesse adicionar vários componentes ao outlet, eu não precisaria ter nenhuma lógica de rota. Os componentes só apareceriam na página inicial porque o outlet não estaria disponível em outras rotas?
4 curtidas

Isso não é surpreendente?

Coloque um único arquivo de template aqui e use-o para referenciar seus Componentes na pasta Components (dos quais você pode ter muitos)

<MyFirstComponent />
<MySecondComponent />
<MyThirdComponent />

Ou o que você quiser… apenas fique com um template nesta pasta?

1 curtida

Eu pensei que fosse porque funciona com outros outlets? Como na captura de tela acima..

Ah, desculpe, você está certo, parece legal em Outlets (geralmente) publicar mais de um arquivo de template em um único Componente de Tema (eu estava ciente de que ele lidava com conflitos entre Componentes de Tema e plugins, então todos eles podiam ser renderizados). Curioso.

Eu acho, no entanto: por que você gostaria de fazer isso? Você terá menos controle sobre o layout?

Um template força você a compor todo o layout de uma vez com quantos subcomponentes você quiser?

O comportamento parece ser inconsistente, no entanto…

Se eu criar uma página inicial personalizada, gostaria de poder renderizar vários componentes existentes nela. E como mencionado, isso já funciona ao usar outros outlets disponíveis e ao limitar os componentes à rota da página inicial personalizada.

Se eu puder adicionar apenas um componente ao outlet específico da página inicial personalizada e também precisar adicionar um para desabilitar o yield padrão, isso na verdade restringe meu controle de layout.

Mas por que você não pode referenciar todos esses componentes em um único template?

Ah, porque eles vêm de diferentes Componentes de Tema?

Acho que estávamos falando em códigos diferentes aqui.

Quando digo para colocar todos os seus Componentes (Ember) na pasta Components, quero dizer exatamente isso, mas em um único Componente de Tema.

Acho que o cerne disso é simplesmente: “por que este outlet se comporta de maneira diferente?” Entendo que você está tentando combinar diferentes Componentes de Tema.

Sim, essa é a ideia. Eu apenas usei os templates de texto simples acima como ilustração. Por exemplo, eu uso Featured Lists. E posso renderizá-lo no outlet com estas configurações:

Mas quando quero renderizar outro da mesma forma, recebo o erro de múltiplos conectores.

:+1:t4:

2 curtidas

Obrigado por testar isso, @manuel, e pelas perguntas.

Eu também não sabia a resposta para isso, mas procurei e descobri mais ou menos o porquê. Recentemente, introduzimos uma distinção entre saídas de plugin clássicas e saídas de plugin wrapper, neste PR do ano passado: DEV: Allow PluginOutlets to 'wrap' a core implementation by davidtaylorhq · Pull Request #23110 · discourse/discourse · GitHub

As saídas de plugin wrapper são as que permitem apenas um conector, as demais permitem múltiplos. Para ilustrar, o código atual da saída de plugin principal é este:

<PluginOutlet @name="custom-homepage">
  {{#if this.currentUser.admin}}
    <p class="alert alert-info">
      {{i18n "custom_homepage.admin_message"}}
    </p>
  {{/if}}
</PluginOutlet>

e permite apenas um conector. Mas se eu mudar o código da saída principal para:

<PluginOutlet @name="custom-homepage" />

Ele permitirá vários templates de conector sem problemas. Nós poderíamos fazer essa mudança no core para esta saída em particular, mas essa diferença é mais geral. No entanto, parece um pouco opaco para os desenvolvedores, vejo seu ponto.

Note também que múltiplos conectores têm um problema de ordenação, até onde sei, não temos um mecanismo para decidir sobre a ordenação.

Acho que a melhor abordagem aqui, de qualquer forma, é o que @merefield sugeriu: usar um template e, a partir dele, referenciar componentes Ember.

O alerta padrão é mostrado apenas para administradores, FYI.

6 curtidas

Obrigado pelas explicações!

Brincando mais com isso… é realmente novo e uma alegria de usar!

Usei três componentes existentes para esse layout e é o que eu esperaria ser uma abordagem comum ao construir uma página inicial personalizada. Eu só poderia adicionar um desses ao outlet do wrapper, é por isso que acho que ter um outlet simples aqui seria mais útil.

6 curtidas

Outra observação: Coloquei um link na barra lateral usando a URL /custom:

Ele não é destacado quando na rota personalizada.

Se eu entendi a lógica com os destaques da barra lateral corretamente, ele também deve ser destacado quando na URL raiz /.

3 curtidas

Consigo ver seu problema com mais clareza depois de dar uma olhada rápida no componente Featured Lists. Uma opção é refatorar esse componente e fazer com que ele gere todas as listas em um único componente Ember. Em seguida, você poderia adicionar esse componente a um outlet de wrapper de plugin.

Outra opção é adicionar um segundo outlet de plugin ao template da página inicial personalizada, algo como <PluginOutlet @name="below-custom-homepage" />.

Posso estar me apegando a este outlet custom-homepage com uma mensagem para administradores sem muito bom motivo, para ser honesto. Esse aviso não é tão útil…

Sim, isso pode ser complicado. No meu teste local agora, /custom não funciona corretamente. É melhor usar /, que roteia corretamente. Mas ainda assim não destaca.

2 curtidas

Isso parece ser um problema comum. Se eu usar /, ele também não destaca outras rotas definidas como página inicial.

Sim, eu também poderia imaginar o aviso sendo exibido de forma diferente. A principal vantagem dos outlets wrapper parece ser que posso ceder condicionalmente o código principal ou renderizar um personalizado. Mas isso provavelmente nunca seria um caso para essa mensagem informativa.

Deve haver um mal-entendido. O componente já envolve todas as listas em um componente de encapsulamento e o renderiza em qualquer outlet fornecido:

image

Portanto, posso adicionar o componente sem problemas ao outlet wrapper atual na página inicial personalizada.
O que não consigo fazer é usar esse outlet para renderizar mais de um componente autônomo na página inicial personalizada. Componentes que eu teria instalado como componentes de tema, como estes três:

Minha suposição é que fazer tal uso de vários componentes de tema autônomos para construir uma página inicial personalizada seria a abordagem comum. Em vez de construir tudo do zero em um único tema.

Se você considerar adicionar outro outlet ou alterar a configuração do outlet, posso fornecer mais feedback com base no uso até agora. Embora eu vá envolver essa toca de coelho em detalhes :smile:

Então percebi que o outlet é renderizado dentro do elemento main-outlet. A estrutura geral desses elementos é então:

  • wrapper do main-outlet
    • wrapper da barra lateral
    • main-outlet
      • outlet custom-homepage

Como designer, na verdade não sou tão flexível organizando itens em uma página inicial personalizada usando este outlet. Para o design compartilhado acima, usei o outlet before-main-outlet, não apenas porque posso colocar mais de um componente, mas também porque ele não aninha componentes dentro do elemento main-outlet.
A estrutura, como compartilhada na captura de tela acima, se parece com isto:

  • wrapper do main-outlet
    • wrapper da barra lateral
    • componente: banner de pesquisa
    • componente: tópicos em destaque
    • componente: listas em destaque
    • main-outlet

A vantagem é que posso organizar elementos em toda a largura do wrapper main-outlet e não apenas dentro do elemento main-outlet. Para ilustrar o ponto, se eu renderizasse um dos componentes no outlet custom-homepage atual, ele seria renderizado aninhado dentro do elemento main-outlet como este:

A maior flexibilidade para designs personalizados, na minha opinião, seria oferecida por um plugin outlet que é colocado

  • como um filho direto do wrapper main-outlet (semelhante ao outlet before-main-outlet)
  • dentro de uma div wrapper

Essa div wrapper agruparia todos os componentes adicionados a ela e permitiria uma fácil ordenação. Tal estrutura ficaria então assim:

  • wrapper do main-outlet
    • wrapper da barra lateral
    • wrapper custom-homepage
      • componente: banner de pesquisa
      • componente: tópicos em destaque
      • componente: listas em destaque
    • main-outlet

Portanto, este é o meu feedback como designer. Acho que cabe a você decidir o quanto isso se alinha com o que você consideraria uma aplicação comum para o recurso de página inicial personalizada.

3 curtidas

Presumivelmente esta página é “superficial” no sentido de que aparecerá para o usuário, mas não para o “Googlebot”, e, portanto, não será indexada?

Correto, sim, para a visualização do crawler optei por exibir apenas o menu superior. Não é possível saber a partir do aplicativo Rails o que um tema irá gerar nesta rota.

Estou pensando nas sugestões aqui @manuel, arranjarei um tempo em breve para testar algumas mudanças. Por favor :bear: comigo.

6 curtidas

Adicionei suporte para este recurso em Discourse Bars 🍻 🍸 (a sidebar framework) - #43 by merefield

4 curtidas

Um problema que encontrei: Eu queria exibir o componente Homepage Feature na página inicial personalizada. Mas então os tópicos não são filtrados nesta rota. O componente apenas mostra qualquer tópico recente que tenha uma imagem.

O código no componente é:

    const topicList = await this.store.findFiltered("topicList", {
      filter: "latest",
      params: {
        tags: [`${settings.featured_tag}`],
        order: sortOrder,
      }

E parece que os parâmetros não são aplicados na página inicial personalizada. Funciona bem caso contrário. Não tenho certeza por que isso acontece?

Editar: Eu uso o mesmo método no componente Featured Lists. Ao usar este componente na página inicial personalizada, o filtro também não é aplicado. Mas apenas na primeira lista… quando há mais, as listas seguintes são todas filtradas corretamente.

3 curtidas

Interessante, não tenho certeza do porquê, talvez haja alguma lógica na store topicList que esteja vinculada às rotas de descoberta? A página inicial personalizada não é uma rota de descoberta.

Fico curioso, esse mesmo componente com os parâmetros funciona bem em uma rota de administrador, por exemplo? Ou em uma rota de perfil de usuário? Alguma chance de você verificar?

O @tynaut encontrou um problema semelhante, então é provável que haja algo a ser abordado aqui.

1 curtida

Tentei com o componente Featured Lists, ele já tem uma configuração para mostrar o componente em todos os lugares. Isso não inclui rotas de administrador, mas tentei em todas as outras (páginas estáticas, perfis de usuário,..) e parece funcionar em todos os lugares, exceto na página inicial personalizada.

A outra coisa estranha é que, como mencionado, ele só não filtra a primeira lista. Por exemplo, aqui eu filtro duas listas, uma para a tag “featured” e outra para a categoria “General”, e é assim que as listas aparecem em todas as outras rotas:

Apenas na rota da página inicial personalizada, elas aparecem assim:

Portanto, a primeira lista não filtra mais pela tag, mas a segunda lista filtra pela categoria. E quando troco a ordem das listas, a primeira lista não filtra pela categoria, mas a segunda filtra pela tag:

2 curtidas

Achei um pouco complicado reproduzir isso corretamente com o componente Featured Homepage, ele mistura muitas outras condições.

Consigo reproduzir facilmente com um componente simplificado. Empurrei isso para um repositório de exemplo aqui: GitHub - pmusaraj/discourse-sample-custom-homepage

O componente sample-list lá deve puxar apenas tópicos com a tag featured, mas não puxa (puxa os 3 primeiros tópicos para mim). Se eu remover o modificador custom_homepage do arquivo about.json desse tema, então os tópicos corretos são puxados.

Vou encontrar alguém mais familiarizado com o serviço de store para dar uma olhada. Obrigado!

1 curtida

Olá

Você pode me explicar como adicionar um componente (banner de pesquisa ou um componente personalizado já instalado no fórum) dentro do arquivo home.hbs para que ele seja exibido na nova página inicial personalizada?

Obrigado