Edición de publicaciones usando un componente de tema

Así que se me ocurrió la idea de permitir que aquellos con permisos de edición de publicaciones (usuarios TL4+) pudieran seleccionar texto y convertir esa parte en un bloque de código.

Después de consultar algunas partes del código del plugin Discourse AI y ver qué datos se pasan al outlet del plugin que estoy utilizando, se me ocurrió el código para obtener el texto seleccionado y envolverlo con cercas de código, utilizando el outlet quote-share-buttons-before.

Entonces, ahora estoy un poco atascado. El plugin checklist (de alguna manera) hace esto con un argumento en la función checklistSyntax llamado postDecorator, que luego pueden usar para obtener el modelo (creo que es el modelo post?) usando .getModel(). Cómo se pasa eso no lo sé, pero no creo que esté disponible para mí en mi configuración.

Si realmente es el modelo de publicación el que se utiliza en el plugin checklist, parece que tengo problemas para encontrar dónde existe la simple función ‘guardar’ en

await postModel.save({
  raw: newRaw,
  edit_reason: i18n("checklist.edit_reason"),
});

en models/post.js, a menos que lo esté entendiendo mal.

Actualmente estoy usando this.args.outletArgs.data.editPost(this.post) (que si no recuerdo mal está en models/topic.js, pero corríjanme si me equivoco) que solo abre el compositor para editar la publicación, no para editarla directamente.

Entonces, mi pregunta es: ¿cómo puedo editar la publicación como el plugin checklist, sin complicaciones? ¿Hay alguna forma de hacerlo si estoy colocando un botón en un outlet en lugar de api.decorateCookedElement como lo hace checklist? ¿Preferiblemente sin usar la API REST?

Mi repositorio:

¡Gracias!

Okay, creo que estoy más cerca muy cerca ahora.

Intenté this.post.save() y aparentemente “funciona” - parece que la solicitud PUT se está realizando (usando ajax internamente), pero me encontré con algún error con poca o ninguna información. Pero eso fue antes de esto…

El this.post.save() funciona. El único problema es el que se enumera a continuación:

Mi función ahora es así:

@action
async addCodeFences() {
  let selectedText = this.selectedText;
  let newText = "```" + "\n" + selectedText + "\n" + "```";

  let post = this.post;
  console.log(this.post.cooked); // Funciona

  let rawPost = post.raw; // ¡¡No existe!!
  console.log(rawPost); // ¡indefinido!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // Error, ¡ya que rawPost es indefinido!

  await this.post.save({
    raw: rawPost,
    edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
  });
}

Por alguna razón, no puedo obtener el contenido raw de la publicación, solo el cocinado. Aparte de hacer una solicitud ajax, ¿hay alguna forma de hacerlo? No parece que raw sea uno de los atributos de la publicación… ¿hay alguna razón por la que no se incluya?

P.S. Estoy tratando de no recurrir a Ask Discourse. ¡Agradecería mucho cualquier ayuda!


EDITAR: Creo que cada publicación se basa en esta solicitud de API? Y la respuesta no parece tener raw como una de las claves JSON :face_exhaling:.

Sí, es correcto: no incluimos raw en la respuesta predeterminada. No es necesario para la renderización normal, por lo que incluirlo sería un desperdicio en términos de transferencia de datos/velocidad.

La mejor opción sería realizar una solicitud ajax adicional cuando la necesites. Como encontraste, el plugin de lista de verificación es un buen ejemplo de esto.

1 me gusta

Entendido, gracias. Trabajaré en esa solicitud ajax.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.