שדות מותאמים אישית אינם מוכנסים עם עורך ProseMirror החדש

שלום!

יש לנו בעיה עם תגיות מותאמות אישית לאירועים ועורך ProseMirror החדש (WYSIWYG): שדות מותאמים אישית שמולאו מטופס האירוע אינם קיימים במחרוזת שנוצרה. זה עדיין עובד כרגיל עם עורך ה-Markdown.

שלבים לשחזור:

  1. הפעל את התוסף Discourse Calendar
  2. הוסף שדה מותאם אישית אחד בתצורת התוסף
  3. פתח טופס לפוסט חדש
  4. בחר את עורך ProseMirror
  5. צור אירוע עם ערך עבור השדה המותאם אישית (אפשרויות > צור אירוע)
  6. אשר את האירוע
  7. עבור לעורך Markdown

מה קורה

השדה המותאם אישית חסר מתג ה-[event].

מה מצופה

השדה המותאם אישית אמור להיות קיים בתג ה-[event].

הערות

כשעושים את אותו הדבר אך מתחילים עם עורך ה-Markdown במקום ProseMirror, השדה המותאם אישית קיים בתג ה-[event].

2 לייקים

חקירת מעט מה קרה עם toolbarEvent בעת אימות האירוע החדש: שיטת addText() נראית מקבלת בשני המקרים את התג המתאים:

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

אם זה יכול לעזור, הנה בדיקת QUnit לשחזור הבעיה:

// 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 - New event form with custom fields", 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("filling the form with MD editor fills the custom fields", async function (assert) {
    await ensureEventTagHasFields(assert, 'md');
  });

  test("filling the form with WYSIWYG editor fills the custom fields", 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} is present in event tag`);
  });
}

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

אנא עזור לי לתקן זאת.

Of course, remove this line in the test coopaname_integration_enabled: false, :upside_down_face:

I can’t find another plugin with the same feature, so it’s hard to find what’s wrong.

When validating the form, it calls this.args.model.toolbarEvent.addText() with the right text.

A few console.log™ lead me to : text-manipulation.js#addText() where this.convertFromMarkdown(text) gets called. It seems that the issue comes from here : there is a kind of schema enforced, and it does not contains the custom fields.

Still digging :shovel:

The issue comes from the editor extension discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js : the list of attributes used by convertFromMarkdown() is defined in the EVENT_ATTRIBUTES constant. It works when adding the custom field to the list.

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

There is nothing about custom fields in this file; I have no idea on how to complete this constant with all the custom fields; the extension seems to get registered early in the process.

Any idea welcome, it makes the plugin unusable with the new editor that can’t be disabled, so we’re stuck with Discourse 3.4.

Custom fields are indeed unsupported on the rich editor for now. We’ll investigate the best path forward.

It can – if you’re an admin, you can set SiteSettings.rich_editor = false via the console, which is still available as a last resort in cases like this.

לייק 1

Thanks for your reply, we’ll disable the editor for now.