Представляем новое раскрывающееся меню действий редактора «Тип публикации»

Переработка редактора за флагом enable_new_composer_actions

Это обновление вводит новый дизайн редактора и выпускает его за флагом новой альфа-версии предстоящих изменений. При выключенном флаге (по умолчанию) визуально ничего не меняется. Администраторы могут включить его через страницу администрирования предстоящих изменений.

Что меняется при включении флага

  • Единое выпадающее меню действий. Устаревшее выпадающее меню SelectKit composer-actions заменено на новый компонент Glimmer/DMenu (composer-actions-new.gjs). Оно по-прежнему отображает все те же строки переключения режимов (ответ на тему, ответ как новая тема, создание ЛС и т. д.) с более понятными подписями и иконками.

  • Переключатели интегрированы в действия. Опции «Шепот» / «Без уведомления» / «Не в списке» теперь отображаются как элементы <DToggleSwitch> в нижней части того же выпадающего меню — отдельное комбинированное меню больше не требуется. Состояние переключателя сохраняется при смене режимов (например: включить шепот → переключиться с «ответа на тему» на «ответ на пост» → шепот остается включенным).

  • Индикатор шепота в виде кнопки-таблетки. Небольшая кнопка справа от триггера выпадающего меню отображает текущее состояние шепота в двух визуальных вариантах: --public (третичный цвет, иконка глаза, «Ответ будет виден») и --whispering (фон primary-medium / primary-very-low, иконка перечеркнутого глаза, «Шепот»). Нажатие на неё переключает шепот — используется тот же путь кода, что и у переключателя внутри меню, поэтому оба элемента остаются синхронизированными. Сама иконка триггера также меняется на far-eye-slash при включенном шепоте.

  • UX редактирования. При редактировании поста выпадающее меню сворачивается в статичную метку без стрелки (иконка карандаша + «Редактировать пост»). Кнопка «Добавить причину редактирования», которая раньше располагалась в другом месте интерфейса редактора, теперь встроена в этот статичный триггер как кликабельная кнопка «Опишите ваше изменение»; при нажатии на неё метка заменяется текстовым полем, привязанным к composer.editReason, и фокус устанавливается на него.

    • editing
  • Интерфейс редактора. Текст/тег .action-title удалён — текущий режим отображается непосредственно в триггере выпадающего меню.

  • Ссылки на посты/темы теперь будут отображаться только при необходимости. Ссылка на тему появится при переходе с темы, а ссылка на пост — при прокрутке за пределы поста или переходе с него.

Примечания для разработчиков плагинов

Новый компонент не является подклассом SelectKit, поэтому старые API расширений к нему не применяются. Для поддержки обоих состояний флага на этапе альфа-версии плагинам следует регистрировать оба API:

Старый API (работает только со старым компонентом) Новый API (работает только с новым компонентом)
api.modifySelectKit("composer-actions").appendContent(...) api.registerValueTransformer("composer-actions-content", ({ value, context }) => { value.push(...); return value; })
api.modifyClass("component:composer-actions", { fooSelected(options, model) { ... } }) api.registerBehaviorTransformer("composer-actions-on-select", ({ context, next }) => { if (context.actionId === "foo") { ...; return; } next(); })

Структура строки ({ name, description, icon, id }) идентична в обоих случаях. Трансформер поведения получает в контексте { actionId, options, model }.

:double_exclamation_mark: Плагины, которые регистрируют только старые хуки, незаметно исчезнут из редактора сразу после включения флага администратором. Плагины, которые регистрируют только новые трансформеры, будут невидимы, пока флаг выключен (по умолчанию для всех после слияния).

Ссылки:

  • discourse-post-voting/extend-composer-actions.js — рабочий пример двойной регистрации (в ядре)

  • discourse-staff-alias — отдельный PR добавляет двойную регистрацию там

  • transformers.js — названия двух новых трансформеров

Примечания по выпуску

  • Статус флага — альфа — включение только для внутреннего тестирования.

  • Плагинам, интегрирующимся с действиями редактора, следует добавить двойную регистрацию до перехода флага в статус beta/stable.

  • Тесты покрывают оба состояния: существующие acceptance/system-спецификации покрывают состояние с выключенным флагом; файлы *-new-test.js покрывают состояние с включенным флагом (плюс новые селекторы DOM для единого выпадающего меню, элементов переключателей, индикатора шепота и фрагментов разделённой метки).

6 лайков