¿ID de tema como variable?

Una palabra común es lo opuesto a lo que quiero. No quiero que mis resultados de búsqueda tengan CADA ticket, quiero una forma de buscar un ticket específico. Por eso el ID del tema sería ideal. Se generan automáticamente y son únicos.

No, creo que el código que estoy usando también era originalmente de awesomerobot, pero ya no encuentro su fuente.
Prefiero la ubicación de lo que estoy usando actualmente a ese bloque debajo del texto.

Bueno, yo no puedo hacer eso. Quizás tú sí.
«Con la voz de Liam Neeson» Tengo un conjunto particular de habilidades. La codificación no está entre ellas.«/Liam Neeson voice»

Entonces, quizás deberías mover este tema a Marketplace o Feature.

1 me gusta

Me malinterpretas. Quise decir tener una palabra común incluyendo el parámetro topic:id, para que solo aparezcan resultados de ese tema. La palabra común elimina la necesidad de cambiar palabras como ‘hola’ y ‘saludos’.

@tknospdr @pfaffman He compilado un componente rápido que te permite introducir el ID del tema y saltar a él.

Crea un nuevo componente y añade esto a la pestaña JS debajo del botón Editar 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>
        }
    );
});

Esto añade un campo de entrada a la página de Búsqueda:


El botón Submit sirve para ir al tema[2]; no afecta a los resultados de búsqueda.

¡Espero que esto ayude!


  1. ¡Mi primera vez usando FormKit, es realmente genial! ↩︎

  2. No pude cambiar el texto del botón, ya que eso requeriría locales… lo que necesitaría un repositorio TC completo, lo cual podría ser excesivo :person_shrugging:. ↩︎

1 me gusta

Gracias @NateDhaliwal, aprecio el esfuerzo.
Creé el componente, pegué el código en la pestaña JS. Me aseguré de que estuviera activo en mi tema, pero no funcionó.
Así se ve mi página de búsqueda:

1 me gusta

Configuré esto en mi sitio para jugar y parece funcionar, sin embargo, recibo esta advertencia que me da algunas dudas:

¿Hay algún error en la consola del navegador?

Este es el único error:

Y creo que es para que el JS muestre el ID del tema, no la búsqueda. No aparece excepto en las páginas que marqué para ese elemento.

Desactivé y volví a activar el componente del banner de búsqueda avanzada, y ahora funciona.
:man_shrugging:

1 me gusta

Aquí, un resumen de la situación actual:

  1. Tenemos una solución funcional. Aunque es un poco ineficiente, satisfará mis necesidades hasta que podamos buscar el ID del tema directamente en el cuadro de búsqueda estándar.
  2. El código actual sugerido por @awesomerobot parece funcionar, pero activa la advertencia que publiqué anteriormente.
    2a. Cuando eliminé el código original que estaba usando para mostrar el ID del tema, esta advertencia desapareció…
  3. Cuando eliges una solución, el código para mostrar el ID del tema aparece tanto en la publicación original como en la solución. ¿Hay alguna manera de tenerlo en cuenta y evitar que se muestre allí?
  4. He mejorado un poco más el CSS, ahora tengo una pastilla en cada respuesta en cada hilo en las categorías especificadas en las que lo estoy usando. Supongo que la respuesta será dejar de mejorarla, pero si alguien conoce otra forma, preferiría conservarla, creo que se ve bien tal como está.

@awesomerobot
Tu código funciona de maravilla, pero parece que cualquier decoración CSS que no sea texto aparece en cada publicación después de la primera como un espacio vacío formateado como dice el CSS.

Desactiva el bloque en línea y obtendrás una barra de color de ancho completo.
Cambia el color de fondo y la píldora cambia de color
etc…

Basado en lo que escribiste, parece que le has dicho que solo se muestre en la primera publicación, pero eso solo afecta al texto. ¿Hay algo más que podamos hacer para eliminar el elemento en todas las publicaciones adicionales?

1 me gusta

Okay, como dije, no soy programador, pero soy muy bueno haciendo preguntas a Grok. Aquí tienes código que se encarga de ambos problemas.

  1. No más burbujas CSS vacías en las respuestas 2 a X.
  2. No más duplicación del ID del tema en las soluciones citadas.

Quizás a nadie más en el planeta le importe, pero esta parece una buena manera de ayudar a rastrear temas para aquellos de nosotros que usamos Discourse como sistema de tickets.

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; // primer post en el tema
    const desiredCategories = [9, 23]; // una lista separada por comas de los IDs de categoría en los que deseas que esto aparezca
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puedes editar el contenido a continuación, {{this.topicId}} es donde se rellenará el ID del tema -->
      Issue Tracking # is
      {{this.topicId}}
      <!-- puedes editar el contenido anterior -->
    {{/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; // primer post en el tema
    const desiredCategories = [9, 23]; // una lista separada por comas de los IDs de categoría en los que deseas que esto aparezca
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puedes editar el contenido a continuación, {{this.topicId}} es donde se rellenará el ID del tema -->
      Issue Tracking # is
      {{this.topicId}}
      <!-- puedes editar el contenido anterior -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Solo continuar si este es el primer post y no está dentro de una cita de solución
    // Solo continuar si este es el primer post, no está en una cita y está en la categoría deseada
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Coincide con las categorías de TopicIdentifier
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Comprobar categoría
      element.classList.contains("post__contents-cooked-quote") || // Comprobar si el elemento en sí es el contenido de la cita
      element.closest("aside.accepted-answer") || // Comprobar el contenedor de solución/cita
      element.closest(".quote") // Comprobación adicional para citas genéricas
    ) {
      return;
    }

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

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

    element.appendChild(wrapper);
  });
});
3 Me gusta

No pude llegar a esto antes, ¡pero me alegro de que lo hayas resuelto! Esta parece una solución razonable.

1 me gusta

Sé que puedo probarlo fácilmente, pero ¿sabes de inmediato si esto funcionaría si pusiera este JS y CSS en su propio componente, o tiene que estar en el tema mismo?

Encontré otra pequeña anomalía. Estaba viendo las burbujas de clase vacías en la primera publicación de temas fuera de las 2 en las que las quería, así que tuve que actualizar el código un poco. Aquí está el producto final.

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; // primera publicación en el tema
    const desiredCategories = [9, 23]; // una lista separada por comas de los IDs de categoría en los que desea que esto aparezca
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- puedes editar el contenido a continuación, {{this.topicId}} es donde se completará el ID del tema -->
      El número de seguimiento del problema es
      {{this.topicId}}
      <!-- puedes editar el contenido anterior -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Solo continuar si esta es la primera publicación y no dentro de una cita de solución
    // Solo continuar si esta es la primera publicación, no en una cita, y en la categoría deseada
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Coincidir con las categorías de TopicIdentifier
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Verificar categoría
      element.classList.contains("post__contents-cooked-quote") || // Verificar si el elemento en sí es el contenido de la cita
      element.closest("aside.accepted-answer") || // Verificar el envoltorio de solución/cita
      element.closest(".quote") // Verificación adicional para citas genéricas
    ) {
      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") || // Verificar si el elemento en sí es el contenido de la cita
      element.closest("aside.accepted-answer") || // Verificar el envoltorio de solución/cita
      element.closest(".quote") // Verificación adicional para citas genéricas
    ) {
      return;
    }

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

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

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

Y para responder a mi propia pregunta, moví todo el código a un nuevo componente de tema y todo sigue funcionando bien.