Пользовательские поля не вставляются с новым редактором ProseMirror

Привет!

У нас возникла проблема с пользовательскими тегами событий и новым WYSIWYG-редактором ProseMirror: пользовательские поля, заполненные в форме события, отсутствуют в сгенерированной строке. С редактором Markdown всё работает как раньше.

Шаги для воспроизведения:

  1. Включите плагин Discourse Calendar.
  2. Добавьте одно пользовательское поле в конфигурацию плагина.
  3. Откройте форму для создания нового сообщения.
  4. Выберите редактор ProseMirror.
  5. Создайте событие, указав значение для пользовательского поля (Опции > Создать событие).
  6. Подтвердите создание события.
  7. Переключитесь на редактор Markdown.

Что происходит

Пользовательское поле отсутствует в теге [event].

Ожидаемое поведение

Пользовательское поле должно присутствовать в теге [event].

Примечания

Если выполнить те же действия, но начать с редактора Markdown вместо ProseMirror, пользовательское поле будет присутствовать в теге [event].

2 лайка

Я немного исследовал, что происходило с toolbarEvent при проверке нового события: метод addText() в обоих случаях, похоже, получает правильную разметку:

[event start="..." status="..." timezone="..." end="..." cf_1="abcd"]\n[/event]

Если это поможет, вот тест QUnit для воспроизведения проблемы:

// plugins/discourse-calendar/test/javascripts/acceptance/post-event-builder-custom-tags-test.js
import { click, find, visit, fillIn } from "@ember/test-helpers";
import { test } from "qunit";
import { acceptance } from "discourse/tests/helpers/qunit-helpers";
import selectKit from "discourse/tests/helpers/select-kit-helper";
import { i18n } from "discourse-i18n";

acceptance("Discourse Calendar — Форма нового события с пользовательскими полями", function (needs) {
  needs.user({ admin: true, can_create_discourse_post_event: true });
  needs.settings({
    discourse_local_dates_enabled: true,
    calendar_enabled: true,
    discourse_post_event_enabled: true,
    discourse_post_event_allowed_on_groups: "",
    discourse_post_event_allowed_custom_fields: "my_custom_field",
    coopaname_integration_enabled: false,
  });

  test("заполнение формы в редакторе MD заполняет пользовательские поля", async function (assert) {
    await ensureEventTagHasFields(assert, 'md');
  });

  test("заполнение формы в редакторе WYSIWYG заполняет пользовательские поля", async function (assert) {
    await ensureEventTagHasFields(assert, 'wysiwyg');
  });
});

async function ensureEventTagHasFields(assert, editorType){
  await visit("/");
  await click('#create-topic');
  const categoryChooser = selectKit(".category-chooser");
  await categoryChooser.expand();
  await categoryChooser.selectRowByValue(2);

  await switchEditorTo(editorType);

  await click(".toolbar-menu__options-trigger");
  await click(`button[title='${i18n("discourse_post_event.builder_modal.attach")}']`);
  await fillIn('input.custom-field-input', 'some value');
  await click('.d-modal__footer > button');

  await switchEditorTo('md');

  const fields = ['start', 'status', 'timezone', 'myCustomField'];
  const content = await find(".d-editor-input").value;

  fields.forEach((field) => {
    assert.true(content.includes(`${field}="`), `${field} присутствует в теге события`);
  });
}

async function switchEditorTo(type){
  const editorSwitch = find('button.composer-toggle-switch');
  const isInMarkdown = editorSwitch.attributes['aria-checked'].value === 'false';
  if ((isInMarkdown && type === 'wysiwyg') || (!isInMarkdown && type === 'md')) {
    await click(editorSwitch);
  }
}

Конечно, удалите эту строку в тесте coopaname_integration_enabled: false, :upside_down_face:

Я не могу найти другой плагин с аналогичной функцией, поэтому сложно понять, в чём проблема.

При валидации формы вызывается this.args.model.toolbarEvent.addText() с правильным текстом.

Несколько console.log привели меня к text-manipulation.js#addText(), где вызывается this.convertFromMarkdown(text). Похоже, проблема именно здесь: здесь применяется своего рода схема, и она не содержит пользовательских полей.

Продолжаю копать :shovel:

Проблема возникает из-за расширения редактора discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js: список атрибутов, используемых функцией convertFromMarkdown(), определен в константе EVENT_ATTRIBUTES. Это работает, если добавить пользовательское поле в этот список.

const EVENT_ATTRIBUTES = {
  // ...
  chatChannelId: { default: null },
  myCustomField: {default: null}
};

В этом файле ничего не сказано о пользовательских полях; я не знаю, как дополнить эту константу всеми пользовательскими полями; расширение, похоже, регистрируется на очень раннем этапе процесса.

Буду рад любым предложениям, так как из-за этого плагин становится неработоспособным с новым редактором, который нельзя отключить, и мы застряли на версии Discourse 3.4.

Настраиваемые поля действительно не поддерживаются в богатом редакторе пока что. Мы изучим наилучший путь решения.

Это возможно — если вы администратор, вы можете установить SiteSettings.rich_editor = false через консоль, которая всё ещё доступна как крайняя мера в подобных случаях.

1 лайк

Спасибо за ваш ответ, мы пока отключим редактор.