الحقول المخصصة لا يتم إدراجها مع محرر 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);
  }
}

بالتأكيد، قم بإزالة هذا السطر في الاختبار coopaname_integration_enabled: false, :upside_down_face:

لا يمكنني العثور على مكون إضافي آخر بنفس الميزة، لذا من الصعب معرفة الخطأ.

عند التحقق من صحة النموذج، فإنه يستدعي this.args.model.toolbarEvent.addText() بالنص الصحيح.

بعض console.log(TM) تقودني إلى: text-manipulation.js#addText() حيث يتم استدعاء this.convertFromMarkdown(text). يبدو أن المشكلة تأتي من هنا: هناك نوع من المخطط يتم فرضه، ولا يحتوي على الحقول المخصصة.

ما زلت أبحث : المجرفة: …

تأتي المشكلة من إضافة المحرر 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)

شكراً على ردك، سنقوم بتعطيل المحرر في الوقت الحالي.