Modification des messages à l'aide d'un composant de thème

J’ai donc eu l’idée de permettre à ceux qui ont les permissions d’édition de publication (utilisateurs TL4+) de sélectionner du texte et de le convertir en bloc de code.

Après avoir consulté certaines parties du code du plugin Discourse AI et examiné les données transmises à l’outlet du plugin que j’utilise, j’ai trouvé le code pour obtenir le texte sélectionné et l’entourer de délimiteurs de code, en utilisant l’outlet quote-share-buttons-before.

Ensuite, je suis un peu bloqué. Le plugin checklist (d’une manière ou d’une autre) fait cela avec un argument dans la fonction checklistSyntax appelé postDecorator, qui leur permet ensuite d’obtenir le modèle (je pense que c’est le modèle post ?) en utilisant .getModel(). Je ne sais pas comment cela est passé, mais je ne pense pas que ce soit disponible pour moi dans ma configuration ?

S’il s’agit bien du modèle de publication utilisé dans le plugin checklist, j’ai du mal à trouver où la simple fonction ‘save’ utilisée dans

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

existe dans models/post.js, à moins que je ne comprenne mal.

J’utilise actuellement this.args.outletArgs.data.editPost(this.post) (qui, si je me souviens bien, se trouve dans models/topic.js, mais corrigez-moi si je me trompe) qui ouvre seulement le compositeur pour éditer la publication, pas pour l’éditer directement.

Ma question est donc la suivante : comment puis-je éditer la publication comme le fait le plugin checklist, sans tracas ? Y a-t-il un moyen de le faire si je place un bouton dans un outlet au lieu de api.decorateCookedElement comme le fait checklist ? De préférence sans utiliser l’API REST ?

Mon dépôt :

Merci !

Okay, je pense que je m’en rapproche \u003cdel\u003eplus près\u003c/del\u003e \u003cins\u003etrès près maintenant\u003c/ins\u003e.

\u003cdel\u003eJ’ai essayé this.post.save() et cela semble fonctionner - la requête PUT semble passer (utilisant ajax en arrière-plan), mais j’ai rencontré une erreur avec peu ou pas d’informations. Mais c’était avant ça…\u003c/del\u003e
\u003cins\u003eLe this.post.save() fonctionne. Le seul problème est celui listé ci-dessous :\u003c/ins\u003e

Ma fonction ressemble maintenant à ceci :

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

  let post = this.post;
  console.log(this.post.cooked); // Fonctionne
  
  let rawPost = post.raw; // N'existe pas !!
  console.log(rawPost); // undefined !

  rawPost.replace(selectedText, "\n" + newText + "\n"); // Erreur, car rawPost est undefined !

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

Pour une raison quelconque, je ne peux pas obtenir le contenu brut du post, seulement le contenu cuit. En dehors de faire une requête ajax, y a-t-il un moyen de le faire ? Je ne semble pas trouver raw parmi les attributs du post… y a-t-il une raison pour qu’il ne soit pas inclus ?

P.S. J’essaie de ne pas me tourner vers Ask Discourse. J’apprécierais vraiment toute aide !

\u003chr\u003e
EDIT : Je pense que chaque post est basé sur cette requête API ? Et la réponse ne semble pas avoir raw comme l’une des clés JSON :face_exhaling:.

Oui, c’est exact - nous n’incluons pas raw dans la réponse par défaut. Ce n’est pas nécessaire pour le rendu normal, donc l’inclure serait un peu un gaspillage en termes de transfert de données/vitesse.

Le mieux serait de faire une requête ajax supplémentaire lorsque vous en avez besoin. Comme vous l’avez trouvé, le plugin checklist en est un bon exemple.

1 « J'aime »

Compris, merci. Je vais travailler sur cette requête ajax.

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