diff --git a/.eslintrc.js b/.eslintrc.js
index 21ac86277a..63f8a973c4 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -83,7 +83,6 @@ module.exports = {
'ApiClient': 'writable',
'chrome': 'writable',
'DlnaProfilePage': 'writable',
- 'Dashboard': 'writable',
'DashboardPage': 'writable',
'Emby': 'readonly',
'Events': 'writable',
diff --git a/src/components/appRouter.js b/src/components/appRouter.js
index e93d4d825d..462338f8f1 100644
--- a/src/components/appRouter.js
+++ b/src/components/appRouter.js
@@ -9,6 +9,7 @@ import loading from './loading/loading';
import page from 'page';
import viewManager from './viewManager/viewManager';
import AppInfo from './AppInfo';
+import Dashboard from '../scripts/clientUtils';
class AppRouter {
allRoutes = [];
diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js
index 3dd7f61402..5b8eaa3161 100644
--- a/src/components/groupedcards.js
+++ b/src/components/groupedcards.js
@@ -3,6 +3,7 @@
import dom from '../scripts/dom';
import { appRouter } from './appRouter';
import { ConnectionManager } from 'jellyfin-apiclient';
+import Dashboard from '../scripts/clientUtils';
function onGroupedCardClick(e, card) {
const itemId = card.getAttribute('data-id');
diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js
index 27f1c4d79e..c379744ba5 100644
--- a/src/components/homesections/homesections.js
+++ b/src/components/homesections/homesections.js
@@ -10,6 +10,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../elements/emby-scroller/emby-scroller';
import '../../elements/emby-button/emby-button';
import './homesections.css';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js
index b6160f93e0..6346594fda 100644
--- a/src/components/tvproviders/schedulesdirect.js
+++ b/src/components/tvproviders/schedulesdirect.js
@@ -8,6 +8,7 @@ import '../../elements/emby-button/paper-icon-button-light';
import '../../elements/emby-select/emby-select';
import '../../elements/emby-button/emby-button';
import '../../assets/css/flexstyles.css';
+import Dashboard from '../../scripts/clientUtils';
export default function (page, providerId, options) {
function reload() {
diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js
index 9d23f7710b..3b2efb3214 100644
--- a/src/components/tvproviders/xmltv.js
+++ b/src/components/tvproviders/xmltv.js
@@ -5,6 +5,7 @@ import '../../elements/emby-checkbox/emby-checkbox';
import '../../elements/emby-input/emby-input';
import '../listview/listview.css';
import '../../elements/emby-button/paper-icon-button-light';
+import Dashboard from '../../scripts/clientUtils';
export default function (page, providerId, options) {
function getListingProvider(config, id) {
diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js
index 2759d1a9f5..7bec82ee75 100644
--- a/src/components/viewContainer.js
+++ b/src/components/viewContainer.js
@@ -1,4 +1,6 @@
import './viewManager/viewContainer.css';
+import Dashboard from '../scripts/clientUtils';
+
/* eslint-disable indent */
function setControllerClass(view, options) {
diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js
index fe82e2e741..854917db8a 100644
--- a/src/controllers/dashboard/dashboard.js
+++ b/src/controllers/dashboard/dashboard.js
@@ -18,6 +18,7 @@ import '../../elements/emby-button/emby-button';
import '../../assets/css/flexstyles.css';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
import taskButton from '../../scripts/taskbutton';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/devices/device.js b/src/controllers/dashboard/devices/device.js
index ec9932d381..18404d605f 100644
--- a/src/controllers/dashboard/devices/device.js
+++ b/src/controllers/dashboard/devices/device.js
@@ -2,6 +2,7 @@ import loading from '../../../components/loading/loading';
import dom from '../../../scripts/dom';
import '../../../elements/emby-input/emby-input';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js
index 2466b24d72..c817d2b99d 100644
--- a/src/controllers/dashboard/devices/devices.js
+++ b/src/controllers/dashboard/devices/devices.js
@@ -7,6 +7,7 @@ import { localeWithSuffix } from '../../../scripts/dfnshelper';
import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../../components/cardbuilder/card.css';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js
index 2a770bf91c..0106d35e91 100644
--- a/src/controllers/dashboard/dlna/profile.js
+++ b/src/controllers/dashboard/dlna/profile.js
@@ -6,6 +6,7 @@ import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-input/emby-input';
import '../../../elements/emby-checkbox/emby-checkbox';
import '../../../components/listview/listview.css';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/dlna/settings.js b/src/controllers/dashboard/dlna/settings.js
index f5591cdef8..33c35b9644 100644
--- a/src/controllers/dashboard/dlna/settings.js
+++ b/src/controllers/dashboard/dlna/settings.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../components/loading/loading';
import libraryMenu from '../../../scripts/libraryMenu';
import globalize from '../../../scripts/globalize';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js
index 7bd611df6c..ad4445461d 100644
--- a/src/controllers/dashboard/encodingsettings.js
+++ b/src/controllers/dashboard/encodingsettings.js
@@ -3,6 +3,7 @@ import loading from '../../components/loading/loading';
import globalize from '../../scripts/globalize';
import dom from '../../scripts/dom';
import libraryMenu from '../../scripts/libraryMenu';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js
index e181ae42b6..ef2540eef8 100644
--- a/src/controllers/dashboard/general.js
+++ b/src/controllers/dashboard/general.js
@@ -7,6 +7,7 @@ import '../../elements/emby-input/emby-input';
import '../../elements/emby-select/emby-select';
import '../../elements/emby-button/emby-button';
import AppInfo from '../../components/AppInfo';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/library.js b/src/controllers/dashboard/library.js
index 9ef5f77fa3..d3575c5ff7 100644
--- a/src/controllers/dashboard/library.js
+++ b/src/controllers/dashboard/library.js
@@ -7,6 +7,7 @@ import dom from '../../scripts/dom';
import imageHelper from '../../scripts/imagehelper';
import '../../components/cardbuilder/card.css';
import '../../elements/emby-itemrefreshindicator/emby-itemrefreshindicator';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/librarydisplay.js b/src/controllers/dashboard/librarydisplay.js
index fbae27fe75..7e7bbb7cf8 100644
--- a/src/controllers/dashboard/librarydisplay.js
+++ b/src/controllers/dashboard/librarydisplay.js
@@ -3,6 +3,7 @@ import loading from '../../components/loading/loading';
import libraryMenu from '../../scripts/libraryMenu';
import '../../elements/emby-checkbox/emby-checkbox';
import '../../elements/emby-button/emby-button';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/metadataImages.js b/src/controllers/dashboard/metadataImages.js
index afc19c0edf..6dda2f1ee6 100644
--- a/src/controllers/dashboard/metadataImages.js
+++ b/src/controllers/dashboard/metadataImages.js
@@ -3,6 +3,7 @@ import loading from '../../components/loading/loading';
import libraryMenu from '../../scripts/libraryMenu';
import globalize from '../../scripts/globalize';
import '../../components/listview/listview.css';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/metadatanfo.js b/src/controllers/dashboard/metadatanfo.js
index e3fd0df002..58cebdd57e 100644
--- a/src/controllers/dashboard/metadatanfo.js
+++ b/src/controllers/dashboard/metadatanfo.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../components/loading/loading';
import libraryMenu from '../../scripts/libraryMenu';
import globalize from '../../scripts/globalize';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js
index a68a334878..28cca69b79 100644
--- a/src/controllers/dashboard/networking.js
+++ b/src/controllers/dashboard/networking.js
@@ -2,6 +2,7 @@ import loading from '../../components/loading/loading';
import globalize from '../../scripts/globalize';
import '../../elements/emby-checkbox/emby-checkbox';
import '../../elements/emby-select/emby-select';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/notifications/notification/index.js b/src/controllers/dashboard/notifications/notification/index.js
index 1501a9a7b5..eda0004420 100644
--- a/src/controllers/dashboard/notifications/notification/index.js
+++ b/src/controllers/dashboard/notifications/notification/index.js
@@ -1,5 +1,6 @@
import 'jquery';
import '../../../../elements/emby-checkbox/emby-checkbox';
+import Dashboard from '../../../../scripts/clientUtils';
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
let html = '
';
diff --git a/src/controllers/dashboard/playback.js b/src/controllers/dashboard/playback.js
index 0ea7dc3207..b02090cd33 100644
--- a/src/controllers/dashboard/playback.js
+++ b/src/controllers/dashboard/playback.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../components/loading/loading';
import libraryMenu from '../../scripts/libraryMenu';
import globalize from '../../scripts/globalize';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js
index 3854087e7e..8738f8be74 100644
--- a/src/controllers/dashboard/plugins/add/index.js
+++ b/src/controllers/dashboard/plugins/add/index.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../../components/loading/loading';
import globalize from '../../../../scripts/globalize';
import '../../../../elements/emby-button/emby-button';
+import Dashboard from '../../../../scripts/clientUtils';
function populateHistory(packageInfo, page) {
let html = '';
diff --git a/src/controllers/dashboard/plugins/installed/index.js b/src/controllers/dashboard/plugins/installed/index.js
index 26e98a3277..7ed0eddf93 100644
--- a/src/controllers/dashboard/plugins/installed/index.js
+++ b/src/controllers/dashboard/plugins/installed/index.js
@@ -4,6 +4,7 @@ import dom from '../../../../scripts/dom';
import globalize from '../../../../scripts/globalize';
import '../../../../components/cardbuilder/card.css';
import '../../../../elements/emby-button/emby-button';
+import Dashboard from '../../../../scripts/clientUtils';
function deletePlugin(page, uniqueid, name) {
const msg = globalize.translate('UninstallPluginConfirmation', name);
diff --git a/src/controllers/dashboard/streaming.js b/src/controllers/dashboard/streaming.js
index 5fbf67491c..5f504d9535 100644
--- a/src/controllers/dashboard/streaming.js
+++ b/src/controllers/dashboard/streaming.js
@@ -2,6 +2,7 @@ import 'jquery';
import libraryMenu from '../../scripts/libraryMenu';
import loading from '../../components/loading/loading';
import globalize from '../../scripts/globalize';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js
index 3532f82621..90b0397230 100644
--- a/src/controllers/dashboard/users/useredit.js
+++ b/src/controllers/dashboard/users/useredit.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../components/loading/loading';
import libraryMenu from '../../../scripts/libraryMenu';
import globalize from '../../../scripts/globalize';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js
index d07cc8f573..3c602fc3f5 100644
--- a/src/controllers/dashboard/users/userlibraryaccess.js
+++ b/src/controllers/dashboard/users/userlibraryaccess.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../components/loading/loading';
import libraryMenu from '../../../scripts/libraryMenu';
import globalize from '../../../scripts/globalize';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/users/usernew.js b/src/controllers/dashboard/users/usernew.js
index 9e6ffc3fc9..0798423b81 100644
--- a/src/controllers/dashboard/users/usernew.js
+++ b/src/controllers/dashboard/users/usernew.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../components/loading/loading';
import globalize from '../../../scripts/globalize';
import '../../../elements/emby-checkbox/emby-checkbox';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/users/userpasswordpage.js b/src/controllers/dashboard/users/userpasswordpage.js
index 2f5246c54b..d5ed54b630 100644
--- a/src/controllers/dashboard/users/userpasswordpage.js
+++ b/src/controllers/dashboard/users/userpasswordpage.js
@@ -2,6 +2,7 @@ import loading from '../../../components/loading/loading';
import libraryMenu from '../../../scripts/libraryMenu';
import globalize from '../../../scripts/globalize';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js
index d0c5270d40..4650e5eb63 100644
--- a/src/controllers/dashboard/users/userprofilespage.js
+++ b/src/controllers/dashboard/users/userprofilespage.js
@@ -8,6 +8,7 @@ import '../../../components/cardbuilder/card.css';
import '../../../elements/emby-button/emby-button';
import '../../../components/indicators/indicators.css';
import '../../../assets/css/flexstyles.css';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js
index 38ea324b3d..3f5373b092 100644
--- a/src/controllers/itemDetails/index.js
+++ b/src/controllers/itemDetails/index.js
@@ -27,6 +27,7 @@ import '../../elements/emby-ratingbutton/emby-ratingbutton';
import '../../elements/emby-scroller/emby-scroller';
import '../../elements/emby-select/emby-select';
import itemShortcuts from '../../components/shortcuts';
+import Dashboard from '../../scripts/clientUtils';
function getPromise(apiClient, params) {
const id = params.id;
diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js
index 23197da6cf..a1fb55f53a 100644
--- a/src/controllers/livetv/livetvrecordings.js
+++ b/src/controllers/livetv/livetvrecordings.js
@@ -4,6 +4,7 @@ import imageLoader from '../../components/images/imageLoader';
import '../../scripts/livetvcomponents';
import '../../components/listview/listview.css';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
+import Dashboard from '../../scripts/clientUtils';
function renderRecordings(elem, recordings, cardOptions, scrollX) {
if (!elem) {
diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js
index 2e795f0c7d..a30db98791 100644
--- a/src/controllers/livetv/livetvschedule.js
+++ b/src/controllers/livetv/livetvschedule.js
@@ -5,6 +5,7 @@ import loading from '../../components/loading/loading';
import '../../scripts/livetvcomponents';
import '../../elements/emby-button/emby-button';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
+import Dashboard from '../../scripts/clientUtils';
function enableScrollX() {
return !layoutManager.desktop;
diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js
index 732b42bbf3..bc011001ca 100644
--- a/src/controllers/livetv/livetvsuggested.js
+++ b/src/controllers/livetv/livetvsuggested.js
@@ -10,6 +10,7 @@ import '../../assets/css/scrollstyles.css';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../elements/emby-tabs/emby-tabs';
import '../../elements/emby-button/emby-button';
+import Dashboard from '../../scripts/clientUtils';
function enableScrollX() {
return !layoutManager.desktop;
diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js
index 65507e829f..c4e2d870f6 100644
--- a/src/controllers/livetvguideprovider.js
+++ b/src/controllers/livetvguideprovider.js
@@ -1,6 +1,7 @@
import { Events } from 'jellyfin-apiclient';
import loading from '../components/loading/loading';
import globalize from '../scripts/globalize';
+import Dashboard from '../scripts/clientUtils';
function onListingsSubmitted() {
Dashboard.navigate('livetvstatus.html');
diff --git a/src/controllers/livetvsettings.js b/src/controllers/livetvsettings.js
index 8946a44520..01f9a96590 100644
--- a/src/controllers/livetvsettings.js
+++ b/src/controllers/livetvsettings.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../components/loading/loading';
import globalize from '../scripts/globalize';
import '../elements/emby-button/emby-button';
+import Dashboard from '../scripts/clientUtils';
function loadPage(page, config) {
$('.liveTvSettingsForm', page).show();
diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js
index ac44336cc0..d7f346b872 100644
--- a/src/controllers/livetvstatus.js
+++ b/src/controllers/livetvstatus.js
@@ -11,6 +11,7 @@ import '../elements/emby-itemscontainer/emby-itemscontainer';
import '../components/cardbuilder/card.css';
import 'material-design-icons-iconfont';
import '../elements/emby-button/emby-button';
+import Dashboard from '../scripts/clientUtils';
const enableFocusTransform = !browser.slow && !browser.edge;
diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js
index 383e52faf7..2f606d5216 100644
--- a/src/controllers/livetvtuner.js
+++ b/src/controllers/livetvtuner.js
@@ -5,6 +5,7 @@ import '../elements/emby-input/emby-input';
import '../elements/emby-button/emby-button';
import '../elements/emby-checkbox/emby-checkbox';
import '../elements/emby-select/emby-select';
+import Dashboard from '../scripts/clientUtils';
function isM3uVariant(type) {
return ['nextpvr'].indexOf(type || '') !== -1;
diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js
index 18618345fe..7de4cb4559 100644
--- a/src/controllers/movies/moviesrecommended.js
+++ b/src/controllers/movies/moviesrecommended.js
@@ -14,6 +14,7 @@ import '../../elements/emby-scroller/emby-scroller';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../elements/emby-tabs/emby-tabs';
import '../../elements/emby-button/emby-button';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js
index 107368ca7e..a9433a6152 100644
--- a/src/controllers/music/musicrecommended.js
+++ b/src/controllers/music/musicrecommended.js
@@ -14,6 +14,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../elements/emby-tabs/emby-tabs';
import '../../elements/emby-button/emby-button';
import '../../assets/css/flexstyles.css';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js
index 316f852203..3fc7549947 100644
--- a/src/controllers/music/songs.js
+++ b/src/controllers/music/songs.js
@@ -7,6 +7,7 @@ import loading from '../../components/loading/loading';
import * as userSettings from '../../scripts/settings/userSettings';
import globalize from '../../scripts/globalize';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js
index 1a16d7374e..7bfb07e60d 100644
--- a/src/controllers/session/addServer/index.js
+++ b/src/controllers/session/addServer/index.js
@@ -2,6 +2,7 @@ import appSettings from '../../../scripts/settings/appSettings';
import loading from '../../../components/loading/loading';
import globalize from '../../../scripts/globalize';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js
index 02de41e344..203605b8bb 100644
--- a/src/controllers/session/forgotPassword/index.js
+++ b/src/controllers/session/forgotPassword/index.js
@@ -1,4 +1,5 @@
import globalize from '../../../scripts/globalize';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js
index e1ac1d1259..5cb38188b9 100644
--- a/src/controllers/session/login/index.js
+++ b/src/controllers/session/login/index.js
@@ -1,7 +1,6 @@
import { appHost } from '../../../components/apphost';
import appSettings from '../../../scripts/settings/appSettings';
import dom from '../../../scripts/dom';
-import { ConnectionManager } from 'jellyfin-apiclient';
import loading from '../../../components/loading/loading';
import layoutManager from '../../../components/layoutManager';
import libraryMenu from '../../../scripts/libraryMenu';
@@ -9,6 +8,7 @@ import browser from '../../../scripts/browser';
import globalize from '../../../scripts/globalize';
import '../../../components/cardbuilder/card.css';
import '../../../elements/emby-checkbox/emby-checkbox';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/session/resetPassword/index.js b/src/controllers/session/resetPassword/index.js
index 8ed9c18dd8..cc84d76fae 100644
--- a/src/controllers/session/resetPassword/index.js
+++ b/src/controllers/session/resetPassword/index.js
@@ -1,4 +1,5 @@
import globalize from '../../../scripts/globalize';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js
index accc828ba4..8eb5c17c7f 100644
--- a/src/controllers/session/selectServer/index.js
+++ b/src/controllers/session/selectServer/index.js
@@ -15,6 +15,7 @@ import '../../../elements/emby-scroller/emby-scroller';
import '../../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../../components/cardbuilder/card.css';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js
index f494f82e0f..3dd08e3f76 100644
--- a/src/controllers/shows/episodes.js
+++ b/src/controllers/shows/episodes.js
@@ -7,6 +7,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder';
import * as userSettings from '../../scripts/settings/userSettings';
import globalize from '../../scripts/globalize';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js
index 936aa587ee..e678fc7118 100644
--- a/src/controllers/shows/tvrecommended.js
+++ b/src/controllers/shows/tvrecommended.js
@@ -13,6 +13,7 @@ import globalize from '../../scripts/globalize';
import '../../assets/css/scrollstyles.css';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../elements/emby-button/emby-button';
+import Dashboard from '../../scripts/clientUtils';
/* eslint-disable indent */
diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js
index f3f92386e2..cfc5b5f4a5 100644
--- a/src/controllers/user/menu/index.js
+++ b/src/controllers/user/menu/index.js
@@ -2,6 +2,7 @@ import { appHost } from '../../../components/apphost';
import '../../../components/listview/listview.css';
import '../../../elements/emby-button/emby-button';
import layoutManager from '../../../components/layoutManager';
+import Dashboard from '../../../scripts/clientUtils';
export default function (view, params) {
view.querySelector('.btnLogout').addEventListener('click', function () {
diff --git a/src/controllers/user/profile/index.js b/src/controllers/user/profile/index.js
index 113f08c4d8..b15334dabe 100644
--- a/src/controllers/user/profile/index.js
+++ b/src/controllers/user/profile/index.js
@@ -4,6 +4,7 @@ import libraryMenu from '../../../scripts/libraryMenu';
import { appHost } from '../../../components/apphost';
import globalize from '../../../scripts/globalize';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
function reloadUser(page) {
const userId = getParameterByName('userId');
diff --git a/src/controllers/wizard/remote/index.js b/src/controllers/wizard/remote/index.js
index 8f0aff72f3..c5689e73bb 100644
--- a/src/controllers/wizard/remote/index.js
+++ b/src/controllers/wizard/remote/index.js
@@ -2,6 +2,7 @@ import loading from '../../../components/loading/loading';
import '../../../elements/emby-checkbox/emby-checkbox';
import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-select/emby-select';
+import Dashboard from '../../../scripts/clientUtils';
function save(page) {
loading.show();
diff --git a/src/controllers/wizard/settings/index.js b/src/controllers/wizard/settings/index.js
index 87cae05275..4a88e861f0 100644
--- a/src/controllers/wizard/settings/index.js
+++ b/src/controllers/wizard/settings/index.js
@@ -2,6 +2,7 @@ import loading from '../../../components/loading/loading';
import '../../../elements/emby-checkbox/emby-checkbox';
import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-select/emby-select';
+import Dashboard from '../../../scripts/clientUtils';
function save(page) {
loading.show();
diff --git a/src/controllers/wizard/start/index.js b/src/controllers/wizard/start/index.js
index 54e3d8e7df..3f524a870a 100644
--- a/src/controllers/wizard/start/index.js
+++ b/src/controllers/wizard/start/index.js
@@ -2,6 +2,7 @@ import 'jquery';
import loading from '../../../components/loading/loading';
import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-select/emby-select';
+import Dashboard from '../../../scripts/clientUtils';
function loadPage(page, config, languageOptions) {
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) {
diff --git a/src/controllers/wizard/user/index.js b/src/controllers/wizard/user/index.js
index 75cfde5b9b..509509a190 100644
--- a/src/controllers/wizard/user/index.js
+++ b/src/controllers/wizard/user/index.js
@@ -3,6 +3,7 @@ import globalize from '../../../scripts/globalize';
import '../../../assets/css/dashboard.css';
import '../../../elements/emby-input/emby-input';
import '../../../elements/emby-button/emby-button';
+import Dashboard from '../../../scripts/clientUtils';
function getApiClient() {
return ApiClient;
diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js
index c9eaf7fc59..bf890d1771 100644
--- a/src/scripts/clientUtils.js
+++ b/src/scripts/clientUtils.js
@@ -182,9 +182,7 @@ export function confirm(message, title, callback) {
});
}
-// This is used in plugins and templates, so keep it defined for now.
-// TODO: Remove once plugins don't need it
-window.Dashboard = {
+const Dashboard = {
alert,
capabilities,
confirm,
@@ -203,21 +201,8 @@ window.Dashboard = {
showLoadingMsg
};
-export default {
- alert,
- capabilities,
- confirm,
- getPluginUrl,
- getCurrentUser,
- getCurrentUserId,
- hideLoadingMsg,
- logout,
- navigate,
- onServerChanged,
- processErrorResponse,
- processPluginConfigurationUpdateResult,
- processServerConfigurationUpdateResult,
- selectServer,
- serverAddress,
- showLoadingMsg
-};
+// This is used in plugins and templates, so keep it defined for now.
+// TODO: Remove once plugins don't need it
+window.Dashboard = Dashboard;
+
+export default Dashboard;
diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js
index ab9f5864b4..686905cde4 100644
--- a/src/scripts/editorsidebar.js
+++ b/src/scripts/editorsidebar.js
@@ -1,6 +1,7 @@
import 'jquery';
import globalize from './globalize';
import 'material-design-icons-iconfont';
+import Dashboard from './clientUtils';
/* eslint-disable indent */
diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js
index 42143aad70..92cb18b81c 100644
--- a/src/scripts/libraryMenu.js
+++ b/src/scripts/libraryMenu.js
@@ -15,6 +15,7 @@ import '../elements/emby-button/paper-icon-button-light';
import 'material-design-icons-iconfont';
import '../assets/css/scrollstyles.css';
import '../assets/css/flexstyles.css';
+import Dashboard from './clientUtils';
/* eslint-disable indent */
diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js
index 3f09f621b2..1b88aed1e1 100644
--- a/src/scripts/playlists.js
+++ b/src/scripts/playlists.js
@@ -6,6 +6,7 @@ import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import * as userSettings from '../scripts/settings/userSettings';
import '../../elements/emby-itemscontainer/emby-itemscontainer';
+import Dashboard from './clientUtils';
export default function (view, params) {
function getPageData(context) {
diff --git a/src/scripts/site.js b/src/scripts/site.js
index 3643ca1d43..ec9bf0f0f8 100644
--- a/src/scripts/site.js
+++ b/src/scripts/site.js
@@ -9,6 +9,7 @@ import 'resize-observer-polyfill';
import 'jellyfin-noto';
import '../assets/css/site.css';
import AppInfo from '../components/AppInfo';
+import Dashboard from './clientUtils';
// TODO: Move this elsewhere
window.getWindowLocationSearch = function(win) {
@@ -115,10 +116,9 @@ function initClient() {
console.debug('loading ApiClient singleton');
return Promise.all([
- import('jellyfin-apiclient'),
- import('./clientUtils')
+ import('jellyfin-apiclient')
])
- .then(([{ ApiClient }, clientUtils]) => {
+ .then(([{ ApiClient }]) => {
console.debug('creating ApiClient singleton');
var apiClient = new ApiClient(Dashboard.serverAddress(), appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId());