Custom Hamburger Menu Links

Я тоже это заметил, и, похоже, внешние ссылки не отображаются в разделе Ещё.

3 лайка

В этом компоненте я использую внутренние ссылки, например, ссылка, открывающая приглашения пользователей: /my/invited/pending/

При открытии ссылки из боковой панели я получаю сообщение: «Ой! Страница не существует или является частной».

Ссылка работает, если открыть её через адресную строку.

При вводе полного URL (https://domain.com/my/invited/pending/) страница открывается следующим образом:
https://domain.com/https://domain.com/my/invited/pending/

2 лайка

Да. Известная проблема.

2 лайка

Здравствуйте,
Это должно работать с: Chat,/chat/browse/open :slightly_smiling_face:

2 лайка

Да, я знаю. Я отправил свой комментарий, возможно, немного слишком быстро. Ну, определённо слишком быстро, потому что я должен был сказать, что нужно использовать путь, а не полный URL.

Дополнительная ссылка для чата… ну, новый боковой панель полностью изменил песочницу, и она больше не нужна.

2 лайка

Я изучил код боковой панели Discourse и тему @manuel добавление иконок.

Кажется, что в настоящее время невозможно настроить пользовательские ссылки для иконок, поскольку метод декорирования гамбургер-меню не учитывает константу prefixValue (которая содержит имя иконки) или что-то в этом роде…

Мне также кажется, что декорирование гамбургер-меню с помощью api.decorateWidget устареет. См.:
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/plugin-api.js#L534

Кроме того, тот факт, что внешние ссылки больше не работают, может быть связан с этим:
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/plugin-api.js#L524

Поэтому для реализации этой возможности, вероятно, потребуются изменения в ядре.

:warning: Мои знания о том, как работает Discourse, практически отсутствуют, так что я могу сильно ошибаться.

Прав ли я в своих выводах?

3 лайка

Я установил этот компонент темы из репозитория GitHub. У меня на Discourse запущена версия 3.0.0.beta15, и хотя, казалось бы, я его добавил, в меню-гамбургере моя ссылка не отображается… Есть какие-нибудь идеи?

1 лайк

Это может быть связано с:

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

3 лайка

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

2 лайка

Думаю, это выходит за рамки возможностей CSS. Команда Discourse включила это в свой план работ, но реализация займёт время (насколько я знаю):

6 лайков

Я использую:

<script>
  const customHeader = document.createElement("div");
  customHeader.className = "sidebar-section-wrapper sidebar-section-community";
  customHeader.innerHTML = `
            <div class="sidebar-section-header-wrapper sidebar-row">
              <button id="ember11" class="sidebar-section-header sidebar-section-header-collapsable btn-flat btn no-text" type="button">
                <span class="sidebar-section-header-text"> Правовая информация </span>
              </button>
          </div>
          <div class="sidebar-section-content" id="customNavigation"/>
      `;

  $(document).ready(function () {
    // Создаём ссылки
    const links = [
      { title: "Impressum", src: "/impressum" },
      { title: "Datenschutz", src: "/privacy" },
    ];

    // Мобильная версия
    let hamburger = document.getElementById("toggle-hamburger-menu");
    if (hamburger) {
      hamburger.addEventListener("click", addCustomLinks);
    } else {
      addCustomLinks();
    }
    
    let bool = false;
    function addCustomLinks() {
      setTimeout(function () {
        // Ждём, пока навигация загрузится
        const sidebar = document.getElementsByClassName("sidebar-sections")[0];
        if (sidebar) {
          sidebar.append(customHeader);
          if (bool) return;
          // Получаем ID customNavigation
          const customNavigation = document.getElementById("customNavigation");
          if (customNavigation) {
            links.filter(function (link) {
              let linkDiv = document.createElement("div");
              linkDiv.className = "sidebar-section-link-wrapper";
              linkDiv.innerHTML = `<a href="${link.src}" class="sidebar-section-link sidebar-section-link-everything sidebar-row ember-view">
                        <span class="sidebar-section-link-prefix icon"></span>
                        <span class="sidebar-section-link-content-text"> ${link.title} </span>
                    </a>
                  `;
              customNavigation.append(linkDiv);
              let linkIcon = document.getElementById("link_" + link.title);
            });
          }
        }
        bool = true;
      }, 0);
      
    }
  });
</script>

Результат можно увидеть здесь: https://forum.courservio.de/
Оригинальная версия этого кода находится по адресу: https://meta.discourse.org/t/add-custom-links-to-sidebar/246848. Возможно, она вам поможет.

6 лайков

@hosch Вау, очень круто, именно то, что я искал! Большое спасибо.

1 лайк

@hosch Не случится ли так, что его можно будет переместить выше? Я бы хотел, чтобы он появлялся после раздела Сообщество или, возможно, даже до него.


Редактирование: Кажется, это возможно с помощью варианта этого:
Rearrange Existing Hamburger Menu Items - #3 by awesomerobot

.sidebar-sections {
  display: flex; /* Настройка flex-раскладки, чтобы можно было менять порядок элементов */
  flex-direction: column;
  .sidebar-section-community {
    order: -1;
  }
}

Интересно, можно ли переместить его на самое верхнее место?

1 лайк

В этом методе есть особенность: пользовательский div исчезает при переключении видимости боковой панели, например, если окно браузера узкое. Это особенно проблема для планшетов, которые обычно получают десктопную версию Discourse и требуют нажатия на меню-гамбургер для отображения боковой панели. Есть ли какие-либо возможные обходные пути? Спасибо!


Редактирование: Решено здесь:

1 лайк

Спасибо @hosch и @Olivier_Lambert за это.

Не могли бы вы объяснить новичку, куда именно это нужно вставить? :pray:

1 лайк

Как можно изменить порядок элементов в боковой панели / меню-гамбургере?

Например, я хочу разместить «Все категории» выше категорий в разделе «Категории», то же самое касается «Все теги».

Спасибо!

1 лайк

Вы уже знаете, как использовать компонент для CSS, верно? Добавьте его в секцию head.

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

2 лайка

Я попробовал это, но получил ошибку при использовании точки с запятой рядом с src.

Давайте попробуем снова. Спасибо.

1 лайк

Эта проблема всё ещё актуальна, предложенные ранее решения не исправили её.

Настройка: Пригласить друзей,/my/invited/pending/,f

Не по теме:

Я раньше видел такой сжатый стиль боковой панели, но не могу нигде его найти. Это компонент темы?

1 лайк

Вы можете использовать этот CSS:

#sidebar-section-content-categories,
#sidebar-section-content-tags {
    display: flex;
    flex-direction: column;
    li:last-child {
        order: -1;
    }
}

:slight_smile:

8 лайков