diff --git a/package.json b/package.json index 91d070e04d..33735f46df 100644 --- a/package.json +++ b/package.json @@ -116,6 +116,7 @@ "src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/timeSyncManager.js", "src/controllers/dashboard/logs.js", + "src/controllers/dashboard/plugins/repositories.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", "src/plugins/photoPlayer/plugin.js", diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index 82fea00b58..37df8801b5 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -123,6 +123,9 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby }, { href: 'availableplugins.html', name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') }]; } diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 87e9428cc6..f03312b422 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -153,6 +153,9 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button' }, { href: 'availableplugins.html', name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') }]; } diff --git a/src/controllers/dashboard/plugins/repositories.js b/src/controllers/dashboard/plugins/repositories.js new file mode 100644 index 0000000000..7e8b711b37 --- /dev/null +++ b/src/controllers/dashboard/plugins/repositories.js @@ -0,0 +1,135 @@ +import loading from 'loading'; +import libraryMenu from 'libraryMenu'; +import globalize from 'globalize'; +import dialogHelper from 'dialogHelper'; +import 'emby-button'; +import 'emby-checkbox'; +import 'emby-select'; +import 'cardStyle'; +import 'formDialogStyle'; + +let repositories = []; + +function reloadList(page) { + loading.show(); + ApiClient.getJSON(ApiClient.getUrl('Repositories')).then(repositories => { + this.repositories = repositories; + populateList({ + listElement: page.querySelector('#repositories'), + noneElement: page.querySelector('#none'), + repositories: this.repositories + }); + }).catch(error => { + page.querySelector('#none').classList.remove('hide'); + loading.hide(); + }); +} + +function saveList() { + loading.show(); + ApiClient.ajax({ + type: 'POST', + url: ApiClient.getUrl('Repositories'), + data: JSON.stringify(repositories), + contentType: 'application/json' + }).catch(error => { + loading.hide(); + }); +} + +function populateList(options) { + var html = ''; + + html += '
'; + for (var i = 0; i < options.repositories.length; i++) { + html += getRepositoryHtml(options.repositories[i]); + } + + html += '
'; + if (!options.repositories.length) { + options.noneElement.classList.remove('hide'); + } + + options.listElement.innerHTML = html; + loading.hide(); +} + +function getRepositoryHtml(repository) { + var html = ''; + + html += ``; + html += '
'; + html += `

${repository.Name}

`; + html += `
${repository.Url}
`; + html += '
'; + html += '
'; + + return html; +} + +function getTabs() { + return [{ + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') + }, { + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') + }, { + href: 'repositories.html', + name: globalize.translate('TabRepositories') + }]; +} + +export default function(view, params) { + view.addEventListener('viewshow', function () { + libraryMenu.setTabs('plugins', 2, getTabs); + reloadList(this); + }); + + view.querySelector('.btnNewRepository').addEventListener('click', () => { + let dialog = dialogHelper.createDialog({ + scrollY: false, + size: 'large', + modal: false, + removeOnClose: true + }); + + let html = ''; + + html += '
'; + html += ''; + html += `

${globalize.translate('HeaderNewRepository')}

`; + html += '
'; + html += '
'; + html += '
'; + html += ``; + html += `
${globalize.translate('LabelRepositoryNameHelp')}
`; + html += '
'; + html += '
'; + html += ``; + html += `
${globalize.translate('LabelRepositoryUrlHelp')}
`; + html += '
'; + html += ``; + html += ''; + html += '
'; + + dialog.innerHTML = html; + dialog.querySelector('.btnCancel').addEventListener('click', () => { + dialogHelper.close(dialog); + }); + + dialog.querySelector('.button-submit').addEventListener('click', () => { + repositories.push({ + Name: dialog.querySelector('#txtRepositoryName').value, + Url: dialog.querySelector('#txtRepositoryUrl').value, + Enabled: true + }); + + saveList(); + reloadList(view); + dialogHelper.close(dialog); + }); + + dialogHelper.open(dialog); + }); +} diff --git a/src/repositories.html b/src/repositories.html new file mode 100644 index 0000000000..e119e753dc --- /dev/null +++ b/src/repositories.html @@ -0,0 +1,19 @@ +
+
+
+
+

${TabRepositories}

+ +
+ +
+ +
+

${MessageNoRepositories}

+

${MessagePleaseEnsureInternetMetadata}

+
+
+
+
diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 6f13711b66..b5bb04683b 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -215,6 +215,12 @@ define([ roles: 'admin', controller: 'dashboard/plugins/available' }); + defineRoute({ + path: '/repositories.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/plugins/repositories' + }); defineRoute({ path: '/home.html', diff --git a/src/strings/en-us.json b/src/strings/en-us.json index b8e081a588..0a6fc9aa9e 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1023,6 +1023,12 @@ "MessageItemsAdded": "Items added.", "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.", "MessageNoAvailablePlugins": "No available plugins.", + "MessageNoRepositories": "No repositories.", + "HeaderNewRepository": "New Repository", + "LabelRepositoryUrl": "Repository URL", + "LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.", + "LabelRepositoryName": "Repository Name", + "LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.", "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.", "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", @@ -1415,6 +1421,7 @@ "TabAlbums": "Albums", "TabArtists": "Artists", "TabCatalog": "Catalog", + "TabRepositories": "Repositories", "TabChannels": "Channels", "TabCodecs": "Codecs", "TabCollections": "Collections",