Раздел сообщений для боковой панели

:information_source: Краткое описание Добавляет в боковую панель ссылки на личные и групповые почтовые ящики с индикаторами непрочитанных сообщений
:eyeglasses: Предпросмотр Theme Creator
:hammer_and_wrench: Репозиторий GitHub - moin-Jana/sidebar-messages-section: Adds personal and group message inbox links to the sidebar, including unread message indicators. · GitHub
:question: Инструкция по установке Как установить тему или компонент темы
:open_book: Новичок в темах Discourse? Начинающее руководство по использованию тем Discourse

Установить этот компонент темы

Компонент добавляет в боковую панель раздел Сообщения со ссылками на личные почтовые ящики — как личный ящик пользователя, так и любые групповые ящики, к которым у него есть доступ. В разделе также есть кнопка для создания нового личного сообщения рядом с заголовком раздела.

Личный ящик

По умолчанию компонент добавляет ссылку на личный ящик для всех пользователей. С помощью настройки show_personal_inbox администраторы могут полностью скрыть её или отображать только для пользователей, которым разрешено создавать личные сообщения, в соответствии с настройкой сайта «Разрешённые группы для личных сообщений». Это соответствует тому, как ссылка на личный ящик отображается в меню уведомлений, в профиле пользователя и в разделе «Сообщество» боковой панели.

:bulb: Чтобы избежать дублирования ссылок на личный ящик, вы можете удалить ссылку на сообщения в первом разделе боковой панели. Для этого откройте меню Ещё, выберите Настроить этот раздел, а затем удалите ссылку на сообщения из раздела.

Групповые ящики

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

Отдельная настройка use_group_page_inbox позволяет выбрать, будут ли ссылки на групповые ящики открываться в интерфейсе сообщений пользователя (/my/messages/group/{group_name}) или на странице группы (/g/{group_name}/messages/inbox).

Индикатор непрочитанных сообщений

Каждая ссылка на ящик отображает текущее состояние сообщений в зависимости от предпочтения пользователя «Показывать количество новых элементов»: либо точка, либо цифровое значение. Значения выше 100 отображаются как 99+.

Расширенная конфигурация групповых ящиков

Чтобы настроить порядок групповых ящиков или изменить отображаемое имя в боковой панели, используйте настройку advanced_group_inbox_configuration.

В этой настройке вы можете:

  • выбрать группу из выпадающего списка
  • при желании задать собственное имя, которое будет отображаться в боковой панели
  • изменить порядок настроенных групп с помощью кнопок внизу

Собственное имя также полезно внутри самой настройки.
Если имя не указано, запись будет называться группа 1, группа 2 и т. д. (в зависимости от её позиции). Добавление временного имени может облегчить изменение порядка; при желании его можно удалить перед сохранением.

Группы с сообщениями, не добавленные в расширенную конфигурацию, всё равно появятся в боковой панели, но будут перечислены после настроенных и отсортированы по ID группы.

Группы, указанные в настройке hide_group_inboxes, всегда будут скрыты, независимо от того, присутствуют ли они также в расширенной конфигурации или имеют сообщения. Предупреждение только для администраторов помогает выделить случаи, когда группа добавлена в обе настройки.

Ниже приведены пример конфигурации и то, как она влияет на порядок и отображаемые имена:


Позиция раздела сообщений

Чтобы изменить положение раздела сообщений, вы можете использовать CSS, например:

Или вы можете установить компонент Discourse Sidebar Menu Reorder и использовать inbox-section в качестве имени раздела при изменении его положения. Также можно использовать настройку порядка компонента Navigation (sidebar) menu display control.

17 лайков

Вау, отлично сделано, Мойн! :clap: :tada:

4 лайка

Маленькое предложение: возможно, javascripts/discourse/api-initializers/group-inboxes-in-sidebar.gjs должен быть JS-файлом, а не GJS?

Отличный компонент!


