Отсутствует PluginOutlet для компонента second-factor.gjs и для second-factor-add-totp.gjs

Привет!
Недавно я начал работать с Discourse и, судя по своему недельному опыту, могу с уверенностью сказать, что порог входа для разработчиков, которым действительно нужно изменять основные компоненты, довольно высок. Это связано с отсутствием актуальной документации и информации, особенно когда речь идет о новейших возможностях. Я могу найти лишь устаревшие материалы, которые не работают в версии 3.6.0, вместо описания новых подходов. Даже если мне что-то удавалось найти, уровень детализации там крайне низок: нет реальных примеров или подробных объяснений того, как использовать те или иные функции.

Тем не менее, мне необходимо изменить компонент second-factor-add-totp.gjs, но у меня не получается сделать это, так как отсутствует информация о том, как правильно это реализовать в моей пользовательской теме.

Я узнал, что существует что-то под названием PluginOutlet, которое работает как хук, позволяющий внедрять собственный код или даже изменять вывод элемента, обернутого в PluginOutlet (не уверен насчет деталей, есть что-то вроде api.renderInOutlet, но я не нашел нормальной информации о том, как это использовать). Просматривая компоненты Ember, я не вижу там PluginOutlet, который мог бы помочь хотя бы в каких-то манипуляциях со структурой, используя хотя бы чистый JS.

Можете ли вы прояснить, можно ли добавить что-то подобное туда и могу ли я использовать это для изменения структуры модального окна или хотя бы перемещения некоторых элементов с помощью чистого JS?
Также, возможно, я что-то упустил, но есть ли документация с примерами новых подходов?

Можете ли вы поделиться более подробной информацией о вашей конечной цели, чтобы мы могли дать более точные рекомендации?

Конечно.
Итак, согласно «модифицированной» версии, которая у меня есть, мне нужно немного обновить дизайн модального окна MFA (когда пользователю следует настроить приложение-аутентификатор для MFA).
Под обновлением я имею в виду, например, перемещение QR-кода в структуре HTML, а точнее — текста сайта «js.user.second_factor.enable_description». QR-код должен располагаться где-то между новым предоставленным текстом (HTML-разметкой).
Другой пример: убедиться, что кнопка «Ввести вручную» вместо этого показывает реальный код, который можно скопировать при клике на него (вручную через JS вызвать клик, чтобы он появился, и просто переместить его).

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

Дополнительное уточнение: я использую кастомную тему, которая хранится с помощью опции GIT.

Дайте знать, если что-то осталось непонятным.

Привет, @Falco, у тебя есть какие-нибудь предложения?

Привет, @Yan_Rudenko! Скорее всего, лучше всего начать с этого руководства:

Как вы и отметили, Plugin Outlets — лучший способ кастомизировать интерфейс. Однако они доступны не везде. Только определённые части интерфейса предназначены для кастомизации.

Манипулирование DOM с помощью обычного JS приведёт к ошибкам, так как наш фреймворк рендеринга потеряет контроль над элементами, которые он отобразил на экране. Лучше придерживаться поддерживаемых plugin outlets и других JS-API Discourse (они также рассматриваются в руководстве).

Привет @david, спасибо за ссылку на туториал, но я уже ознакомился с ним и не нашёл ответов на свои вопросы. Примеры сами по себе базовые и не охватывают, например, как получить конкретную категорию (без выполнения AJAX-запроса) или как использовать API Discourse в коде в целом (упомянуто на https://docs.discourse.org/). Как я понимаю и вижу, такой функционал существует, поэтому я обратился сюда, чтобы получить более подробную информацию от людей, которые ежедневно работают с Discourse и знают многое, что не указано в документации.

Я полностью понимаю, что использование чистого JS может вызывать проблемы, но пока это единственное решение, которое я смог найти. Возможно, в будущем я смогу изменить что-то более подходящим образом, если появится такая возможность.

Если я правильно понимаю, в текущей версии Discourse, которую я использую (3.6.0.beta2-latest), описанные мной изменения нельзя реализовать с помощью встроенных инструментов Discourse? Из-за отсутствия PluginOutlets в этих компонентах?

Рассматривает ли команда разработки добавление этих возможностей в упомянутые компоненты в будущих релизах? Я предполагаю, что технических препятствий для этого нет, но это вопрос решения людей, работающих над проектом.

Спасибо.

Да! Вы можете создать PR в ядро Discourse, который добавит новые outlets.

Я не могу обещать, что он будет принят сразу. Но как только у нас будет отправная точка, продолжить обсуждение станет проще.

@david, спасибо за предложение. Я рассмотрю его, как только у меня появится время, но вам нужно понимать, что для человека, который только начал работать с Discourse, это может занять время: мне нужно разобраться, как подготовить изменения, добавить их, пройти этап одобрения и дождаться включения в следующее обновление.

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

Тем не менее, как я уже упоминал выше, я рассмотрю ваше предложение.

Всё же я не получил ответа на свой вопрос: возможно ли реализовать описанные мной изменения в текущей версии Discourse, или сначала необходимо внести/внести свой вклад в изменения (добавить PluginOutlet в эти компоненты)?

Причина моего вопроса в том, что у меня есть перечень задач, которые необходимо выполнить, но я не могу их сделать. Мне нужно объяснить команде, почему это невозможно: либо изменить перечень задач на то, что мы можем сделать, либо мне придётся внести свой вклад с надеждой, что это будет включено в ядро и выпущено в следующем обновлении. Поэтому мне необходимо подтверждение от команды разработчиков Discourse о том, возможно ли это или нет.

Также, глядя на основной репозиторий GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub, я не вижу раздела «Issues» рядом с «Pull requests», где люди обычно создают задачи, описывая, что сломано или отсутствует.

Сломанные вещи отправляйте в bug, отсутствующие функции — в #feature (или, например, в случае точек расширения плагинов — в Development).

Вы используете стабильную ветку? Тогда до следующего стабильного релиза ещё довольно много времени, но в противном случае вам не нужно ждать, пока коммиты будут добавлены в последнюю ветку после слияния PR.

Привет, @Moin, спасибо за эту информацию!

Я использую настройку Docker для Discourse, и вы提出了 отличную идею насчёт ветки. Да, я, возможно, смогу изменить её после слияния PR, не дожидаясь официального релиза.

Просматривая файл app.yml, я вижу, что он использует версию (ветку) tests-passed. Судя по истории в GIT, это не самый лучший вариант для обеспечения стабильности. Какой вариант предпочтительнее: main или переключение на latest tag? Возможно ли вообще переключиться на тег в настройке Docker?

tests-passed — это актуальная версия: "tests-passed" is now "latest"

Ветка main не рекомендуется для использования в продакшене.

@david, @Falco, я создал PR, пожалуйста, проверьте его и дайте знать, если что-то упущено. Мне нужно, чтобы это было продвинуто как можно скорее, поэтому, если вы сможете как-то приоритизировать это, я буду очень благодарен.

@david, просто хотел сказать спасибо за такой быстрый ревью и мердж PR.