Предстоящие изменения в заголовке: подготовка тем и плагинов

Что именно вот-вот сломается, кстати? Может, уже есть поддерживаемый компонент темы, который справится с этой задачей.

Речь только о баннере вверху, который ведёт на главный сайт?

Есть ли замена для:

api.changeWidgetSetting("header-notifications", "avatarSize", "large");

Это вызывает предупреждение об устаревании, которое ведет сюда:

Виджет header-notifications устарел, и changeWidgetSetting больше не поддерживается как переопределение.

Я тоже столкнулся с этой проблемой.

Пытаюсь изменить URL логотипа правильным способом, но следующее больше невозможно:

api.changeWidgetSetting("home-logo", "href", "https://my-other-homepage/");

Какой вызов API теперь следует использовать вместо этого?

Мы работаем над созданием чистого решения для этого, но оно пока не готово. Следите за обновлениями в этой теме.

Привет, @david! Готово ли будет чистое решение к пятнице, 7 июня? Если нет, не могли бы вы предоставить оценку?Извините за спешку, мы начинаем закрытое бета-тестирование 17 июня и нам нужно знать, будет ли это реализовано до начала тестирования или нет.

У меня нет точной даты, но, скорее всего, это произойдёт в течение следующих 1–2 недель. К завтрашнему дню это не будет готово.

Если вам нужно решение, которое будет работать уже завтра, рекомендую использовать старую версию API. Она автоматически переключит ваш сайт на использование устаревшей реализации заголовков.

@kana.tatsuta новый API слит.

Я добавил раздел в первом сообщении с примерами того, как настроить URL логотипа.

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

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

<script type="text/discourse-plugin" version="0.8.25">
  api.reopenWidget("home-logo", {
    logoUrl() {
      return (
        settings.Alternative_logo_url || ""
      );
    },

    mobileLogoUrl() {
      return (
        settings.Alternative_mobile_logo_url || ""
      );
    },

    smallLogoUrl() {
      return (
        settings.Alternative_small_logo_url || ""
      );
    }
  });
</script>

@tradmo,

Попробуйте использовать коннектор в плагин-аутлете home-logo-contents. Ваш код будет выглядеть примерно так:

// javascripts/discourse/initializers/customize-logo.gjs

import HomeLogoContents from "discourse/components/header/home-logo-contents";
import { withPluginApi } from "discourse/lib/plugin-api";

export default {
  name: `logo-customizations`,
  initialize(container) {
    withPluginApi("1.29.0", (api) => {
      renderHomeLogo(api);
    });
  },
};

function renderHomeLogo(api) {
  const logoSmallUrl = settings.Alternative_small_logo_url || "";
  const logoUrl = settings.Alternative_logo_url || "";
  const mobileLogoUrl = settings.Alternative_mobile_logo_url || "";

  api.renderInOutlet("home-logo-contents", <template>
    <HomeLogoContents
      @logoSmallUrl={{logoSmallUrl}}
      @logoUrl={{logoUrl}}
      @minimized={{@outletArgs.minimized}}
      @mobileLogoUrl={{mobileLogoUrl}}
      @showMobileLogo={{@outletArgs.showMobileLogo}}
      @title={{@outletArgs.title}}
    />
  </template>);
}

По поводу reopenWidget (sidebar-toggle), не могли бы вы помочь мне понять, как заменить следующий код? Я не нашел инструкций в этом руководстве.

// /javascripts/discourse/api-initializers/desktop-open-sidebar-always.js
/* кнопка sidebarToggle удалена благодаря "reopenWidget", applicationController принудительно устанавливает showSidebar в true (для desktopView) */

import { withPluginApi } from "discourse/lib/plugin-api";
import { reopenWidget } from "discourse/widgets/widget";

function sidebarToggle(api) {
  const applicationController = api.container.lookup("controller:application");
  api.reopenWidget("sidebar-toggle", {
    html(attrs) {
      if (this.site.desktopView == true && attrs.showSidebar == false) {
        applicationController.set("showSidebar", true);
      }
    },
  });
}

export default {
  name: "desktop-open-sidebar-always",
  initialize() {
    withPluginApi("0.10.1", sidebarToggle);
  },
};