Я потратил последние 10 минут на изучение кода и анализ основных классов и должен сказать, насколько замечательно было (и остается) сделано Discourse, чтобы всё так хорошо сочеталось.

2 лайка

Да, API предоставляет практически всё необходимое, чтобы этот раздел выглядел и работал так же, как и все остальные. Чат тоже использует его, что, вероятно, повлияло на процесс разработки — функции создавались одновременно.

К сожалению, get badgeText(), который отображает количество непрочитанных тем в основных разделах, не поддерживается, поэтому мне пришлось проявить немного креативности с отображением чисел.

4 лайка

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

.sidebar-section-link[data-link-name="my-messages"] {
    display: none;
}

@Moin, можно ли добавить для этого флажок в компонент темы, чтобы скрыть его?

2 лайка

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

2 лайка

Дерьмо, ты прав. Я слишком усложнял, думая, что это будет настройка в консоли администратора и/или основная функциональность.

1 лайк

Вы не единственный, кто там искал. :joy:


Это классный компонент!

2 лайка

Я расширил примечание:

5 лайков

Да, вы правы. Но как администраторы мы часто привыкли работать через панель управления. :wink: Поэтому, когда просматриваем инструкции, можем упустить некоторые детали.

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

Очень давно, например, с Android, насколько я помню, в версии Gingerbread были отдельные приложения Nav и Maps. Я потратил около 10 минут на поиск Nav после того, как его объединили с Maps в одном из обновлений. :joy:

Это блестящий компонент темы, который идеально подходит для сайтов, где особое внимание уделяется сообщениям! Спасибо @moin за вашу отличную работу!

Чтобы сделать его ещё лучше для тех, кто активно использует группы (сообщения — важная часть этого), не могли бы вы рассмотреть следующие предложения?

Настраиваемое расположение в боковой панели

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

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

/* Убедитесь, что раздел «Сообщения» отображается первым в контейнере flexbox */
.sidebar-section-wrapper {
  order: 1;
}
.sidebar-section-wrapper[data-section-name="inbox-section"] {
  order: 0;
}

Открытие почтовых ящиков групп в контексте группы

Я хочу, чтобы пользователи могли легко находить и взаимодействовать со своими группами. Логично, чтобы они работали с сообщениями в почтовом ящике, доступ к которому осуществляется со страницы группы (то есть /g/the-group/messages/inbox), а не со страницы личного почтового ящика (то есть /my/messages/group/the-group).

Это даёт им чистую страницу, сфокусированную на группе, с лёгким доступом к другим участникам группы и настройкам:

Было бы отлично, если бы это регулировалось настройкой в TC.

3 лайка

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

Я считаю, что текущее расположение такое же, как в разделе сообщений, который был в ядре.
Уже существует отличный компонент для изменения порядка разделов в боковой панели: Navigation (sidebar) menu display control
Чтобы избежать конфликтов, поскольку оба компонента пытаются переопределить порядок, возможно, имеет смысл, чтобы администраторы, желающие изменить порядок, использовали существующий компонент (автор подтвердил, что это работает при использовании названия раздела “inbox-section”).
Мне нужно будет посмотреть, смогу ли я добавить для этого отдельную настройку. В любом случае, я хочу избежать взаимного вмешательства компонентов.

2 лайка

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

Я подготовил запрос на слияние (PR) с тем, чего удалось добиться:

Но чтобы всё работало по-настоящему хорошо, обязательно нужны индикатор непрочитанных сообщений и подсветка ссылок, верно?

Отличный аргумент! Это гораздо лучшая идея. К моему стыду, я на самом деле один из авторов того предложения (TC)!

1 лайк

Почему вы использовали href вместо route? Мне кажется, что href вообще не работал с индикаторами непрочитанных сообщений. Меня больше беспокоило, что цифры на маршруте group.messages.inbox были недоступны так, как их можно использовать на userPrivateMessages.

1 лайк

