Недавно я начал разбираться с ошибкой в плагине Events: данные о событиях, отображаемые в редакторе, теряются, если пост сохраняется как черновик.
Я попытался исправить проблему и вскоре выяснил, что в Discourse нет API, которое позволяло бы это сделать.
С точки зрения UX это важная функция, имеющая множество потенциальных сценариев использования, выходящих за рамки моей конкретной задачи.
Поэтому я подготовил PR, который решает эту проблему, добавляя новый метод serializeToDraft в модель Composer. Этот метод будет сохранять эти пользовательские поля при сохранении поста как черновика. Кроме того, эти поля будут загружаться в модель редактора при повторном открытии черновика.
@angus помогает мне с этим PR, просматривая код и предлагая важные улучшения.
Хотел бы узнать мнение команды Discourse об этой функции.
Есть несколько моментов, которые я не до конца понимаю: почему serializeToDraft является частью API плагинов, а serializeOnCreate и serializeToTopic — нет? При каких обстоятельствах serializeToDraft полезен без двух других, и наоборот? Не должен ли существовать обёрточный метод, который выполняет сериализацию и для постов/тем, и для черновиков?
Я столкнулся с ещё одной проблемой: как насчёт метода saveDraft()? Как-то нужно добавить наблюдатель для полей, добавленных через serializeToDraft(), аналогичный этому:
иначе черновик не будет отправлен на конечную точку, если изменились только пользовательские поля черновика.
Таким образом, saveDraft() тоже должен быть частью API, или же эту логику нужно как-то абстрагировать.
Я также обнаружил наблюдатель dataChanged в модели composer. Мне кажется очень странным, что у нас есть два наблюдателя, следящих за одним и тем же. Логика внутри этого наблюдателя, вероятно, тоже должна срабатывать для пользовательских полей черновика. Также интересно, какой из двух наблюдателей сработает первым и каковы будут последствия.