Campos personalizados não são inseridos com o novo editor ProseMirror

Olá!

Temos um problema com as tags personalizadas de eventos e o novo editor WYSIWYG ProseMirror: os campos personalizados preenchidos a partir do formulário de evento não estão presentes na string gerada. Ainda funciona como antes com o editor de markdown.

Passos para reproduzir:

  1. Ative o plugin Discourse Calendar
  2. Adicione um campo personalizado na configuração do plugin
  3. Abra um formulário para uma nova Postagem
  4. Selecione o editor ProseMirror
  5. Crie um evento com um valor para o campo personalizado (Opções > Criar Evento)
  6. Valide o evento
  7. Mude para o editor Markdown

O que está acontecendo

O campo personalizado está ausente da tag [event].

O que é esperado

O campo personalizado deve estar presente na tag [event].

Observações

Ao fazer o mesmo, mas começando com o editor Markdown em vez de ProseMirror, o campo personalizado está presente na tag [event].

2 curtidas

Investiguei um pouco o que estava acontecendo com o toolbarEvent ao validar o novo evento: o método addText() parece receber em ambos os casos a marcação correta:

[event start="2025-09-26 18:00" status="public" timezone="Europe/Paris" end="2025-09-26 19:00" cf_1="abcd"]\n[/event]

Se isso puder ajudar, aqui está o teste QUnit para reproduzir o problema:

// plugins/discourse-calendar/test/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 - Novo formulário de evento com campos personalizados", 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("preencher o formulário com o editor MD preenche os campos personalizados", async function (assert) {
    await ensureEventTagHasFields(assert, 'md');
  });

  test("preencher o formulário com o editor WYSIWYG preenche os campos personalizados", 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} está presente na tag do evento`);
  });
}

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);
  }
}

Claro, remova esta linha no teste coopaname_integration_enabled: false, :upside_down_face:

Não consigo encontrar outro plugin com o mesmo recurso, então é difícil descobrir o que está errado.

Ao validar o formulário, ele chama this.args.model.toolbarEvent.addText() com o texto correto.

Alguns console.log(TM) me levam a: text-manipulation.js#addText(), onde this.convertFromMarkdown(text) é chamado. Parece que o problema vem daqui: há uma espécie de esquema imposto, e ele não contém os campos personalizados.

Ainda investigando :shovel:

O problema vem da extensão do editor discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js: a lista de atributos usada por convertFromMarkdown() é definida na constante EVENT_ATTRIBUTES. Funciona ao adicionar o campo personalizado à lista.

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

Não há nada sobre campos personalizados neste arquivo; não tenho ideia de como completar esta constante com todos os campos personalizados; a extensão parece ser registrada no início do processo.

Qualquer ideia é bem-vinda, isso torna o plugin inutilizável com o novo editor que não pode ser desativado, então estamos presos com o Discourse 3.4.

Campos personalizados não são suportados no editor avançado por enquanto. Investigaremos o melhor caminho a seguir.

Ele pode – se você for um administrador, pode definir SiteSettings.rich_editor = false através do console, que ainda está disponível como último recurso em casos como este.

1 curtida

Obrigado pela sua resposta, desativaremos o editor por enquanto.