テーマコンポーネントを使用した投稿の編集

編集権限を持つユーザー(TL4以上)がテキストを選択してコードブロックに変換できるようにするというアイデアを思いつきました。

Discourse AIプラグインのコードの一部を参照し、使用しているプラグインのアウトレットに渡されるデータを調べた後、選択されたテキストを取得し、quote-share-buttons-before アウトレットを使用して、コードフェンスで囲むコードを作成しました。

しかし、行き詰まっています。チェックリストプラグインは、checklistSyntax 関数の postDecorator という引数を使用してこれを(何らかの方法で)実行しており、それを使用してモデル(おそらく post モデル?)を .getModel() で取得できます。それがどのように渡されるかはわかりませんが、私のセットアップでは利用できないと思いますか?

チェックリストプラグインで使用されているのが本当にポストモデルである場合、models/post.js のどこに、以下のような単純な「保存」関数が存在するのかを見つけるのに苦労しているようです。

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

私が誤解していない限り。

現在、this.args.outletArgs.data.editPost(this.post)(これは models/topic.js にあると思いますが、もし間違っていたら訂正してください)を使用していますが、これはポストを直接編集するのではなく、コンポーザーを開くだけです。

そこで質問です。チェックリストプラグインのように、手間をかけずにポストを編集するにはどうすればよいですか?チェックリストが行っている api.decorateCookedElement ではなく、アウトレットにボタンを配置する場合、REST APIを使用せずにこれを行う方法はありますか?

私のリポジトリ:

よろしくお願いします!

わかりました、だいぶ近づいてきたと思います。

this.post.save()を試したところ、それは「機能する」ようでした。PUTリクエストは(内部でajaxを使用している)通過しているようですが、ほとんど情報のないエラーに遭遇しました。しかし、それはこれより前のことでした。

このthis.post.save()は機能します。唯一の問題は、以下にリストされているものです。

私の関数は現在このようになっています。

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

  let post = this.post;
  console.log(this.post.cooked); // 機能する

  let rawPost = post.raw; // 存在しない!!
  console.log(rawPost); // undefined!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // rawPostが未定義のためエラー!

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

なぜか、調理済みのものしか取得できず、投稿の生のコンテンツを取得できません。ajaxリクエストを行う以外に、方法はありますか?投稿の属性としてrawが見つかりません…含まれていない理由がありますか?

追伸:Discourseの質問に頼りたくありません。どんな助けでも本当に感謝します!


編集:各投稿はこのAPIリクエストに基づいていると思いますか?そして、応答にはrawがJSONキーの1つとして含まれていないようです:face_exhaling:。

はい、その通りです。通常のレンダリングには必要ないため、デフォルトのレスポンスにはrawを含めていません。含めるとデータ転送/速度の点で無駄になります。

必要な場合は、追加のajaxリクエストを行うのが最善です。チェックリストプラグインがその良い例です。

「いいね!」 1

承知しました。ありがとうございます。そのAjaxリクエストに取り組みます。

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