From b3c8d364126732d8be6adeb50bc949bc524a13c8 Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Tue, 2 Jun 2020 11:39:12 -0500 Subject: [PATCH] DEV: Plugin api for adding extra header icons (#9964) --- .../discourse/app/lib/plugin-api.js | 18 +++++++++++++++++- .../discourse/app/widgets/header.js | 12 ++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/lib/plugin-api.js b/app/assets/javascripts/discourse/app/lib/plugin-api.js index 101c97da4b3..879eeac1076 100644 --- a/app/assets/javascripts/discourse/app/lib/plugin-api.js +++ b/app/assets/javascripts/discourse/app/lib/plugin-api.js @@ -28,7 +28,10 @@ import { addTagsHtmlCallback } from "discourse/lib/render-tags"; import { addUserMenuGlyph } from "discourse/widgets/user-menu"; import { addPostClassesCallback } from "discourse/widgets/post"; import { addPostTransformCallback } from "discourse/widgets/post-stream"; -import { attachAdditionalPanel } from "discourse/widgets/header"; +import { + attachAdditionalPanel, + addToHeaderIcons +} from "discourse/widgets/header"; import { registerIconRenderer, replaceIcon @@ -1141,6 +1144,19 @@ class PluginApi { addCategoryLinkIcon(renderer) { addExtraIconRenderer(renderer); } + /** + * Adds a widget to the header-icon ul. The widget must already be created. You can create new widgets + * in a theme or plugin via an initializer prior to calling this function. + * + * ``` + * api.addToHeaderIcons( + * createWidget('some-widget') + * ``` + * + **/ + addToHeaderIcons(icon) { + addToHeaderIcons(icon); + } } let _pluginv01; diff --git a/app/assets/javascripts/discourse/app/widgets/header.js b/app/assets/javascripts/discourse/app/widgets/header.js index 2580fff416a..4699a58a86b 100644 --- a/app/assets/javascripts/discourse/app/widgets/header.js +++ b/app/assets/javascripts/discourse/app/widgets/header.js @@ -12,6 +12,12 @@ import { addExtraUserClasses } from "discourse/helpers/user-avatar"; import { scrollTop } from "discourse/mixins/scroll-top"; import { h } from "virtual-dom"; +const _extraHeaderIcons = []; + +export function addToHeaderIcons(icon) { + _extraHeaderIcons.push(icon); +} + const dropdown = { buildClasses(attrs) { if (attrs.active) { @@ -226,6 +232,12 @@ createWidget("header-icons", { ); } + if (_extraHeaderIcons) { + _extraHeaderIcons.forEach(icon => { + icons.push(this.attach(icon)); + }); + } + return icons; } });