diff --git a/package.json b/package.json
index 54d5f28189..467dc3b171 100644
--- a/package.json
+++ b/package.json
@@ -209,6 +209,9 @@
"src/controllers/dashboard/notifications/notification.js",
"src/controllers/dashboard/notifications/notifications.js",
"src/controllers/dashboard/playback.js",
+ "src/controllers/dashboard/plugins/add/index.js",
+ "src/controllers/dashboard/plugins/installed/index.js",
+ "src/controllers/dashboard/plugins/available/index.js",
"src/controllers/dashboard/plugins/repositories/index.js",
"src/controllers/dashboard/scheduledtasks/scheduledtask.js",
"src/controllers/dashboard/scheduledtasks/scheduledtasks.js",
diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js
index 6c666b4646..8393970e76 100644
--- a/src/controllers/dashboard/plugins/add/index.js
+++ b/src/controllers/dashboard/plugins/add/index.js
@@ -1,143 +1,148 @@
-define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) {
- 'use strict';
+import $ from 'jQuery';
+import loading from 'loading';
+import globalize from 'globalize';
+import 'emby-button';
- loading = loading.default || loading;
+function populateHistory(packageInfo, page) {
+ let html = '';
+ const length = Math.min(packageInfo.versions.length, 10);
- function populateHistory(packageInfo, page) {
- var html = '';
- var length = Math.min(packageInfo.versions.length, 10);
-
- for (var i = 0; i < length; i++) {
- var version = packageInfo.versions[i];
- html += '
' + version.version + '
';
- html += '' + version.changelog + '
';
- }
-
- $('#revisionHistory', page).html(html);
+ for (let i = 0; i < length; i++) {
+ let version = packageInfo.versions[i];
+ html += '' + version.version + '
';
+ html += '' + version.changelog + '
';
}
- function populateVersions(packageInfo, page, installedPlugin) {
- var html = '';
+ $('#revisionHistory', page).html(html);
+}
- for (var i = 0; i < packageInfo.versions.length; i++) {
- var version = packageInfo.versions[i];
- html += '';
- }
+function populateVersions(packageInfo, page, installedPlugin) {
+ let html = '';
- var selectmenu = $('#selectVersion', page).html(html);
-
- if (!installedPlugin) {
- $('#pCurrentVersion', page).hide().html('');
- }
-
- var packageVersion = packageInfo.versions[0];
- if (packageVersion) {
- selectmenu.val(packageVersion.version);
- }
+ for (let i = 0; i < packageInfo.versions.length; i++) {
+ const version = packageInfo.versions[i];
+ html += '';
}
- function renderPackage(pkg, installedPlugins, page) {
- var installedPlugin = installedPlugins.filter(function (ip) {
- return ip.Name == pkg.name;
- })[0];
+ const selectmenu = $('#selectVersion', page).html(html);
- populateVersions(pkg, page, installedPlugin);
- populateHistory(pkg, page);
-
- $('.pluginName', page).html(pkg.name);
- $('#btnInstallDiv', page).removeClass('hide');
- $('#pSelectVersion', page).removeClass('hide');
-
- if (pkg.overview) {
- $('#overview', page).show().html(pkg.overview);
- } else {
- $('#overview', page).hide();
- }
-
- $('#description', page).html(pkg.description);
- $('#developer', page).html(pkg.owner);
-
- if (installedPlugin) {
- var currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + '');
- $('#pCurrentVersion', page).show().html(currentVersionText);
- } else {
- $('#pCurrentVersion', page).hide().html('');
- }
-
- loading.hide();
+ if (!installedPlugin) {
+ $('#pCurrentVersion', page).hide().html('');
}
- function alertText(options) {
- require(['alert'], function ({default: alert}) {
- alert(options);
- });
+ const packageVersion = packageInfo.versions[0];
+ if (packageVersion) {
+ selectmenu.val(packageVersion.version);
+ }
+}
+
+function renderPackage(pkg, installedPlugins, page) {
+ const installedPlugin = installedPlugins.filter(function (ip) {
+ return ip.Name == pkg.name;
+ })[0];
+
+ populateVersions(pkg, page, installedPlugin);
+ populateHistory(pkg, page);
+
+ $('.pluginName', page).html(pkg.name);
+ $('#btnInstallDiv', page).removeClass('hide');
+ $('#pSelectVersion', page).removeClass('hide');
+
+ if (pkg.overview) {
+ $('#overview', page).show().html(pkg.overview);
+ } else {
+ $('#overview', page).hide();
}
- function performInstallation(page, name, guid, version) {
- var developer = $('#developer', page).html().toLowerCase();
+ $('#description', page).html(pkg.description);
+ $('#developer', page).html(pkg.owner);
- var alertCallback = function () {
- loading.show();
- page.querySelector('#btnInstall').disabled = true;
- ApiClient.installPlugin(name, guid, version).then(function () {
- loading.hide();
- alertText(globalize.translate('MessagePluginInstalled'));
- });
- };
+ if (installedPlugin) {
+ const currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + '');
+ $('#pCurrentVersion', page).show().html(currentVersionText);
+ } else {
+ $('#pCurrentVersion', page).hide().html('');
+ }
- if (developer !== 'jellyfin') {
+ loading.hide();
+}
+
+function alertText(options) {
+ import('alert').then(({default: alert}) => {
+ alert(options);
+ });
+}
+
+function performInstallation(page, name, guid, version) {
+ const developer = $('#developer', page).html().toLowerCase();
+
+ const alertCallback = function () {
+ loading.show();
+ page.querySelector('#btnInstall').disabled = true;
+ ApiClient.installPlugin(name, guid, version).then(() => {
loading.hide();
- var msg = globalize.translate('MessagePluginInstallDisclaimer');
- msg += '
';
- msg += '
';
- msg += globalize.translate('PleaseConfirmPluginInstallation');
+ alertText(globalize.translate('MessagePluginInstalled'));
+ }).catch(() => {
+ alertText(globalize.translate('MessagePluginIntallError'));
+ });
+ };
- require(['confirm'], function (confirm) {
- confirm.default(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () {
- alertCallback();
- }, function () {
- console.debug('plugin not installed');
- });
+ if (developer !== 'jellyfin') {
+ loading.hide();
+ let msg = globalize.translate('MessagePluginInstallDisclaimer');
+ msg += '
';
+ msg += '
';
+ msg += globalize.translate('PleaseConfirmPluginInstallation');
+
+ import('confirm').then(({default: confirm}) => {
+ confirm.default(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () {
+ alertCallback();
+ }).catch(() => {
+ console.debug('plugin not installed');
});
- } else {
- alertCallback();
- }
+ });
+ } else {
+ alertCallback();
}
+}
- return function (view, params) {
- $('.addPluginForm', view).on('submit', function () {
- loading.show();
- var page = $(this).parents('#addPluginPage')[0];
- var name = params.name;
- var guid = params.guid;
- ApiClient.getInstalledPlugins().then(function (plugins) {
- var installedPlugin = plugins.filter(function (plugin) {
- return plugin.Name == name;
- })[0];
+export default function(view, params) {
+ $('.addPluginForm', view).on('submit', function () {
+ loading.show();
+ const page = $(this).parents('#addPluginPage')[0];
+ const name = params.name;
+ const guid = params.guid;
+ ApiClient.getInstalledPlugins().then(function (plugins) {
+ const installedPlugin = plugins.filter(function (plugin) {
+ return plugin.Name == name;
+ })[0];
- var version = $('#selectVersion', page).val();
- if (installedPlugin && installedPlugin.Version === version) {
+ const version = $('#selectVersion', page).val();
+ if (installedPlugin) {
+ if (installedPlugin.Version === version) {
loading.hide();
Dashboard.alert({
message: globalize.translate('MessageAlreadyInstalled'),
title: globalize.translate('HeaderPluginInstallation')
});
- } else {
- performInstallation(page, name, guid, version);
}
- });
- return false;
+ } else {
+ performInstallation(page, name, guid, version);
+ }
+ }).catch(() => {
+ alertText(globalize.translate('MessageGetInstalledPluginsError'));
});
- view.addEventListener('viewshow', function () {
- var page = this;
- loading.show();
- var name = params.name;
- var guid = params.guid;
- var promise1 = ApiClient.getPackageInfo(name, guid);
- var promise2 = ApiClient.getInstalledPlugins();
- Promise.all([promise1, promise2]).then(function (responses) {
- renderPackage(responses[0], responses[1], page);
- });
+ return false;
+ });
+ view.addEventListener('viewshow', function () {
+ const page = this;
+ loading.show();
+ const name = params.name;
+ const guid = params.guid;
+ const promise1 = ApiClient.getPackageInfo(name, guid);
+ const promise2 = ApiClient.getInstalledPlugins();
+ Promise.all([promise1, promise2]).then(function (responses) {
+ renderPackage(responses[0], responses[1], page);
});
- };
-});
+ });
+}
diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js
index e38365ef55..aa25320d5c 100644
--- a/src/controllers/dashboard/plugins/available/index.js
+++ b/src/controllers/dashboard/plugins/available/index.js
@@ -1,143 +1,141 @@
-define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) {
- 'use strict';
+import loading from 'loading';
+import libraryMenu from 'libraryMenu';
+import globalize from 'globalize';
+import 'cardStyle';
+import 'emby-button';
+import 'emby-checkbox';
+import 'emby-select';
- loading = loading.default || loading;
-
- function reloadList(page) {
- loading.show();
- var promise1 = ApiClient.getAvailablePlugins();
- var promise2 = ApiClient.getInstalledPlugins();
- Promise.all([promise1, promise2]).then(function (responses) {
- populateList({
- catalogElement: page.querySelector('#pluginTiles'),
- noItemsElement: page.querySelector('#noPlugins'),
- availablePlugins: responses[0],
- installedPlugins: responses[1]
- });
+function reloadList(page) {
+ loading.show();
+ const promise1 = ApiClient.getAvailablePlugins();
+ const promise2 = ApiClient.getInstalledPlugins();
+ Promise.all([promise1, promise2]).then(function (responses) {
+ populateList({
+ catalogElement: page.querySelector('#pluginTiles'),
+ noItemsElement: page.querySelector('#noPlugins'),
+ availablePlugins: responses[0],
+ installedPlugins: responses[1]
});
+ });
+}
+
+function getHeaderText(category) {
+ category = category.replace(' ', '');
+ if ('Channel' === category) {
+ category = 'Channels';
+ } else if ('Theme' === category) {
+ category = 'Themes';
+ } else if ('LiveTV' === category) {
+ category = 'HeaderLiveTV';
+ } else if ('ScreenSaver' === category) {
+ category = 'HeaderScreenSavers';
}
- function getHeaderText(category) {
- category = category.replace(' ', '');
- if (category === 'Channel') {
- category = 'Channels';
- } else if (category === 'Theme') {
- category = 'Themes';
- } else if (category === 'LiveTV') {
- category = 'HeaderLiveTV';
- } else if (category === 'ScreenSaver') {
- category = 'HeaderScreenSavers';
+ return globalize.translate(category);
+}
+
+function populateList(options) {
+ const availablePlugins = options.availablePlugins;
+ const installedPlugins = options.installedPlugins;
+
+ availablePlugins.forEach(function (plugin, index, array) {
+ plugin.category = plugin.category || 'General';
+ plugin.categoryDisplayName = getHeaderText(plugin.category);
+ array[index] = plugin;
+ });
+
+ availablePlugins.sort(function (a, b) {
+ if (a.category > b.category) {
+ return 1;
+ } else if (b.category > a.category) {
+ return -1;
}
+ if (a.name > b.name) {
+ return 1;
+ } else if (b.name > a.name) {
+ return -1;
+ }
+ return 0;
+ });
- return globalize.translate(category);
- }
+ let currentCategory = null;
+ let html = '';
- function populateList(options) {
- var availablePlugins = options.availablePlugins;
- var installedPlugins = options.installedPlugins;
-
- availablePlugins.forEach(function (plugin, index, array) {
- plugin.category = plugin.category || 'General';
- plugin.categoryDisplayName = getHeaderText(plugin.category);
- array[index] = plugin;
- });
-
- availablePlugins.sort(function (a, b) {
- if (a.category > b.category) {
- return 1;
- } else if (b.category > a.category) {
- return -1;
+ for (let i = 0; i < availablePlugins.length; i++) {
+ const plugin = availablePlugins[i];
+ const category = plugin.categoryDisplayName;
+ if (category != currentCategory) {
+ if (currentCategory) {
+ html += '';
+ html += '';
}
- if (a.name > b.name) {
- return 1;
- } else if (b.name > a.name) {
- return -1;
- }
- return 0;
- });
-
- var currentCategory = null;
- var html = '';
-
- for (var i = 0; i < availablePlugins.length; i++) {
- var plugin = availablePlugins[i];
- var category = plugin.categoryDisplayName;
- if (category != currentCategory) {
- if (currentCategory) {
- html += '';
- html += '';
- }
- html += '';
- html += '
' + category + '
';
- html += '
';
- currentCategory = category;
- }
- html += getPluginHtml(plugin, options, installedPlugins);
+ html += '
';
+ html += '
' + category + '
';
+ html += '
';
+ currentCategory = category;
}
- html += '
';
- html += '
';
+ html += getPluginHtml(plugin, options, installedPlugins);
+ }
+ html += '
';
+ html += '
';
- if (!availablePlugins.length && options.noItemsElement) {
- options.noItemsElement.classList.remove('hide');
- }
-
- options.catalogElement.innerHTML = html;
- loading.hide();
+ if (!availablePlugins.length && options.noItemsElement) {
+ options.noItemsElement.classList.remove('hide');
}
- function getPluginHtml(plugin, options, installedPlugins) {
- var html = '';
- var href = plugin.externalUrl ? plugin.externalUrl : 'addplugin.html?name=' + encodeURIComponent(plugin.name) + '&guid=' + plugin.guid;
+ options.catalogElement.innerHTML = html;
+ loading.hide();
+}
- if (options.context) {
- href += '&context=' + options.context;
- }
+function getPluginHtml(plugin, options, installedPlugins) {
+ let html = '';
+ let href = plugin.externalUrl ? plugin.externalUrl : 'addplugin.html?name=' + encodeURIComponent(plugin.name) + '&guid=' + plugin.guid;
- var target = plugin.externalUrl ? ' target="_blank"' : '';
- html += "";
- html += '
';
- html += '
';
- html += '';
- html += '
';
- return html += '
';
+ if (options.context) {
+ href += '&context=' + options.context;
}
- function getTabs() {
- return [{
- href: 'installedplugins.html',
- name: globalize.translate('TabMyPlugins')
- }, {
- href: 'availableplugins.html',
- name: globalize.translate('TabCatalog')
- }, {
- href: 'repositories.html',
- name: globalize.translate('TabRepositories')
- }];
- }
+ const target = plugin.externalUrl ? ' target="_blank"' : '';
+ html += "";
+ html += '
';
+ html += '
';
+ html += '';
+ html += '
';
+ return html += '
';
+}
- window.PluginCatalog = {
- renderCatalog: populateList
- };
+function getTabs() {
+ return [{
+ href: 'installedplugins.html',
+ name: globalize.translate('TabMyPlugins')
+ }, {
+ href: 'availableplugins.html',
+ name: globalize.translate('TabCatalog')
+ }, {
+ href: 'repositories.html',
+ name: globalize.translate('TabRepositories')
+ }];
+}
- return function (view, params) {
- view.addEventListener('viewshow', function () {
- libraryMenu.setTabs('plugins', 1, getTabs);
- reloadList(this);
- });
- };
-});
+export default function (view) {
+ view.addEventListener('viewshow', function () {
+ libraryMenu.setTabs('plugins', 1, getTabs);
+ reloadList(this);
+ });
+}
diff --git a/src/controllers/dashboard/plugins/installed/index.js b/src/controllers/dashboard/plugins/installed/index.js
index 80577d227b..20cbe56928 100644
--- a/src/controllers/dashboard/plugins/installed/index.js
+++ b/src/controllers/dashboard/plugins/installed/index.js
@@ -1,192 +1,193 @@
-define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) {
- 'use strict';
+import loading from 'loading';
+import libraryMenu from 'libraryMenu';
+import dom from 'dom';
+import globalize from 'globalize';
+import 'cardStyle';
+import 'emby-button';
- loading = loading.default || loading;
+function deletePlugin(page, uniqueid, name) {
+ const msg = globalize.translate('UninstallPluginConfirmation', name);
- function deletePlugin(page, uniqueid, name) {
- var msg = globalize.translate('UninstallPluginConfirmation', name);
-
- require(['confirm'], function (confirm) {
- confirm.default({
- title: globalize.translate('HeaderUninstallPlugin'),
- text: msg,
- primary: 'delete',
- confirmText: globalize.translate('HeaderUninstallPlugin')
- }).then(function () {
- loading.show();
- ApiClient.uninstallPlugin(uniqueid).then(function () {
- reloadList(page);
- });
+ import('confirm').then(({default: confirm}) => {
+ confirm.default({
+ title: globalize.translate('UninstallPluginHeader'),
+ text: msg,
+ primary: 'delete',
+ confirmText: globalize.translate('UninstallPluginHeader')
+ }).then(function () {
+ loading.show();
+ ApiClient.uninstallPlugin(uniqueid).then(function () {
+ reloadList(page);
});
});
- }
+ });
+}
- function showNoConfigurationMessage() {
- Dashboard.alert({
- message: globalize.translate('MessageNoPluginConfiguration')
- });
- }
+function showNoConfigurationMessage() {
+ Dashboard.alert({
+ message: globalize.translate('NoPluginConfigurationMessage')
+ });
+}
- function showConnectMessage() {
- Dashboard.alert({
- message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess')
- });
- }
+function showConnectMessage() {
+ Dashboard.alert({
+ message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess')
+ });
+}
- function getPluginCardHtml(plugin, pluginConfigurationPages) {
- var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) {
- return pluginConfigurationPage.PluginId == plugin.Id;
- })[0];
- var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null;
- var html = '';
- html += "";
- html += '
';
- html += '
';
- html += '
';
- return html;
- }
-
- function renderPlugins(page, plugins) {
- ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) {
- populateList(page, plugins, configPages);
- });
- }
-
- function populateList(page, plugins, pluginConfigurationPages) {
- plugins = plugins.sort(function (plugin1, plugin2) {
- if (plugin1.Name > plugin2.Name) {
- return 1;
- }
-
- return -1;
- });
-
- var html = plugins.map(function (p) {
- return getPluginCardHtml(p, pluginConfigurationPages);
- }).join('');
-
- var installedPluginsElement = page.querySelector('.installedPlugins');
- installedPluginsElement.removeEventListener('click', onInstalledPluginsClick);
- installedPluginsElement.addEventListener('click', onInstalledPluginsClick);
-
- if (plugins.length) {
- installedPluginsElement.classList.add('itemsContainer');
- installedPluginsElement.classList.add('vertical-wrap');
- } else {
- html += '
';
- }
-
- installedPluginsElement.innerHTML = html;
- loading.hide();
- }
-
- function showPluginMenu(page, elem) {
- var card = dom.parentWithClass(elem, 'card');
- var id = card.getAttribute('data-id');
- var name = card.getAttribute('data-name');
- var removable = card.getAttribute('data-removable');
- var configHref = card.querySelector('.cardContent').getAttribute('href');
- var menuItems = [];
-
- if (configHref) {
- menuItems.push({
- name: globalize.translate('ButtonSettings'),
- id: 'open',
- icon: 'mode_edit'
- });
- }
-
- if (removable === 'true') {
- menuItems.push({
- name: globalize.translate('ButtonUninstall'),
- id: 'delete',
- icon: 'delete'
- });
- }
-
- require(['actionsheet'], function (actionsheet) {
- actionsheet.show({
- items: menuItems,
- positionTo: elem,
- callback: function (resultId) {
- switch (resultId) {
- case 'open':
- Dashboard.navigate(configHref);
- break;
- case 'delete':
- deletePlugin(page, id, name);
- break;
- }
- }
- });
- });
- }
-
- function reloadList(page) {
- loading.show();
- ApiClient.getInstalledPlugins().then(function (plugins) {
- renderPlugins(page, plugins);
- });
- }
-
- function getTabs() {
- return [{
- href: 'installedplugins.html',
- name: globalize.translate('TabMyPlugins')
- }, {
- href: 'availableplugins.html',
- name: globalize.translate('TabCatalog')
- }, {
- href: 'repositories.html',
- name: globalize.translate('TabRepositories')
- }];
- }
-
- function onInstalledPluginsClick(e) {
- if (dom.parentWithClass(e.target, 'noConfigPluginCard')) {
- showNoConfigurationMessage();
- } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) {
- showConnectMessage();
- } else {
- var btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu');
- if (btnCardMenu) {
- showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu);
- }
- }
- }
-
- pageIdOn('pageshow', 'pluginsPage', function () {
- libraryMenu.setTabs('plugins', 0, getTabs);
- reloadList(this);
+ return -1;
});
- window.PluginsPage = {
- renderPlugins: renderPlugins
- };
+ let html = plugins.map(function (p) {
+ return getPluginCardHtml(p, pluginConfigurationPages);
+ }).join('');
+
+ const installedPluginsElement = page.querySelector('.installedPlugins');
+ installedPluginsElement.removeEventListener('click', onInstalledPluginsClick);
+ installedPluginsElement.addEventListener('click', onInstalledPluginsClick);
+
+ if (plugins.length) {
+ installedPluginsElement.classList.add('itemsContainer');
+ installedPluginsElement.classList.add('vertical-wrap');
+ } else {
+ html += '
';
+ }
+
+ installedPluginsElement.innerHTML = html;
+ loading.hide();
+}
+
+function showPluginMenu(page, elem) {
+ const card = dom.parentWithClass(elem, 'card');
+ const id = card.getAttribute('data-id');
+ const name = card.getAttribute('data-name');
+ const removable = card.getAttribute('data-removable');
+ const configHref = card.querySelector('.cardContent').getAttribute('href');
+ const menuItems = [];
+
+ if (configHref) {
+ menuItems.push({
+ name: globalize.translate('ButtonSettings'),
+ id: 'open',
+ icon: 'mode_edit'
+ });
+ }
+
+ if (removable === 'true') {
+ menuItems.push({
+ name: globalize.translate('ButtonUninstall'),
+ id: 'delete',
+ icon: 'delete'
+ });
+ }
+
+ import('actionsheet').then(({default: actionsheet}) => {
+ actionsheet.show({
+ items: menuItems,
+ positionTo: elem,
+ callback: function (resultId) {
+ switch (resultId) {
+ case 'open':
+ Dashboard.navigate(configHref);
+ break;
+ case 'delete':
+ deletePlugin(page, id, name);
+ break;
+ }
+ }
+ });
+ });
+}
+
+function reloadList(page) {
+ loading.show();
+ ApiClient.getInstalledPlugins().then(function (plugins) {
+ renderPlugins(page, plugins);
+ });
+}
+
+function getTabs() {
+ return [{
+ href: 'installedplugins.html',
+ name: globalize.translate('TabMyPlugins')
+ }, {
+ href: 'availableplugins.html',
+ name: globalize.translate('TabCatalog')
+ }, {
+ href: 'repositories.html',
+ name: globalize.translate('TabRepositories')
+ }];
+}
+
+function onInstalledPluginsClick(e) {
+ if (dom.parentWithClass(e.target, 'noConfigPluginCard')) {
+ showNoConfigurationMessage();
+ } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) {
+ showConnectMessage();
+ } else {
+ const btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu');
+ if (btnCardMenu) {
+ showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu);
+ }
+ }
+}
+
+pageIdOn('pageshow', 'pluginsPage', function () {
+ libraryMenu.setTabs('plugins', 0, getTabs);
+ reloadList(this);
});
+
+window.PluginsPage = {
+ renderPlugins: renderPlugins
+};
diff --git a/src/strings/en-us.json b/src/strings/en-us.json
index 4dffc49618..5c7e1e267d 100644
--- a/src/strings/en-us.json
+++ b/src/strings/en-us.json
@@ -1282,6 +1282,8 @@
"PleaseRestartServerName": "Please restart Jellyfin Server - {0}.",
"PleaseSelectTwoItems": "Please select at least two items.",
"MessagePluginInstalled": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
+ "MessagePluginIntallError": "An error occured while installing the plugin.",
+ "MessageGetInstalledPluginsError": "An error occured while getting the list of currently installed plugins.",
"PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
"PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.",