Prossimi cambiamenti all'elenco degli argomenti - come preparare temi e plugin

Nell’ambito della nostra continua ricerca di standardizzazione dei sistemi di rendering nel codebase di Discourse, stiamo sostituendo l’implementazione della topic-list.

In precedenza, questo utilizzava un approccio ‘raw handlebars’ (.hbr), e poteva essere personalizzato tramite override di template e raw-plugin-outlets. La nuova implementazione della topic-list utilizza i moderni componenti Glimmer, ed è stata costruita da zero per essere personalizzabile in modi sostenibili.

La nuova implementazione è ora disponibile dietro l’impostazione glimmer_topic_list_mode.

  • disabled: utilizza la legacy topic-list “raw handlebars”
  • auto: rileverà la compatibilità dei tuoi plugin e temi attuali. Se alcuni sono incompatibili, utilizzerà il sistema legacy; altrimenti utilizzerà la nuova implementazione.
  • enabled: utilizzerà la nuova implementazione della topic-list. Se hai plugin o temi incompatibili, il tuo sito potrebbe bloccarsi.

Abbiamo già aggiornato la maggior parte dei nostri temi e plugin ufficiali per essere compatibili con il nuovo menu. Tuttavia, se utilizzi plugin, temi o componenti tema di terze parti che personalizzano la topic-list, sarà necessario aggiornarli.

Verranno stampati avvisi nella console del browser che identificheranno la fonte dell’incompatibilità.

:timer_clock: Tempistiche di rilascio

Queste sono stime approssimative soggette a modifiche

Q4 2024:

  • :white_check_mark: implementazione core completata
  • :white_check_mark: aggiornamento temi/plugin ufficiali (in corso)
  • :white_check_mark: abilitato su Meta
  • :white_check_mark: pubblicati consigli per l’aggiornamento

Q1 2025:

  • :white_check_mark: aggiornamento temi/plugin ufficiali

  • :white_check_mark: glimmer_topic_list_mode impostato di default su auto; abilitati messaggi di deprecazione nella console

  • :white_check_mark: le deprecazioni attiveranno un banner di avviso per gli amministratori per eventuali problemi rimanenti

  • i plugin e i temi di terze parti dovrebbero essere aggiornati

  • :white_check_mark: 1° marzo - abilitazione della nuova topic-list per tutti i siti. L’impostazione predefinita per l’impostazione del sito sarà cambiata in enabled, ma sarà ancora possibile tornare a ‘disabled’

Q2 2025

  • :white_check_mark: dopo il 1° aprile - rimozione definitiva della modalità legacy e del codice associato

:eyes: Cosa significa per me?

Se il tuo plugin o tema ha file ‘raw handlebars’ (con estensione .hbr o .raw.hbs), questi dovranno essere aggiornati per essere compatibili con la nuova versione. I normali file .hbs per componenti/route Ember non sono interessati da questa modifica.

Saranno richiesti aggiornamenti anche se utilizzi modifyClass su component:topic-list o component:topic-list-item.

Se il tuo sito presenta una di queste personalizzazioni incompatibili, verranno stampati messaggi di avviso nella console degli sviluppatori del browser, incluse informazioni su quale tema/plugin ne sia la causa.

Quali sono le sostituzioni?

Alcuni dei vecchi raw-plugin-outlets sono stati convertiti in regolari Plugin Outlets. Questi possono essere aggiornati in modo 1:1.

Le personalizzazioni più avanzate dovranno essere valutate caso per caso. La nuova topic-list dispone di una serie di nuove API per una personalizzazione semplice e robusta. Scopri di più qui:

Ecco alcuni esempi:

:sos: Cosa succede alle altre personalizzazioni?

Se la tua personalizzazione non può essere realizzata utilizzando le nuove API che abbiamo introdotto, faccelo sapere creando un nuovo topic Dev per discuterne.

:sparkles: Sono un autore di plugin/temi. Come aggiorno un tema/plugin per supportare sia la vecchia che la nuova topic list durante la transizione?

I nuovi plugin outlets vengono renderizzati sia nella vecchia che nella nuova implementazione della topic list. Quindi: quando avrai implementato la nuova, semplicemente elimina il vecchio connettore raw-plugin-outlet.

Per le personalizzazioni basate su DAG che sostituiscono gli override di template o gli outlet non modernizzati, dovrai mantenere entrambe le implementazioni durante il periodo di transizione.

Una volta che il tuo tema/plugin supporterà entrambe le implementazioni, potrai aggiungere questo commento magico in cima a tutti i tuoi file .hbr:

{{!-- has-modern-replacement --}}

Questo silenzierà i messaggi di deprecazione e consentirà l’utilizzo della nuova implementazione quando è in modalità “auto”.

12 Mi Piace

Mi scuso per essere pignolo, ma questo non significa in realtà qualcosa di più simile a “se il tuo plugin o tema ha file ‘raw handlebars’ che hanno a che fare con la lista degli argomenti, allora devono essere aggiornati”

