ID argomento come variabile?

Una parola comune è l’opposto di ciò che voglio. Non voglio che i miei risultati di ricerca contengano TUTTI i ticket, voglio un modo per cercare un ticket specifico. Ecco perché l’ID dell’argomento sarebbe ideale. Vengono generati automaticamente e sono univoci.

No, penso che il codice che sto usando fosse originariamente di awesomerobot, ma non riesco più a trovarne la fonte.
Preferisco il posizionamento di ciò che sto usando attualmente rispetto a quel blocco sotto il testo.

Beh, io non posso farlo. Forse tu puoi.
«Voce di Liam Neeson»Ho un certo set di abilità. La programmazione non è tra queste.«/Voce di Liam Neeson»

Allora forse dovresti spostare questo argomento in Marketplace o Feature.

1 Mi Piace

Mi fraintendi. Intendevo avere una parola comune incluso il parametro topic:id, in modo che vengano visualizzati solo i risultati da quell’argomento. La parola comune elimina la necessità di cambiare parole come ‘ciao’ e ‘salve’.

@tknospdr @pfaffman Ho messo insieme un componente rapido che ti permette di inserire l’ID dell’argomento e di accedervi.

Crea un nuovo componente e aggiungi questo nella scheda JS sotto il pulsante Modifica CSS/HTML[1]:

import { apiInitializer } from "discourse/lib/api";
import Component from '@glimmer/component';
import { action } from "@ember/object";
import Form from "discourse/components/form";
import DiscourseURL from "discourse/lib/url";

export default apiInitializer((api) => {
    api.renderBeforeWrapperOutlet("full-page-search-filters",
        class GoToTopic extends Component {
            @action
            handleSubmit(data) {
                DiscourseURL.routeTo(`/t/${data.id}`);
            }

            <template>
                <div class="topic-id-go-to" style="margin-top: 1em;">
                    <Form @onSubmit={{this.handleSubmit}} as |form|>

                      <form.Field @name="id" @title="Topic id" as |field|>
                        <field.Input @type="number" @validation="required" />
                      </form.Field>

                      <form.Submit />
                    </Form>
                </div>
            </template>
        }
    );
});

Questo aggiunge un input alla pagina di ricerca:


Il pulsante Submit serve per andare all’argomento[2]; non influisce sui risultati della ricerca.

Spero che questo aiuti!


  1. La mia prima volta con FormKit, è davvero fantastico! ↩︎

  2. Non ho potuto cambiare il testo del pulsante, poiché ciò richiederebbe le localizzazioni… che necessiterebbero di un intero repository TC, il che potrebbe essere eccessivo :person_shrugging:. ↩︎

1 Mi Piace

Grazie @NateDhaliwal, apprezzo lo sforzo.
Ho creato il componente, incollato il codice nella scheda JS. Mi sono assicurato che fosse attivo sul mio tema, ma niente.
Questo è l’aspetto della mia pagina di ricerca:

1 Mi Piace

Ho impostato questo sul mio sito per giocare e sembra funzionare, tuttavia, ricevo questo avviso che mi dà qualche esitazione:

Ci sono errori nella console del browser?

Questo è l’unico errore:

E penso che sia dovuto al JS per mostrare l’ID dell’argomento, non alla ricerca. Non appare se non nelle pagine che ho contrassegnato per quell’elemento.

Ho disabilitato, quindi riattivato il componente Banner di ricerca avanzata e ora funziona.
:man_shrugging:

1 Mi Piace

Ecco un riepilogo della situazione attuale:

  1. Abbiamo una soluzione funzionante. Anche se è leggermente inelegante, soddisferà le mie esigenze fino a quando non potremo cercare l’ID dell’argomento direttamente nella casella di ricerca standard.
  2. Il codice attuale suggerito da @awesomerobot sembra funzionare, ma attiva l’avviso che ho pubblicato sopra.
    2a. Quando ho rimosso il codice originale che stavo usando per visualizzare l’ID dell’argomento, questo avviso è scomparso…
  3. Quando scegli una soluzione, il codice per visualizzare l’ID dell’argomento appare sia nel post originale che nella soluzione. C’è un modo per tenerne conto e impedirne la visualizzazione lì?
  4. Ho abbellito un po’ di più il CSS, ora ho una pillola su ogni risposta in ogni thread nelle categorie specificate in cui la sto usando. Suppongo che la risposta sarà di “dis-abbellirla”, ma se qualcuno conosce un altro modo preferirei mantenerla, penso che abbia un bell’aspetto così com’è.

