Beiträge mit einer Theme-Komponente bearbeiten

Ich bin auf die Idee gestoßen, denjenigen mit Bearbeitungsberechtigungen für Beiträge (TL4±Benutzer) zu ermöglichen, Text auszuwählen und diesen Teil in einen Codeblock umzuwandeln.

Nachdem ich einige Teile des Discourse AI-Plugin-Codes referenziert und mir angesehen habe, welche Daten an den von mir verwendeten Plugin-Outlet übergeben werden, habe ich den Code entwickelt, um den ausgewählten Text zu erhalten und ihn mit quote-share-buttons-before mit Code-Zäunen zu umschließen.

Dann stecke ich fest. Das Checklist-Plugin (irgendwie) macht dies mit einem Argument in der Funktion checklistSyntax namens postDecorator, mit dem sie dann das Modell (ich glaube, es ist das post-Modell?) über .getModel() abrufen können. Wie das übergeben wird, weiß ich nicht, aber ich glaube nicht, dass es in meinem Setup für mich verfügbar ist?

Wenn es sich tatsächlich um das Post-Modell handelt, das im Checklist-Plugin verwendet wird, scheine ich Schwierigkeiten zu haben, die einfache ‘save’-Funktion zu finden, die in

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

in models/post.js existiert, es sei denn, ich verstehe es falsch.

Ich benutze derzeit this.args.outletArgs.data.editPost(this.post) (was, wenn ich mich recht erinnere, in models/topic.js steht, aber korrigieren Sie mich, wenn ich falsch liege), was nur den Composer öffnet, um den Beitrag zu bearbeiten, nicht ihn direkt zu bearbeiten.

Meine Frage ist also: Wie kann ich den Beitrag wie das Checklist-Plugin ohne Aufwand bearbeiten? Gibt es eine Möglichkeit, das zu tun, wenn ich einen Button in einem Outlet anstelle von api.decorateCookedElement platziere, wie es Checklist tut? Vorzugsweise ohne die REST-API zu verwenden?

Mein Repository:

Danke!

Okay, ich glaube, ich komme \u003cdel\u003ejetzt näher\u003c/del\u003e \u003cins\u003ejetzt sehr nah\u003c/ins\u003e.

\u003cdel\u003eIch habe this.post.save() versucht und es funktioniert anscheinend – die PUT-Anfrage scheint durchzugehen (unter der Haube mit Ajax), aber ich stieß auf einen Fehler mit wenig bis gar keiner Information. Aber das war vor dem hier.\u003c/del\u003e

\u003cins\u003eDas this.post.save() funktioniert. Das einzige Problem ist das unten aufgeführte:\u003c/ins\u003e

Meine Funktion sieht jetzt so aus:

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

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

  let rawPost = post.raw; // Existiert nicht!!
  console.log(rawPost); // undefined!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // Fehler, da rawPost undefiniert ist!

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

Aus irgendeinem Grund kann ich nicht auf die Rohinhalte des Posts zugreifen, nur auf die gekochten. Gibt es eine Möglichkeit, dies zu tun, ohne eine Ajax-Anfrage zu stellen? Ich kann raw nicht als eines der Attribute für den Post finden… gibt es einen Grund, warum es nicht enthalten ist?

P.S. Ich versuche, nicht auf Ask Discourse zurückzugreifen. Ich wäre Ihnen für jede Hilfe sehr dankbar!

\u003chr\u003e

EDIT: Ich glaube, jeder Post basiert auf dieser API-Anfrage? Und die Antwort scheint raw nicht als einen der JSON-Schlüssel zu haben :face_exhaling:.

Ja, das stimmt – wir schließen raw nicht in die Standardantwort ein. Es wird für die normale Darstellung nicht benötigt, daher wäre die Einbeziehung eine Verschwendung in Bezug auf Datenübertragung/Geschwindigkeit.

Am besten wäre es, eine zusätzliche Ajax-Anfrage zu stellen, wenn Sie sie benötigen. Wie Sie festgestellt haben, ist das Checklisten-Plugin ein gutes Beispiel dafür.

1 „Gefällt mir“

Verstanden, danke. Ich werde an dieser Ajax-Anfrage arbeiten.

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