diff --git a/src/config.json b/src/config.json index 9dd6fa01d6..d0725ce3f2 100644 --- a/src/config.json +++ b/src/config.json @@ -23,6 +23,7 @@ "id": "wmc" } ], + "menuLinks": [], "servers": [], "plugins": [ "playAccessValidation/plugin", diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 1ebd56ac06..4ccf357c76 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -10,6 +10,7 @@ import groupSelectionMenu from '../components/syncPlay/ui/groupSelectionMenu'; import browser from './browser'; import globalize from './globalize'; import imageHelper from './imagehelper'; +import { getMenuLinks } from '../scripts/settings/webSettings'; import '../elements/emby-button/paper-icon-button-light'; import 'material-design-icons-iconfont'; import '../assets/css/scrollstyles.scss'; @@ -273,9 +274,11 @@ import Headroom from 'headroom.js'; html += '
'; html += '' + globalize.translate('Home') + ''; + // placeholder for custom menu links + html += '
'; + // libraries are added here - html += '
'; - html += '
'; + html += '
'; if (user.localUser && user.localUser.Policy.IsAdministrator) { html += '
'; @@ -638,6 +641,32 @@ import Headroom from 'headroom.js'; const userId = Dashboard.getCurrentUserId(); const apiClient = getCurrentApiClient(); + + const customMenuOptions = document.querySelector('.customMenuOptions'); + if (customMenuOptions) { + getMenuLinks().then(links => { + links.forEach(link => { + const option = document.createElement('a'); + option.setAttribute('is', 'emby-linkbutton'); + option.className = 'navMenuOption lnkMediaFolder'; + option.rel = 'noopener noreferrer'; + option.target = '_blank'; + option.href = link.url; + + const icon = document.createElement('span'); + icon.className = `material-icons navMenuOptionIcon ${link.icon || 'link'}`; + option.appendChild(icon); + + const label = document.createElement('span'); + label.className = 'navMenuOptionText'; + label.textContent = link.name; + option.appendChild(label); + + customMenuOptions.appendChild(option); + }); + }); + } + const libraryMenuOptions = document.querySelector('.libraryMenuOptions'); if (libraryMenuOptions) { diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index e88e65ad8f..ca67b72cc5 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -126,6 +126,18 @@ export function getThemes() { export const getDefaultTheme = () => internalDefaultTheme; +export function getMenuLinks() { + return getConfig().then(config => { + if (!config.menuLinks) { + console.error('web config is invalid, missing menuLinks:', config); + } + return config.menuLinks || []; + }).catch(error => { + console.log('cannot get web config:', error); + return []; + }); +} + export function getPlugins() { return getConfig().then(config => { if (!config.plugins) {