Не удалось установить режим Markdown по умолчанию

Привет! Я заметил, что даже после установки параметра «default_composition_mode» в режим Markdown, пользователи на моём форуме при создании новой темы по-прежнему получают WYSIWYG-редактор. Версия форума: «Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/08e9f9c00b — Ember v5.12.0».

Каждый раз при применении изменения мне предлагается: «Хотите применить это изменение исторически? Это изменит настройки для 15 существующих пользователей», и я нажимаю «Да». Однако пользователям всё равно показывается WYSIWYG-редактор. Это известная ошибка?

Редактирование — примечание: Эта проблема возникает у пользователей, которые никогда не использовали переключатель для смены режима редактора между WYSIWYG и Markdown. Они просто зашли сегодня после того, как я уже установил режим по умолчанию в выходные сразу после обновления. Кроме того, я скрыл переключатель через CSS темы.

2 лайка

В продолжение темы: у нас есть плагин, использующий токены BBCode «wrap_open», которые пока не поддерживаются в редакторе с богатым форматированием. Поэтому нам пока необходимо оставаться в режиме Markdown.

Я использовал Claude Sonnet для генерации следующего кода, чтобы обеспечить это. Буду рад получить любые отзывы о том, как его можно улучшить (особенно если в нём есть какие-либо ошибки :sweat_smile:). Также делюсь этим на случай, если это поможет другим администраторам форумов. Код размещается в настройках темы > JS (/admin/customize/themes/2/common/js/edit):

import {
  apiInitializer
} from "discourse/lib/api";

export default apiInitializer((api) => {
  // Принудительно переключить редактор пользователя в режим Markdown
  function switchToMarkdownMode() {
    const currentUser = api.getCurrentUser();

    // Пользователь должен быть авторизован, если открыт композер
    if (!currentUser) {
      console.error('Пользователь не найден');
      return;
    }

    // Получил эту опцию отсюда
    // https://github.com/discourse/discourse/blob/f0fc5646dc9bd29b0e814faea490e34800e9b322/app/assets/javascripts/discourse/app/models/user.js#L262C1-L266C4
    const currentMode = currentUser.get('user_option.composition_mode');

    if (currentMode !== 0) {
      // Переключать только если ещё не в режиме Markdown
      // Пример использования: https://github.com/discourse/discourse/blob/87476ce2c18fb8f856dda7ff03804ed5fbb0ff38/app/assets/javascripts/discourse/app/services/user-tips.js#L127
      currentUser.set('user_option.composition_mode', 0);

      // Сохранить настройку пользователя на сервере
      currentUser.save(['composition_mode']).then(() => {
        console.log('Успешно переключено в режим Markdown');
      }).catch((error) => {
        console.error('Не удалось обновить режим композиции:', error);
      });

      // Немедленно переключить текущий интерфейс композера
      setTimeout(() => {
        const toggleButton = document.querySelector('.composer-toggle-switch[data-rich-editor]');
        if (toggleButton) {
          const isRichTextActive = toggleButton.getAttribute('aria-checked') === 'true';
          if (isRichTextActive) {
            toggleButton.click();
            console.log('Переключено текущее окно композиции в режим Markdown');
          }
        }
      }, 100); // Небольшая задержка для полной отрисовки композера
    } else {
      console.log('Уже в режиме Markdown, изменений не требуется');
    }
  }

  api.onAppEvent('composer:opened', () => {
    switchToMarkdownMode();
  });
});

Это, как правило, плохая практика: полагаться на тайминги в таких случаях ненадежно.

Давайте вынесем это в отдельную тему — нам определенно нужно разрешить администраторам устанавливать режим Markdown по умолчанию.

Какой минимальный пример воспроизведения проблемы здесь?

2 лайка

Я постараюсь воспроизвести это и завтра займусь исправлением, но не понимаю, почему это происходит, поскольку настройки администратора по умолчанию задают все значения опций пользователя (если вы используете существующую опцию пользователя в подсказке), а мы используем именно их для управления переключателем.

2 лайка

Спасибо за быстрые ответы! :slightly_smiling_face: Не уверен, как создать минимальный воспроизводимый пример для этого. Я с радостью предоставлю любую дополнительную информацию из моего форума, если вы поделитесь инструкциями по её получению.

2 лайка

Сегодня я попытался воспроизвести это, но безуспешно. У меня есть один вопрос: обновляют ли пользователи браузер после того, как вы внесли это изменение? Если нет, то в браузере в Ember всё ещё хранятся их старые данные о предпочтениях пользователей, поэтому новое предпочтение пока не будет использовано.

Чтобы это работало как ожидалось, я сделал следующее:

  • Убедился, что у пользователя А редактор переключён в режим богатого форматирования.
  • Как администратор, я изменил настройку по умолчанию на режим Markdown и применил её для всех пользователей.
  • Как пользователь А, я перезагрузил страницу и снова открыл редактор, и увидел, что он находится в режиме Markdown.