Потому что я ужасный разработчик и перепробовал кучу вещей, пока что-то не сработало! Скорее всего, это также из-за моей нездоровой зависимости от не совсем умных генеративных ИИ :wink:.

Я пытался использовать маршруты, но не смог заставить их переопределить существующие. Так что я сдался.

Мне приходило в голову, возможно ли получить эти цифры / поведение, просто перехватив ссылку, чтобы перенаправить её в другое место. Но это немного сложно для такого простого старика, как я.

Чувствуйте себя свободными «улучшить» это!

(Кстати, замечательный @moin сделал именно это, добавив функционал — заставив всё работать как надо!)

3 лайка

Это действительно работает очень хорошо. Немного стыдно, но я один из авторов (хотя и второстепенный по сравнению с @lilly) той темы :flushed_face:!

Было бы здорово добавить это в первое сообщение.

2 лайка

@nathank попросил добавить возможность изменять порядок отображения групповых почтовых ящиков в боковой панели. Ранее я обращался за идеями о том, как лучше всего реализовать это в теме Configuring the order of groups in theme component settings, и теперь, думаю, нашёл решение.

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

Обе функции реализованы через новое значение настройки advanced_group_inbox_configuration.

В этой настройке вы можете:

  • выбрать группу из выпадающего списка
  • при желании определить пользовательское имя, которое будет отображаться в боковой панели
  • изменить порядок настроенных групп с помощью кнопок внизу

Пользовательское имя также полезно внутри самой настройки.
Если имя не указано, запись будет помечена как группа 1, группа 2 и т. д. (в зависимости от её позиции). Добавление временного имени может облегчить изменение порядка, и при желании его можно удалить перед сохранением.

Группы с сообщениями, которые не добавлены в расширенную конфигурацию, по-прежнему будут отображаться в боковой панели, располагаясь после настроенных групп и сортируясь по их ID.
Группы, указанные в настройке hide_group_inboxes, всегда будут скрыты, независимо от того, присутствуют ли они также в расширенной конфигурации или имеют сообщения.


В этом примере для группы модераторов не было введено пользовательское имя, поэтому в конфигурации она отображается как группа 1. Остальные группы имеют пользовательские имена.

Эта конфигурация приводит к следующему результату:


Здесь видно, что почтовые ящики ‘doggo-daily’ и ‘cat_pics’ поменялись местами и отображаются без дефисов или подчёркиваний. Почтовый ящик ‘Team’ расположен ниже тех, что настроены в расширенных настройках.
Также видно предупреждение, видимое только администраторам, которое появляется потому, что группа ‘admin’ была добавлена одновременно в расширенную конфигурацию и в настройку hide_group_inboxes.

5 лайков

Теперь это просто гениально для тех, кто использует группы для общения. Отличная работа, @Moin!

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

3 лайка

Привет, @Moin, отличная работа, большое спасибо.

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

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

Более важно то, что это не та задача, для которой хорошо подходят компоненты темы. Компоненты темы могут работать только с данными, которые уже существуют на фронтенде, или которые можно разумно получить из существующих бэкенд-эндпоинтов. Именно поэтому этот компонент может отображать входящие сообщения групп в боковой панели: многие части Discourse уже знают, к каким группам принадлежит пользователь, поэтому эта информация readily доступна.

Однако то, что вы описываете, потребует доступа к данным сообщений из всех групповых почтовых ящиков. Discourse в настоящее время не предоставляет это в одном месте. Теоретически компонент темы мог бы получать данные из каждого группового ящика по очереди, но это быстро становится неэффективным. Каждый запрос возвращает только первые 30 сообщений, поэтому вам придется загружать несколько страниц для каждого ящика. Чтобы затем отсортировать сообщения по активности, вам фактически понадобятся все сообщения из всех ящиков одновременно.

Из-за этих ограничений компонент темы здесь не подходит. Плагин, который добавит правильный бэкенд-эндпоинт для возврата этих данных, будет гораздо более разумным и масштабируемым решением.

4 лайка