Редактирование постов с использованием компонента темы

Итак, я наткнулся на идею позволить пользователям с правами на редактирование постов (TL4 и выше) выделять текст и преобразовывать его в блок кода.

После изучения некоторых частей кода плагина Discourse AI и анализа данных, передаваемых в используемый мной выходной порт плагина, я написал код для получения выделенного текста и обертки его в блоки кода с помощью выходного порта quote-share-buttons-before.

Теперь же я немного застрял. Плагин checklist (каким-то образом) делает это с помощью аргумента postDecorator в функции checklistSyntax, через который они получают модель (я полагаю, это модель post?), используя метод .getModel(). Как именно этот аргумент передается, я не знаю, но мне кажется, что в моей настройке он недоступен.

Если в плагине checklist действительно используется модель поста, то я не могу найти, где находится простая функция сохранения save, используемая в:

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

в файле models/post.js, если только я что-то не понимаю неправильно.

В настоящее время я использую this.args.outletArgs.data.editPost(this.post) (если память не изменяет, это находится в models/topic.js, но поправьте меня, если я ошибаюсь), что открывает только композер для редактирования поста, а не редактирует его напрямую.

Итак, мой вопрос таков: как можно редактировать пост так же, как это делает плагин checklist, без лишних хлопот? Существует ли способ сделать это, если я размещаю кнопку в выходном порте, а не использую api.decorateCookedElement, как это делает checklist? Желательно без использования REST API?

Мой репозиторий:

Спасибо!

Хорошо, я думаю, что я ближе очень близок сейчас.

Я попробовал this.post.save(), и, apparently, это «работает» — похоже, что 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 равен undefined!

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

По какой-то причине я не могу получить необработанное содержимое поста, только обработанное. Кроме выполнения AJAX-запроса, есть ли способ это сделать? Я не могу найти raw среди атрибутов поста… есть ли причина, по которой он не включён?

P.S. Я стараюсь не обращаться к Ask Discourse. Я был бы очень благодарен за любую помощь!


РЕДАКТИРОВАНИЕ: Я думаю, что каждый пост основан на этом API-запросе? И в ответе, похоже, нет raw среди ключей JSON :face_exhaling:

Да, всё верно — мы не включаем raw в ответ по умолчанию. Это не нужно для обычного рендеринга, поэтому его включение было бы своего рода расточительством с точки зрения передачи данных и скорости.

Лучшее решение — делать дополнительный AJAX-запрос, когда это необходимо. Как вы уже заметили, плагин checklist является хорошим примером этого.

Понял, спасибо! Я займусь этим AJAX-запросом.