새 ProseMirror 편집기에 커스텀 필드가 삽입되지 않습니다

안녕하세요!

이벤트 커스텀 태그와 새로운 WYSIWYG ProseMirror 편집기에서 문제가 발생하고 있습니다. 이벤트 양식에서 입력한 커스텀 필드가 생성된 문자열에 포함되지 않습니다. 마크다운 편집기를 사용하면 이전과 동일하게 정상적으로 작동합니다.

재현 방법:

  1. Discourse Calendar 플러그인을 활성화합니다.
  2. 플러그인 설정에서 커스텀 필드를 하나 추가합니다.
  3. 새 게시물을 위한 양식을 엽니다.
  4. ProseMirror 편집기를 선택합니다.
  5. 커스텀 필드 값을 가진 이벤트를 생성합니다(옵션 > 이벤트 생성).
  6. 이벤트를 확인합니다.
  7. 마크다운 편집기로 전환합니다.

현재 발생하는 현상

[event] 태그에 커스텀 필드가 없습니다.

기대되는 동작

[event] 태그에 커스텀 필드가 포함되어야 합니다.

참고 사항

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 - 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)가 호출되고 있었습니다. 문제가 여기에서 발생하는 것 같습니다. 어떤 스키마가 강제되고 있는데, 이 스키마에는 사용자 정의 필드가 포함되어 있지 않습니다.

여전히 조사 중입니다 :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개의 좋아요

답변해 주셔서 감사합니다. 지금은 편집기를 비활성화하겠습니다.

이 문제는 FIX: restore post event allowed custom fields - Pull Request #40551 - discourse/discourse - GitHub 을 통해 수정되었습니다