¿Es posible modificar una función en un helper mediante el sistema de componentes de plugin o tema?

¿Hay alguna forma de volver a abrir una clase y sobrescribir una función?

La que necesito sobrescribir es function categoryStripe(color, classes) {} en la línea 15 de aquí: javascripts/discourse/helpers/category-link.js.es6.

Creo que sí. ¿Has visto Developing Discourse Themes & Theme Components?

4 Me gusta

Hay varias formas de hacer lo que estás preguntando. ¿Cuál es tu objetivo al sobrescribir categoryStripe?

3 Me gusta

Me gustaría cambiarlo de:

function categoryStripe(color, classes) {
  var style = color ? "style='background-color: #" + color + ";'" : "";
  return "<span class='" + classes + "' " + style + "></span>";
}

a:

function categoryStripe(color, classes) {
  var style = color ? "style='border: 1px solid #" + color + ";'" : "";
  return "<span class='" + "my-class" + classes + "' " + style + "></span>";
}

Es decir, cambiar el color de fondo por un borde y añadir una clase.

¿Cuál es la mejor manera de lograr esto, Justin?


Sí, lo leí, pero, si no recuerdo mal, solo cubre la capacidad de sobrescribir plantillas (y widgets), sin mencionar los helpers, ¿verdad?

1 me gusta

Nada de eso era obvio en tu primer mensaje. Creo que ahora obtendrás una respuesta útil que tengo curiosidad por ver.

1 me gusta

¿Has considerado agregar la clase mediante JavaScript o anular el estilo en línea usando !important en la hoja de estilos? Aunque puedes trabajar para anular este método, eventualmente dejará de funcionar. Agregarlo al DOM mediante JS es probablemente la forma más estable de proceder.

Lo que intentaba averiguar el otro día era básicamente eso. Quería agregar una clase personalizada a los mensajes en todos los temas (pero no al tema/publicación original). Me gustaría poder activar/desactivar esa clase personalizada por grupo de usuarios y fecha de creación del tema, pero pensé que podría resolver eso una vez que descubriera cómo agregar la clase personalizada a los mensajes. No encontré exactamente el ejemplo que buscaba, pero algunas otras cosas pudieron haberme distraído antes de encontrar el ejemplo.

No creo que eso funcione, porque necesito que el color se obtenga desde la configuración de la categoría, de modo que el color del borde variará para cada categoría. (He actualizado mi publicación anterior para reflejar esto.)

¿A menos que eso pueda obtenerse mediante JS (/añadiéndolo al DOM)? (Si es así, ¿podrías darme un ejemplo, por favor?)

Tendría que investigar los detalles para ver si lo que estás haciendo es factible solo con selección de JS (lamentablemente no tengo tiempo ahora mismo).

Pero puedes ver la adición de una clase aquí: discourse-knowledge-base-theme/javascripts/discourse/components/knowledge-base.js.es6 at 4694d4a8ad788f8884e3341c852d3f77b2c1d103 · discourse/discourse-knowledge-base-theme · GitHub

También puedes modificar estilos en línea con JS: Setting CSS Styles using JavaScript | KIRUPA

4 Me gusta

Gracias, Justin, lo revisaré.

¿O hay alguna manera de sobrescribir los helpers (discourse/app/assets/javascripts/discourse/helpers/category-link.js.es6 at b25d9e96c1414bf78b44221da4d385675843991e · discourse/discourse · GitHub) como podemos hacerlo con plantillas/componentes/widgets, etc.?

No me importa tener que estar atento a ese archivo para cambios futuros si es necesario :smiley:

Puedes intentar crear un archivo en tu tema en javascripts/discourse/helpers/category-link.js.es6 y agregar allí una versión modificada de esa función. ¡Ha pasado mucho tiempo desde la última vez que tuve que meterme tan profundo, así que no puedo garantizar si funcionará! :smiley:

5 Me gusta

Sí, eso debería funcionar.

3 Me gusta

¡Gracias a ambos!

Última pregunta (¡espero!): ¿cómo creo un archivo allí? :relaxed:

En un plugin que es fácil, crea la carpeta y ¡simplemente copia y pega!

1 me gusta

¡Ah! ¡Gracias, Robert!

Tengo que salir ahora, pero lo probaré tan pronto como regrese :ok_hand:

1 me gusta

Demo:

Estructura de carpetas del plugin:

image

¿Ves la edición oculta? :male_detective:

image

5 Me gusta

¡Gracias, Robert!

Pero no funciona :sob:

Esto es lo que hice:

rails g plugin CategoryAlternative

Luego puse esto:

En una carpeta helpers que tuve que crear:

Luego:

rm -rf tmp
rails s

Aparece en el AdminCP, pero los cambios no se reflejan en la página real (los cambios sí se ven si edito la versión no del plugin del archivo con exactamente las mismas modificaciones):

¿Me he perdido algo? ¿Necesito configurar algo más?

1 me gusta

¿Estás recibiendo errores en la consola de JavaScript?

¿Incluiste el archivo completo?

Nota: No utilicé el generador de plugins; simplemente creé todo manualmente.

1 me gusta

En el momento de escribir esto no lo hice (ya que pensé que Justin solo quería que incluyera esa función), pero aunque incluir el archivo completo hizo que funcionara, no fue lo mismo que cuando edité el archivo directamente.

Por ejemplo, funcionó en la página latest, pero no en el menú desplegable de todas las categorías… ¡lo cual sí funcionó cuando edité el archivo directamente!

Así que terminé haciendo los cambios que necesitaba mediante un CSS algo desordenado :joy: y también tuve que hacer algunas concesiones. Definitivamente es mejor que no haber podido hacerlo, pero idealmente habría preferido algo tan sencillo como cambiar el estilo de una categoría que fuera tan simple como editar una plantilla :sweat:

2 Me gusta

Me gustaría hacer lo mismo.
Aquí está la ruta del archivo que intento sobrescribir en mi componente del tema:
custom_loader\javascripts\discourse\helpers\loading-spinner.js
Pero el archivo JS no se carga. ¿Qué me estoy perdiendo?

1 me gusta