Всем привет :wave:,

Не мог бы кто-нибудь помочь мне с изменениями, которые мне нужны для этого?

<script type="text/discourse-plugin" version="0.4">
const { iconNode } = require("discourse-common/lib/icon-library");

api.decorateWidget('header-icons:before', helper => {
    return helper.h('li', [
        helper.h('a#graduation-cap.icon', {
            href:'https://example.com/',
            title: 'Центр обучения'
        }, iconNode('graduation-cap')),
    ]);
});
</script>

Я полагаю, мне нужно переписать это, чтобы использовать api.headerIcons.add("foo", FooIcon, { before: "search" }), но я не на 100% уверен, как это сделать :frowning:

Любая помощь здесь будет очень кстати :pray:

Привет @angelinekwan,

Вот наша рекомендация:

  1. Удалите существующий файл javascripts/discourse/api-initializers/desktop-open-sidebar-always.js

  2. Создайте новый файл: javascripts/discourse/pre-initializers/desktop-open-sidebar-always.js и добавьте следующий код:

import { withPluginApi } from "discourse/lib/plugin-api";

const PLUGIN_NAME = "desktop-open-sidebar-always";

export default {
  name: PLUGIN_NAME,

  initialize() {
    withPluginApi("1.34.0", (api) => {
      api.modifyClass("controller:application", {
        pluginId: PLUGIN_NAME,

        calculateShowSidebar() {
          if (this.site.desktopView && this.canDisplaySidebar) {
            return true;
          }

          return this._super(...arguments);
        },
      });
    });
  },
};

Добавьте следующее в common/common.scss:

html.desktop-view {
  .header-sidebar-toggle {
    display: none;
  }
}

Привет @Danny_Dainton,

Посмотрите на компонент темы по адресу Custom Header Links (icons). Я думаю, он делает то, что вам нужно.

Если вы не можете использовать компонент темы, api.headerIcons.add тоже сработает. :smiley:

  • Создайте новый файл инициализатора. Он должен иметь расширение .gjs
  • Следующий код сделает то, что вы хотите:
// javascripts/discourse/initializers/custom-header-icons.gjs

import { apiInitializer } from "discourse/lib/api";
import dIcon from "discourse-common/helpers/d-icon";

export default apiInitializer("1.34.0", (api) => {
  api.headerIcons.add(
    "custom-header-home",
    <template>
      <li>
        <a id="graduation-cap" class="icon" href="https://example.com/" title="Learning Center">
          {{dIcon "graduation-cap"}}
        </a>
      </li>
    </template>,
    { before: "search" }
  );
});

Спасибо, сэр!

Ах, теперь, когда я вижу это перед собой, это стало немного понятнее.

Я очень ценю ваш ответ!! :heart:

Буду признателен за помощь с миграцией этого фрагмента кода — не могу понять, как его перенести:

api.reopenWidget("user-dropdown", {
  html(attrs) {
    return h(
      "a.icon",
      {title: I18n.t("custom.string.title")},
      [iconNode("bell"), this.attach("header-notifications", attrs)],
    );
  },
});

Исходная цель этого изменения — сохранить меню user-dropdown без изменений, но заменить изображение профиля на иконку (колокольчик).

Самый простой способ добиться желаемого эффекта — добавить иконку с помощью существующего PluginOutlet и просто скрыть изображение аватара пользователя с помощью CSS.

В файле .gjs:

// javascripts/discourse/initializers/user-dropdown-bell-icon.gjs

import { withPluginApi } from "discourse/lib/plugin-api";
import dIcon from "discourse-common/helpers/d-icon";

export default {
  name: "user-dropdown-bell-icon",
  initialize(container) {
    withPluginApi("1.34.0", (api) => {
      api.renderInOutlet("user-dropdown-notifications__before", <template>
        {{dIcon "bell"}}
      </template>);
    });
  },
};

Добавьте следующий CSS:

.header-dropdown-toggle.user-menu-panel img {
  display: none;
}

Результат:

Старый код виджета был удален.

Не мог бы кто-нибудь помочь мне с обновлением компонента темы, который добавляет текст рядом с логотипом “home-logo”? Заранее спасибо.