@awesomerobot
Il tuo codice funziona alla grande, ma sembra che qualsiasi decorazione CSS diversa dal testo appaia su ogni post dopo il primo come uno spazio vuoto formattato come dice il CSS.

Disattiva il blocco inline e otterrai una barra colorata a tutta larghezza.
Cambia il colore di sfondo e la pillola cambia colore
ecc…

In base a ciò che hai scritto, sembra che tu abbia detto di mostrarlo solo nel primo post, ma questo influisce solo sul testo. C’è qualcos’altro che possiamo fare per eliminare l’elemento su tutti i post aggiuntivi?

1 Mi Piace

Ok, come ho detto, non sono un programmatore, ma sono bravissimo a fare domande a Grok. Ecco un codice che si occupa di entrambi i problemi.

  1. Niente più bolle CSS vuote nelle risposte dalla 2 alla X.
  2. Niente più duplicazione dell’ID dell’argomento nelle soluzioni citate.

Forse nessun altro sulla Terra ci tiene, ma questo sembra un buon modo per aiutare a tracciare gli argomenti per quelli di noi che usano Discourse come sistema di ticketing.

import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // primo post nell'argomento
    const desiredCategories = [9, 23]; // un elenco separato da virgole degli ID delle categorie in cui si desidera che questo appaia
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puoi modificare il contenuto sottostante, {{this.topicId}} è dove verrà riempito l'ID dell'argomento -->
      Issue Tracking # is
      {{this.topicId}}
      <!-- puoi modificare il contenuto soprastante -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
```gjs
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // primo post nell'argomento
    const desiredCategories = [9, 23]; // un elenco separato da virgole degli ID delle categorie in cui si desidera che questo appaia
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puoi modificare il contenuto sottostante, {{this.topicId}} è dove verrà riempito l'ID dell'argomento -->
      Issue Tracking # is
      {{this.topicId}}
      <!-- puoi modificare il contenuto soprastante -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Procedi solo se questo è il primo post e non all'interno di una citazione di soluzione
    // Procedi solo se questo è il primo post, non in una citazione, e nella categoria desiderata
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Corrisponde alle categorie da TopicIdentifier
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Controlla la categoria
      element.classList.contains("post__contents-cooked-quote") || // Controlla se l'elemento stesso è il contenuto della citazione
      element.closest("aside.accepted-answer") || // Controlla il wrapper della soluzione/citazione
      element.closest(".quote") // Controllo aggiuntivo per citazioni generiche
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});
3 Mi Piace

Non sono riuscito a occuparmene prima, ma sono contento che tu abbia risolto! Sembra una soluzione ragionevole.

1 Mi Piace

So che posso testarlo facilmente, ma sai già se funzionerebbe se mettessi questo JS e CSS nel suo componente, o deve essere nel tema stesso?

Ho trovato un’altra piccola anomalia. Stavo vedendo le bolle di classe vuote nel primo post degli argomenti al di fuori dei 2 in cui li volevo, quindi ho dovuto aggiornare un po’ il codice. Ecco il prodotto finale.

import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // primo post nell'argomento
    const desiredCategories = [9, 23]; // un elenco separato da virgole di ID di categoria in cui si desidera che questo appaia
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puoi modificare il contenuto sottostante, {{this.topicId}} è dove verrà inserito l'ID dell'argomento -->
      Issue Tracking # is
      {{this.topicId}}
      <!-- puoi modificare il contenuto sopra -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Only proceed if this is the first post and not inside a solution quote
    // Only proceed if this is the first post, not in a quote, and in the desired category
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Match the categories from TopicIdentifier
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Check category
      element.classList.contains("post__contents-cooked-quote") || // Check if the element itself is the quote content
      element.closest("aside.accepted-answer") || // Check for solution/quote wrapper
      element.closest(".quote") // Additional check for generic quotes
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});
      element.classList.contains("post__contents-cooked-quote") || // Check if the element itself is the quote content
      element.closest("aside.accepted-answer") || // Check for solution/quote wrapper
      element.closest(".quote") // Additional check for generic quotes
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});

E per rispondere alla mia domanda, ho spostato tutto il codice in un nuovo componente del tema e tutto funziona ancora bene.