I miei file raw handlebars che hanno a che fare con altri modelli continueranno ad andare bene, giusto? O i file raw handlebars stanno scomparendo del tutto? (Penso che siano necessari per modelli/route aggiuntivi, giusto?)

3 Mi Piace

“Raw handlebars” significa i nostri template specifici per discourse, che hanno l’estensione del file .hbr (o storicamente .raw.hbs). Abbiamo utilizzato questo sistema solo per la lista degli argomenti e per alcuni elementi interni di ‘autocomplete’.

Altri file .hbs (ad esempio per componenti Ember o route) non sono interessati.

Aggiornerò l’OP per renderlo più chiaro. Grazie @pfaffman!

Modifica: ecco fatto:

1 Mi Piace

Oh. Ci hai davvero provato a renderlo chiaro. Hai esplicitamente indicato le estensioni. Non credo che tu possa renderlo più chiaro. Penso che questo sia un mio problema. :person_shrugging:

Ma forse l’aggiunta di una frase in più mi avrebbe aiutato a leggere.

1 Mi Piace

Grazie per aver condiviso. Ho avuto paura di questo per molto tempo e sta arrivando…:grimacing: Non sembrerà una corsa facile… :sweat_smile: Ma il trasformatore di valore probabilmente lo renderà più facile.:crossed_fingers:

2 Mi Piace

Credo che GitHub - discourse/discourse-topic-excerpts: Add topic excerpts to all topics in the topic list non sia ancora stato aggiornato?

1 Mi Piace

Sì, abbiamo ancora molti temi/plugin ufficiali in attesa di aggiornamento. Estenderò quel punto elenco al Q1 nell’OP :writing_hand:

1 Mi Piace

Grazie! Mi sto godendo l’esperienza di sviluppo finora! Ti farò sapere se TLP solleva problemi quando ci arriverò.

2 Mi Piace

Fantastico! La topic-list-thumbnails ufficiale è una di quelle che abbiamo finito di aggiornare, quindi potrebbe servire come utile riferimento.

2 Mi Piace

Oh, scusami! @isaac ha aggiornato topic-excerpts la scorsa settimana: DEV: Update plugin for `glimmer-topic-list` (#34) · discourse/discourse-topic-excerpts@0dd3c6c · GitHub

Quindi dovrebbe funzionare bene con la nuova topic-list :crossed_fingers:

1 Mi Piace

Sto riscontrando:

Entrambe le versioni sono aggiornate.

quando si aggiunge una colonna, qual è il modo strategico per aggiungere un’intestazione di colonna ordinabile?

usando:

api.registerValueTransformer("topic-list-header-sortable-column"

in aggiunta all’altro transformer?

      api.registerValueTransformer(
        "topic-list-columns",

non sembra farlo da solo? :thinking:

cc @isaac. Se dovessi indovinare: forse la nuova logica necessita di un aggiornamento per gestire gli argomenti non categorizzati?

Il transformer che hai trovato serve a sovrascrivere l’ordinabilità delle colonne esistenti (ad esempio, lo facciamo in discourse-calendar per impedire l’uso di altri metodi di ordinamento quando ci si trova nella vista cronologica degli argomenti).

Se stai aggiungendo una nuova colonna, allora dovresti essere in grado di definire la tua intestazione utilizzando il componente SortableColumn. Ad esempio, eccone uno nel core:

(una cosa che è davvero bella della nuova API è che tutte le colonne principali sono definite utilizzando la stessa API che usi da temi/plugin!)

2 Mi Piace

sì, l’ho notato quando ho fatto una ricerca nel codice, bello!

1 Mi Piace

Fixed :slight_smile:

2 Mi Piace

D: È possibile assegnare un Component intero a una Cell, non solo un <template>?

Ad esempio, cosa succederebbe se volessi visualizzare un pulsante trasparente in una cella che richiedesse una logica JavaScript minima?

Sì! Tecnicamente, un tag <template> vuoto crea tecnicamente un “Template Only Component”. Simile al tipo di componente che si ottiene quando si inserisce un file .hbs vuoto nella directory components/.

Quindi sì, importare e passare una normale classe di componente funzionerà allo stesso modo. Funzionerà anche con i componenti classici! (anche se ovviamente raccomandiamo di utilizzare i componenti Glimmer più moderni).

2 Mi Piace

È fantastico!

Questo cambia… molto! :exploding_head:

1 Mi Piace

Domanda stupida, forse.

Ma come applicare le modifiche a… topic-list mobile?

1 Mi Piace

Per dispositivi mobili, abbiamo una serie di nuovi plugin outlet (inclusi i wrapper outlet).

In alternativa, puoi usare un valueTransformer per forzare la visualizzazione desktop ovunque (lo facciamo per i topic-thumbnails).

Ho in programma di scrivere una guida più dettagliata su “come personalizzare l’elenco degli argomenti” Documentation > Developer Guides la prossima settimana, quindi includerò sicuramente queste informazioni.

4 Mi Piace