Если бы я не перезагрузил страницу на шаге 3, я бы всё ещё видел режим богатого форматирования.

1 лайк

Спасибо за уточнение, Мартин. Я уже установил режим Markdown в воскресенье. Затем в понедельник я зашел с тестовой учетной записью в отдельном профиле браузера, где вместо этого был предложен редактор с богатым форматированием.

Кроме того, если это поможет, каждый раз, когда я устанавливаю “default_composition_mode” в значение “Markdown”, появляется предупреждение: “Хотите применить это изменение ко всем предыдущим данным? Это изменит настройки для 61 существующего пользователя.” Я понимаю, что такое предупреждение должно появляться только в первый раз, но, похоже, это ошибка, если оно запрашивает это каждый раз для определенного числа пользователей.

Для дальнейшего тестирования я также только что зашел в другую тестовую учетную запись, из которой не входили в течение 10 месяцев. По умолчанию для неё также был установлен режим Rich Text.

1 лайк

Это действительно очень странно… сколько всего пользователей на вашем сайте? Мне кажется, что процесс может застрять на шаге, где должно происходить обновление всех пользователей в связи с изменением настройки сайта, так как я заметил, что в интерфейсе нет никаких указаний на то, что работа ещё продолжается.

Зависит от того, сколько пользователей изменили эту настройку с помощью переключателя за это время. В моих локальных тестах всё работает корректно.

1 лайк

Согласно нашей странице /about, у нас 20 000 участников.

Я уточню, что шаги следующие:

  1. Перейдите на страницу /admin/site_settings/category/all_results?filter=default_composition_mode.
  2. Установите default_composition_mode в режим Markdown. Даже если он уже установлен в режим Markdown, вы можете открыть выпадающий список и выбрать опцию Markdown.
  3. Появится предупреждение о количестве пользователей XX. Примите его.
  4. Подождите десять минут, затем перезагрузите страницу.
  5. Установите default_composition_mode в режим Markdown (как в шаге 2).
  6. Снова появится предупреждение о том же количестве пользователей.

Как вы упомянули, я тоже не знаю, сколько времени требуется (более 10 минут?) на обновление исторических предпочтений пользователей. Также я не думаю, что все эти пользователи успели бы обновить свои настройки за такой короткий срок. Возможно, я что-то упускаю.

1 лайк

Да, точно, похоже, что не так много людей будут переключаться за это время :thinking: Можешь сделать запись экрана, чтобы показать, что происходит?

Также рекомендую заглянуть во вкладку Network в инструментах разработчика Chrome. После сохранения там должно появиться два подобных запроса (первый — для отображения подсказки о XX пользователях, второй — для непосредственного сохранения настройки и выполнения backfill):

image

У второго запроса должен быть статус 200. Если его нет и ты уйдёшь со страницы, то backfill для существующих пользователей выполнен не будет.

Спасибо за дополнительную информацию. Два запроса показаны на изображении ниже. Оба были довольно быстрыми.

Видеозапись доступна по этой ссылке в Google Диске. Я настроил параметр, принял диалоговое окно с предупреждением, немного подождал, обновил страницу и затем настроил параметр снова. После этого диалоговое окно с предупреждением появилось вновь.

1 лайк

Ладно, дело принимает обороты… Этот момент, когда вы выбираете Markdown, хотя он уже выбран, и система предлагает сохранить:

— не должен происходить… Здесь есть ошибка: система считает значение элемента списка (0) отличным от значения настройки ('0'). Поэтому, думаю, кнопка «Сохранить» здесь ничего не делает. Я могу исправить эту ошибку, но не могли бы вы сделать следующее:

  • Измените настройку на «Форматированный текст»
  • Сохраните её, выбрав «Нет, применить изменения только к будущим сообщениям»
  • Вернитесь к «Markdown»
  • Сохраните и выберите «Да», чтобы применить изменения ретроспективно

И посмотрите, решит ли это ваши проблемы.

1 лайк

Спасибо, что сообщили. Я вошёл под старым тестовым аккаунтом, и всё сработало корректно: режим Markdown включился при первом запуске :slightly_smiling_face:

Есть ли способ убедиться, что все пользователи работают в режиме Markdown, например, используя Data Explorer?

2 лайка

Хорошо, что проблема решена!

Да, конечно. Вы можете выполнить такой запрос:

SELECT composition_mode, COUNT(composition_mode) FROM user_options GROUP BY composition_mode;

Значения указаны здесь:

2 лайка

Спасибо, все наши пользователи теперь в режиме Markdown :partying_face:

3 лайка

@martin Я переместил эту тему из раздела поддержки в раздел ошибок и закрою её, предполагая, что вы исправили ошибку. Если вы этого не сделали, пожалуйста, откройте тему снова.

1 лайк

Это было исправлено в FIX: Don't show setting save/cancel buttons when selecting the current value by OsamaSayegh · Pull Request #34552 · discourse/discourse · GitHub

5 лайков