1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge branch 'master' into migrate-to-ES6-45

This commit is contained in:
Cameron 2020-08-02 18:00:52 +01:00 committed by GitHub
commit 5d4b133dcf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
172 changed files with 5872 additions and 5916 deletions

View file

@ -64,7 +64,7 @@ jobs:
value: 0.0.0 value: 0.0.0
steps: steps:
- script: echo '##vso[task.setvariable variable=JellyfinVersion]$( awk -F "/" "{ print $NF }" <<<"$(Build.SourceBranch)" | sed "s/^v//" )' - script: echo "##vso[task.setvariable variable=JellyfinVersion]$( awk -F '/' '{ print $NF }' <<<'$(Build.SourceBranch)' | sed 's/^v//' )"
displayName: Set release version (stable) displayName: Set release version (stable)
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags') condition: startsWith(variables['Build.SourceBranch'], 'refs/tags')

View file

@ -8,5 +8,5 @@ trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
end_of_line = lf end_of_line = lf
[json] [*.json]
indent_size = 2 indent_size = 2

View file

@ -1,6 +1,7 @@
module.exports = { module.exports = {
root: true, root: true,
plugins: [ plugins: [
'@babel',
'promise', 'promise',
'import', 'import',
'eslint-comments' 'eslint-comments'
@ -28,7 +29,7 @@ module.exports = {
], ],
rules: { rules: {
'block-spacing': ['error'], 'block-spacing': ['error'],
'brace-style': ['error', "1tbs", { "allowSingleLine": true }], 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
'comma-dangle': ['error', 'never'], 'comma-dangle': ['error', 'never'],
'comma-spacing': ['error'], 'comma-spacing': ['error'],
'eol-last': ['error'], 'eol-last': ['error'],
@ -40,20 +41,21 @@ module.exports = {
'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-multiple-empty-lines': ['error', { 'max': 1 }],
'no-trailing-spaces': ['error'], 'no-trailing-spaces': ['error'],
'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], 'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }],
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], 'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }],
'one-var': ['error', 'never'], 'one-var': ['error', 'never'],
'padded-blocks': ['error', 'never'], 'padded-blocks': ['error', 'never'],
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
'semi': ['error'], 'semi': ['error'],
'space-before-blocks': ['error'], 'space-before-blocks': ['error'],
'space-infix-ops': 'error' 'space-infix-ops': 'error',
'yoda': 'error'
}, },
overrides: [ overrides: [
{ {
files: [ files: [
'./src/**/*.js' './src/**/*.js'
], ],
parser: 'babel-eslint', parser: '@babel/eslint-parser',
env: { env: {
node: false, node: false,
amd: true, amd: true,

View file

@ -36,6 +36,7 @@
- [MrTimscampi](https://github.com/MrTimscampi) - [MrTimscampi](https://github.com/MrTimscampi)
- [Sarab Singh](https://github.com/sarab97) - [Sarab Singh](https://github.com/sarab97)
- [Andrei Oanca](https://github.com/OancaAndrei) - [Andrei Oanca](https://github.com/OancaAndrei)
- [Cromefire_](https://github.com/cromefire)
# Emby Contributors # Emby Contributors

View file

@ -44,6 +44,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user
### Dependencies ### Dependencies
- [Node.js](https://nodejs.org/en/download/)
- [Yarn 1.22.4](https://classic.yarnpkg.com/en/docs/install) - [Yarn 1.22.4](https://classic.yarnpkg.com/en/docs/install)
- Gulp-cli - Gulp-cli

View file

@ -5,21 +5,22 @@
"repository": "https://github.com/jellyfin/jellyfin-web", "repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.10.5", "@babel/core": "^7.11.0",
"@babel/eslint-parser": "^7.11.0",
"@babel/eslint-plugin": "^7.11.0",
"@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-class-properties": "^7.10.1",
"@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-proposal-private-methods": "^7.10.1",
"@babel/plugin-transform-modules-amd": "^7.10.5", "@babel/plugin-transform-modules-amd": "^7.10.5",
"@babel/polyfill": "^7.8.7", "@babel/polyfill": "^7.8.7",
"@babel/preset-env": "^7.10.3", "@babel/preset-env": "^7.11.0",
"autoprefixer": "^9.8.5", "autoprefixer": "^9.8.6",
"babel-eslint": "^11.0.0-beta.2",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"browser-sync": "^2.26.12", "browser-sync": "^2.26.12",
"copy-webpack-plugin": "^5.1.1", "copy-webpack-plugin": "^5.1.1",
"css-loader": "^4.0.0", "css-loader": "^4.2.0",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"del": "^5.1.0", "del": "^5.1.0",
"eslint": "^6.8.0", "eslint": "^7.6.0",
"eslint-plugin-compat": "^3.5.1", "eslint-plugin-compat": "^3.5.1",
"eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-import": "^2.21.2", "eslint-plugin-import": "^2.21.2",
@ -48,7 +49,7 @@
"stylelint-config-rational-order": "^0.1.2", "stylelint-config-rational-order": "^0.1.2",
"stylelint-no-browser-hacks": "^1.2.1", "stylelint-no-browser-hacks": "^1.2.1",
"stylelint-order": "^4.1.0", "stylelint-order": "^4.1.0",
"webpack": "^4.44.0", "webpack": "^4.44.1",
"webpack-merge": "^4.2.2", "webpack-merge": "^4.2.2",
"webpack-stream": "^5.2.1" "webpack-stream": "^5.2.1"
}, },
@ -62,7 +63,7 @@
"fast-text-encoding": "^1.0.3", "fast-text-encoding": "^1.0.3",
"flv.js": "^1.5.0", "flv.js": "^1.5.0",
"headroom.js": "^0.11.0", "headroom.js": "^0.11.0",
"hls.js": "^0.14.6", "hls.js": "^0.14.7",
"howler": "^2.2.0", "howler": "^2.2.0",
"intersection-observer": "^0.11.0", "intersection-observer": "^0.11.0",
"jellyfin-apiclient": "^1.4.1", "jellyfin-apiclient": "^1.4.1",
@ -106,6 +107,7 @@
"src/components/dialogHelper/dialogHelper.js", "src/components/dialogHelper/dialogHelper.js",
"src/components/directorybrowser/directorybrowser.js", "src/components/directorybrowser/directorybrowser.js",
"src/components/displaySettings/displaySettings.js", "src/components/displaySettings/displaySettings.js",
"src/components/favoriteitems.js",
"src/components/fetchhelper.js", "src/components/fetchhelper.js",
"src/components/filterdialog/filterdialog.js", "src/components/filterdialog/filterdialog.js",
"src/components/groupedcards.js", "src/components/groupedcards.js",
@ -114,14 +116,18 @@
"src/components/htmlMediaHelper.js", "src/components/htmlMediaHelper.js",
"src/components/imageOptionsEditor/imageOptionsEditor.js", "src/components/imageOptionsEditor/imageOptionsEditor.js",
"src/components/images/imageLoader.js", "src/components/images/imageLoader.js",
"src/components/imageDownloader/imageDownloader.js",
"src/components/imageeditor/imageeditor.js",
"src/components/imageUploader/imageUploader.js", "src/components/imageUploader/imageUploader.js",
"src/components/indicators/indicators.js", "src/components/indicators/indicators.js",
"src/components/itemContextMenu.js", "src/components/itemContextMenu.js",
"src/components/itemHelper.js",
"src/components/itemidentifier/itemidentifier.js", "src/components/itemidentifier/itemidentifier.js",
"src/components/itemMediaInfo/itemMediaInfo.js", "src/components/itemMediaInfo/itemMediaInfo.js",
"src/components/lazyLoader/lazyLoaderIntersectionObserver.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js",
"src/components/libraryoptionseditor/libraryoptionseditor.js", "src/components/libraryoptionseditor/libraryoptionseditor.js",
"src/components/listview/listview.js", "src/components/listview/listview.js",
"src/components/loading/loading.js",
"src/components/maintabsmanager.js", "src/components/maintabsmanager.js",
"src/components/mediainfo/mediainfo.js", "src/components/mediainfo/mediainfo.js",
"src/components/mediaLibraryCreator/mediaLibraryCreator.js", "src/components/mediaLibraryCreator/mediaLibraryCreator.js",
@ -134,9 +140,11 @@
"src/components/playback/mediasession.js", "src/components/playback/mediasession.js",
"src/components/playback/nowplayinghelper.js", "src/components/playback/nowplayinghelper.js",
"src/components/playback/playbackorientation.js", "src/components/playback/playbackorientation.js",
"src/components/playback/playbackmanager.js",
"src/components/playback/playerSelectionMenu.js", "src/components/playback/playerSelectionMenu.js",
"src/components/playback/playersettingsmenu.js", "src/components/playback/playersettingsmenu.js",
"src/components/playback/playmethodhelper.js", "src/components/playback/playmethodhelper.js",
"src/components/playback/playqueuemanager.js",
"src/components/playback/remotecontrolautoplay.js", "src/components/playback/remotecontrolautoplay.js",
"src/components/playback/volumeosd.js", "src/components/playback/volumeosd.js",
"src/components/playbackSettings/playbackSettings.js", "src/components/playbackSettings/playbackSettings.js",
@ -144,8 +152,10 @@
"src/components/playlisteditor/playlisteditor.js", "src/components/playlisteditor/playlisteditor.js",
"src/components/playmenu.js", "src/components/playmenu.js",
"src/components/prompt/prompt.js", "src/components/prompt/prompt.js",
"src/components/refreshdialog/refreshdialog.js",
"src/components/sanatizefilename.js", "src/components/sanatizefilename.js",
"src/components/scrollManager.js", "src/components/scrollManager.js",
"src/plugins/htmlVideoPlayer/plugin.js",
"src/components/search/searchfields.js", "src/components/search/searchfields.js",
"src/components/search/searchresults.js", "src/components/search/searchresults.js",
"src/components/settingshelper.js", "src/components/settingshelper.js",
@ -156,6 +166,7 @@
"src/components/syncPlay/playbackPermissionManager.js", "src/components/syncPlay/playbackPermissionManager.js",
"src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/syncPlayManager.js",
"src/components/syncPlay/timeSyncManager.js", "src/components/syncPlay/timeSyncManager.js",
"src/components/viewContainer.js",
"src/controllers/session/addServer/index.js", "src/controllers/session/addServer/index.js",
"src/controllers/session/forgotPassword/index.js", "src/controllers/session/forgotPassword/index.js",
"src/controllers/session/redeemPassword/index.js", "src/controllers/session/redeemPassword/index.js",
@ -172,6 +183,12 @@
"src/controllers/dashboard/general.js", "src/controllers/dashboard/general.js",
"src/controllers/dashboard/librarydisplay.js", "src/controllers/dashboard/librarydisplay.js",
"src/controllers/dashboard/logs.js", "src/controllers/dashboard/logs.js",
"src/controllers/music/musicalbums.js",
"src/controllers/music/musicartists.js",
"src/controllers/music/musicgenres.js",
"src/controllers/music/musicplaylists.js",
"src/controllers/music/musicrecommended.js",
"src/controllers/music/songs.js",
"src/controllers/dashboard/mediaLibrary.js", "src/controllers/dashboard/mediaLibrary.js",
"src/controllers/dashboard/metadataImages.js", "src/controllers/dashboard/metadataImages.js",
"src/controllers/dashboard/metadatanfo.js", "src/controllers/dashboard/metadatanfo.js",
@ -189,9 +206,13 @@
"src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userpasswordpage.js",
"src/controllers/dashboard/users/userprofilespage.js", "src/controllers/dashboard/users/userprofilespage.js",
"src/controllers/list.js", "src/controllers/list.js",
"src/controllers/itemDetails/index.js",
"src/controllers/playback/queue/index.js", "src/controllers/playback/queue/index.js",
"src/controllers/playback/video/index.js", "src/controllers/playback/video/index.js",
"src/controllers/searchpage.js", "src/controllers/searchpage.js",
"src/controllers/livetvtuner.js",
"src/controllers/livetvstatus.js",
"src/controllers/livetvsettings.js",
"src/controllers/shows/episodes.js", "src/controllers/shows/episodes.js",
"src/controllers/shows/tvgenres.js", "src/controllers/shows/tvgenres.js",
"src/controllers/shows/tvlatest.js", "src/controllers/shows/tvlatest.js",
@ -205,7 +226,6 @@
"src/controllers/user/playback/index.js", "src/controllers/user/playback/index.js",
"src/controllers/user/profile/index.js", "src/controllers/user/profile/index.js",
"src/controllers/user/subtitles/index.js", "src/controllers/user/subtitles/index.js",
"src/controllers/user/subtitles/index.js",
"src/controllers/wizard/finish/index.js", "src/controllers/wizard/finish/index.js",
"src/controllers/wizard/remote/index.js", "src/controllers/wizard/remote/index.js",
"src/controllers/wizard/settings/index.js", "src/controllers/wizard/settings/index.js",
@ -239,6 +259,7 @@
"src/plugins/youtubePlayer/plugin.js", "src/plugins/youtubePlayer/plugin.js",
"src/scripts/alphanumericshortcuts.js", "src/scripts/alphanumericshortcuts.js",
"src/scripts/autoBackdrops.js", "src/scripts/autoBackdrops.js",
"src/scripts/browser.js",
"src/scripts/datetime.js", "src/scripts/datetime.js",
"src/scripts/deleteHelper.js", "src/scripts/deleteHelper.js",
"src/scripts/dfnshelper.js", "src/scripts/dfnshelper.js",
@ -250,7 +271,11 @@
"src/scripts/imagehelper.js", "src/scripts/imagehelper.js",
"src/scripts/inputManager.js", "src/scripts/inputManager.js",
"src/scripts/keyboardNavigation.js", "src/scripts/keyboardNavigation.js",
"src/scripts/libraryBrowser.js",
"src/scripts/mouseManager.js",
"src/scripts/multiDownload.js",
"src/scripts/playlists.js", "src/scripts/playlists.js",
"src/scripts/routes.js",
"src/scripts/settings/appSettings.js", "src/scripts/settings/appSettings.js",
"src/scripts/settings/userSettings.js", "src/scripts/settings/userSettings.js",
"src/scripts/settings/webSettings.js", "src/scripts/settings/webSettings.js",
@ -271,7 +296,7 @@
"last 2 Chrome versions", "last 2 Chrome versions",
"last 2 ChromeAndroid versions", "last 2 ChromeAndroid versions",
"last 2 Safari versions", "last 2 Safari versions",
"last 2 iOS versions", "iOS > 10",
"last 2 Edge versions", "last 2 Edge versions",
"Chrome 27", "Chrome 27",
"Chrome 38", "Chrome 38",
@ -279,6 +304,7 @@
"Chrome 53", "Chrome 53",
"Chrome 56", "Chrome 56",
"Chrome 63", "Chrome 63",
"Edge 18",
"Firefox ESR" "Firefox ESR"
], ],
"scripts": { "scripts": {

View file

@ -646,7 +646,7 @@
.layout-desktop .detailRibbon, .layout-desktop .detailRibbon,
.layout-tv .detailRibbon { .layout-tv .detailRibbon {
margin-top: -7.2em; margin-top: -7.2em;
height: 7.18em; height: 7.2em;
} }
.layout-desktop .noBackdrop .detailRibbon, .layout-desktop .noBackdrop .detailRibbon,

View file

@ -49,7 +49,7 @@ import 'formDialogStyle';
}; };
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) {
return void alert(globalize.translate('ErrorMessageStartHourGreaterThanEnd')); return void alert(globalize.translate('ErrorStartHourGreaterThanEnd'));
} }
context.submitted = true; context.submitted = true;

View file

@ -16,7 +16,7 @@ import 'listViewStyle';
let color = '#00a4dc'; let color = '#00a4dc';
let icon = 'notifications'; let icon = 'notifications';
if ('Error' == entry.Severity || 'Fatal' == entry.Severity || 'Warn' == entry.Severity) { if (entry.Severity == 'Error' || entry.Severity == 'Fatal' || entry.Severity == 'Warn') {
color = '#cc0000'; color = '#cc0000';
icon = 'notification_important'; icon = 'notification_important';
} }
@ -60,13 +60,13 @@ import 'listViewStyle';
} }
function reloadData(instance, elem, apiClient, startIndex, limit) { function reloadData(instance, elem, apiClient, startIndex, limit) {
if (null == startIndex) { if (startIndex == null) {
startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0'); startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0');
} }
limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7'); limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7');
const minDate = new Date(); const minDate = new Date();
const hasUserId = 'false' !== elem.getAttribute('data-useractivity'); const hasUserId = elem.getAttribute('data-useractivity') !== 'false';
// TODO: Use date-fns // TODO: Use date-fns
if (hasUserId) { if (hasUserId) {

View file

@ -1,6 +1,9 @@
define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, skinManager, backdrop, browser, page, appSettings, appHost, connectionManager) { define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, skinManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
'use strict'; 'use strict';
browser = browser.default || browser;
loading = loading.default || loading;
var appRouter = { var appRouter = {
showLocalLogin: function (serverId, manualLogin) { showLocalLogin: function (serverId, manualLogin) {
var pageName = manualLogin ? 'manuallogin' : 'login'; var pageName = manualLogin ? 'manuallogin' : 'login';
@ -231,8 +234,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
max /= 8; max /= 8;
max *= 1000000; max *= 1000000;
max *= 0.7; max *= 0.7;
max = parseInt(max); return parseInt(max, 10);
return max;
} }
} }
/* eslint-enable compat/compat */ /* eslint-enable compat/compat */

View file

@ -1,6 +1,8 @@
define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'globalize'], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) { define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'globalize'], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) {
'use strict'; 'use strict';
browser = browser.default || browser;
function getBaseProfileOptions(item) { function getBaseProfileOptions(item) {
var disableHlsVideoAudioCodecs = []; var disableHlsVideoAudioCodecs = [];
@ -47,7 +49,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder); profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder);
} else { } else {
var builderOpts = getBaseProfileOptions(item); var builderOpts = getBaseProfileOptions(item);
builderOpts.enableSsaRender = (item && !options.isRetry && 'allcomplexformats' !== appSettings.get('subtitleburnin')); builderOpts.enableSsaRender = (item && !options.isRetry && appSettings.get('subtitleburnin') !== 'allcomplexformats');
profile = profileBuilder(builderOpts); profile = profileBuilder(builderOpts);
} }
@ -370,7 +372,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
return window.NativeShell.AppHost.supports(command); return window.NativeShell.AppHost.supports(command);
} }
return -1 !== supportedFeatures.indexOf(command.toLowerCase()); return supportedFeatures.indexOf(command.toLowerCase()) !== -1;
}, },
preferVisualCards: browser.android || browser.chrome, preferVisualCards: browser.android || browser.chrome,
getSyncProfile: getSyncProfile, getSyncProfile: getSyncProfile,

View file

@ -277,7 +277,7 @@ import 'programStyles';
*/ */
function getImageWidth(shape, screenWidth, isOrientationLandscape) { function getImageWidth(shape, screenWidth, isOrientationLandscape) {
const imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); const imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape);
return Math.round(screenWidth / imagesPerRow) * 2; return Math.round(screenWidth / imagesPerRow);
} }
/** /**

View file

@ -73,7 +73,7 @@ import browser from 'browser';
if (ImageTag) { if (ImageTag) {
return apiClient.getScaledImageUrl(Id, { return apiClient.getScaledImageUrl(Id, {
maxWidth: maxWidth * 2, maxWidth: maxWidth,
tag: ImageTag, tag: ImageTag,
type: 'Chapter', type: 'Chapter',
index index
@ -104,9 +104,7 @@ import browser from 'browser';
const cardBoxCssClass = 'cardBox'; const cardBoxCssClass = 'cardBox';
const cardScalableClass = 'cardScalable'; const cardScalableClass = 'cardScalable';
const html = `<button type="button" class="${className}"${dataAttributes}><div class="${cardBoxCssClass}"><div class="${cardScalableClass}"><div class="cardPadder-${shape}"></div>${cardImageContainer}</div><div class="innerCardFooter">${nameHtml}</div></div></div></button>`; return `<button type="button" class="${className}"${dataAttributes}><div class="${cardBoxCssClass}"><div class="${cardScalableClass}"><div class="cardPadder-${shape}"></div>${cardImageContainer}</div><div class="innerCardFooter">${nameHtml}</div></div></div></button>`;
return html;
} }
export function buildChapterCards(item, chapters, options) { export function buildChapterCards(item, chapters, options) {

View file

@ -159,9 +159,9 @@
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label> <label>
<input type="checkbox" is="emby-checkbox" id="chkBlurhash" /> <input type="checkbox" is="emby-checkbox" id="chkBlurhash" />
<span>${EnableBlurhash}</span> <span>${EnableBlurHash}</span>
</label> </label>
<div class="fieldDescription checkboxFieldDescription">${EnableBlurhashHelp}</div> <div class="fieldDescription checkboxFieldDescription">${EnableBlurHashHelp}</div>
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">

View file

@ -1,5 +1,14 @@
define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'globalize', 'layoutManager', 'scrollStyles', 'emby-itemscontainer'], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) { import loading from 'loading';
'use strict'; import cardBuilder from 'cardBuilder';
import dom from 'dom';
import appHost from 'apphost';
import imageLoader from 'imageLoader';
import globalize from 'globalize';
import layoutManager from 'layoutManager';
import 'scrollStyles';
import 'emby-itemscontainer';
/* eslint-disable indent */
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
@ -94,8 +103,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
} }
function loadSection(elem, userId, topParentId, section, isSingleSection) { function loadSection(elem, userId, topParentId, section, isSingleSection) {
var screenWidth = dom.getWindowSize().innerWidth; const screenWidth = dom.getWindowSize().innerWidth;
var options = { const options = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending', SortOrder: 'Ascending',
Filters: 'IsFavorite', Filters: 'IsFavorite',
@ -118,9 +127,9 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
} }
} }
var promise; let promise;
if ('MusicArtist' === section.types) { if (section.types === 'MusicArtist') {
promise = ApiClient.getArtists(userId, options); promise = ApiClient.getArtists(userId, options);
} else { } else {
options.IncludeItemTypes = section.types; options.IncludeItemTypes = section.types;
@ -128,7 +137,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
} }
return promise.then(function (result) { return promise.then(function (result) {
var html = ''; let html = '';
if (result.Items.length) { if (result.Items.length) {
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) { if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
@ -144,7 +153,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
html += '</div>'; html += '</div>';
if (enableScrollX()) { if (enableScrollX()) {
var scrollXClass = 'scrollX hiddenScrollX'; let scrollXClass = 'scrollX hiddenScrollX';
if (layoutManager.tv) { if (layoutManager.tv) {
scrollXClass += ' smoothScrollX'; scrollXClass += ' smoothScrollX';
} }
@ -154,13 +163,13 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">'; html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
} }
var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle; let cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
cardLayout = false; cardLayout = false;
html += cardBuilder.getCardsHtml(result.Items, { html += cardBuilder.getCardsHtml(result.Items, {
preferThumb: section.preferThumb, preferThumb: section.preferThumb,
shape: section.shape, shape: section.shape,
centerText: section.centerText && !cardLayout, centerText: section.centerText && !cardLayout,
overlayText: false !== section.overlayText, overlayText: section.overlayText !== false,
showTitle: section.showTitle, showTitle: section.showTitle,
showParentTitle: section.showParentTitle, showParentTitle: section.showParentTitle,
scalable: true, scalable: true,
@ -179,10 +188,10 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
}); });
} }
function loadSections(page, userId, topParentId, types) { export function loadSections(page, userId, topParentId, types) {
loading.show(); loading.show();
var sections = getSections(); let sections = getSections();
var sectionid = getParameterByName('sectionid'); const sectionid = getParameterByName('sectionid');
if (sectionid) { if (sectionid) {
sections = sections.filter(function (s) { sections = sections.filter(function (s) {
@ -192,30 +201,28 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
if (types) { if (types) {
sections = sections.filter(function (s) { sections = sections.filter(function (s) {
return -1 !== types.indexOf(s.id); return types.indexOf(s.id) !== -1;
}); });
} }
var i; let elem = page.querySelector('.favoriteSections');
var length;
var elem = page.querySelector('.favoriteSections');
if (!elem.innerHTML) { if (!elem.innerHTML) {
var html = ''; let html = '';
for (i = 0, length = sections.length; i < length; i++) { for (let i = 0, length = sections.length; i < length; i++) {
html += '<div class="verticalSection section' + sections[i].id + '"></div>'; html += '<div class="verticalSection section' + sections[i].id + '"></div>';
} }
elem.innerHTML = html; elem.innerHTML = html;
} }
var promises = []; const promises = [];
for (i = 0, length = sections.length; i < length; i++) { for (let i = 0, length = sections.length; i < length; i++) {
var section = sections[i]; const section = sections[i];
elem = page.querySelector('.section' + section.id); elem = page.querySelector('.section' + section.id);
promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length)); promises.push(loadSection(elem, userId, topParentId, section, sections.length === 1));
} }
Promise.all(promises).then(function () { Promise.all(promises).then(function () {
@ -223,7 +230,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
}); });
} }
return { export default {
render: loadSections render: loadSections
}; };
});
/* eslint-enable indent */

View file

@ -21,7 +21,7 @@ import connectionManager from 'connectionManager';
if (!actionableParent || actionableParent.classList.contains('cardContent')) { if (!actionableParent || actionableParent.classList.contains('cardContent')) {
apiClient.getJSON(apiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { apiClient.getJSON(apiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) {
if (1 === items.length) { if (items.length === 1) {
return void appRouter.showItem(items[0]); return void appRouter.showItem(items[0]);
} }

View file

@ -1,6 +1,10 @@
define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-programcell', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'webcomponents'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) { define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-programcell', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'webcomponents'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
browser = browser.default || browser;
loading = loading.default || loading;
function showViewSettings(instance) { function showViewSettings(instance) {
require(['guide-settings-dialog'], function (guideSettingsDialog) { require(['guide-settings-dialog'], function (guideSettingsDialog) {
guideSettingsDialog.show(instance.categoryOptions).then(function () { guideSettingsDialog.show(instance.categoryOptions).then(function () {

View file

@ -1,23 +1,39 @@
define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (dom, loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) { import dom from 'dom';
'use strict'; import loading from 'loading';
import appHost from 'apphost';
import dialogHelper from 'dialogHelper';
import connectionManager from 'connectionManager';
import imageLoader from 'imageLoader';
import browser from 'browser';
import layoutManager from 'layoutManager';
import scrollHelper from 'scrollHelper';
import globalize from 'globalize';
import require from 'require';
import 'emby-checkbox';
import 'paper-icon-button-light';
import 'emby-button';
import 'formDialogStyle';
import 'cardStyle';
var enableFocusTransform = !browser.slow && !browser.edge; /* eslint-disable indent */
var currentItemId; const enableFocusTransform = !browser.slow && !browser.edge;
var currentItemType;
var currentResolve; let currentItemId;
var currentReject; let currentItemType;
var hasChanges = false; let currentResolve;
let currentReject;
let hasChanges = false;
// These images can be large and we're seeing memory problems in safari // These images can be large and we're seeing memory problems in safari
var browsableImagePageSize = browser.slow ? 6 : 30; const browsableImagePageSize = browser.slow ? 6 : 30;
var browsableImageStartIndex = 0; let browsableImageStartIndex = 0;
var browsableImageType = 'Primary'; let browsableImageType = 'Primary';
var selectedProvider; let selectedProvider;
function getBaseRemoteOptions() { function getBaseRemoteOptions() {
var options = {}; const options = {};
options.itemId = currentItemId; options.itemId = currentItemId;
@ -27,14 +43,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
function reloadBrowsableImages(page, apiClient) { function reloadBrowsableImages(page, apiClient) {
loading.show(); loading.show();
var options = getBaseRemoteOptions(); const options = getBaseRemoteOptions();
options.type = browsableImageType; options.type = browsableImageType;
options.startIndex = browsableImageStartIndex; options.startIndex = browsableImageStartIndex;
options.limit = browsableImagePageSize; options.limit = browsableImagePageSize;
options.IncludeAllLanguages = page.querySelector('#chkAllLanguages').checked; options.IncludeAllLanguages = page.querySelector('#chkAllLanguages').checked;
var provider = selectedProvider || ''; const provider = selectedProvider || '';
if (provider) { if (provider) {
options.ProviderName = provider; options.ProviderName = provider;
@ -45,11 +61,11 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
page.querySelector('#selectBrowsableImageType').value = browsableImageType; page.querySelector('#selectBrowsableImageType').value = browsableImageType;
var providersHtml = result.Providers.map(function (p) { const providersHtml = result.Providers.map(function (p) {
return '<option value="' + p + '">' + p + '</option>'; return '<option value="' + p + '">' + p + '</option>';
}); });
var selectImageProvider = page.querySelector('#selectImageProvider'); const selectImageProvider = page.querySelector('#selectImageProvider');
selectImageProvider.innerHTML = '<option value="">' + globalize.translate('All') + '</option>' + providersHtml; selectImageProvider.innerHTML = '<option value="">' + globalize.translate('All') + '</option>' + providersHtml;
selectImageProvider.value = provider; selectImageProvider.value = provider;
@ -60,18 +76,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
function renderRemoteImages(page, apiClient, imagesResult, imageType, startIndex, limit) { function renderRemoteImages(page, apiClient, imagesResult, imageType, startIndex, limit) {
page.querySelector('.availableImagesPaging').innerHTML = getPagingHtml(startIndex, limit, imagesResult.TotalRecordCount); page.querySelector('.availableImagesPaging').innerHTML = getPagingHtml(startIndex, limit, imagesResult.TotalRecordCount);
var html = ''; let html = '';
for (var i = 0, length = imagesResult.Images.length; i < length; i++) { for (let i = 0, length = imagesResult.Images.length; i < length; i++) {
html += getRemoteImageHtml(imagesResult.Images[i], imageType, apiClient); html += getRemoteImageHtml(imagesResult.Images[i], imageType, apiClient);
} }
var availableImagesList = page.querySelector('.availableImagesList'); const availableImagesList = page.querySelector('.availableImagesList');
availableImagesList.innerHTML = html; availableImagesList.innerHTML = html;
imageLoader.lazyChildren(availableImagesList); imageLoader.lazyChildren(availableImagesList);
var btnNextPage = page.querySelector('.btnNextPage'); const btnNextPage = page.querySelector('.btnNextPage');
var btnPreviousPage = page.querySelector('.btnPreviousPage'); const btnPreviousPage = page.querySelector('.btnPreviousPage');
if (btnNextPage) { if (btnNextPage) {
btnNextPage.addEventListener('click', function () { btnNextPage.addEventListener('click', function () {
@ -89,18 +105,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
} }
function getPagingHtml(startIndex, limit, totalRecordCount) { function getPagingHtml(startIndex, limit, totalRecordCount) {
var html = ''; let html = '';
var recordsEnd = Math.min(startIndex + limit, totalRecordCount); const recordsEnd = Math.min(startIndex + limit, totalRecordCount);
// 20 is the minimum page size // 20 is the minimum page size
var showControls = totalRecordCount > limit; const showControls = totalRecordCount > limit;
html += '<div class="listPaging">'; html += '<div class="listPaging">';
html += '<span style="margin-right: 10px;">'; html += '<span style="margin-right: 10px;">';
var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; const startAtDisplay = totalRecordCount ? startIndex + 1 : 0;
html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount); html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount);
html += '</span>'; html += '</span>';
@ -119,7 +135,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
} }
function downloadRemoteImage(page, apiClient, url, type, provider) { function downloadRemoteImage(page, apiClient, url, type, provider) {
var options = getBaseRemoteOptions(); const options = getBaseRemoteOptions();
options.Type = type; options.Type = type;
options.ImageUrl = url; options.ImageUrl = url;
@ -129,7 +145,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
apiClient.downloadRemoteImage(options).then(function () { apiClient.downloadRemoteImage(options).then(function () {
hasChanges = true; hasChanges = true;
var dlg = dom.parentWithClass(page, 'dialog'); const dlg = dom.parentWithClass(page, 'dialog');
dialogHelper.close(dlg); dialogHelper.close(dlg);
}); });
} }
@ -139,17 +155,17 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
} }
function getRemoteImageHtml(image, imageType, apiClient) { function getRemoteImageHtml(image, imageType, apiClient) {
var tagName = layoutManager.tv ? 'button' : 'div'; const tagName = layoutManager.tv ? 'button' : 'div';
var enableFooterButtons = !layoutManager.tv; const enableFooterButtons = !layoutManager.tv;
// TODO move card creation code to Card component // TODO move card creation code to Card component
var html = ''; let html = '';
var cssClass = 'card scalableCard imageEditorCard'; let cssClass = 'card scalableCard imageEditorCard';
var cardBoxCssClass = 'cardBox visualCardBox'; const cardBoxCssClass = 'cardBox visualCardBox';
var shape = 'backdrop'; let shape;
if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') { if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') {
shape = 'backdrop'; shape = 'backdrop';
} else if (imageType === 'Banner') { } else if (imageType === 'Banner') {
@ -284,14 +300,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
}); });
page.addEventListener('click', function (e) { page.addEventListener('click', function (e) {
var btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage'); const btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage');
if (btnDownloadRemoteImage) { if (btnDownloadRemoteImage) {
var card = dom.parentWithClass(btnDownloadRemoteImage, 'card'); const card = dom.parentWithClass(btnDownloadRemoteImage, 'card');
downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider')); downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider'));
return; return;
} }
var btnImageCard = dom.parentWithClass(e.target, 'btnImageCard'); const btnImageCard = dom.parentWithClass(e.target, 'btnImageCard');
if (btnImageCard) { if (btnImageCard) {
downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider')); downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider'));
} }
@ -302,12 +318,12 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
loading.show(); loading.show();
require(['text!./imageDownloader.template.html'], function (template) { require(['text!./imageDownloader.template.html'], function (template) {
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
currentItemId = itemId; currentItemId = itemId;
currentItemType = itemType; currentItemType = itemType;
var dialogOptions = { const dialogOptions = {
removeOnClose: true removeOnClose: true
}; };
@ -317,7 +333,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
dialogOptions.size = 'small'; dialogOptions.size = 'small';
} }
var dlg = dialogHelper.createDialog(dialogOptions); const dlg = dialogHelper.createDialog(dialogOptions);
dlg.innerHTML = globalize.translateHtml(template, 'core'); dlg.innerHTML = globalize.translateHtml(template, 'core');
@ -330,7 +346,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
dialogHelper.open(dlg); dialogHelper.open(dlg);
var editorContent = dlg.querySelector('.formDialogContent'); const editorContent = dlg.querySelector('.formDialogContent');
initEditor(editorContent, apiClient); initEditor(editorContent, apiClient);
dlg.querySelector('.btnCancel').addEventListener('click', function () { dlg.querySelector('.btnCancel').addEventListener('click', function () {
@ -342,7 +358,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
} }
function onDialogClosed() { function onDialogClosed() {
var dlg = this; const dlg = this;
if (layoutManager.tv) { if (layoutManager.tv) {
scrollHelper.centerFocus.off(dlg, false); scrollHelper.centerFocus.off(dlg, false);
@ -356,18 +372,20 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
} }
} }
return { export function show(itemId, serverId, itemType, imageType) {
show: function (itemId, serverId, itemType, imageType) { return new Promise(function (resolve, reject) {
return new Promise(function (resolve, reject) { currentResolve = resolve;
currentResolve = resolve; currentReject = reject;
currentReject = reject; hasChanges = false;
hasChanges = false; browsableImageStartIndex = 0;
browsableImageStartIndex = 0; browsableImageType = imageType || 'Primary';
browsableImageType = imageType || 'Primary'; selectedProvider = null;
selectedProvider = null; showEditor(itemId, serverId, itemType);
});
}
showEditor(itemId, serverId, itemType); export default {
}); show: show
} };
};
}); /* eslint-enable indent */

View file

@ -16,7 +16,7 @@ import 'emby-input';
return { return {
Type: type, Type: type,
MinWidth: 0, MinWidth: 0,
Limit: 'Primary' === type ? 1 : 0 Limit: type === 'Primary' ? 1 : 0
}; };
} }

View file

@ -1,13 +1,29 @@
define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 'focusManager', 'globalize', 'scrollHelper', 'imageLoader', 'require', 'browser', 'apphost', 'cardStyle', 'formDialogStyle', 'emby-button', 'paper-icon-button-light', 'css!./imageeditor'], function (dialogHelper, connectionManager, loading, dom, layoutManager, focusManager, globalize, scrollHelper, imageLoader, require, browser, appHost) { import dialogHelper from 'dialogHelper';
'use strict'; import connectionManager from 'connectionManager';
import loading from 'loading';
import dom from 'dom';
import layoutManager from 'layoutManager';
import focusManager from 'focusManager';
import globalize from 'globalize';
import scrollHelper from 'scrollHelper';
import imageLoader from 'imageLoader';
import browser from 'browser';
import appHost from 'apphost';
import 'cardStyle';
import 'formDialogStyle';
import 'emby-button';
import 'paper-icon-button-light';
import 'css!./imageeditor';
var enableFocusTransform = !browser.slow && !browser.edge; /* eslint-disable indent */
var currentItem; const enableFocusTransform = !browser.slow && !browser.edge;
var hasChanges = false;
let currentItem;
let hasChanges = false;
function getBaseRemoteOptions() { function getBaseRemoteOptions() {
var options = {}; const options = {};
options.itemId = currentItem.Id; options.itemId = currentItem.Id;
@ -17,7 +33,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
function reload(page, item, focusContext) { function reload(page, item, focusContext) {
loading.show(); loading.show();
var apiClient; let apiClient;
if (item) { if (item) {
apiClient = connectionManager.getApiClient(item.ServerId); apiClient = connectionManager.getApiClient(item.ServerId);
@ -32,7 +48,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
function addListeners(container, className, eventName, fn) { function addListeners(container, className, eventName, fn) {
container.addEventListener(eventName, function (e) { container.addEventListener(eventName, function (e) {
var elem = dom.parentWithClass(e.target, className); const elem = dom.parentWithClass(e.target, className);
if (elem) { if (elem) {
fn.call(elem, e); fn.call(elem, e);
} }
@ -43,8 +59,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
currentItem = item; currentItem = item;
apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) { apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) {
var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages'); const btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) { for (let i = 0, length = btnBrowseAllImages.length; i < length; i++) {
if (providers.length) { if (providers.length) {
btnBrowseAllImages[i].classList.remove('hide'); btnBrowseAllImages[i].classList.remove('hide');
} else { } else {
@ -87,10 +103,10 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) { function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) {
// TODO move card creation code to Card component // TODO move card creation code to Card component
var html = ''; let html = '';
var cssClass = 'card scalableCard imageEditorCard'; let cssClass = 'card scalableCard imageEditorCard';
var cardBoxCssClass = 'cardBox visualCardBox'; const cardBoxCssClass = 'cardBox visualCardBox';
cssClass += ' backdropCard backdropCard-scalable'; cssClass += ' backdropCard backdropCard-scalable';
@ -120,7 +136,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
html += '<div class="cardContent">'; html += '<div class="cardContent">';
var imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize }); const imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize });
html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center center;background-size:contain;"></div>'; html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center center;background-size:contain;"></div>';
@ -172,7 +188,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function deleteImage(context, itemId, type, index, apiClient, enableConfirmation) { function deleteImage(context, itemId, type, index, apiClient, enableConfirmation) {
var afterConfirm = function () { const afterConfirm = function () {
apiClient.deleteItemImage(itemId, type, index).then(function () { apiClient.deleteItemImage(itemId, type, index).then(function () {
hasChanges = true; hasChanges = true;
reload(context); reload(context);
@ -184,8 +200,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
return; return;
} }
require(['confirm'], function (confirm) { import('confirm').then(({default: confirm}) => {
confirm.default({ confirm({
text: globalize.translate('ConfirmDeleteImage'), text: globalize.translate('ConfirmDeleteImage'),
confirmText: globalize.translate('Delete'), confirmText: globalize.translate('Delete'),
@ -200,27 +216,26 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
hasChanges = true; hasChanges = true;
reload(context, null, focusContext); reload(context, null, focusContext);
}, function () { }, function () {
require(['alert'], function (alert) { import('alert').then(({default: alert}) => {
alert(globalize.translate('DefaultErrorMessage')); alert(globalize.translate('ErrorDefault'));
}); });
}); });
} }
function renderImages(page, item, apiClient, images, imageProviders, elem) { function renderImages(page, item, apiClient, images, imageProviders, elem) {
var html = ''; let html = '';
var imageSize = 300; let imageSize = 300;
var windowSize = dom.getWindowSize(); const windowSize = dom.getWindowSize();
if (windowSize.innerWidth >= 1280) { if (windowSize.innerWidth >= 1280) {
imageSize = Math.round(windowSize.innerWidth / 4); imageSize = Math.round(windowSize.innerWidth / 4);
} }
var tagName = layoutManager.tv ? 'button' : 'div'; const tagName = layoutManager.tv ? 'button' : 'div';
var enableFooterButtons = !layoutManager.tv; const enableFooterButtons = !layoutManager.tv;
for (var i = 0, length = images.length; i < length; i++) {
var image = images[i];
for (let i = 0, length = images.length; i < length; i++) {
const image = images[i];
html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons); html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons);
} }
@ -229,7 +244,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function renderStandardImages(page, apiClient, item, imageInfos, imageProviders) { function renderStandardImages(page, apiClient, item, imageInfos, imageProviders) {
var images = imageInfos.filter(function (i) { const images = imageInfos.filter(function (i) {
return i.ImageType !== 'Screenshot' && i.ImageType !== 'Backdrop' && i.ImageType !== 'Chapter'; return i.ImageType !== 'Screenshot' && i.ImageType !== 'Backdrop' && i.ImageType !== 'Chapter';
}); });
@ -237,7 +252,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) { function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) {
var images = imageInfos.filter(function (i) { const images = imageInfos.filter(function (i) {
return i.ImageType === 'Backdrop'; return i.ImageType === 'Backdrop';
}).sort(function (a, b) { }).sort(function (a, b) {
return a.ImageIndex - b.ImageIndex; return a.ImageIndex - b.ImageIndex;
@ -252,7 +267,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) { function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) {
var images = imageInfos.filter(function (i) { const images = imageInfos.filter(function (i) {
return i.ImageType === 'Screenshot'; return i.ImageType === 'Screenshot';
}).sort(function (a, b) { }).sort(function (a, b) {
return a.ImageIndex - b.ImageIndex; return a.ImageIndex - b.ImageIndex;
@ -267,7 +282,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function showImageDownloader(page, imageType) { function showImageDownloader(page, imageType) {
require(['imageDownloader'], function (ImageDownloader) { import('imageDownloader').then(({default: ImageDownloader}) => {
ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () { ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () {
hasChanges = true; hasChanges = true;
reload(page); reload(page);
@ -276,17 +291,17 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function showActionSheet(context, imageCard) { function showActionSheet(context, imageCard) {
var itemId = imageCard.getAttribute('data-id'); const itemId = imageCard.getAttribute('data-id');
var serverId = imageCard.getAttribute('data-serverid'); const serverId = imageCard.getAttribute('data-serverid');
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
var type = imageCard.getAttribute('data-imagetype'); const type = imageCard.getAttribute('data-imagetype');
var index = parseInt(imageCard.getAttribute('data-index')); const index = parseInt(imageCard.getAttribute('data-index'));
var providerCount = parseInt(imageCard.getAttribute('data-providers')); const providerCount = parseInt(imageCard.getAttribute('data-providers'));
var numImages = parseInt(imageCard.getAttribute('data-numimages')); const numImages = parseInt(imageCard.getAttribute('data-numimages'));
require(['actionsheet'], function (actionSheet) { import('actionsheet').then(({default: actionSheet}) => {
var commands = []; const commands = [];
commands.push({ commands.push({
name: globalize.translate('Delete'), name: globalize.translate('Delete'),
@ -343,9 +358,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
function initEditor(context, options) { function initEditor(context, options) {
var uploadButtons = context.querySelectorAll('.btnOpenUploadMenu'); const uploadButtons = context.querySelectorAll('.btnOpenUploadMenu');
var isFileInputSupported = appHost.supports('fileinput'); const isFileInputSupported = appHost.supports('fileinput');
for (var i = 0, length = uploadButtons.length; i < length; i++) { for (let i = 0, length = uploadButtons.length; i < length; i++) {
if (isFileInputSupported) { if (isFileInputSupported) {
uploadButtons[i].classList.remove('hide'); uploadButtons[i].classList.remove('hide');
} else { } else {
@ -354,9 +369,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
} }
addListeners(context, 'btnOpenUploadMenu', 'click', function () { addListeners(context, 'btnOpenUploadMenu', 'click', function () {
var imageType = this.getAttribute('data-imagetype'); const imageType = this.getAttribute('data-imagetype');
require(['imageUploader'], function (imageUploader) { import('imageUploader').then(({default: imageUploader}) => {
imageUploader.show({ imageUploader.show({
theme: options.theme, theme: options.theme,
@ -386,32 +401,32 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
}); });
addListeners(context, 'btnDeleteImage', 'click', function () { addListeners(context, 'btnDeleteImage', 'click', function () {
var type = this.getAttribute('data-imagetype'); const type = this.getAttribute('data-imagetype');
var index = this.getAttribute('data-index'); let index = this.getAttribute('data-index');
index = index === 'null' ? null : parseInt(index); index = index === 'null' ? null : parseInt(index);
var apiClient = connectionManager.getApiClient(currentItem.ServerId); const apiClient = connectionManager.getApiClient(currentItem.ServerId);
deleteImage(context, currentItem.Id, type, index, apiClient, true); deleteImage(context, currentItem.Id, type, index, apiClient, true);
}); });
addListeners(context, 'btnMoveImage', 'click', function () { addListeners(context, 'btnMoveImage', 'click', function () {
var type = this.getAttribute('data-imagetype'); const type = this.getAttribute('data-imagetype');
var index = this.getAttribute('data-index'); const index = this.getAttribute('data-index');
var newIndex = this.getAttribute('data-newindex'); const newIndex = this.getAttribute('data-newindex');
var apiClient = connectionManager.getApiClient(currentItem.ServerId); const apiClient = connectionManager.getApiClient(currentItem.ServerId);
moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer')); moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer'));
}); });
} }
function showEditor(options, resolve, reject) { function showEditor(options, resolve, reject) {
var itemId = options.itemId; const itemId = options.itemId;
var serverId = options.serverId; const serverId = options.serverId;
loading.show(); loading.show();
require(['text!./imageeditor.template.html'], function (template) { import('text!./imageeditor.template.html').then(({default: template}) => {
var apiClient = connectionManager.getApiClient(serverId); const apiClient = connectionManager.getApiClient(serverId);
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
var dialogOptions = { const dialogOptions = {
removeOnClose: true removeOnClose: true
}; };
@ -421,7 +436,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
dialogOptions.size = 'small'; dialogOptions.size = 'small';
} }
var dlg = dialogHelper.createDialog(dialogOptions); const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog'); dlg.classList.add('formDialog');
@ -459,13 +474,15 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
}); });
} }
return { export function show (options) {
show: function (options) { return new Promise(function (resolve, reject) {
return new Promise(function (resolve, reject) { hasChanges = false;
hasChanges = false; showEditor(options, resolve, reject);
});
}
showEditor(options, resolve, reject); export default {
}); show
} };
};
}); /* eslint-enable indent */

View file

@ -205,7 +205,7 @@ import 'css!./style';
/* eslint-enable indent */ /* eslint-enable indent */
export default { export default {
serLazyImage: setLazyImage, setLazyImage: setLazyImage,
fillImages: fillImages, fillImages: fillImages,
fillImage: fillImage, fillImage: fillImage,
lazyImage: lazyImage, lazyImage: lazyImage,

View file

@ -1,342 +1,350 @@
define(['apphost', 'globalize'], function (appHost, globalize) { import appHost from 'apphost';
'use strict'; import globalize from 'globalize';
function getDisplayName(item, options = {}) { export function getDisplayName(item, options = {}) {
if (!item) { if (!item) {
throw new Error('null item passed into getDisplayName'); throw new Error('null item passed into getDisplayName');
}
if (item.Type === 'Timer') {
item = item.ProgramInfo || item;
}
let name = ((item.Type === 'Program' || item.Type === 'Recording') && (item.IsSeries || item.EpisodeTitle) ? item.EpisodeTitle : item.Name) || '';
if (item.Type === 'TvChannel') {
if (item.ChannelNumber) {
return item.ChannelNumber + ' ' + name;
} }
if (item.Type === 'Timer') {
item = item.ProgramInfo || item;
}
var name = ((item.Type === 'Program' || item.Type === 'Recording') && (item.IsSeries || item.EpisodeTitle) ? item.EpisodeTitle : item.Name) || '';
if (item.Type === 'TvChannel') {
if (item.ChannelNumber) {
return item.ChannelNumber + ' ' + name;
}
return name;
}
if (item.Type === 'Episode' && item.ParentIndexNumber === 0) {
name = globalize.translate('ValueSpecialEpisodeName', name);
} else if ((item.Type === 'Episode' || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) {
var displayIndexNumber = item.IndexNumber;
var number = displayIndexNumber;
var nameSeparator = ' - ';
if (options.includeParentInfo !== false) {
number = 'S' + item.ParentIndexNumber + ':E' + number;
} else {
nameSeparator = '. ';
}
if (item.IndexNumberEnd) {
displayIndexNumber = item.IndexNumberEnd;
number += '-' + displayIndexNumber;
}
if (number) {
name = name ? (number + nameSeparator + name) : number;
}
}
return name; return name;
} }
if (item.Type === 'Episode' && item.ParentIndexNumber === 0) {
name = globalize.translate('ValueSpecialEpisodeName', name);
} else if ((item.Type === 'Episode' || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) {
let displayIndexNumber = item.IndexNumber;
function supportsAddingToCollection(item) { let number = displayIndexNumber;
var invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer']; let nameSeparator = ' - ';
if (item.Type === 'Recording') { if (options.includeParentInfo !== false) {
if (item.Status !== 'Completed') { number = 'S' + item.ParentIndexNumber + ':E' + number;
return false; } else {
} nameSeparator = '. ';
} }
return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item); if (item.IndexNumberEnd) {
displayIndexNumber = item.IndexNumberEnd;
number += '-' + displayIndexNumber;
}
if (number) {
name = name ? (number + nameSeparator + name) : number;
}
} }
function supportsAddingToPlaylist(item) { return name;
if (item.Type === 'Program') { }
return false;
}
if (item.Type === 'TvChannel') {
return false;
}
if (item.Type === 'Timer') {
return false;
}
if (item.Type === 'SeriesTimer') {
return false;
}
if (item.MediaType === 'Photo') {
return false;
}
if (item.Type === 'Recording') { export function supportsAddingToCollection(item) {
if (item.Status !== 'Completed') { const invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer'];
return false;
}
}
if (isLocalItem(item)) { if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false; return false;
} }
if (item.CollectionType === 'livetv') {
return false;
}
return item.MediaType || item.IsFolder || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'MusicArtist';
} }
function canEdit(user, item) { return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item);
var itemType = item.Type; }
if (itemType === 'UserRootFolder' || itemType === 'UserView') { export function supportsAddingToPlaylist(item) {
return false; if (item.Type === 'Program') {
} return false;
}
if (itemType === 'Program') { if (item.Type === 'TvChannel') {
return false; return false;
} }
if (item.Type === 'Timer') {
if (itemType === 'Timer') { return false;
return false; }
} if (item.Type === 'SeriesTimer') {
return false;
if (itemType === 'SeriesTimer') { }
return false; if (item.MediaType === 'Photo') {
} return false;
if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false;
}
}
if (isLocalItem(item)) {
return false;
}
return user.Policy.IsAdministrator;
} }
function isLocalItem(item) { if (item.Type === 'Recording') {
if (item && item.Id && item.Id.indexOf('local') === 0) { if (item.Status !== 'Completed') {
return false;
}
}
if (isLocalItem(item)) {
return false;
}
if (item.CollectionType === 'livetv') {
return false;
}
return item.MediaType || item.IsFolder || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'MusicArtist';
}
export function canEdit(user, item) {
const itemType = item.Type;
if (itemType === 'UserRootFolder' || itemType === 'UserView') {
return false;
}
if (itemType === 'Program') {
return false;
}
if (itemType === 'Timer') {
return false;
}
if (itemType === 'SeriesTimer') {
return false;
}
if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false;
}
}
if (isLocalItem(item)) {
return false;
}
return user.Policy.IsAdministrator;
}
export function isLocalItem(item) {
if (item && item.Id && item.Id.indexOf('local') === 0) {
return true;
}
return false;
}
export function canIdentify (user, item) {
const itemType = item.Type;
if (itemType === 'Movie' ||
itemType === 'Trailer' ||
itemType === 'Series' ||
itemType === 'BoxSet' ||
itemType === 'Person' ||
itemType === 'Book' ||
itemType === 'MusicAlbum' ||
itemType === 'MusicArtist' ||
itemType === 'MusicVideo') {
if (user.Policy.IsAdministrator) {
if (!isLocalItem(item)) {
return true;
}
}
}
return false;
}
export function canEditImages (user, item) {
const itemType = item.Type;
if (item.MediaType === 'Photo') {
return false;
}
if (itemType === 'UserView') {
if (user.Policy.IsAdministrator) {
return true; return true;
} }
return false; return false;
} }
return { if (item.Type === 'Recording') {
getDisplayName: getDisplayName, if (item.Status !== 'Completed') {
supportsAddingToCollection: supportsAddingToCollection,
supportsAddingToPlaylist: supportsAddingToPlaylist,
isLocalItem: isLocalItem,
canIdentify: function (user, item) {
var itemType = item.Type;
if (itemType === 'Movie' ||
itemType === 'Trailer' ||
itemType === 'Series' ||
itemType === 'BoxSet' ||
itemType === 'Person' ||
itemType === 'Book' ||
itemType === 'MusicAlbum' ||
itemType === 'MusicArtist' ||
itemType === 'MusicVideo') {
if (user.Policy.IsAdministrator) {
if (!isLocalItem(item)) {
return true;
}
}
}
return false; return false;
}, }
}
canEdit: canEdit, return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item);
}
canEditImages: function (user, item) { export function canSync (user, item) {
var itemType = item.Type; if (user && !user.Policy.EnableContentDownloading) {
return false;
}
if (item.MediaType === 'Photo') { if (isLocalItem(item)) {
return false; return false;
} }
if (itemType === 'UserView') { return item.SupportsSync;
if (user.Policy.IsAdministrator) { }
return true;
}
return false;
}
if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false;
}
}
return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item);
},
canSync: function (user, item) {
if (user && !user.Policy.EnableContentDownloading) {
return false;
}
if (isLocalItem(item)) {
return false;
}
return item.SupportsSync;
},
canShare: function (item, user) {
if (item.Type === 'Program') {
return false;
}
if (item.Type === 'TvChannel') {
return false;
}
if (item.Type === 'Timer') {
return false;
}
if (item.Type === 'SeriesTimer') {
return false;
}
if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false;
}
}
if (isLocalItem(item)) {
return false;
}
return user.Policy.EnablePublicSharing && appHost.supports('sharing');
},
enableDateAddedDisplay: function (item) {
return !item.IsFolder && item.MediaType && item.Type !== 'Program' && item.Type !== 'TvChannel' && item.Type !== 'Trailer';
},
canMarkPlayed: function (item) {
if (item.Type === 'Program') {
return false;
}
if (item.MediaType === 'Video') {
if (item.Type !== 'TvChannel') {
return true;
}
} else if (item.MediaType === 'Audio') {
if (item.Type === 'AudioPodcast') {
return true;
}
if (item.Type === 'AudioBook') {
return true;
}
}
if (item.Type === 'Series' ||
item.Type === 'Season' ||
item.Type === 'BoxSet' ||
item.MediaType === 'Book' ||
item.MediaType === 'Recording') {
return true;
}
export function canShare (item, user) {
if (item.Type === 'Program') {
return false;
}
if (item.Type === 'TvChannel') {
return false;
}
if (item.Type === 'Timer') {
return false;
}
if (item.Type === 'SeriesTimer') {
return false;
}
if (item.Type === 'Recording') {
if (item.Status !== 'Completed') {
return false; return false;
}, }
}
if (isLocalItem(item)) {
return false;
}
return user.Policy.EnablePublicSharing && appHost.supports('sharing');
}
canRate: function (item) { export function enableDateAddedDisplay (item) {
if (item.Type === 'Program' return !item.IsFolder && item.MediaType && item.Type !== 'Program' && item.Type !== 'TvChannel' && item.Type !== 'Trailer';
|| item.Type === 'Timer' }
|| item.Type === 'SeriesTimer'
|| item.Type === 'CollectionFolder'
|| item.Type === 'UserView'
|| item.Type === 'Channel'
|| !item.UserData) {
return false;
}
return true; export function canMarkPlayed (item) {
}, if (item.Type === 'Program') {
return false;
canConvert: function (item, user) { }
if (!user.Policy.EnableMediaConversion) {
return false;
}
if (isLocalItem(item)) {
return false;
}
var mediaType = item.MediaType;
if (mediaType === 'Book' || mediaType === 'Photo' || mediaType === 'Audio') {
return false;
}
var collectionType = item.CollectionType;
if (collectionType === 'livetv') {
return false;
}
var type = item.Type;
if (type === 'Channel' || type === 'Person' || type === 'Year' || type === 'Program' || type === 'Timer' || type === 'SeriesTimer') {
return false;
}
if (item.LocationType === 'Virtual' && !item.IsFolder) {
return false;
}
if (item.IsPlaceHolder) {
return false;
}
return true;
},
canRefreshMetadata: function (item, user) {
if (user.Policy.IsAdministrator) {
var collectionType = item.CollectionType;
if (collectionType === 'livetv') {
return false;
}
if (item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' && item.Type !== 'TvChannel' && !(item.Type === 'Recording' && item.Status !== 'Completed')) {
if (!isLocalItem(item)) {
return true;
}
}
}
return false;
},
supportsMediaSourceSelection: function (item) {
if (item.MediaType !== 'Video') {
return false;
}
if (item.Type === 'TvChannel') {
return false;
}
if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) {
return false;
}
if (item.EnableMediaSourceDisplay === false) {
return false;
}
if (item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library') {
return false;
}
if (item.MediaType === 'Video') {
if (item.Type !== 'TvChannel') {
return true; return true;
} }
}; } else if (item.MediaType === 'Audio') {
}); if (item.Type === 'AudioPodcast') {
return true;
}
if (item.Type === 'AudioBook') {
return true;
}
}
if (item.Type === 'Series' ||
item.Type === 'Season' ||
item.Type === 'BoxSet' ||
item.MediaType === 'Book' ||
item.MediaType === 'Recording') {
return true;
}
return false;
}
export function canRate (item) {
if (item.Type === 'Program'
|| item.Type === 'Timer'
|| item.Type === 'SeriesTimer'
|| item.Type === 'CollectionFolder'
|| item.Type === 'UserView'
|| item.Type === 'Channel'
|| !item.UserData) {
return false;
}
return true;
}
export function canConvert (item, user) {
if (!user.Policy.EnableMediaConversion) {
return false;
}
if (isLocalItem(item)) {
return false;
}
const mediaType = item.MediaType;
if (mediaType === 'Book' || mediaType === 'Photo' || mediaType === 'Audio') {
return false;
}
const collectionType = item.CollectionType;
if (collectionType === 'livetv') {
return false;
}
const type = item.Type;
if (type === 'Channel' || type === 'Person' || type === 'Year' || type === 'Program' || type === 'Timer' || type === 'SeriesTimer') {
return false;
}
if (item.LocationType === 'Virtual' && !item.IsFolder) {
return false;
}
if (item.IsPlaceHolder) {
return false;
}
return true;
}
export function canRefreshMetadata (item, user) {
if (user.Policy.IsAdministrator) {
const collectionType = item.CollectionType;
if (collectionType === 'livetv') {
return false;
}
if (item.Type !== 'Timer' && item.Type !== 'SeriesTimer' && item.Type !== 'Program' && item.Type !== 'TvChannel' && !(item.Type === 'Recording' && item.Status !== 'Completed')) {
if (!isLocalItem(item)) {
return true;
}
}
}
return false;
}
export function supportsMediaSourceSelection (item) {
if (item.MediaType !== 'Video') {
return false;
}
if (item.Type === 'TvChannel') {
return false;
}
if (!item.MediaSources || (item.MediaSources.length === 1 && item.MediaSources[0].Type === 'Placeholder')) {
return false;
}
if (item.EnableMediaSourceDisplay === false) {
return false;
}
if (item.EnableMediaSourceDisplay == null && item.SourceType && item.SourceType !== 'Library') {
return false;
}
return true;
}
export default {
getDisplayName: getDisplayName,
supportsAddingToCollection: supportsAddingToCollection,
supportsAddingToPlaylist: supportsAddingToPlaylist,
isLocalItem: isLocalItem,
canIdentify: canIdentify,
canEdit: canEdit,
canEditImages: canEditImages,
canSync: canSync,
canShare: canShare,
enableDateAddedDisplay: enableDateAddedDisplay,
canMarkPlayed: canMarkPlayed,
canRate: canRate,
canConvert: canConvert,
canRefreshMetadata: canRefreshMetadata,
supportsMediaSourceSelection: supportsMediaSourceSelection
};

View file

@ -1,6 +1,8 @@
define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) { define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
function onUserDataChanged(e, apiClient, userData) { function onUserDataChanged(e, apiClient, userData) {
var instance = this; var instance = this;

View file

@ -1,6 +1,8 @@
define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) { define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) {
'use strict'; 'use strict';
browser = browser.default || browser;
function setLayout(instance, layout, selectedLayout) { function setLayout(instance, layout, selectedLayout) {
if (layout === selectedLayout) { if (layout === selectedLayout) {
instance[layout] = true; instance[layout] = true;

View file

@ -219,7 +219,7 @@ import 'emby-input';
html += '<div class="flex align-items-center" style="margin:1.5em 0 .5em;">'; html += '<div class="flex align-items-center" style="margin:1.5em 0 .5em;">';
html += '<h3 class="checkboxListLabel" style="margin:0;">' + globalize.translate('HeaderTypeImageFetchers', availableTypeOptions.Type) + '</h3>'; html += '<h3 class="checkboxListLabel" style="margin:0;">' + globalize.translate('HeaderTypeImageFetchers', availableTypeOptions.Type) + '</h3>';
const supportedImageTypes = availableTypeOptions.SupportedImageTypes || []; const supportedImageTypes = availableTypeOptions.SupportedImageTypes || [];
if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && 'Primary' !== supportedImageTypes[0]) { if (supportedImageTypes.length > 1 || supportedImageTypes.length === 1 && supportedImageTypes[0] !== 'Primary') {
html += '<button is="emby-button" class="raised btnImageOptionsForType" type="button" style="margin-left:1.5em;font-size:90%;"><span>' + globalize.translate('HeaderFetcherSettings') + '</span></button>'; html += '<button is="emby-button" class="raised btnImageOptionsForType" type="button" style="margin-left:1.5em;font-size:90%;"><span>' + globalize.translate('HeaderFetcherSettings') + '</span></button>';
} }
html += '</div>'; html += '</div>';
@ -362,7 +362,7 @@ import 'emby-input';
TypeOptions: [] TypeOptions: []
}; };
currentAvailableOptions = null; currentAvailableOptions = null;
const isNewLibrary = null === libraryOptions; const isNewLibrary = libraryOptions === null;
isNewLibrary && parent.classList.add('newlibrary'); isNewLibrary && parent.classList.add('newlibrary');
const response = await fetch('components/libraryoptionseditor/libraryoptionseditor.template.html'); const response = await fetch('components/libraryoptionseditor/libraryoptionseditor.template.html');
const template = await response.text(); const template = await response.text();
@ -578,7 +578,7 @@ import 'emby-input';
parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches; parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches;
parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch; parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch;
Array.prototype.forEach.call(parent.querySelectorAll('.chkMetadataSaver'), elem => { Array.prototype.forEach.call(parent.querySelectorAll('.chkMetadataSaver'), elem => {
elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : 'true' === elem.getAttribute('data-defaultenabled'); elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : elem.getAttribute('data-defaultenabled') === 'true';
}); });
Array.prototype.forEach.call(parent.querySelectorAll('.chkSubtitleLanguage'), elem => { Array.prototype.forEach.call(parent.querySelectorAll('.chkSubtitleLanguage'), elem => {
elem.checked = !!options.SubtitleDownloadLanguages && options.SubtitleDownloadLanguages.includes(elem.getAttribute('data-lang')); elem.checked = !!options.SubtitleDownloadLanguages && options.SubtitleDownloadLanguages.includes(elem.getAttribute('data-lang'));

View file

@ -81,7 +81,7 @@ import 'emby-playstatebutton';
let itemId; let itemId;
const options = { const options = {
maxWidth: width * 2, maxWidth: width,
type: 'Primary' type: 'Primary'
}; };
@ -108,7 +108,7 @@ import 'emby-playstatebutton';
function getChannelImageUrl(item, width) { function getChannelImageUrl(item, width) {
const apiClient = connectionManager.getApiClient(item.ServerId); const apiClient = connectionManager.getApiClient(item.ServerId);
const options = { const options = {
maxWidth: width * 2, maxWidth: width,
type: 'Primary' type: 'Primary'
}; };

View file

@ -1,78 +1,74 @@
define(['css!./loading'], function () { import 'css!./loading';
'use strict';
var loadingElem; let loadingElem;
var layer1; let layer1;
var layer2; let layer2;
var layer3; let layer3;
var layer4; let layer4;
var circleLefts; let circleLefts;
var circleRights; let circleRights;
return { export function show() {
show: function () { let elem = loadingElem;
var elem = loadingElem;
if (!elem) { if (!elem) {
elem = document.createElement('div'); elem = document.createElement('div');
loadingElem = elem; loadingElem = elem;
elem.classList.add('docspinner'); elem.classList.add('docspinner');
elem.classList.add('mdl-spinner'); elem.classList.add('mdl-spinner');
elem.innerHTML = '<div class="mdl-spinner__layer mdl-spinner__layer-1"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-2"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-3"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-4"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div>'; elem.innerHTML = '<div class="mdl-spinner__layer mdl-spinner__layer-1"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-2"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-3"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-4"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div>';
document.body.appendChild(elem); document.body.appendChild(elem);
layer1 = elem.querySelector('.mdl-spinner__layer-1'); layer1 = elem.querySelector('.mdl-spinner__layer-1');
layer2 = elem.querySelector('.mdl-spinner__layer-2'); layer2 = elem.querySelector('.mdl-spinner__layer-2');
layer3 = elem.querySelector('.mdl-spinner__layer-3'); layer3 = elem.querySelector('.mdl-spinner__layer-3');
layer4 = elem.querySelector('.mdl-spinner__layer-4'); layer4 = elem.querySelector('.mdl-spinner__layer-4');
circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft'); circleLefts = elem.querySelectorAll('.mdl-spinner__circleLeft');
circleRights = elem.querySelectorAll('.mdl-spinner__circleRight'); circleRights = elem.querySelectorAll('.mdl-spinner__circleRight');
} }
elem.classList.add('mdlSpinnerActive'); elem.classList.add('mdlSpinnerActive');
layer1.classList.add('mdl-spinner__layer-1-active'); layer1.classList.add('mdl-spinner__layer-1-active');
layer2.classList.add('mdl-spinner__layer-2-active'); layer2.classList.add('mdl-spinner__layer-2-active');
layer3.classList.add('mdl-spinner__layer-3-active'); layer3.classList.add('mdl-spinner__layer-3-active');
layer4.classList.add('mdl-spinner__layer-4-active'); layer4.classList.add('mdl-spinner__layer-4-active');
var i; for (let i = 0, length = circleLefts.length; i < length; i++) {
var length; circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
}
for (i = 0, length = circleLefts.length; i < length; i++) { for (let i = 0, length = circleRights.length; i < length; i++) {
circleLefts[i].classList.add('mdl-spinner__circleLeft-active'); circleRights[i].classList.add('mdl-spinner__circleRight-active');
} }
}
for (i = 0, length = circleRights.length; i < length; i++) { export function hide() {
circleRights[i].classList.add('mdl-spinner__circleRight-active'); const elem = loadingElem;
}
},
hide: function () {
var elem = loadingElem;
if (elem) { if (elem) {
elem.classList.remove('mdlSpinnerActive'); elem.classList.remove('mdlSpinnerActive');
elem.classList.remove('mdl-spinner__layer-1-active'); elem.classList.remove('mdl-spinner__layer-1-active');
elem.classList.remove('mdl-spinner__layer-2-active'); elem.classList.remove('mdl-spinner__layer-2-active');
elem.classList.remove('mdl-spinner__layer-3-active'); elem.classList.remove('mdl-spinner__layer-3-active');
elem.classList.remove('mdl-spinner__layer-4-active'); elem.classList.remove('mdl-spinner__layer-4-active');
var i; for (let i = 0, length = circleLefts.length; i < length; i++) {
var length; circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
for (i = 0, length = circleLefts.length; i < length; i++) {
circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
}
for (i = 0, length = circleRights.length; i < length; i++) {
circleRights[i].classList.remove('mdl-spinner__circleRight-active');
}
}
} }
};
}); for (let i = 0, length = circleRights.length; i < length; i++) {
circleRights[i].classList.remove('mdl-spinner__circleRight-active');
}
}
}
export default {
show: show,
hide: hide
};

View file

@ -85,7 +85,7 @@ import 'flexStyles';
refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor')); refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor'));
}, () => { }, () => {
import('toast').then(({default: toast}) => { import('toast').then(({default: toast}) => {
toast(globalize.translate('DefaultErrorMessage')); toast(globalize.translate('ErrorDefault'));
}); });
}); });
}); });
@ -98,8 +98,8 @@ import 'flexStyles';
if (listItem) { if (listItem) {
const index = parseInt(listItem.getAttribute('data-index')); const index = parseInt(listItem.getAttribute('data-index'));
const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || [];
const pathInfo = null == index ? {} : pathInfos[index] || {}; const pathInfo = index == null ? {} : pathInfos[index] || {};
const originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]); const originalPath = pathInfo.Path || (index == null ? null : currentOptions.library.Locations[index]);
const btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); const btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath');
if (btnRemovePath) { if (btnRemovePath) {
@ -171,7 +171,7 @@ import 'flexStyles';
const picker = new directoryBrowser(); const picker = new directoryBrowser();
picker.show({ picker.show({
enableNetworkSharePath: true, enableNetworkSharePath: true,
pathReadOnly: null != originalPath, pathReadOnly: originalPath != null,
path: originalPath, path: originalPath,
networkSharePath: networkPath, networkSharePath: networkPath,
callback: function (path, networkSharePath) { callback: function (path, networkSharePath) {

View file

@ -1,6 +1,8 @@
define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) { define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
function onOneDocumentClick() { function onOneDocumentClick() {
document.removeEventListener('click', onOneDocumentClick); document.removeEventListener('click', onOneDocumentClick);
document.removeEventListener('keydown', onOneDocumentClick); document.removeEventListener('keydown', onOneDocumentClick);

File diff suppressed because it is too large Load diff

View file

@ -1,56 +1,56 @@
define([], function () { /*eslint prefer-const: "error"*/
'use strict';
var currentId = 0; let currentId = 0;
function addUniquePlaylistItemId(item) { function addUniquePlaylistItemId(item) {
if (!item.PlaylistItemId) { if (!item.PlaylistItemId) {
item.PlaylistItemId = 'playlistItem' + currentId; item.PlaylistItemId = 'playlistItem' + currentId;
currentId++; currentId++;
}
}
function findPlaylistIndex(playlistItemId, list) {
for (let i = 0, length = list.length; i < length; i++) {
if (list[i].PlaylistItemId === playlistItemId) {
return i;
} }
} }
function findPlaylistIndex(playlistItemId, list) { return -1;
for (var i = 0, length = list.length; i < length; i++) { }
if (list[i].PlaylistItemId === playlistItemId) {
return i;
}
}
return -1; class PlayQueueManager {
} constructor() {
function PlayQueueManager() {
this._sortedPlaylist = []; this._sortedPlaylist = [];
this._playlist = []; this._playlist = [];
this._repeatMode = 'RepeatNone'; this._repeatMode = 'RepeatNone';
this._shuffleMode = 'Sorted'; this._shuffleMode = 'Sorted';
} }
PlayQueueManager.prototype.getPlaylist = function () { getPlaylist() {
return this._playlist.slice(0); return this._playlist.slice(0);
}; }
PlayQueueManager.prototype.setPlaylist = function (items) { setPlaylist(items) {
items = items.slice(0); items = items.slice(0);
for (var i = 0, length = items.length; i < length; i++) { for (let i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]); addUniquePlaylistItemId(items[i]);
} }
this._currentPlaylistItemId = null; this._currentPlaylistItemId = null;
this._playlist = items; this._playlist = items;
this._repeatMode = 'RepeatNone'; this._repeatMode = 'RepeatNone';
}; }
PlayQueueManager.prototype.queue = function (items) { queue(items) {
for (var i = 0, length = items.length; i < length; i++) { for (let i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]); addUniquePlaylistItemId(items[i]);
this._playlist.push(items[i]); this._playlist.push(items[i]);
} }
}; }
PlayQueueManager.prototype.shufflePlaylist = function () { shufflePlaylist() {
this._sortedPlaylist = []; this._sortedPlaylist = [];
for (const item of this._playlist) { for (const item of this._playlist) {
this._sortedPlaylist.push(item); this._sortedPlaylist.push(item);
@ -65,42 +65,31 @@ define([], function () {
} }
this._playlist.unshift(currentPlaylistItem); this._playlist.unshift(currentPlaylistItem);
this._shuffleMode = 'Shuffle'; this._shuffleMode = 'Shuffle';
}; }
PlayQueueManager.prototype.sortShuffledPlaylist = function () { sortShuffledPlaylist() {
this._playlist = []; this._playlist = [];
for (let item of this._sortedPlaylist) { for (const item of this._sortedPlaylist) {
this._playlist.push(item); this._playlist.push(item);
} }
this._sortedPlaylist = []; this._sortedPlaylist = [];
this._shuffleMode = 'Sorted'; this._shuffleMode = 'Sorted';
}; }
PlayQueueManager.prototype.clearPlaylist = function (clearCurrentItem = false) { clearPlaylist(clearCurrentItem = false) {
const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0]; const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0];
this._playlist = []; this._playlist = [];
if (!clearCurrentItem) { if (!clearCurrentItem) {
this._playlist.push(currentPlaylistItem); this._playlist.push(currentPlaylistItem);
} }
};
function arrayInsertAt(destArray, pos, arrayToInsert) {
var args = [];
args.push(pos); // where to insert
args.push(0); // nothing to remove
args = args.concat(arrayToInsert); // add on array to insert
destArray.splice.apply(destArray, args); // splice it in
} }
PlayQueueManager.prototype.queueNext = function (items) { queueNext(items) {
var i; for (let i = 0, length = items.length; i < length; i++) {
var length;
for (i = 0, length = items.length; i < length; i++) {
addUniquePlaylistItemId(items[i]); addUniquePlaylistItemId(items[i]);
} }
var currentIndex = this.getCurrentPlaylistIndex(); let currentIndex = this.getCurrentPlaylistIndex();
if (currentIndex === -1) { if (currentIndex === -1) {
currentIndex = this._playlist.length; currentIndex = this._playlist.length;
@ -109,43 +98,43 @@ define([], function () {
} }
arrayInsertAt(this._playlist, currentIndex, items); arrayInsertAt(this._playlist, currentIndex, items);
}; }
PlayQueueManager.prototype.getCurrentPlaylistIndex = function () { getCurrentPlaylistIndex() {
return findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist); return findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist);
}; }
PlayQueueManager.prototype.getCurrentItem = function () { getCurrentItem() {
var index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist); const index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist);
return index === -1 ? null : this._playlist[index]; return index === -1 ? null : this._playlist[index];
}; }
PlayQueueManager.prototype.getCurrentPlaylistItemId = function () { getCurrentPlaylistItemId() {
return this._currentPlaylistItemId; return this._currentPlaylistItemId;
}; }
PlayQueueManager.prototype.setPlaylistState = function (playlistItemId, playlistIndex) { setPlaylistState(playlistItemId, playlistIndex) {
this._currentPlaylistItemId = playlistItemId; this._currentPlaylistItemId = playlistItemId;
}; }
PlayQueueManager.prototype.setPlaylistIndex = function (playlistIndex) { setPlaylistIndex(playlistIndex) {
if (playlistIndex < 0) { if (playlistIndex < 0) {
this.setPlaylistState(null); this.setPlaylistState(null);
} else { } else {
this.setPlaylistState(this._playlist[playlistIndex].PlaylistItemId); this.setPlaylistState(this._playlist[playlistIndex].PlaylistItemId);
} }
}; }
PlayQueueManager.prototype.removeFromPlaylist = function (playlistItemIds) { removeFromPlaylist(playlistItemIds) {
if (this._playlist.length <= playlistItemIds.length) { if (this._playlist.length <= playlistItemIds.length) {
return { return {
result: 'empty' result: 'empty'
}; };
} }
var currentPlaylistItemId = this.getCurrentPlaylistItemId(); const currentPlaylistItemId = this.getCurrentPlaylistItemId();
var isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1; const isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1;
this._sortedPlaylist = this._sortedPlaylist.filter(function (item) { this._sortedPlaylist = this._sortedPlaylist.filter(function (item) {
return !playlistItemIds.includes(item.PlaylistItemId); return !playlistItemIds.includes(item.PlaylistItemId);
@ -159,17 +148,13 @@ define([], function () {
result: 'removed', result: 'removed',
isCurrentIndex: isCurrentIndex isCurrentIndex: isCurrentIndex
}; };
};
function moveInArray(array, from, to) {
array.splice(to, 0, array.splice(from, 1)[0]);
} }
PlayQueueManager.prototype.movePlaylistItem = function (playlistItemId, newIndex) { movePlaylistItem(playlistItemId, newIndex) {
var playlist = this.getPlaylist(); const playlist = this.getPlaylist();
var oldIndex; let oldIndex;
for (var i = 0, length = playlist.length; i < length; i++) { for (let i = 0, length = playlist.length; i < length; i++) {
if (playlist[i].PlaylistItemId === playlistItemId) { if (playlist[i].PlaylistItemId === playlistItemId) {
oldIndex = i; oldIndex = i;
break; break;
@ -195,30 +180,30 @@ define([], function () {
playlistItemId: playlistItemId, playlistItemId: playlistItemId,
newIndex: newIndex newIndex: newIndex
}; };
}; }
PlayQueueManager.prototype.reset = function () { reset() {
this._sortedPlaylist = []; this._sortedPlaylist = [];
this._playlist = []; this._playlist = [];
this._currentPlaylistItemId = null; this._currentPlaylistItemId = null;
this._repeatMode = 'RepeatNone'; this._repeatMode = 'RepeatNone';
this._shuffleMode = 'Sorted'; this._shuffleMode = 'Sorted';
}; }
PlayQueueManager.prototype.setRepeatMode = function (value) { setRepeatMode(value) {
const repeatModes = ['RepeatOne', 'RepeatAll', 'RepeatNone']; const repeatModes = ['RepeatOne', 'RepeatAll', 'RepeatNone'];
if (repeatModes.includes(value)) { if (repeatModes.includes(value)) {
this._repeatMode = value; this._repeatMode = value;
} else { } else {
throw new TypeError('invalid value provided for setRepeatMode'); throw new TypeError('invalid value provided for setRepeatMode');
} }
}; }
PlayQueueManager.prototype.getRepeatMode = function () { getRepeatMode() {
return this._repeatMode; return this._repeatMode;
}; }
PlayQueueManager.prototype.setShuffleMode = function (value) { setShuffleMode(value) {
switch (value) { switch (value) {
case 'Shuffle': case 'Shuffle':
this.shufflePlaylist(); this.shufflePlaylist();
@ -229,9 +214,9 @@ define([], function () {
default: default:
throw new TypeError('invalid value provided to setShuffleMode'); throw new TypeError('invalid value provided to setShuffleMode');
} }
}; }
PlayQueueManager.prototype.toggleShuffleMode = function () { toggleShuffleMode() {
switch (this._shuffleMode) { switch (this._shuffleMode) {
case 'Shuffle': case 'Shuffle':
this.setShuffleMode('Sorted'); this.setShuffleMode('Sorted');
@ -242,16 +227,16 @@ define([], function () {
default: default:
throw new TypeError('current value for shufflequeue is invalid'); throw new TypeError('current value for shufflequeue is invalid');
} }
}; }
PlayQueueManager.prototype.getShuffleMode = function () { getShuffleMode() {
return this._shuffleMode; return this._shuffleMode;
}; }
PlayQueueManager.prototype.getNextItemInfo = function () { getNextItemInfo() {
var newIndex; let newIndex;
var playlist = this.getPlaylist(); const playlist = this.getPlaylist();
var playlistLength = playlist.length; const playlistLength = playlist.length;
switch (this.getRepeatMode()) { switch (this.getRepeatMode()) {
case 'RepeatOne': case 'RepeatOne':
@ -272,7 +257,7 @@ define([], function () {
return null; return null;
} }
var item = playlist[newIndex]; const item = playlist[newIndex];
if (!item) { if (!item) {
return null; return null;
@ -282,7 +267,19 @@ define([], function () {
item: item, item: item,
index: newIndex index: newIndex
}; };
}; }
}
return PlayQueueManager; function arrayInsertAt(destArray, pos, arrayToInsert) {
}); let args = [];
args.push(pos); // where to insert
args.push(0); // nothing to remove
args = args.concat(arrayToInsert); // add on array to insert
destArray.splice.apply(destArray, args); // splice it in
}
function moveInArray(array, from, to) {
array.splice(to, 0, array.splice(from, 1)[0]);
}
export default PlayQueueManager;

View file

@ -85,7 +85,7 @@
<div class="selectContainer"> <div class="selectContainer">
<select is="emby-select" class="selectChromecastVersion" label="${LabelChromecastVersion}"> <select is="emby-select" class="selectChromecastVersion" label="${LabelChromecastVersion}">
<option value="stable">${LabelStable}</option> <option value="stable">${LabelStable}</option>
<option value="nightly">${LabelNightly}</option> <option value="unstable">${LabelUnstable}</option>
</select> </select>
</div> </div>

View file

@ -104,7 +104,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
var apiClient = connectionManager.getApiClient(serverId); var apiClient = connectionManager.getApiClient(serverId);
apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
playbackManager.play({ playbackManager.default.play({
ids: [item.ChannelId], ids: [item.ChannelId],
serverId: serverId serverId: serverId
}); });

View file

@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
'use strict'; 'use strict';
loading = loading.default || loading;
var currentDialog; var currentDialog;
var recordingDeleted = false; var recordingDeleted = false;
var currentItemId; var currentItemId;

View file

@ -1,6 +1,8 @@
define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) { define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) {
'use strict'; 'use strict';
loading = loading.default || loading;
function loadData(parent, program, apiClient) { function loadData(parent, program, apiClient) {
if (program.IsSeries) { if (program.IsSeries) {
parent.querySelector('.recordSeriesContainer').classList.remove('hide'); parent.querySelector('.recordSeriesContainer').classList.remove('hide');

View file

@ -1,6 +1,8 @@
define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) { define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) {
'use strict'; 'use strict';
loading = loading.default || loading;
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) { function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
loading.show(); loading.show();

View file

@ -1,6 +1,8 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) {
'use strict'; 'use strict';
loading = loading.default || loading;
var currentDialog; var currentDialog;
var recordingUpdated = false; var recordingUpdated = false;
var recordingDeleted = false; var recordingDeleted = false;

View file

@ -1,94 +1,108 @@
define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) { import dom from 'dom';
'use strict'; import dialogHelper from 'dialogHelper';
import loading from 'loading';
import layoutManager from 'layoutManager';
import connectionManager from 'connectionManager';
import globalize from 'globalize';
import 'emby-input';
import 'emby-checkbox';
import 'paper-icon-button-light';
import 'emby-select';
import 'material-icons';
import 'css!./../formdialog';
import 'emby-button';
function getEditorHtml() { /*eslint prefer-const: "error"*/
var html = '';
html += '<div class="formDialogContent smoothScrollY" style="padding-top:2em;">'; function getEditorHtml() {
html += '<div class="dialogContentInner dialog-content-centered">'; let html = '';
html += '<form style="margin:auto;">';
html += '<div class="fldSelectPlaylist selectContainer">'; html += '<div class="formDialogContent smoothScrollY" style="padding-top:2em;">';
html += '<select is="emby-select" id="selectMetadataRefreshMode" label="' + globalize.translate('LabelRefreshMode') + '">'; html += '<div class="dialogContentInner dialog-content-centered">';
html += '<option value="scan">' + globalize.translate('ScanForNewAndUpdatedFiles') + '</option>'; html += '<form style="margin:auto;">';
html += '<option value="missing">' + globalize.translate('SearchForMissingMetadata') + '</option>';
html += '<option value="all" selected>' + globalize.translate('ReplaceAllMetadata') + '</option>';
html += '</select>';
html += '</div>';
html += '<label class="checkboxContainer hide fldReplaceExistingImages">'; html += '<div class="fldSelectPlaylist selectContainer">';
html += '<input type="checkbox" is="emby-checkbox" class="chkReplaceImages" />'; html += '<select is="emby-select" id="selectMetadataRefreshMode" label="' + globalize.translate('LabelRefreshMode') + '">';
html += '<span>' + globalize.translate('ReplaceExistingImages') + '</span>'; html += '<option value="scan">' + globalize.translate('ScanForNewAndUpdatedFiles') + '</option>';
html += '</label>'; html += '<option value="missing">' + globalize.translate('SearchForMissingMetadata') + '</option>';
html += '<option value="all" selected>' + globalize.translate('ReplaceAllMetadata') + '</option>';
html += '</select>';
html += '</div>';
html += '<div class="fieldDescription">'; html += '<label class="checkboxContainer hide fldReplaceExistingImages">';
html += globalize.translate('RefreshDialogHelp'); html += '<input type="checkbox" is="emby-checkbox" class="chkReplaceImages" />';
html += '</div>'; html += '<span>' + globalize.translate('ReplaceExistingImages') + '</span>';
html += '</label>';
html += '<input type="hidden" class="fldSelectedItemIds" />'; html += '<div class="fieldDescription">';
html += globalize.translate('RefreshDialogHelp');
html += '</div>';
html += '<br />'; html += '<input type="hidden" class="fldSelectedItemIds" />';
html += '<div class="formDialogFooter">';
html += '<button is="emby-button" type="submit" class="raised btnSubmit block formDialogFooterItem button-submit">' + globalize.translate('Refresh') + '</button>';
html += '</div>';
html += '</form>'; html += '<br />';
html += '</div>'; html += '<div class="formDialogFooter">';
html += '</div>'; html += '<button is="emby-button" type="submit" class="raised btnSubmit block formDialogFooterItem button-submit">' + globalize.translate('Refresh') + '</button>';
html += '</div>';
return html; html += '</form>';
} html += '</div>';
html += '</div>';
function centerFocus(elem, horiz, on) { return html;
require(['scrollHelper'], function (scrollHelper) { }
var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz); function centerFocus(elem, horiz, on) {
import('scrollHelper').then(({default: scrollHelper}) => {
const fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz);
});
}
function onSubmit(e) {
loading.show();
const instance = this;
const dlg = dom.parentWithClass(e.target, 'dialog');
const options = instance.options;
const apiClient = connectionManager.getApiClient(options.serverId);
const replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all';
const mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh';
const replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked;
options.itemIds.forEach(function (itemId) {
apiClient.refreshItem(itemId, {
Recursive: true,
ImageRefreshMode: mode,
MetadataRefreshMode: mode,
ReplaceAllImages: replaceAllImages,
ReplaceAllMetadata: replaceAllMetadata
}); });
} });
function onSubmit(e) { dialogHelper.close(dlg);
loading.show();
var instance = this; import('toast').then(({default: toast}) => {
var dlg = dom.parentWithClass(e.target, 'dialog'); toast(globalize.translate('RefreshQueued'));
var options = instance.options; });
var apiClient = connectionManager.getApiClient(options.serverId); loading.hide();
var replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all'; e.preventDefault();
return false;
}
var mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh'; class RefreshDialog {
var replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked; constructor(options) {
options.itemIds.forEach(function (itemId) {
apiClient.refreshItem(itemId, {
Recursive: true,
ImageRefreshMode: mode,
MetadataRefreshMode: mode,
ReplaceAllImages: replaceAllImages,
ReplaceAllMetadata: replaceAllMetadata
});
});
dialogHelper.close(dlg);
require(['toast'], function (toast) {
toast(globalize.translate('RefreshQueued'));
});
loading.hide();
e.preventDefault();
return false;
}
function RefreshDialog(options) {
this.options = options; this.options = options;
} }
RefreshDialog.prototype.show = function () { show() {
var dialogOptions = { const dialogOptions = {
removeOnClose: true, removeOnClose: true,
scrollY: false scrollY: false
}; };
@ -99,12 +113,12 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM
dialogOptions.size = 'small'; dialogOptions.size = 'small';
} }
var dlg = dialogHelper.createDialog(dialogOptions); const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog'); dlg.classList.add('formDialog');
var html = ''; let html = '';
var title = globalize.translate('RefreshMetadata'); const title = globalize.translate('RefreshMetadata');
html += '<div class="formDialogHeader">'; html += '<div class="formDialogHeader">';
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><span class="material-icons arrow_back"></span></button>'; html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><span class="material-icons arrow_back"></span></button>';
@ -150,7 +164,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM
dlg.addEventListener('close', resolve); dlg.addEventListener('close', resolve);
dialogHelper.open(dlg); dialogHelper.open(dlg);
}); });
}; }
}
return RefreshDialog; export default RefreshDialog;
});

View file

@ -1,5 +1,8 @@
define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'itemContextMenu', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder, itemContextMenu) { define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'itemContextMenu', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder, itemContextMenu) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
var showMuteButton = true; var showMuteButton = true;
var showVolumeSlider = true; var showVolumeSlider = true;
@ -48,7 +51,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
menuItems.unshift({ menuItems.unshift({
id: -1, id: -1,
name: globalize.translate('ButtonOff'), name: globalize.translate('ButtonOff'),
selected: null == currentIndex selected: currentIndex == null
}); });
require(['actionsheet'], function (actionsheet) { require(['actionsheet'], function (actionsheet) {
@ -69,18 +72,18 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
} }
function seriesImageUrl(item, options) { function seriesImageUrl(item, options) {
if ('Episode' !== item.Type) { if (item.Type !== 'Episode') {
return null; return null;
} }
options = options || {}; options = options || {};
options.type = options.type || 'Primary'; options.type = options.type || 'Primary';
if ('Primary' === options.type && item.SeriesPrimaryImageTag) { if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag; options.tag = item.SeriesPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
} }
if ('Thumb' === options.type) { if (options.type === 'Thumb') {
if (item.SeriesThumbImageTag) { if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag; options.tag = item.SeriesThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
@ -119,9 +122,9 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
var nowPlayingServerId = (item.ServerId || serverId); var nowPlayingServerId = (item.ServerId || serverId);
if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') { if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
var songName = item.Name; var songName = item.Name;
if (item.Album != null && item.Artists != null) { var artistsSeries = '';
var artistsSeries = ''; var albumName = '';
var albumName = item.Album; if (item.Artists != null) {
if (item.ArtistItems != null) { if (item.ArtistItems != null) {
for (const artist of item.ArtistItems) { for (const artist of item.ArtistItems) {
let artistName = artist.Name; let artistName = artist.Name;
@ -142,9 +145,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
} }
} }
} }
context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
context.querySelector('.nowPlayingAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}">${albumName}</a>`;
} }
if (item.Album != null) {
albumName = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}">` + item.Album + '</a>';
}
context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
context.querySelector('.nowPlayingSongName').innerHTML = songName; context.querySelector('.nowPlayingSongName').innerHTML = songName;
} else if (item.Type == 'Episode') { } else if (item.Type == 'Episode') {
if (item.SeasonName != null) { if (item.SeasonName != null) {
@ -171,9 +177,9 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
} }
var url = item ? seriesImageUrl(item, { var url = item ? seriesImageUrl(item, {
maxHeight: 300 * 2 maxHeight: 300
}) || imageUrl(item, { }) || imageUrl(item, {
maxHeight: 300 * 2 maxHeight: 300
}) : null; }) : null;
let contextButton = context.querySelector('.btnToggleContextMenu'); let contextButton = context.querySelector('.btnToggleContextMenu');
@ -210,7 +216,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
backdrop.setBackdrops([item]); backdrop.setBackdrops([item]);
apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
var userData = fullItem.UserData || {}; var userData = fullItem.UserData || {};
var likes = null == userData.Likes ? '' : userData.Likes; var likes = userData.Likes == null ? '' : userData.Likes;
context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><span class="material-icons favorite"></span></button>'; context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><span class="material-icons favorite"></span></button>';
context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><span class="material-icons favorite"></span></button>'; context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><span class="material-icons favorite"></span></button>';
}); });
@ -251,7 +257,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
var all = context.querySelectorAll('.btnCommand'); var all = context.querySelectorAll('.btnCommand');
for (var i = 0, length = all.length; i < length; i++) { for (var i = 0, length = all.length; i < length; i++) {
var enableButton = -1 !== commands.indexOf(all[i].getAttribute('data-command')); var enableButton = commands.indexOf(all[i].getAttribute('data-command')) !== -1;
all[i].disabled = !enableButton; all[i].disabled = !enableButton;
} }
} }
@ -278,7 +284,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
currentPlayerSupportedCommands = supportedCommands; currentPlayerSupportedCommands = supportedCommands;
var playState = state.PlayState || {}; var playState = state.PlayState || {};
var isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select'); var isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select');
buttonVisible(context.querySelector('.btnToggleFullscreen'), item && 'Video' == item.MediaType && supportedCommands.includes('ToggleFullscreen')); buttonVisible(context.querySelector('.btnToggleFullscreen'), item && item.MediaType == 'Video' && supportedCommands.includes('ToggleFullscreen'));
updateAudioTracksDisplay(player, context); updateAudioTracksDisplay(player, context);
updateSubtitleTracksDisplay(player, context); updateSubtitleTracksDisplay(player, context);
@ -306,15 +312,15 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
context.querySelector('.remoteControlSection').classList.add('hide'); context.querySelector('.remoteControlSection').classList.add('hide');
} }
buttonVisible(context.querySelector('.btnStop'), null != item); buttonVisible(context.querySelector('.btnStop'), item != null);
buttonVisible(context.querySelector('.btnNextTrack'), null != item); buttonVisible(context.querySelector('.btnNextTrack'), item != null);
buttonVisible(context.querySelector('.btnPreviousTrack'), null != item); buttonVisible(context.querySelector('.btnPreviousTrack'), item != null);
if (layoutManager.mobile) { if (layoutManager.mobile) {
buttonVisible(context.querySelector('.btnRewind'), false); buttonVisible(context.querySelector('.btnRewind'), false);
buttonVisible(context.querySelector('.btnFastForward'), false); buttonVisible(context.querySelector('.btnFastForward'), false);
} else { } else {
buttonVisible(context.querySelector('.btnRewind'), null != item); buttonVisible(context.querySelector('.btnRewind'), item != null);
buttonVisible(context.querySelector('.btnFastForward'), null != item); buttonVisible(context.querySelector('.btnFastForward'), item != null);
} }
var positionSlider = context.querySelector('.nowPlayingPositionSlider'); var positionSlider = context.querySelector('.nowPlayingPositionSlider');
@ -325,15 +331,15 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
if (positionSlider && !positionSlider.dragging) { if (positionSlider && !positionSlider.dragging) {
positionSlider.disabled = !playState.CanSeek; positionSlider.disabled = !playState.CanSeek;
var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; var isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null;
positionSlider.setIsClear(isProgressClear); positionSlider.setIsClear(isProgressClear);
} }
updatePlayPauseState(playState.IsPaused, null != item); updatePlayPauseState(playState.IsPaused, item != null);
updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null); updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null);
updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel); updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel);
if (item && 'Video' == item.MediaType) { if (item && item.MediaType == 'Video') {
context.classList.remove('hideVideoButtons'); context.classList.remove('hideVideoButtons');
} else { } else {
context.classList.add('hideVideoButtons'); context.classList.add('hideVideoButtons');
@ -346,12 +352,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
function updateAudioTracksDisplay(player, context) { function updateAudioTracksDisplay(player, context) {
var supportedCommands = currentPlayerSupportedCommands; var supportedCommands = currentPlayerSupportedCommands;
buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && -1 != supportedCommands.indexOf('SetAudioStreamIndex')); buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && supportedCommands.indexOf('SetAudioStreamIndex') != -1);
} }
function updateSubtitleTracksDisplay(player, context) { function updateSubtitleTracksDisplay(player, context) {
var supportedCommands = currentPlayerSupportedCommands; var supportedCommands = currentPlayerSupportedCommands;
buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && -1 != supportedCommands.indexOf('SetSubtitleStreamIndex')); buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && supportedCommands.indexOf('SetSubtitleStreamIndex') != -1);
} }
function updateRepeatModeDisplay(repeatMode) { function updateRepeatModeDisplay(repeatMode) {
@ -383,11 +389,11 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
var view = context; var view = context;
var supportedCommands = currentPlayerSupportedCommands; var supportedCommands = currentPlayerSupportedCommands;
if (-1 === supportedCommands.indexOf('Mute')) { if (supportedCommands.indexOf('Mute') === -1) {
showMuteButton = false; showMuteButton = false;
} }
if (-1 === supportedCommands.indexOf('SetVolume')) { if (supportedCommands.indexOf('SetVolume') === -1) {
showVolumeSlider = false; showVolumeSlider = false;
} }
@ -452,8 +458,8 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
} }
} }
context.querySelector('.positionTime').innerHTML = null == positionTicks ? '--:--' : datetime.getDisplayRunningTime(positionTicks); context.querySelector('.positionTime').innerHTML = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks);
context.querySelector('.runtime').innerHTML = null != runtimeTicks ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; context.querySelector('.runtime').innerHTML = runtimeTicks != null ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--';
} }
function getPlaylistItems(player) { function getPlaylistItems(player) {

View file

@ -1,6 +1,8 @@
define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, backdrop, globalize, require, appSettings) { define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, backdrop, globalize, require, appSettings) {
'use strict'; 'use strict';
browser = browser.default || browser;
var themeStyleElement; var themeStyleElement;
var currentThemeId; var currentThemeId;

View file

@ -5,6 +5,8 @@
define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) { define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) {
'use strict'; 'use strict';
browser = browser.default || browser;
/** /**
* Name of transition event. * Name of transition event.
*/ */

View file

@ -1,6 +1,8 @@
define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) {
'use strict'; 'use strict';
loading = loading.default || loading;
var currentItem; var currentItem;
var hasChanges; var hasChanges;

View file

@ -1,6 +1,8 @@
define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) { define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
var player; var player;
var subtitleSyncSlider; var subtitleSyncSlider;
var subtitleSyncTextField; var subtitleSyncTextField;

View file

@ -1,6 +1,8 @@
define(['playbackManager', 'userSettings', 'connectionManager'], function (playbackManager, userSettings, connectionManager) { define(['playbackManager', 'userSettings', 'connectionManager'], function (playbackManager, userSettings, connectionManager) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
var currentOwnerId; var currentOwnerId;
var currentThemeIds = []; var currentThemeIds = [];

View file

@ -1,6 +1,9 @@
define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize', 'loading', 'browser', 'focusManager', 'scrollHelper', 'material-icons', 'formDialogStyle', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) { define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize', 'loading', 'browser', 'focusManager', 'scrollHelper', 'material-icons', 'formDialogStyle', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) {
'use strict'; 'use strict';
browser = browser.default || browser;
loading = loading.default || loading;
var enableFocusTransform = !browser.slow && !browser.edge; var enableFocusTransform = !browser.slow && !browser.edge;
function getEditorHtml() { function getEditorHtml() {

View file

@ -1,6 +1,8 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
return function (page, providerId, options) { return function (page, providerId, options) {
function reload() { function reload() {
loading.show(); loading.show();
@ -42,7 +44,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
for (var region in result) { for (var region in result) {
var countries = result[region]; var countries = result[region];
if (countries.length && 'ZZZ' !== region) { if (countries.length && region !== 'ZZZ') {
for (i = 0, length = countries.length; i < length; i++) { for (i = 0, length = countries.length; i < length; i++) {
countryList.push({ countryList.push({
name: countries[i].fullName, name: countries[i].fullName,
@ -237,7 +239,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb
var device = devices[i]; var device = devices[i];
html += '<div class="listItem">'; html += '<div class="listItem">';
var enabledTuners = providerInfo.EnabledTuners || []; var enabledTuners = providerInfo.EnabledTuners || [];
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
var checkedAttribute = isChecked ? ' checked' : ''; var checkedAttribute = isChecked ? ' checked' : '';
html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + '/><span></span></label>'; html += '<label class="checkboxContainer listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" data-id="' + device.Id + '" class="chkTuner" ' + checkedAttribute + '/><span></span></label>';
html += '<div class="listItemBody two-line">'; html += '<div class="listItemBody two-line">';

View file

@ -1,6 +1,8 @@
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) { define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
return function (page, providerId, options) { return function (page, providerId, options) {
function getListingProvider(config, id) { function getListingProvider(config, id) {
if (config && id) { if (config && id) {
@ -84,7 +86,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
}).then(function (result) { }).then(function (result) {
loading.hide(); loading.hide();
if (false !== options.showConfirmation) { if (options.showConfirmation !== false) {
Dashboard.processServerConfigurationUpdateResult(); Dashboard.processServerConfigurationUpdateResult();
} }
@ -118,7 +120,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi
var device = devices[i]; var device = devices[i];
html += '<div class="listItem">'; html += '<div class="listItem">';
var enabledTuners = providerInfo.EnabledTuners || []; var enabledTuners = providerInfo.EnabledTuners || [];
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
var checkedAttribute = isChecked ? ' checked' : ''; var checkedAttribute = isChecked ? ' checked' : '';
html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + '><span></span></label>'; html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + '><span></span></label>';
html += '<div class="listItemBody two-line">'; html += '<div class="listItemBody two-line">';

View file

@ -1,6 +1,8 @@
define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) { define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
var transitionEndEventName = dom.whichTransitionEvent(); var transitionEndEventName = dom.whichTransitionEvent();
function seriesImageUrl(item, options) { function seriesImageUrl(item, options) {

View file

@ -1,20 +1,20 @@
define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) { import 'css!components/viewManager/viewContainer';
'use strict'; /* eslint-disable indent */
function setControllerClass(view, options) { function setControllerClass(view, options) {
if (options.controllerFactory) { if (options.controllerFactory) {
return Promise.resolve(); return Promise.resolve();
} }
var controllerUrl = view.getAttribute('data-controller'); let controllerUrl = view.getAttribute('data-controller');
if (controllerUrl) { if (controllerUrl) {
if (0 === controllerUrl.indexOf('__plugin/')) { if (controllerUrl.indexOf('__plugin/') === 0) {
controllerUrl = controllerUrl.substring('__plugin/'.length); controllerUrl = controllerUrl.substring('__plugin/'.length);
} }
controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl); controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl);
return getRequirePromise([controllerUrl]).then(function (ControllerFactory) { return import(controllerUrl).then((ControllerFactory) => {
options.controllerFactory = ControllerFactory; options.controllerFactory = ControllerFactory;
}); });
} }
@ -22,94 +22,85 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
return Promise.resolve(); return Promise.resolve();
} }
function getRequirePromise(deps) { export function loadView(options) {
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
function loadView(options) {
if (!options.cancel) { if (!options.cancel) {
var selected = selectedPageIndex; const selected = selectedPageIndex;
var previousAnimatable = -1 === selected ? null : allPages[selected]; const previousAnimatable = selected === -1 ? null : allPages[selected];
var pageIndex = selected + 1; let pageIndex = selected + 1;
if (pageIndex >= pageContainerCount) { if (pageIndex >= pageContainerCount) {
pageIndex = 0; pageIndex = 0;
} }
var isPluginpage = -1 !== options.url.toLowerCase().indexOf('/configurationpage'); const isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
var newViewInfo = normalizeNewView(options, isPluginpage); const newViewInfo = normalizeNewView(options, isPluginpage);
var newView = newViewInfo.elem; const newView = newViewInfo.elem;
var modulesToLoad = [];
return new Promise(function (resolve) { return new Promise((resolve) => {
require(modulesToLoad, function () { const currentPage = allPages[pageIndex];
var currentPage = allPages[pageIndex];
if (currentPage) { if (currentPage) {
triggerDestroy(currentPage); triggerDestroy(currentPage);
} }
var view = newView; let view = newView;
if ('string' == typeof view) { if (typeof view == 'string') {
view = document.createElement('div'); view = document.createElement('div');
view.innerHTML = newView; view.innerHTML = newView;
} }
view.classList.add('mainAnimatedPage'); view.classList.add('mainAnimatedPage');
if (currentPage) { if (currentPage) {
if (newViewInfo.hasScript && window.$) { if (newViewInfo.hasScript && window.$) {
view = $(view).appendTo(mainAnimatedPages)[0]; view = $(view).appendTo(mainAnimatedPages)[0];
mainAnimatedPages.removeChild(currentPage); mainAnimatedPages.removeChild(currentPage);
} else {
mainAnimatedPages.replaceChild(view, currentPage);
}
} else { } else {
if (newViewInfo.hasScript && window.$) { mainAnimatedPages.replaceChild(view, currentPage);
view = $(view).appendTo(mainAnimatedPages)[0]; }
} else { } else {
mainAnimatedPages.appendChild(view); if (newViewInfo.hasScript && window.$) {
} view = $(view).appendTo(mainAnimatedPages)[0];
} else {
mainAnimatedPages.appendChild(view);
}
}
if (options.type) {
view.setAttribute('data-type', options.type);
}
const properties = [];
if (options.fullscreen) {
properties.push('fullscreen');
}
if (properties.length) {
view.setAttribute('data-properties', properties.join(','));
}
allPages[pageIndex] = view;
setControllerClass(view, options).then(() => {
if (onBeforeChange) {
onBeforeChange(view, false, options);
} }
if (options.type) { beforeAnimate(allPages, pageIndex, selected);
view.setAttribute('data-type', options.type); selectedPageIndex = pageIndex;
currentUrls[pageIndex] = options.url;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, pageIndex);
} }
var properties = []; if (window.$) {
$.mobile = $.mobile || {};
if (options.fullscreen) { $.mobile.activePage = view;
properties.push('fullscreen');
} }
if (properties.length) { resolve(view);
view.setAttribute('data-properties', properties.join(','));
}
allPages[pageIndex] = view;
setControllerClass(view, options).then(function () {
if (onBeforeChange) {
onBeforeChange(view, false, options);
}
beforeAnimate(allPages, pageIndex, selected);
selectedPageIndex = pageIndex;
currentUrls[pageIndex] = options.url;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, pageIndex);
}
if (window.$) {
$.mobile = $.mobile || {};
$.mobile.activePage = view;
}
resolve(view);
});
}); });
}); });
} }
@ -125,33 +116,33 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
html = replaceAll(html, '<\/script>--\x3e', '<\/script>'); html = replaceAll(html, '<\/script>--\x3e', '<\/script>');
} }
var wrapper = document.createElement('div'); const wrapper = document.createElement('div');
wrapper.innerHTML = html; wrapper.innerHTML = html;
return wrapper.querySelector('div[data-role="page"]'); return wrapper.querySelector('div[data-role="page"]');
} }
function normalizeNewView(options, isPluginpage) { function normalizeNewView(options, isPluginpage) {
var viewHtml = options.view; const viewHtml = options.view;
if (-1 === viewHtml.indexOf('data-role="page"')) { if (viewHtml.indexOf('data-role="page"') === -1) {
return viewHtml; return viewHtml;
} }
var hasScript = -1 !== viewHtml.indexOf('<script'); let hasScript = viewHtml.indexOf('<script') !== -1;
var elem = parseHtml(viewHtml, hasScript); const elem = parseHtml(viewHtml, hasScript);
if (hasScript) { if (hasScript) {
hasScript = null != elem.querySelector('script'); hasScript = elem.querySelector('script') != null;
} }
var hasjQuery = false; let hasjQuery = false;
var hasjQuerySelect = false; let hasjQuerySelect = false;
var hasjQueryChecked = false; let hasjQueryChecked = false;
if (isPluginpage) { if (isPluginpage) {
hasjQuery = -1 != viewHtml.indexOf('jQuery') || -1 != viewHtml.indexOf('$(') || -1 != viewHtml.indexOf('$.'); hasjQuery = viewHtml.indexOf('jQuery') != -1 || viewHtml.indexOf('$(') != -1 || viewHtml.indexOf('$.') != -1;
hasjQueryChecked = -1 != viewHtml.indexOf('.checked('); hasjQueryChecked = viewHtml.indexOf('.checked(') != -1;
hasjQuerySelect = -1 != viewHtml.indexOf('.selectmenu('); hasjQuerySelect = viewHtml.indexOf('.selectmenu(') != -1;
} }
return { return {
@ -164,7 +155,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
} }
function beforeAnimate(allPages, newPageIndex, oldPageIndex) { function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
for (var index = 0, length = allPages.length; index < length; index++) { for (let index = 0, length = allPages.length; index < length; index++) {
if (newPageIndex !== index && oldPageIndex !== index) { if (newPageIndex !== index && oldPageIndex !== index) {
allPages[index].classList.add('hide'); allPages[index].classList.add('hide');
} }
@ -172,33 +163,33 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
} }
function afterAnimate(allPages, newPageIndex) { function afterAnimate(allPages, newPageIndex) {
for (var index = 0, length = allPages.length; index < length; index++) { for (let index = 0, length = allPages.length; index < length; index++) {
if (newPageIndex !== index) { if (newPageIndex !== index) {
allPages[index].classList.add('hide'); allPages[index].classList.add('hide');
} }
} }
} }
function setOnBeforeChange(fn) { export function setOnBeforeChange(fn) {
onBeforeChange = fn; onBeforeChange = fn;
} }
function tryRestoreView(options) { export function tryRestoreView(options) {
var url = options.url; const url = options.url;
var index = currentUrls.indexOf(url); const index = currentUrls.indexOf(url);
if (-1 !== index) { if (index !== -1) {
var animatable = allPages[index]; const animatable = allPages[index];
var view = animatable; const view = animatable;
if (view) { if (view) {
if (options.cancel) { if (options.cancel) {
return; return;
} }
var selected = selectedPageIndex; const selected = selectedPageIndex;
var previousAnimatable = -1 === selected ? null : allPages[selected]; const previousAnimatable = selected === -1 ? null : allPages[selected];
return setControllerClass(view, options).then(function () { return setControllerClass(view, options).then(() => {
if (onBeforeChange) { if (onBeforeChange) {
onBeforeChange(view, true, options); onBeforeChange(view, true, options);
} }
@ -228,25 +219,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
view.dispatchEvent(new CustomEvent('viewdestroy', {})); view.dispatchEvent(new CustomEvent('viewdestroy', {}));
} }
function reset() { export function reset() {
allPages = []; allPages = [];
currentUrls = []; currentUrls = [];
mainAnimatedPages.innerHTML = ''; mainAnimatedPages.innerHTML = '';
selectedPageIndex = -1; selectedPageIndex = -1;
} }
var onBeforeChange; let onBeforeChange;
var mainAnimatedPages = document.querySelector('.mainAnimatedPages'); const mainAnimatedPages = document.querySelector('.mainAnimatedPages');
var allPages = []; let allPages = [];
var currentUrls = []; let currentUrls = [];
var pageContainerCount = 3; const pageContainerCount = 3;
var selectedPageIndex = -1; let selectedPageIndex = -1;
reset(); reset();
mainAnimatedPages.classList.remove('hide'); mainAnimatedPages.classList.remove('hide');
return {
loadView: loadView, /* eslint-enable indent */
tryRestoreView: tryRestoreView,
reset: reset, export default {
setOnBeforeChange: setOnBeforeChange loadView: loadView,
}; tryRestoreView: tryRestoreView,
}); reset: reset,
setOnBeforeChange: setOnBeforeChange
};

View file

@ -313,7 +313,7 @@ import 'emby-itemscontainer';
btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? '' : ' hide'; btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? '' : ' hide';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionInfo paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('ViewPlaybackInfo') + '"><span class="material-icons info"></span></button>'; html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionInfo paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('ViewPlaybackInfo') + '"><span class="material-icons info"></span></button>';
btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide'; btnCssClass = session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide';
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('SendMessage') + '"><span class="material-icons message"></span></button>'; html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate('SendMessage') + '"><span class="material-icons message"></span></button>';
html += '</div>'; html += '</div>';
@ -346,7 +346,7 @@ import 'emby-itemscontainer';
function renderRunningTasks(view, tasks) { function renderRunningTasks(view, tasks) {
let html = ''; let html = '';
tasks = tasks.filter(function (task) { tasks = tasks.filter(function (task) {
if ('Idle' != task.State) { if (task.State != 'Idle') {
return !task.IsHidden; return !task.IsHidden;
} }
@ -551,7 +551,7 @@ import 'emby-itemscontainer';
row.classList.remove('playingSession'); row.classList.remove('playingSession');
} }
if (session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId()) { if (session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== connectionManager.deviceId()) {
row.querySelector('.btnSessionSendMessage').classList.remove('hide'); row.querySelector('.btnSessionSendMessage').classList.remove('hide');
} else { } else {
row.querySelector('.btnSessionSendMessage').classList.add('hide'); row.querySelector('.btnSessionSendMessage').classList.add('hide');

View file

@ -29,7 +29,7 @@ import 'listViewStyle';
function renderProfile(page, profile, users) { function renderProfile(page, profile, users) {
$('#txtName', page).val(profile.Name); $('#txtName', page).val(profile.Name);
$('.chkMediaType', page).each(function () { $('.chkMediaType', page).each(function () {
this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')); this.checked = (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')) != -1;
}); });
$('#chkEnableAlbumArtInDidl', page).prop('checked', profile.EnableAlbumArtInDidl); $('#chkEnableAlbumArtInDidl', page).prop('checked', profile.EnableAlbumArtInDidl);
$('#chkEnableSingleImageLimit', page).prop('checked', profile.EnableSingleAlbumArtLimit); $('#chkEnableSingleImageLimit', page).prop('checked', profile.EnableSingleAlbumArtLimit);
@ -111,7 +111,7 @@ import 'listViewStyle';
} }
function editIdentificationHeader(page, header) { function editIdentificationHeader(page, header) {
isSubProfileNew = null == header; isSubProfileNew = header == null;
header = header || {}; header = header || {};
currentSubProfile = header; currentSubProfile = header;
const popup = $('#identificationHeaderPopup', page); const popup = $('#identificationHeaderPopup', page);
@ -156,7 +156,7 @@ import 'listViewStyle';
} }
function editXmlDocumentAttribute(page, attribute) { function editXmlDocumentAttribute(page, attribute) {
isSubProfileNew = null == attribute; isSubProfileNew = attribute == null;
attribute = attribute || {}; attribute = attribute || {};
currentSubProfile = attribute; currentSubProfile = attribute;
const popup = $('#xmlAttributePopup', page); const popup = $('#xmlAttributePopup', page);
@ -204,7 +204,7 @@ import 'listViewStyle';
} }
function editSubtitleProfile(page, profile) { function editSubtitleProfile(page, profile) {
isSubProfileNew = null == profile; isSubProfileNew = profile == null;
profile = profile || {}; profile = profile || {};
currentSubProfile = profile; currentSubProfile = profile;
const popup = $('#subtitleProfilePopup', page); const popup = $('#subtitleProfilePopup', page);
@ -266,11 +266,11 @@ import 'listViewStyle';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + index + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + index + '">';
html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>'; html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>';
if ('Video' == profile.Type) { if (profile.Type == 'Video') {
html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>';
html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>';
} else { } else {
if ('Audio' == profile.Type) { if (profile.Type == 'Audio') {
html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>';
} }
} }
@ -298,7 +298,7 @@ import 'listViewStyle';
} }
function editDirectPlayProfile(page, directPlayProfile) { function editDirectPlayProfile(page, directPlayProfile) {
isSubProfileNew = null == directPlayProfile; isSubProfileNew = directPlayProfile == null;
directPlayProfile = directPlayProfile || {}; directPlayProfile = directPlayProfile || {};
currentSubProfile = directPlayProfile; currentSubProfile = directPlayProfile;
const popup = $('#popupEditDirectPlayProfile', page); const popup = $('#popupEditDirectPlayProfile', page);
@ -327,11 +327,11 @@ import 'listViewStyle';
html += '<p>Protocol: ' + (profile.Protocol || 'Http') + '</p>'; html += '<p>Protocol: ' + (profile.Protocol || 'Http') + '</p>';
html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>'; html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>';
if ('Video' == profile.Type) { if (profile.Type == 'Video') {
html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>';
html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>';
} else { } else {
if ('Audio' == profile.Type) { if (profile.Type == 'Audio') {
html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>';
} }
} }
@ -354,7 +354,7 @@ import 'listViewStyle';
} }
function editTranscodingProfile(page, transcodingProfile) { function editTranscodingProfile(page, transcodingProfile) {
isSubProfileNew = null == transcodingProfile; isSubProfileNew = transcodingProfile == null;
transcodingProfile = transcodingProfile || {}; transcodingProfile = transcodingProfile || {};
currentSubProfile = transcodingProfile; currentSubProfile = transcodingProfile;
const popup = $('#transcodingProfilePopup', page); const popup = $('#transcodingProfilePopup', page);
@ -365,7 +365,7 @@ import 'listViewStyle';
$('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http');
$('#chkEnableMpegtsM2TsMode', popup).prop('checked', transcodingProfile.EnableMpegtsM2TsMode || false); $('#chkEnableMpegtsM2TsMode', popup).prop('checked', transcodingProfile.EnableMpegtsM2TsMode || false);
$('#chkEstimateContentLength', popup).prop('checked', transcodingProfile.EstimateContentLength || false); $('#chkEstimateContentLength', popup).prop('checked', transcodingProfile.EstimateContentLength || false);
$('#chkReportByteRangeRequests', popup).prop('checked', 'Bytes' == transcodingProfile.TranscodeSeekInfo); $('#chkReportByteRangeRequests', popup).prop('checked', transcodingProfile.TranscodeSeekInfo == 'Bytes');
$('.radioTabButton:first', popup).trigger('click'); $('.radioTabButton:first', popup).trigger('click');
openPopup(popup[0]); openPopup(popup[0]);
} }
@ -443,7 +443,7 @@ import 'listViewStyle';
} }
function editContainerProfile(page, containerProfile) { function editContainerProfile(page, containerProfile) {
isSubProfileNew = null == containerProfile; isSubProfileNew = containerProfile == null;
containerProfile = containerProfile || {}; containerProfile = containerProfile || {};
currentSubProfile = containerProfile; currentSubProfile = containerProfile;
const popup = $('#containerProfilePopup', page); const popup = $('#containerProfilePopup', page);
@ -515,7 +515,7 @@ import 'listViewStyle';
} }
function editCodecProfile(page, codecProfile) { function editCodecProfile(page, codecProfile) {
isSubProfileNew = null == codecProfile; isSubProfileNew = codecProfile == null;
codecProfile = codecProfile || {}; codecProfile = codecProfile || {};
currentSubProfile = codecProfile; currentSubProfile = codecProfile;
const popup = $('#codecProfilePopup', page); const popup = $('#codecProfilePopup', page);
@ -555,11 +555,11 @@ import 'listViewStyle';
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>'; html += '<p>' + globalize.translate('ValueContainer', profile.Container || allText) + '</p>';
if ('Video' == profile.Type) { if (profile.Type == 'Video') {
html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '</p>';
html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '</p>';
} else { } else {
if ('Audio' == profile.Type) { if (profile.Type == 'Audio') {
html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>'; html += '<p>' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '</p>';
} }
} }
@ -595,7 +595,7 @@ import 'listViewStyle';
} }
function editResponseProfile(page, responseProfile) { function editResponseProfile(page, responseProfile) {
isSubProfileNew = null == responseProfile; isSubProfileNew = responseProfile == null;
responseProfile = responseProfile || {}; responseProfile = responseProfile || {};
currentSubProfile = responseProfile; currentSubProfile = responseProfile;
const popup = $('#responseProfilePopup', page); const popup = $('#responseProfilePopup', page);
@ -703,26 +703,26 @@ import 'listViewStyle';
$('.radioTabButton', page).on('click', function () { $('.radioTabButton', page).on('click', function () {
$(this).siblings().removeClass('ui-btn-active'); $(this).siblings().removeClass('ui-btn-active');
$(this).addClass('ui-btn-active'); $(this).addClass('ui-btn-active');
const value = 'A' == this.tagName ? this.getAttribute('data-value') : this.value; const value = this.tagName == 'A' ? this.getAttribute('data-value') : this.value;
const elem = $('.' + value, page); const elem = $('.' + value, page);
elem.siblings('.tabContent').hide(); elem.siblings('.tabContent').hide();
elem.show(); elem.show();
}); });
$('#selectDirectPlayProfileType', page).on('change', function () { $('#selectDirectPlayProfileType', page).on('change', function () {
if ('Video' == this.value) { if (this.value == 'Video') {
$('#fldDirectPlayVideoCodec', page).show(); $('#fldDirectPlayVideoCodec', page).show();
} else { } else {
$('#fldDirectPlayVideoCodec', page).hide(); $('#fldDirectPlayVideoCodec', page).hide();
} }
if ('Photo' == this.value) { if (this.value == 'Photo') {
$('#fldDirectPlayAudioCodec', page).hide(); $('#fldDirectPlayAudioCodec', page).hide();
} else { } else {
$('#fldDirectPlayAudioCodec', page).show(); $('#fldDirectPlayAudioCodec', page).show();
} }
}); });
$('#selectTranscodingProfileType', page).on('change', function () { $('#selectTranscodingProfileType', page).on('change', function () {
if ('Video' == this.value) { if (this.value == 'Video') {
$('#fldTranscodingVideoCodec', page).show(); $('#fldTranscodingVideoCodec', page).show();
$('#fldTranscodingProtocol', page).show(); $('#fldTranscodingProtocol', page).show();
$('#fldEnableMpegtsM2TsMode', page).show(); $('#fldEnableMpegtsM2TsMode', page).show();
@ -732,7 +732,7 @@ import 'listViewStyle';
$('#fldEnableMpegtsM2TsMode', page).hide(); $('#fldEnableMpegtsM2TsMode', page).hide();
} }
if ('Photo' == this.value) { if (this.value == 'Photo') {
$('#fldTranscodingAudioCodec', page).hide(); $('#fldTranscodingAudioCodec', page).hide();
$('#fldEstimateContentLength', page).hide(); $('#fldEstimateContentLength', page).hide();
$('#fldReportByteRangeRequests', page).hide(); $('#fldReportByteRangeRequests', page).hide();
@ -743,13 +743,13 @@ import 'listViewStyle';
} }
}); });
$('#selectResponseProfileType', page).on('change', function () { $('#selectResponseProfileType', page).on('change', function () {
if ('Video' == this.value) { if (this.value == 'Video') {
$('#fldResponseProfileVideoCodec', page).show(); $('#fldResponseProfileVideoCodec', page).show();
} else { } else {
$('#fldResponseProfileVideoCodec', page).hide(); $('#fldResponseProfileVideoCodec', page).hide();
} }
if ('Photo' == this.value) { if (this.value == 'Photo') {
$('#fldResponseProfileAudioCodec', page).hide(); $('#fldResponseProfileAudioCodec', page).hide();
} else { } else {
$('#fldResponseProfileAudioCodec', page).show(); $('#fldResponseProfileAudioCodec', page).show();

View file

@ -18,13 +18,13 @@ import 'emby-button';
function renderUserProfiles(page, profiles) { function renderUserProfiles(page, profiles) {
renderProfiles(page, page.querySelector('.customProfiles'), profiles.filter(function (p) { renderProfiles(page, page.querySelector('.customProfiles'), profiles.filter(function (p) {
return 'User' == p.Type; return p.Type == 'User';
})); }));
} }
function renderSystemProfiles(page, profiles) { function renderSystemProfiles(page, profiles) {
renderProfiles(page, page.querySelector('.systemProfiles'), profiles.filter(function (p) { renderProfiles(page, page.querySelector('.systemProfiles'), profiles.filter(function (p) {
return 'System' == p.Type; return p.Type == 'System';
})); }));
} }
@ -45,7 +45,7 @@ import 'emby-button';
html += '</a>'; html += '</a>';
html += '</div>'; html += '</div>';
if ('User' == profile.Type) { if (profile.Type == 'User') {
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate('ButtonDelete') + '"><span class="material-icons delete"></span></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate('ButtonDelete') + '"><span class="material-icons delete"></span></button>';
} }

View file

@ -8,7 +8,7 @@ import libraryMenu from 'libraryMenu';
function loadPage(page, config, systemInfo) { function loadPage(page, config, systemInfo) {
Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) {
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')); c.checked = (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')) !== -1;
}); });
page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc; page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc;
page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9; page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9;
@ -81,7 +81,7 @@ import libraryMenu from 'libraryMenu';
updateEncoder(form); updateEncoder(form);
}, function () { }, function () {
import('alert').then(({default: alert}) => { import('alert').then(({default: alert}) => {
alert(globalize.translate('DefaultErrorMessage')); alert(globalize.translate('ErrorDefault'));
}); });
Dashboard.processServerConfigurationUpdateResult(); Dashboard.processServerConfigurationUpdateResult();
@ -107,7 +107,7 @@ import libraryMenu from 'libraryMenu';
value = value || ''; value = value || '';
let any; let any;
Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) { Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) {
if (-1 === c.getAttribute('data-types').split(',').indexOf(value)) { if (c.getAttribute('data-types').split(',').indexOf(value) === -1) {
dom.parentWithTag(c, 'LABEL').classList.add('hide'); dom.parentWithTag(c, 'LABEL').classList.add('hide');
} else { } else {
dom.parentWithTag(c, 'LABEL').classList.remove('hide'); dom.parentWithTag(c, 'LABEL').classList.remove('hide');
@ -138,7 +138,7 @@ import libraryMenu from 'libraryMenu';
$(document).on('pageinit', '#encodingSettingsPage', function () { $(document).on('pageinit', '#encodingSettingsPage', function () {
const page = this; const page = this;
page.querySelector('#selectVideoDecoder').addEventListener('change', function () { page.querySelector('#selectVideoDecoder').addEventListener('change', function () {
if ('vaapi' == this.value) { if (this.value == 'vaapi') {
page.querySelector('.fldVaapiDevice').classList.remove('hide'); page.querySelector('.fldVaapiDevice').classList.remove('hide');
page.querySelector('#txtVaapiDevice').setAttribute('required', 'required'); page.querySelector('#txtVaapiDevice').setAttribute('required', 'required');
} else { } else {

View file

@ -52,7 +52,7 @@ import 'emby-button';
}); });
}, function () { }, function () {
import('alert').then(({default: alert}) => { import('alert').then(({default: alert}) => {
alert(globalize.translate('DefaultErrorMessage')); alert(globalize.translate('ErrorDefault'));
}); });
Dashboard.processServerConfigurationUpdateResult(); Dashboard.processServerConfigurationUpdateResult();

View file

@ -48,7 +48,7 @@ import 'emby-button';
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
}); });
ApiClient.getNamedConfiguration('metadata').then(function(config) { ApiClient.getNamedConfiguration('metadata').then(function(config) {
config.UseFileCreationTimeForDateAdded = '1' === $('#selectDateAdded', form).val(); config.UseFileCreationTimeForDateAdded = $('#selectDateAdded', form).val() === '1';
ApiClient.updateNamedConfiguration('metadata', config); ApiClient.updateNamedConfiguration('metadata', config);
}); });
@ -61,7 +61,7 @@ import 'emby-button';
libraryMenu.setTabs('librarysetup', 1, getTabs); libraryMenu.setTabs('librarysetup', 1, getTabs);
loadData(); loadData();
ApiClient.getSystemInfo().then(function(info) { ApiClient.getSystemInfo().then(function(info) {
if ('Windows' === info.OperatingSystem) { if (info.OperatingSystem === 'Windows') {
view.querySelector('.fldSaveMetadataHidden').classList.remove('hide'); view.querySelector('.fldSaveMetadataHidden').classList.remove('hide');
} else { } else {
view.querySelector('.fldSaveMetadataHidden').classList.add('hide'); view.querySelector('.fldSaveMetadataHidden').classList.add('hide');

View file

@ -156,7 +156,7 @@ import 'emby-itemrefreshindicator';
} }
function shouldRefreshLibraryAfterChanges(page) { function shouldRefreshLibraryAfterChanges(page) {
return 'mediaLibraryPage' === page.id; return page.id === 'mediaLibraryPage';
} }
function reloadVirtualFolders(page, virtualFolders) { function reloadVirtualFolders(page, virtualFolders) {
@ -286,7 +286,7 @@ import 'emby-itemrefreshindicator';
if (hasCardImageContainer) { if (hasCardImageContainer) {
html += '<div class="cardIndicators backdropCardIndicators">'; html += '<div class="cardIndicators backdropCardIndicators">';
html += '<div is="emby-itemrefreshindicator"' + (virtualFolder.RefreshProgress || virtualFolder.RefreshStatus && 'Idle' !== virtualFolder.RefreshStatus ? '' : ' class="hide"') + ' data-progress="' + (virtualFolder.RefreshProgress || 0) + '" data-status="' + virtualFolder.RefreshStatus + '"></div>'; html += '<div is="emby-itemrefreshindicator"' + (virtualFolder.RefreshProgress || virtualFolder.RefreshStatus && virtualFolder.RefreshStatus !== 'Idle' ? '' : ' class="hide"') + ' data-progress="' + (virtualFolder.RefreshProgress || 0) + '" data-status="' + virtualFolder.RefreshStatus + '"></div>';
html += '</div>'; html += '</div>';
html += '</div>'; html += '</div>';
} }

View file

@ -30,7 +30,7 @@ import 'emby-select';
}).filter(function (s) { }).filter(function (s) {
return s.length > 0; return s.length > 0;
}); });
config.IsRemoteIPFilterBlacklist = 'blacklist' === form.querySelector('#selectExternalAddressFilterMode').value; config.IsRemoteIPFilterBlacklist = form.querySelector('#selectExternalAddressFilterMode').value === 'blacklist';
config.PublicPort = form.querySelector('#txtPublicPort').value; config.PublicPort = form.querySelector('#txtPublicPort').value;
config.PublicHttpsPort = form.querySelector('#txtPublicHttpsPort').value; config.PublicHttpsPort = form.querySelector('#txtPublicHttpsPort').value;
config.HttpServerPortNumber = form.querySelector('#txtPortNumber').value; config.HttpServerPortNumber = form.querySelector('#txtPortNumber').value;
@ -110,7 +110,7 @@ import 'emby-select';
page.querySelector('#txtLanNetworks').value = (config.LocalNetworkSubnets || []).join(', '); page.querySelector('#txtLanNetworks').value = (config.LocalNetworkSubnets || []).join(', ');
page.querySelector('#txtExternalAddressFilter').value = (config.RemoteIPFilter || []).join(', '); page.querySelector('#txtExternalAddressFilter').value = (config.RemoteIPFilter || []).join(', ');
page.querySelector('#selectExternalAddressFilterMode').value = config.IsRemoteIPFilterBlacklist ? 'blacklist' : 'whitelist'; page.querySelector('#selectExternalAddressFilterMode').value = config.IsRemoteIPFilterBlacklist ? 'blacklist' : 'whitelist';
page.querySelector('#chkRemoteAccess').checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess; page.querySelector('#chkRemoteAccess').checked = config.EnableRemoteAccess == null || config.EnableRemoteAccess;
page.querySelector('#txtHttpsPort').value = config.HttpsPortNumber; page.querySelector('#txtHttpsPort').value = config.HttpsPortNumber;
page.querySelector('#chkEnableHttps').checked = config.EnableHttps; page.querySelector('#chkEnableHttps').checked = config.EnableHttps;
page.querySelector('#chkRequireHttps').checked = config.RequireHttps; page.querySelector('#chkRequireHttps').checked = config.RequireHttps;

View file

@ -106,7 +106,7 @@ define(['jQuery', 'emby-checkbox'], function ($) {
$(document).on('pageinit', '#notificationSettingPage', function () { $(document).on('pageinit', '#notificationSettingPage', function () {
var page = this; var page = this;
$('#selectUsers', page).on('change', function () { $('#selectUsers', page).on('change', function () {
if ('Custom' == this.value) { if (this.value == 'Custom') {
$('.selectCustomUsers', page).show(); $('.selectCustomUsers', page).show();
} else { } else {
$('.selectCustomUsers', page).hide(); $('.selectCustomUsers', page).hide();

View file

@ -1,6 +1,8 @@
define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'], function(loading, libraryMenu, globalize) { define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'], function(loading, libraryMenu, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
function reload(page) { function reload(page) {
loading.show(); loading.show();
ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function(list) { ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function(list) {

View file

@ -1,6 +1,8 @@
define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) { define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) {
'use strict'; 'use strict';
loading = loading.default || loading;
function populateHistory(packageInfo, page) { function populateHistory(packageInfo, page) {
var html = ''; var html = '';
var length = Math.min(packageInfo.versions.length, 10); var length = Math.min(packageInfo.versions.length, 10);
@ -79,7 +81,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'e
page.querySelector('#btnInstall').disabled = true; page.querySelector('#btnInstall').disabled = true;
ApiClient.installPlugin(name, guid, version).then(function () { ApiClient.installPlugin(name, guid, version).then(function () {
loading.hide(); loading.hide();
alertText(globalize.translate('PluginInstalledMessage')); alertText(globalize.translate('MessagePluginInstalled'));
}); });
}; };

View file

@ -1,6 +1,8 @@
define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) { define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
function reloadList(page) { function reloadList(page) {
loading.show(); loading.show();
var promise1 = ApiClient.getAvailablePlugins(); var promise1 = ApiClient.getAvailablePlugins();
@ -17,13 +19,13 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby
function getHeaderText(category) { function getHeaderText(category) {
category = category.replace(' ', ''); category = category.replace(' ', '');
if ('Channel' === category) { if (category === 'Channel') {
category = 'Channels'; category = 'Channels';
} else if ('Theme' === category) { } else if (category === 'Theme') {
category = 'Themes'; category = 'Themes';
} else if ('LiveTV' === category) { } else if (category === 'LiveTV') {
category = 'HeaderLiveTV'; category = 'HeaderLiveTV';
} else if ('ScreenSaver' === category) { } else if (category === 'ScreenSaver') {
category = 'HeaderScreenSavers'; category = 'HeaderScreenSavers';
} }

View file

@ -1,15 +1,17 @@
define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) { define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
function deletePlugin(page, uniqueid, name) { function deletePlugin(page, uniqueid, name) {
var msg = globalize.translate('UninstallPluginConfirmation', name); var msg = globalize.translate('UninstallPluginConfirmation', name);
require(['confirm'], function (confirm) { require(['confirm'], function (confirm) {
confirm.default({ confirm.default({
title: globalize.translate('UninstallPluginHeader'), title: globalize.translate('HeaderUninstallPlugin'),
text: msg, text: msg,
primary: 'delete', primary: 'delete',
confirmText: globalize.translate('UninstallPluginHeader') confirmText: globalize.translate('HeaderUninstallPlugin')
}).then(function () { }).then(function () {
loading.show(); loading.show();
ApiClient.uninstallPlugin(uniqueid).then(function () { ApiClient.uninstallPlugin(uniqueid).then(function () {
@ -21,7 +23,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
function showNoConfigurationMessage() { function showNoConfigurationMessage() {
Dashboard.alert({ Dashboard.alert({
message: globalize.translate('NoPluginConfigurationMessage') message: globalize.translate('MessageNoPluginConfiguration')
}); });
} }
@ -95,7 +97,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
html += '<div class="centerMessage">'; html += '<div class="centerMessage">';
html += '<h1>' + globalize.translate('MessageNoPluginsInstalled') + '</h1>'; html += '<h1>' + globalize.translate('MessageNoPluginsInstalled') + '</h1>';
html += '<p><a is="emby-linkbutton" class="button-link" href="availableplugins.html">'; html += '<p><a is="emby-linkbutton" class="button-link" href="availableplugins.html">';
html += globalize.translate('BrowsePluginCatalogMessage'); html += globalize.translate('MessageBrowsePluginCatalog');
html += '</a></p>'; html += '</a></p>';
html += '</div>'; html += '</div>';
} }

View file

@ -84,16 +84,16 @@ import 'emby-select';
}, },
// TODO: Replace this mess with date-fns and remove datetime completely // TODO: Replace this mess with date-fns and remove datetime completely
getTriggerFriendlyName: function (trigger) { getTriggerFriendlyName: function (trigger) {
if ('DailyTrigger' == trigger.Type) { if (trigger.Type == 'DailyTrigger') {
return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
} }
if ('WeeklyTrigger' == trigger.Type) { if (trigger.Type == 'WeeklyTrigger') {
// TODO: The day of week isn't localised as well // TODO: The day of week isn't localised as well
return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
} }
if ('SystemEventTrigger' == trigger.Type && 'WakeFromSleep' == trigger.SystemEvent) { if (trigger.Type == 'SystemEventTrigger' && trigger.SystemEvent == 'WakeFromSleep') {
return globalize.translate('OnWakeFromSleep'); return globalize.translate('OnWakeFromSleep');
} }

View file

@ -14,13 +14,13 @@ import globalize from 'globalize';
let html = ''; let html = '';
for (const folder of mediaFolders) { for (const folder of mediaFolders) {
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1;
checkedAttribute = isChecked ? ' checked="checked"' : ''; checkedAttribute = isChecked ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>';
} }
for (const folder of channelsResult.Items) { for (const folder of channelsResult.Items) {
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1;
checkedAttribute = isChecked ? ' checked="checked"' : ''; checkedAttribute = isChecked ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>';
} }
@ -96,7 +96,7 @@ import globalize from 'globalize';
$('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding); $('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding);
$('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing); $('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing);
$('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding); $('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding);
$('#chkRemoteAccess', page).prop('checked', null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); $('#chkRemoteAccess', page).prop('checked', user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess);
$('#chkEnableSyncTranscoding', page).prop('checked', user.Policy.EnableSyncTranscoding); $('#chkEnableSyncTranscoding', page).prop('checked', user.Policy.EnableSyncTranscoding);
$('#chkEnableConversion', page).prop('checked', user.Policy.EnableMediaConversion || false); $('#chkEnableConversion', page).prop('checked', user.Policy.EnableMediaConversion || false);
$('#chkEnableSharing', page).prop('checked', user.Policy.EnablePublicSharing); $('#chkEnableSharing', page).prop('checked', user.Policy.EnablePublicSharing);

View file

@ -18,7 +18,7 @@ import globalize from 'globalize';
for (let i = 0, length = mediaFolders.length; i < length; i++) { for (let i = 0, length = mediaFolders.length; i < length; i++) {
const folder = mediaFolders[i]; const folder = mediaFolders[i];
const isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id); const isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1;
const checkedAttribute = isChecked ? ' checked="checked"' : ''; const checkedAttribute = isChecked ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>';
} }
@ -37,7 +37,7 @@ import globalize from 'globalize';
for (let i = 0, length = channels.length; i < length; i++) { for (let i = 0, length = channels.length; i < length; i++) {
const folder = channels[i]; const folder = channels[i];
const isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id); const isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1;
const checkedAttribute = isChecked ? ' checked="checked"' : ''; const checkedAttribute = isChecked ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + '><span>' + folder.Name + '</span></label>';
} }
@ -61,7 +61,7 @@ import globalize from 'globalize';
for (let i = 0, length = devices.length; i < length; i++) { for (let i = 0, length = devices.length; i < length; i++) {
const device = devices[i]; const device = devices[i];
const checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ''; const checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + '><span>' + device.Name + ' - ' + device.AppName + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + '><span>' + device.Name + ' - ' + device.AppName + '</span></label>';
} }

View file

@ -89,7 +89,7 @@ import 'emby-checkbox';
}); });
}, function (response) { }, function (response) {
import('toast').then(({default: toast}) => { import('toast').then(({default: toast}) => {
toast(globalize.translate('DefaultErrorMessage')); toast(globalize.translate('ErrorDefault'));
}); });
loading.hide(); loading.hide();

View file

@ -67,7 +67,7 @@ import 'paper-icon-button-light';
for (let i = 0, length = items.length; i < length; i++) { for (let i = 0, length = items.length; i < length; i++) {
const item = items[i]; const item = items[i];
const checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ''; const checkedAttribute = user.Policy.BlockUnratedItems.indexOf(item.value) != -1 ? ' checked="checked"' : '';
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + '><span>' + item.name + '</span></label>'; html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + '><span>' + item.name + '</span></label>';
} }
@ -201,7 +201,7 @@ import 'paper-icon-button-light';
}).then(function (updatedSchedule) { }).then(function (updatedSchedule) {
const schedules = getSchedulesFromPage(page); const schedules = getSchedulesFromPage(page);
if (-1 == index) { if (index == -1) {
index = schedules.length; index = schedules.length;
} }
@ -234,7 +234,7 @@ import 'paper-icon-button-light';
}).then(function (value) { }).then(function (value) {
const tags = getBlockedTagsFromPage(page); const tags = getBlockedTagsFromPage(page);
if (-1 == tags.indexOf(value)) { if (tags.indexOf(value) == -1) {
tags.push(value); tags.push(value);
loadBlockedTags(page, tags); loadBlockedTags(page, tags);
} }

View file

@ -14,7 +14,7 @@ import 'emby-button';
let showPasswordSection = true; let showPasswordSection = true;
let showLocalAccessSection = false; let showLocalAccessSection = false;
if ('Guest' == user.ConnectLinkType) { if (user.ConnectLinkType == 'Guest') {
page.querySelector('.localAccessSection').classList.add('hide'); page.querySelector('.localAccessSection').classList.add('hide');
showPasswordSection = false; showPasswordSection = false;
} else if (user.HasConfiguredPassword) { } else if (user.HasConfiguredPassword) {
@ -145,14 +145,14 @@ import 'emby-button';
function resetPassword() { function resetPassword() {
const msg = globalize.translate('PasswordResetConfirmation'); const msg = globalize.translate('PasswordResetConfirmation');
import('confirm').then(({default: confirm}) => { import('confirm').then(({default: confirm}) => {
confirm(msg, globalize.translate('PasswordResetHeader')).then(function () { confirm(msg, globalize.translate('HeaderResetPassword')).then(function () {
const userId = params.userId; const userId = params.userId;
loading.show(); loading.show();
ApiClient.resetUserPassword(userId).then(function () { ApiClient.resetUserPassword(userId).then(function () {
loading.hide(); loading.hide();
Dashboard.alert({ Dashboard.alert({
message: globalize.translate('PasswordResetComplete'), message: globalize.translate('PasswordResetComplete'),
title: globalize.translate('PasswordResetHeader') title: globalize.translate('HeaderResetPassword')
}); });
loadUser(view, params); loadUser(view, params);
}); });

View file

@ -129,7 +129,7 @@ import 'flexStyles';
html += '</div>'; html += '</div>';
html += '<div class="cardText cardText-secondary">'; html += '<div class="cardText cardText-secondary">';
const lastSeen = getLastSeenText(user.LastActivityDate); const lastSeen = getLastSeenText(user.LastActivityDate);
html += '' != lastSeen ? lastSeen : '&nbsp;'; html += lastSeen != '' ? lastSeen : '&nbsp;';
html += '</div>'; html += '</div>';
html += '</div>'; html += '</div>';
html += '</div>'; html += '</div>';

View file

@ -1,6 +1,8 @@
define(['loading', 'scripts/editorsidebar'], function (loading) { define(['loading', 'scripts/editorsidebar'], function (loading) {
'use strict'; 'use strict';
loading = loading.default || loading;
function reload(context, itemId) { function reload(context, itemId) {
loading.show(); loading.show();

View file

@ -147,11 +147,11 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
options.Limit = 20; options.Limit = 20;
var userId = apiClient.getCurrentUserId(); var userId = apiClient.getCurrentUserId();
if ('MusicArtist' === section.types) { if (section.types === 'MusicArtist') {
return apiClient.getArtists(userId, options); return apiClient.getArtists(userId, options);
} }
if ('Person' === section.types) { if (section.types === 'Person') {
return apiClient.getPeople(userId, options); return apiClient.getPeople(userId, options);
} }
@ -198,7 +198,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
preferThumb: section.preferThumb, preferThumb: section.preferThumb,
shape: section.shape, shape: section.shape,
centerText: section.centerText && !cardLayout, centerText: section.centerText && !cardLayout,
overlayText: false !== section.overlayText, overlayText: section.overlayText !== false,
showTitle: section.showTitle, showTitle: section.showTitle,
showYear: section.showYear, showYear: section.showYear,
showParentTitle: section.showParentTitle, showParentTitle: section.showParentTitle,

View file

@ -20,7 +20,7 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-
} }
function getTabController(index) { function getTabController(index) {
if (null == index) { if (index == null) {
throw new Error('index cannot be null'); throw new Error('index cannot be null');
} }

View file

@ -1,6 +1,8 @@
define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
'use strict'; 'use strict';
loading = loading.default || loading;
function HomeTab(view, params) { function HomeTab(view, params) {
this.view = view; this.view = view;
this.params = params; this.params = params;

File diff suppressed because it is too large Load diff

View file

@ -14,6 +14,9 @@ import 'emby-scroller';
/* eslint-disable indent */ /* eslint-disable indent */
playbackManager = playbackManager.default || playbackManager;
loading = loading.default || loading;
function getInitialLiveTvQuery(instance, params) { function getInitialLiveTvQuery(instance, params) {
const query = { const query = {
UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(), UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(),
@ -22,7 +25,7 @@ import 'emby-scroller';
Limit: 300 Limit: 300
}; };
if ('Recordings' === params.type) { if (params.type === 'Recordings') {
query.IsInProgress = false; query.IsInProgress = false;
} else { } else {
query.HasAired = false; query.HasAired = false;
@ -32,39 +35,39 @@ import 'emby-scroller';
query.GenreIds = params.genreId; query.GenreIds = params.genreId;
} }
if ('true' === params.IsMovie) { if (params.IsMovie === 'true') {
query.IsMovie = true; query.IsMovie = true;
} else if ('false' === params.IsMovie) { } else if (params.IsMovie === 'false') {
query.IsMovie = false; query.IsMovie = false;
} }
if ('true' === params.IsSeries) { if (params.IsSeries === 'true') {
query.IsSeries = true; query.IsSeries = true;
} else if ('false' === params.IsSeries) { } else if (params.IsSeries === 'false') {
query.IsSeries = false; query.IsSeries = false;
} }
if ('true' === params.IsNews) { if (params.IsNews === 'true') {
query.IsNews = true; query.IsNews = true;
} else if ('false' === params.IsNews) { } else if (params.IsNews === 'false') {
query.IsNews = false; query.IsNews = false;
} }
if ('true' === params.IsSports) { if (params.IsSports === 'true') {
query.IsSports = true; query.IsSports = true;
} else if ('false' === params.IsSports) { } else if (params.IsSports === 'false') {
query.IsSports = false; query.IsSports = false;
} }
if ('true' === params.IsKids) { if (params.IsKids === 'true') {
query.IsKids = true; query.IsKids = true;
} else if ('false' === params.IsKids) { } else if (params.IsKids === 'false') {
query.IsKids = false; query.IsKids = false;
} }
if ('true' === params.IsAiring) { if (params.IsAiring === 'true') {
query.IsAiring = true; query.IsAiring = true;
} else if ('false' === params.IsAiring) { } else if (params.IsAiring === 'false') {
query.IsAiring = false; query.IsAiring = false;
} }
@ -194,13 +197,13 @@ import 'emby-scroller';
const btnSortIcon = instance.btnSortIcon; const btnSortIcon = instance.btnSortIcon;
if (btnSortIcon) { if (btnSortIcon) {
setSortButtonIcon(btnSortIcon, 'Descending' === values.sortOrder ? 'arrow_downward' : 'arrow_upward'); setSortButtonIcon(btnSortIcon, values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward');
} }
} }
} }
function updateItemsContainerForViewType(instance) { function updateItemsContainerForViewType(instance) {
if ('list' === instance.getViewSettings().imageType) { if (instance.getViewSettings().imageType === 'list') {
instance.itemsContainer.classList.remove('vertical-wrap'); instance.itemsContainer.classList.remove('vertical-wrap');
instance.itemsContainer.classList.add('vertical-list'); instance.itemsContainer.classList.add('vertical-list');
} else { } else {
@ -216,11 +219,11 @@ import 'emby-scroller';
if (alphaPicker) { if (alphaPicker) {
const values = instance.getSortValues(); const values = instance.getSortValues();
if (null == numItems) { if (numItems == null) {
numItems = 100; numItems = 100;
} }
if ('SortName' === values.sortBy && 'Ascending' === values.sortOrder && numItems > 40) { if (values.sortBy === 'SortName' && values.sortOrder === 'Ascending' && numItems > 40) {
alphaPicker.classList.remove('hide'); alphaPicker.classList.remove('hide');
instance.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); instance.itemsContainer.parentNode.classList.add('padded-right-withalphapicker');
} else { } else {
@ -235,19 +238,19 @@ import 'emby-scroller';
const apiClient = connectionManager.getApiClient(params.serverId); const apiClient = connectionManager.getApiClient(params.serverId);
instance.queryRecursive = false; instance.queryRecursive = false;
if ('Recordings' === params.type) { if (params.type === 'Recordings') {
return apiClient.getLiveTvRecordings(getInitialLiveTvQuery(instance, params)); return apiClient.getLiveTvRecordings(getInitialLiveTvQuery(instance, params));
} }
if ('Programs' === params.type) { if (params.type === 'Programs') {
if ('true' === params.IsAiring) { if (params.IsAiring === 'true') {
return apiClient.getLiveTvRecommendedPrograms(getInitialLiveTvQuery(instance, params)); return apiClient.getLiveTvRecommendedPrograms(getInitialLiveTvQuery(instance, params));
} }
return apiClient.getLiveTvPrograms(getInitialLiveTvQuery(instance, params)); return apiClient.getLiveTvPrograms(getInitialLiveTvQuery(instance, params));
} }
if ('nextup' === params.type) { if (params.type === 'nextup') {
return apiClient.getNextUpEpisodes(modifyQueryWithFilters(instance, { return apiClient.getNextUpEpisodes(modifyQueryWithFilters(instance, {
Limit: limit, Limit: limit,
Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo',
@ -263,9 +266,9 @@ import 'emby-scroller';
instance.queryRecursive = true; instance.queryRecursive = true;
let method = 'getItems'; let method = 'getItems';
if ('MusicArtist' === params.type) { if (params.type === 'MusicArtist') {
method = 'getArtists'; method = 'getArtists';
} else if ('Person' === params.type) { } else if (params.type === 'Person') {
method = 'getPeople'; method = 'getPeople';
} }
@ -274,15 +277,15 @@ import 'emby-scroller';
Limit: limit, Limit: limit,
Fields: 'PrimaryImageAspectRatio,SortName', Fields: 'PrimaryImageAspectRatio,SortName',
ImageTypeLimit: 1, ImageTypeLimit: 1,
IncludeItemTypes: 'MusicArtist' === params.type || 'Person' === params.type ? null : params.type, IncludeItemTypes: params.type === 'MusicArtist' || params.type === 'Person' ? null : params.type,
Recursive: true, Recursive: true,
IsFavorite: 'true' === params.IsFavorite || null, IsFavorite: params.IsFavorite === 'true' || null,
ArtistIds: params.artistId || null, ArtistIds: params.artistId || null,
SortBy: sortBy SortBy: sortBy
})); }));
} }
if ('Genre' === item.Type || 'MusicGenre' === item.Type || 'Studio' === item.Type || 'Person' === item.Type) { if (item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'Studio' || item.Type === 'Person') {
instance.queryRecursive = true; instance.queryRecursive = true;
const query = { const query = {
StartIndex: startIndex, StartIndex: startIndex,
@ -293,25 +296,25 @@ import 'emby-scroller';
SortBy: sortBy SortBy: sortBy
}; };
if ('Studio' === item.Type) { if (item.Type === 'Studio') {
query.StudioIds = item.Id; query.StudioIds = item.Id;
} else if ('Genre' === item.Type || 'MusicGenre' === item.Type) { } else if (item.Type === 'Genre' || item.Type === 'MusicGenre') {
query.GenreIds = item.Id; query.GenreIds = item.Id;
} else if ('Person' === item.Type) { } else if (item.Type === 'Person') {
query.PersonIds = item.Id; query.PersonIds = item.Id;
} }
if ('MusicGenre' === item.Type) { if (item.Type === 'MusicGenre') {
query.IncludeItemTypes = 'MusicAlbum'; query.IncludeItemTypes = 'MusicAlbum';
} else if ('GameGenre' === item.Type) { } else if (item.Type === 'GameGenre') {
query.IncludeItemTypes = 'Game'; query.IncludeItemTypes = 'Game';
} else if ('movies' === item.CollectionType) { } else if (item.CollectionType === 'movies') {
query.IncludeItemTypes = 'Movie'; query.IncludeItemTypes = 'Movie';
} else if ('tvshows' === item.CollectionType) { } else if (item.CollectionType === 'tvshows') {
query.IncludeItemTypes = 'Series'; query.IncludeItemTypes = 'Series';
} else if ('Genre' === item.Type) { } else if (item.Type === 'Genre') {
query.IncludeItemTypes = 'Movie,Series,Video'; query.IncludeItemTypes = 'Movie,Series,Video';
} else if ('Person' === item.Type) { } else if (item.Type === 'Person') {
query.IncludeItemTypes = params.type; query.IncludeItemTypes = params.type;
} }
@ -329,7 +332,7 @@ import 'emby-scroller';
} }
function getItem(params) { function getItem(params) {
if ('Recordings' === params.type || 'Programs' === params.type || 'nextup' === params.type) { if (params.type === 'Recordings' || params.type === 'Programs' || params.type === 'nextup') {
return Promise.resolve(null); return Promise.resolve(null);
} }
@ -426,7 +429,7 @@ class ItemsView {
constructor(view, params) { constructor(view, params) {
function fetchData() { function fetchData() {
return getItems(self, params, self.currentItem).then(function (result) { return getItems(self, params, self.currentItem).then(function (result) {
if (null == self.totalItemCount) { if (self.totalItemCount == null) {
self.totalItemCount = result.Items ? result.Items.length : result.length; self.totalItemCount = result.Items ? result.Items.length : result.length;
} }
@ -438,7 +441,7 @@ class ItemsView {
function getItemsHtml(items) { function getItemsHtml(items) {
const settings = self.getViewSettings(); const settings = self.getViewSettings();
if ('list' === settings.imageType) { if (settings.imageType === 'list') {
return listView.getListViewHtml({ return listView.getListViewHtml({
items: items items: items
}); });
@ -452,24 +455,24 @@ class ItemsView {
const item = self.currentItem; const item = self.currentItem;
let lines = settings.showTitle ? 2 : 0; let lines = settings.showTitle ? 2 : 0;
if ('banner' === settings.imageType) { if (settings.imageType === 'banner') {
shape = 'banner'; shape = 'banner';
} else if ('disc' === settings.imageType) { } else if (settings.imageType === 'disc') {
shape = 'square'; shape = 'square';
preferDisc = true; preferDisc = true;
} else if ('logo' === settings.imageType) { } else if (settings.imageType === 'logo') {
shape = 'backdrop'; shape = 'backdrop';
preferLogo = true; preferLogo = true;
} else if ('thumb' === settings.imageType) { } else if (settings.imageType === 'thumb') {
shape = 'backdrop'; shape = 'backdrop';
preferThumb = true; preferThumb = true;
} else if ('nextup' === params.type) { } else if (params.type === 'nextup') {
shape = 'backdrop'; shape = 'backdrop';
preferThumb = 'thumb' === settings.imageType; preferThumb = settings.imageType === 'thumb';
} else if ('Programs' === params.type || 'Recordings' === params.type) { } else if (params.type === 'Programs' || params.type === 'Recordings') {
shape = 'true' === params.IsMovie ? 'portrait' : 'autoVertical'; shape = params.IsMovie === 'true' ? 'portrait' : 'autoVertical';
preferThumb = 'true' !== params.IsMovie ? 'auto' : false; preferThumb = params.IsMovie !== 'true' ? 'auto' : false;
defaultShape = 'true' === params.IsMovie ? 'portrait' : 'backdrop'; defaultShape = params.IsMovie === 'true' ? 'portrait' : 'backdrop';
} else { } else {
shape = 'autoVertical'; shape = 'autoVertical';
} }
@ -487,46 +490,46 @@ class ItemsView {
overlayMoreButton: true, overlayMoreButton: true,
overlayText: !settings.showTitle, overlayText: !settings.showTitle,
defaultShape: defaultShape, defaultShape: defaultShape,
action: 'Audio' === params.type ? 'playallfromhere' : null action: params.type === 'Audio' ? 'playallfromhere' : null
}; };
if ('nextup' === params.type) { if (params.type === 'nextup') {
posterOptions.showParentTitle = settings.showTitle; posterOptions.showParentTitle = settings.showTitle;
} else if ('Person' === params.type) { } else if (params.type === 'Person') {
posterOptions.showYear = false; posterOptions.showYear = false;
posterOptions.showParentTitle = false; posterOptions.showParentTitle = false;
lines = 1; lines = 1;
} else if ('Audio' === params.type) { } else if (params.type === 'Audio') {
posterOptions.showParentTitle = settings.showTitle; posterOptions.showParentTitle = settings.showTitle;
} else if ('MusicAlbum' === params.type) { } else if (params.type === 'MusicAlbum') {
posterOptions.showParentTitle = settings.showTitle; posterOptions.showParentTitle = settings.showTitle;
} else if ('Episode' === params.type) { } else if (params.type === 'Episode') {
posterOptions.showParentTitle = settings.showTitle; posterOptions.showParentTitle = settings.showTitle;
} else if ('MusicArtist' === params.type) { } else if (params.type === 'MusicArtist') {
posterOptions.showYear = false; posterOptions.showYear = false;
lines = 1; lines = 1;
} else if ('Programs' === params.type) { } else if (params.type === 'Programs') {
lines = settings.showTitle ? 1 : 0; lines = settings.showTitle ? 1 : 0;
const showParentTitle = settings.showTitle && 'true' !== params.IsMovie; const showParentTitle = settings.showTitle && params.IsMovie !== 'true';
if (showParentTitle) { if (showParentTitle) {
lines++; lines++;
} }
const showAirTime = settings.showTitle && 'Recordings' !== params.type; const showAirTime = settings.showTitle && params.type !== 'Recordings';
if (showAirTime) { if (showAirTime) {
lines++; lines++;
} }
const showYear = settings.showTitle && 'true' === params.IsMovie && 'Recordings' === params.type; const showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings';
if (showYear) { if (showYear) {
lines++; lines++;
} }
posterOptions = Object.assign(posterOptions, { posterOptions = Object.assign(posterOptions, {
inheritThumb: 'Recordings' === params.type, inheritThumb: params.type === 'Recordings',
context: 'livetv', context: 'livetv',
showParentTitle: showParentTitle, showParentTitle: showParentTitle,
showAirTime: showAirTime, showAirTime: showAirTime,
@ -543,7 +546,7 @@ class ItemsView {
posterOptions.lines = lines; posterOptions.lines = lines;
posterOptions.items = items; posterOptions.items = items;
if (item && 'folders' === item.CollectionType) { if (item && item.CollectionType === 'folders') {
posterOptions.context = 'folders'; posterOptions.context = 'folders';
} }
@ -575,7 +578,7 @@ class ItemsView {
function setTitle(item) { function setTitle(item) {
Emby.Page.setTitle(getTitle(item) || ''); Emby.Page.setTitle(getTitle(item) || '');
if (item && 'playlists' === item.CollectionType) { if (item && item.CollectionType === 'playlists') {
hideOrShowAll(view.querySelectorAll('.btnNewItem'), false); hideOrShowAll(view.querySelectorAll('.btnNewItem'), false);
} else { } else {
hideOrShowAll(view.querySelectorAll('.btnNewItem'), true); hideOrShowAll(view.querySelectorAll('.btnNewItem'), true);
@ -583,43 +586,43 @@ class ItemsView {
} }
function getTitle(item) { function getTitle(item) {
if ('Recordings' === params.type) { if (params.type === 'Recordings') {
return globalize.translate('Recordings'); return globalize.translate('Recordings');
} }
if ('Programs' === params.type) { if (params.type === 'Programs') {
if ('true' === params.IsMovie) { if (params.IsMovie === 'true') {
return globalize.translate('Movies'); return globalize.translate('Movies');
} }
if ('true' === params.IsSports) { if (params.IsSports === 'true') {
return globalize.translate('Sports'); return globalize.translate('Sports');
} }
if ('true' === params.IsKids) { if (params.IsKids === 'true') {
return globalize.translate('HeaderForKids'); return globalize.translate('HeaderForKids');
} }
if ('true' === params.IsAiring) { if (params.IsAiring === 'true') {
return globalize.translate('HeaderOnNow'); return globalize.translate('HeaderOnNow');
} }
if ('true' === params.IsSeries) { if (params.IsSeries === 'true') {
return globalize.translate('Shows'); return globalize.translate('Shows');
} }
if ('true' === params.IsNews) { if (params.IsNews === 'true') {
return globalize.translate('News'); return globalize.translate('News');
} }
return globalize.translate('Programs'); return globalize.translate('Programs');
} }
if ('nextup' === params.type) { if (params.type === 'nextup') {
return globalize.translate('NextUp'); return globalize.translate('NextUp');
} }
if ('favoritemovies' === params.type) { if (params.type === 'favoritemovies') {
return globalize.translate('FavoriteMovies'); return globalize.translate('FavoriteMovies');
} }
@ -627,35 +630,35 @@ class ItemsView {
return item.Name; return item.Name;
} }
if ('Movie' === params.type) { if (params.type === 'Movie') {
return globalize.translate('Movies'); return globalize.translate('Movies');
} }
if ('Series' === params.type) { if (params.type === 'Series') {
return globalize.translate('Shows'); return globalize.translate('Shows');
} }
if ('Season' === params.type) { if (params.type === 'Season') {
return globalize.translate('Seasons'); return globalize.translate('Seasons');
} }
if ('Episode' === params.type) { if (params.type === 'Episode') {
return globalize.translate('Episodes'); return globalize.translate('Episodes');
} }
if ('MusicArtist' === params.type) { if (params.type === 'MusicArtist') {
return globalize.translate('Artists'); return globalize.translate('Artists');
} }
if ('MusicAlbum' === params.type) { if (params.type === 'MusicAlbum') {
return globalize.translate('Albums'); return globalize.translate('Albums');
} }
if ('Audio' === params.type) { if (params.type === 'Audio') {
return globalize.translate('Songs'); return globalize.translate('Songs');
} }
if ('Video' === params.type) { if (params.type === 'Video') {
return globalize.translate('Videos'); return globalize.translate('Videos');
} }
@ -714,11 +717,11 @@ class ItemsView {
if (params.parentId) { if (params.parentId) {
this.itemsContainer.setAttribute('data-parentid', params.parentId); this.itemsContainer.setAttribute('data-parentid', params.parentId);
} else if ('nextup' === params.type) { } else if (params.type === 'nextup') {
this.itemsContainer.setAttribute('data-monitor', 'videoplayback'); this.itemsContainer.setAttribute('data-monitor', 'videoplayback');
} else if ('favoritemovies' === params.type) { } else if (params.type === 'favoritemovies') {
this.itemsContainer.setAttribute('data-monitor', 'markfavorite'); this.itemsContainer.setAttribute('data-monitor', 'markfavorite');
} else if ('Programs' === params.type) { } else if (params.type === 'Programs') {
this.itemsContainer.setAttribute('data-refreshinterval', '300000'); this.itemsContainer.setAttribute('data-refreshinterval', '300000');
} }
@ -751,7 +754,7 @@ class ItemsView {
const sortButton = sortButtons[i]; const sortButton = sortButtons[i];
sortButton.addEventListener('click', showSortMenu.bind(this)); sortButton.addEventListener('click', showSortMenu.bind(this));
if ('nextup' !== params.type) { if (params.type !== 'nextup') {
sortButton.classList.remove('hide'); sortButton.classList.remove('hide');
} }
} }
@ -786,19 +789,19 @@ class ItemsView {
} }
}); });
if (!isRestored && item && 'PhotoAlbum' !== item.Type) { if (!isRestored && item && item.Type !== 'PhotoAlbum') {
initAlphaPicker(); initAlphaPicker();
} }
const itemType = item ? item.Type : null; const itemType = item ? item.Type : null;
if ('MusicGenre' === itemType || 'Programs' !== params.type && 'Channel' !== itemType) { if (itemType === 'MusicGenre' || params.type !== 'Programs' && itemType !== 'Channel') {
hideOrShowAll(view.querySelectorAll('.btnPlay'), false); hideOrShowAll(view.querySelectorAll('.btnPlay'), false);
} else { } else {
hideOrShowAll(view.querySelectorAll('.btnPlay'), true); hideOrShowAll(view.querySelectorAll('.btnPlay'), true);
} }
if ('MusicGenre' === itemType || 'Programs' !== params.type && 'nextup' !== params.type && 'Channel' !== itemType) { if (itemType === 'MusicGenre' || params.type !== 'Programs' && params.type !== 'nextup' && itemType !== 'Channel') {
hideOrShowAll(view.querySelectorAll('.btnShuffle'), false); hideOrShowAll(view.querySelectorAll('.btnShuffle'), false);
} else { } else {
hideOrShowAll(view.querySelectorAll('.btnShuffle'), true); hideOrShowAll(view.querySelectorAll('.btnShuffle'), true);
@ -858,14 +861,14 @@ class ItemsView {
getFilters() { getFilters() {
const basekey = this.getSettingsKey(); const basekey = this.getSettingsKey();
return { return {
IsPlayed: 'true' === userSettings.getFilter(basekey + '-filter-IsPlayed'), IsPlayed: userSettings.getFilter(basekey + '-filter-IsPlayed') === 'true',
IsUnplayed: 'true' === userSettings.getFilter(basekey + '-filter-IsUnplayed'), IsUnplayed: userSettings.getFilter(basekey + '-filter-IsUnplayed') === 'true',
IsFavorite: 'true' === userSettings.getFilter(basekey + '-filter-IsFavorite'), IsFavorite: userSettings.getFilter(basekey + '-filter-IsFavorite') === 'true',
IsResumable: 'true' === userSettings.getFilter(basekey + '-filter-IsResumable'), IsResumable: userSettings.getFilter(basekey + '-filter-IsResumable') === 'true',
Is4K: 'true' === userSettings.getFilter(basekey + '-filter-Is4K'), Is4K: userSettings.getFilter(basekey + '-filter-Is4K') === 'true',
IsHD: 'true' === userSettings.getFilter(basekey + '-filter-IsHD'), IsHD: userSettings.getFilter(basekey + '-filter-IsHD') === 'true',
IsSD: 'true' === userSettings.getFilter(basekey + '-filter-IsSD'), IsSD: userSettings.getFilter(basekey + '-filter-IsSD') === 'true',
Is3D: 'true' === userSettings.getFilter(basekey + '-filter-Is3D'), Is3D: userSettings.getFilter(basekey + '-filter-Is3D') === 'true',
VideoTypes: userSettings.getFilter(basekey + '-filter-VideoTypes'), VideoTypes: userSettings.getFilter(basekey + '-filter-VideoTypes'),
SeriesStatus: userSettings.getFilter(basekey + '-filter-SeriesStatus'), SeriesStatus: userSettings.getFilter(basekey + '-filter-SeriesStatus'),
HasSubtitles: userSettings.getFilter(basekey + '-filter-HasSubtitles'), HasSubtitles: userSettings.getFilter(basekey + '-filter-HasSubtitles'),
@ -880,7 +883,7 @@ class ItemsView {
const basekey = this.getSettingsKey(); const basekey = this.getSettingsKey();
return { return {
sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(), sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(),
sortOrder: 'Descending' === userSettings.getFilter(basekey + '-sortorder') ? 'Descending' : 'Ascending' sortOrder: userSettings.getFilter(basekey + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending'
}; };
} }
getDefaultSortBy() { getDefaultSortBy() {
@ -897,7 +900,7 @@ class ItemsView {
const sortBy = []; const sortBy = [];
const params = this.params; const params = this.params;
if ('Programs' === params.type) { if (params.type === 'Programs') {
sortBy.push({ sortBy.push({
name: globalize.translate('AirDate'), name: globalize.translate('AirDate'),
value: 'StartDate,SortName' value: 'StartDate,SortName'
@ -922,7 +925,7 @@ class ItemsView {
sortBy.push(option); sortBy.push(option);
} }
if ('Programs' !== params.type) { if (params.type !== 'Programs') {
sortBy.push({ sortBy.push({
name: globalize.translate('DateAdded'), name: globalize.translate('DateAdded'),
value: 'DateCreated,SortName' value: 'DateCreated,SortName'
@ -964,7 +967,7 @@ class ItemsView {
return sortBy; return sortBy;
} }
getNameSortOption(params) { getNameSortOption(params) {
if ('Episode' === params.type) { if (params.type === 'Episode') {
return { return {
name: globalize.translate('Name'), name: globalize.translate('Name'),
value: 'SeriesName,SortName' value: 'SeriesName,SortName'
@ -977,7 +980,7 @@ class ItemsView {
}; };
} }
getPlayCountSortOption() { getPlayCountSortOption() {
if ('Programs' === this.params.type) { if (this.params.type === 'Programs') {
return null; return null;
} }
@ -985,9 +988,10 @@ class ItemsView {
name: globalize.translate('PlayCount'), name: globalize.translate('PlayCount'),
value: 'PlayCount,SortName' value: 'PlayCount,SortName'
}; };
} }
getDatePlayedSortOption() { getDatePlayedSortOption() {
if ('Programs' === this.params.type) { if (this.params.type === 'Programs') {
return null; return null;
} }
@ -997,7 +1001,11 @@ class ItemsView {
}; };
} }
getCriticRatingSortOption() { getCriticRatingSortOption() {
if ('Programs' === this.params.type) { if (this.params.type === 'Programs') {
};
ItemsView.prototype.getCriticRatingSortOption = function () {
if () {
return null; return null;
} }
@ -1016,8 +1024,8 @@ class ItemsView {
const filters = []; const filters = [];
const params = this.params; const params = this.params;
if (!('nextup' === params.type)) { if (!(params.type === 'nextup')) {
if ('Programs' === params.type) { if (params.type === 'Programs') {
filters.push('Genres'); filters.push('Genres');
} else { } else {
filters.push('IsUnplayed'); filters.push('IsUnplayed');
@ -1082,7 +1090,7 @@ class ItemsView {
const item = (this.params, this.currentItem); const item = (this.params, this.currentItem);
const fields = ['showTitle']; const fields = ['showTitle'];
if (!item || 'PhotoAlbum' !== item.Type && 'ChannelFolderItem' !== item.Type) { if (!item || item.Type !== 'PhotoAlbum' && item.Type !== 'ChannelFolderItem') {
fields.push('imageType'); fields.push('imageType');
} }
@ -1095,25 +1103,25 @@ class ItemsView {
const item = this.currentItem; const item = this.currentItem;
let showTitle = userSettings.get(basekey + '-showTitle'); let showTitle = userSettings.get(basekey + '-showTitle');
if ('true' === showTitle) { if (showTitle === 'true') {
showTitle = true; showTitle = true;
} else if ('false' === showTitle) { } else if (showTitle === 'false') {
showTitle = false; showTitle = false;
} else if ('Programs' === params.type || 'Recordings' === params.type || 'Person' === params.type || 'nextup' === params.type || 'Audio' === params.type || 'MusicAlbum' === params.type || 'MusicArtist' === params.type) { } else if (params.type === 'Programs' || params.type === 'Recordings' || params.type === 'Person' || params.type === 'nextup' || params.type === 'Audio' || params.type === 'MusicAlbum' || params.type === 'MusicArtist') {
showTitle = true; showTitle = true;
} else if (item && 'PhotoAlbum' !== item.Type) { } else if (item && item.Type !== 'PhotoAlbum') {
showTitle = true; showTitle = true;
} }
let imageType = userSettings.get(basekey + '-imageType'); let imageType = userSettings.get(basekey + '-imageType');
if (!imageType && 'nextup' === params.type) { if (!imageType && params.type === 'nextup') {
imageType = 'thumb'; imageType = 'thumb';
} }
return { return {
showTitle: showTitle, showTitle: showTitle,
showYear: 'false' !== userSettings.get(basekey + '-showYear'), showYear: userSettings.get(basekey + '-showYear') !== 'false',
imageType: imageType || 'primary', imageType: imageType || 'primary',
viewType: userSettings.get(basekey + '-viewType') || 'images' viewType: userSettings.get(basekey + '-viewType') || 'images'
}; };
@ -1121,11 +1129,11 @@ class ItemsView {
getItemTypes() { getItemTypes() {
const params = this.params; const params = this.params;
if ('nextup' === params.type) { if (params.type === 'nextup') {
return ['Episode']; return ['Episode'];
} }
if ('Programs' === params.type) { if (params.type === 'Programs') {
return ['Program']; return ['Program'];
} }

View file

@ -1,6 +1,9 @@
define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) {
'use strict'; 'use strict';
loading = loading.default || loading;
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { return function (view, params, tabContent) {
function getPageData() { function getPageData() {
if (!pageData) { if (!pageData) {

View file

@ -1,6 +1,8 @@
define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) {
'use strict'; 'use strict';
loading = loading.default || loading;
function renderRecordings(elem, recordings, cardOptions, scrollX) { function renderRecordings(elem, recordings, cardOptions, scrollX) {
if (!elem) { if (!elem) {
return; return;

View file

@ -1,6 +1,8 @@
define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) {
'use strict'; 'use strict';
loading = loading.default || loading;
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
} }

View file

@ -1,6 +1,8 @@
define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) { define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) {
'use strict'; 'use strict';
loading = loading.default || loading;
function renderTimers(context, timers) { function renderTimers(context, timers) {
var html = ''; var html = '';
html += cardBuilder.getCardsHtml({ html += cardBuilder.getCardsHtml({

View file

@ -1,6 +1,8 @@
define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
'use strict'; 'use strict';
loading = loading.default || loading;
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
} }
@ -142,9 +144,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
coverImage: true, coverImage: true,
overlayText: false, overlayText: false,
lazy: true, lazy: true,
overlayPlayButton: 'play' === overlayButton, overlayPlayButton: overlayButton === 'play',
overlayMoreButton: 'more' === overlayButton, overlayMoreButton: overlayButton === 'more',
overlayInfoButton: 'info' === overlayButton, overlayInfoButton: overlayButton === 'info',
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
showAirTime: true, showAirTime: true,
showAirDateTime: true showAirDateTime: true
@ -261,7 +263,7 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
require(depends, function (controllerFactory) { require(depends, function (controllerFactory) {
var tabContent; var tabContent;
if (0 == index) { if (index == 0) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent; self.tabContent = tabContent;
} }
@ -271,9 +273,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
if (!controller) { if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (0 === index) { if (index === 0) {
controller = self; controller = self;
} else if (6 === index) { } else if (index === 6) {
controller = new controllerFactory(view, tabContent, { controller = new controllerFactory(view, tabContent, {
collectionType: 'livetv' collectionType: 'livetv'
}); });
@ -305,8 +307,8 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
getTabController(page, index, function (controller) { getTabController(page, index, function (controller) {
initialTabIndex = null; initialTabIndex = null;
if (-1 == renderedTabs.indexOf(index)) { if (renderedTabs.indexOf(index) == -1) {
if (1 === index) { if (index === 1) {
renderedTabs.push(index); renderedTabs.push(index);
} }

View file

@ -1,6 +1,8 @@
define(['events', 'loading', 'globalize'], function (events, loading, globalize) { define(['events', 'loading', 'globalize'], function (events, loading, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
function onListingsSubmitted() { function onListingsSubmitted() {
Dashboard.navigate('livetvstatus.html'); Dashboard.navigate('livetvstatus.html');
} }

View file

@ -1,65 +1,68 @@
define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, globalize) { import $ from 'jQuery';
'use strict'; import loading from 'loading';
import globalize from 'globalize';
import 'emby-button';
function loadPage(page, config) { function loadPage(page, config) {
$('.liveTvSettingsForm', page).show(); $('.liveTvSettingsForm', page).show();
$('.noLiveTvServices', page).hide(); $('.noLiveTvServices', page).hide();
$('#selectGuideDays', page).val(config.GuideDays || ''); $('#selectGuideDays', page).val(config.GuideDays || '');
$('#txtPrePaddingMinutes', page).val(config.PrePaddingSeconds / 60); $('#txtPrePaddingMinutes', page).val(config.PrePaddingSeconds / 60);
$('#txtPostPaddingMinutes', page).val(config.PostPaddingSeconds / 60); $('#txtPostPaddingMinutes', page).val(config.PostPaddingSeconds / 60);
page.querySelector('#txtRecordingPath').value = config.RecordingPath || ''; page.querySelector('#txtRecordingPath').value = config.RecordingPath || '';
page.querySelector('#txtMovieRecordingPath').value = config.MovieRecordingPath || ''; page.querySelector('#txtMovieRecordingPath').value = config.MovieRecordingPath || '';
page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || ''; page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || '';
page.querySelector('#txtPostProcessor').value = config.RecordingPostProcessor || ''; page.querySelector('#txtPostProcessor').value = config.RecordingPostProcessor || '';
page.querySelector('#txtPostProcessorArguments').value = config.RecordingPostProcessorArguments || ''; page.querySelector('#txtPostProcessorArguments').value = config.RecordingPostProcessorArguments || '';
loading.hide(); loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; const form = this;
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
config.GuideDays = $('#selectGuideDays', form).val() || null; config.GuideDays = $('#selectGuideDays', form).val() || null;
var recordingPath = form.querySelector('#txtRecordingPath').value || null; const recordingPath = form.querySelector('#txtRecordingPath').value || null;
var movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null; const movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null;
var seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null; const seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null;
var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath; const recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
config.RecordingPath = recordingPath; config.RecordingPath = recordingPath;
config.MovieRecordingPath = movieRecordingPath; config.MovieRecordingPath = movieRecordingPath;
config.SeriesRecordingPath = seriesRecordingPath; config.SeriesRecordingPath = seriesRecordingPath;
config.RecordingEncodingFormat = 'mkv'; config.RecordingEncodingFormat = 'mkv';
config.PrePaddingSeconds = 60 * $('#txtPrePaddingMinutes', form).val(); config.PrePaddingSeconds = 60 * $('#txtPrePaddingMinutes', form).val();
config.PostPaddingSeconds = 60 * $('#txtPostPaddingMinutes', form).val(); config.PostPaddingSeconds = 60 * $('#txtPostPaddingMinutes', form).val();
config.RecordingPostProcessor = $('#txtPostProcessor', form).val(); config.RecordingPostProcessor = $('#txtPostProcessor', form).val();
config.RecordingPostProcessorArguments = $('#txtPostProcessorArguments', form).val(); config.RecordingPostProcessorArguments = $('#txtPostProcessorArguments', form).val();
ApiClient.updateNamedConfiguration('livetv', config).then(function () { ApiClient.updateNamedConfiguration('livetv', config).then(function () {
Dashboard.processServerConfigurationUpdateResult(); Dashboard.processServerConfigurationUpdateResult();
showSaveMessage(recordingPathChanged); showSaveMessage(recordingPathChanged);
});
}); });
return false; });
return false;
}
function showSaveMessage(recordingPathChanged) {
let msg = '';
if (recordingPathChanged) {
msg += globalize.translate('MessageChangeRecordingPath');
} }
function showSaveMessage(recordingPathChanged) { if (msg) {
var msg = ''; import('alert').then(({default: alert}) => {
alert(msg);
if (recordingPathChanged) { });
msg += globalize.translate('RecordingPathChangeMessage');
}
if (msg) {
require(['alert'], function (alert) {
alert(msg);
});
}
} }
}
export default function () {
$(document).on('pageinit', '#liveTvSettingsPage', function () { $(document).on('pageinit', '#liveTvSettingsPage', function () {
var page = this; const page = this;
$('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit);
$('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () {
require(['directorybrowser'], function (directoryBrowser) { import('directorybrowser').then(({default: directoryBrowser}) => {
var picker = new directoryBrowser.default(); const picker = new directoryBrowser();
picker.show({ picker.show({
callback: function (path) { callback: function (path) {
if (path) { if (path) {
@ -73,8 +76,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
}); });
}); });
$('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () {
require(['directorybrowser'], function (directoryBrowser) { import('directorybrowser').then(({default: directoryBrowser}) => {
var picker = new directoryBrowser.default(); const picker = new directoryBrowser();
picker.show({ picker.show({
callback: function (path) { callback: function (path) {
if (path) { if (path) {
@ -88,8 +91,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
}); });
}); });
$('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () {
require(['directorybrowser'], function (directoryBrowser) { import('directorybrowser').then(({default: directoryBrowser}) => {
var picker = new directoryBrowser.default(); const picker = new directoryBrowser();
picker.show({ picker.show({
callback: function (path) { callback: function (path) {
if (path) { if (path) {
@ -103,8 +106,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
}); });
}); });
$('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () {
require(['directorybrowser'], function (directoryBrowser) { import('directorybrowser').then(({default: directoryBrowser}) => {
var picker = new directoryBrowser.default(); const picker = new directoryBrowser();
picker.show({ picker.show({
includeFiles: true, includeFiles: true,
callback: function (path) { callback: function (path) {
@ -119,9 +122,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
}); });
}).on('pageshow', '#liveTvSettingsPage', function () { }).on('pageshow', '#liveTvSettingsPage', function () {
loading.show(); loading.show();
var page = this; const page = this;
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
loadPage(page, config); loadPage(page, config);
}); });
}); });
}); }

View file

@ -1,294 +1,305 @@
define(['jQuery', 'globalize', 'scripts/taskbutton', 'dom', 'libraryMenu', 'layoutManager', 'loading', 'browser', 'listViewStyle', 'flexStyles', 'emby-itemscontainer', 'cardStyle', 'material-icons', 'emby-button'], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading, browser) { import $ from 'jQuery';
'use strict'; import globalize from 'globalize';
import taskButton from 'scripts/taskbutton';
import dom from 'dom';
import layoutManager from 'layoutManager';
import loading from 'loading';
import browser from 'browser';
import 'listViewStyle';
import 'flexStyles';
import 'emby-itemscontainer';
import 'cardStyle';
import 'material-icons';
import 'emby-button';
var enableFocusTransform = !browser.slow && !browser.edge; const enableFocusTransform = !browser.slow && !browser.edge;
function getDeviceHtml(device) { function getDeviceHtml(device) {
var padderClass; let padderClass;
var html = ''; let html = '';
var cssClass = 'card scalableCard'; let cssClass = 'card scalableCard';
var cardBoxCssClass = 'cardBox visualCardBox'; let cardBoxCssClass = 'cardBox visualCardBox';
cssClass += ' backdropCard backdropCard-scalable'; cssClass += ' backdropCard backdropCard-scalable';
padderClass = 'cardPadder-backdrop'; padderClass = 'cardPadder-backdrop';
// TODO move card creation code to Card component // TODO move card creation code to Card component
if (layoutManager.tv) { if (layoutManager.tv) {
cssClass += ' show-focus'; cssClass += ' show-focus';
if (enableFocusTransform) { if (enableFocusTransform) {
cssClass += ' show-animation'; cssClass += ' show-animation';
}
} }
html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="' + padderClass + '"></div>';
html += '<div class="cardContent searchImage">';
html += '<div class="cardImageContainer coveredImage"><span class="cardImageIcon material-icons dvr"></span></div>';
html += '</div>';
html += '</div>';
html += '<div class="cardFooter visualCardBox-cardFooter">';
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><span class="material-icons more_vert"></span></button>';
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + '</div>';
html += '<div class="cardText cardText-secondary">';
html += device.Url || '&nbsp;';
html += '</div>';
html += '</div>';
html += '</div>';
return html += '</div>';
} }
function renderDevices(page, devices) { html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
var html = devices.map(getDeviceHtml).join(''); html += '<div class="' + cardBoxCssClass + '">';
page.querySelector('.devicesList').innerHTML = html; html += '<div class="cardScalable visualCardBox-cardScalable">';
} html += '<div class="' + padderClass + '"></div>';
html += '<div class="cardContent searchImage">';
html += '<div class="cardImageContainer coveredImage"><span class="cardImageIcon material-icons dvr"></span></div>';
html += '</div>';
html += '</div>';
html += '<div class="cardFooter visualCardBox-cardFooter">';
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><span class="material-icons more_vert"></span></button>';
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + '</div>';
html += '<div class="cardText cardText-secondary">';
html += device.Url || '&nbsp;';
html += '</div>';
html += '</div>';
html += '</div>';
return html += '</div>';
}
function deleteDevice(page, id) { function renderDevices(page, devices) {
var message = globalize.translate('MessageConfirmDeleteTunerDevice'); page.querySelector('.devicesList').innerHTML = devices.map(getDeviceHtml).join('');
}
require(['confirm'], function (confirm) { function deleteDevice(page, id) {
confirm.default(message, globalize.translate('HeaderDeleteDevice')).then(function () { const message = globalize.translate('MessageConfirmDeleteTunerDevice');
loading.show();
ApiClient.ajax({ import('confirm').then(({default: confirm}) => {
type: 'DELETE', confirm(message, globalize.translate('HeaderDeleteDevice')).then(function () {
url: ApiClient.getUrl('LiveTv/TunerHosts', { loading.show();
Id: id ApiClient.ajax({
}) type: 'DELETE',
}).then(function () { url: ApiClient.getUrl('LiveTv/TunerHosts', {
reload(page); Id: id
}); })
}).then(function () {
reload(page);
}); });
}); });
} });
}
function reload(page) { function reload(page) {
loading.show(); loading.show();
ApiClient.getNamedConfiguration('livetv').then(function (config) { ApiClient.getNamedConfiguration('livetv').then(function (config) {
renderDevices(page, config.TunerHosts); renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders); renderProviders(page, config.ListingProviders);
});
loading.hide();
}
function submitAddDeviceForm(page) {
page.querySelector('.dlgAddDevice').close();
loading.show();
ApiClient.ajax({
type: 'POST',
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify({
Type: $('#selectTunerDeviceType', page).val(),
Url: $('#txtDevicePath', page).val()
}),
contentType: 'application/json'
}).then(function () {
reload(page);
}, function () {
Dashboard.alert({
message: globalize.translate('ErrorAddingTunerDevice')
}); });
loading.hide(); });
} }
function submitAddDeviceForm(page) { function renderProviders(page, providers) {
page.querySelector('.dlgAddDevice').close(); let html = '';
loading.show();
ApiClient.ajax({
type: 'POST',
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify({
Type: $('#selectTunerDeviceType', page).val(),
Url: $('#txtDevicePath', page).val()
}),
contentType: 'application/json'
}).then(function () {
reload(page);
}, function () {
Dashboard.alert({
message: globalize.translate('ErrorAddingTunerDevice')
});
});
}
function renderProviders(page, providers) { if (providers.length) {
var html = ''; html += '<div class="paperList">';
if (providers.length) {
html += '<div class="paperList">';
for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i];
html += '<div class="listItem">';
html += '<span class="listItemIcon material-icons dvr"></span>';
html += '<div class="listItemBody two-line">';
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + '&id=' + provider.Id + '">';
html += '<h3 class="listItemBodyText">';
html += getProviderName(provider.Type);
html += '</h3>';
html += '<div class="listItemBodyText secondary">';
html += provider.Path || provider.ListingsId || '';
html += '</div>';
html += '</a>';
html += '</div>';
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><span class="material-icons listItemAside more_vert"></span></button>';
html += '</div>';
}
for (let i = 0, length = providers.length; i < length; i++) {
const provider = providers[i];
html += '<div class="listItem">';
html += '<span class="listItemIcon material-icons dvr"></span>';
html += '<div class="listItemBody two-line">';
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + '&id=' + provider.Id + '">';
html += '<h3 class="listItemBodyText">';
html += getProviderName(provider.Type);
html += '</h3>';
html += '<div class="listItemBodyText secondary">';
html += provider.Path || provider.ListingsId || '';
html += '</div>';
html += '</a>';
html += '</div>';
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><span class="material-icons listItemAside more_vert"></span></button>';
html += '</div>'; html += '</div>';
} }
var elem = $('.providerList', page).html(html); html += '</div>';
$('.btnOptions', elem).on('click', function () {
var id = this.getAttribute('data-id');
showProviderOptions(page, id, this);
});
} }
function showProviderOptions(page, providerId, button) { const elem = $('.providerList', page).html(html);
var items = []; $('.btnOptions', elem).on('click', function () {
items.push({ const id = this.getAttribute('data-id');
name: globalize.translate('ButtonDelete'), showProviderOptions(page, id, this);
id: 'delete' });
}); }
items.push({
name: globalize.translate('MapChannels'),
id: 'map'
});
require(['actionsheet'], function (actionsheet) { function showProviderOptions(page, providerId, button) {
actionsheet.show({ const items = [];
items: items, items.push({
positionTo: button name: globalize.translate('ButtonDelete'),
}).then(function (id) { id: 'delete'
switch (id) { });
case 'delete': items.push({
deleteProvider(page, providerId); name: globalize.translate('MapChannels'),
break; id: 'map'
});
case 'map': import('actionsheet').then(({default: actionsheet}) => {
mapChannels(page, providerId); actionsheet.show({
} items: items,
}); positionTo: button
}); }).then(function (id) {
} switch (id) {
case 'delete':
deleteProvider(page, providerId);
break;
function mapChannels(page, providerId) { case 'map':
require(['components/channelMapper/channelMapper'], function (channelMapper) { mapChannels(page, providerId);
new channelMapper.default({
serverId: ApiClient.serverInfo().Id,
providerId: providerId
}).show();
});
}
function deleteProvider(page, id) {
var message = globalize.translate('MessageConfirmDeleteGuideProvider');
require(['confirm'], function (confirm) {
confirm.default(message, globalize.translate('HeaderDeleteProvider')).then(function () {
loading.show();
ApiClient.ajax({
type: 'DELETE',
url: ApiClient.getUrl('LiveTv/ListingProviders', {
Id: id
})
}).then(function () {
reload(page);
}, function () {
reload(page);
});
});
});
}
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'm3u':
return 'M3U';
case 'hdhomerun':
return 'HDHomeRun';
case 'hauppauge':
return 'Hauppauge';
case 'satip':
return 'DVB';
default:
return 'Unknown';
}
}
function getProviderName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'schedulesdirect':
return 'Schedules Direct';
case 'xmltv':
return 'XMLTV';
default:
return 'Unknown';
}
}
function getProviderConfigurationUrl(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'xmltv':
return 'livetvguideprovider.html?type=xmltv';
case 'schedulesdirect':
return 'livetvguideprovider.html?type=schedulesdirect';
}
}
function addProvider(button) {
var menuItems = [];
menuItems.push({
name: 'Schedules Direct',
id: 'SchedulesDirect'
});
menuItems.push({
name: 'XMLTV',
id: 'xmltv'
});
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: button,
callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id));
}
});
});
}
function addDevice(button) {
Dashboard.navigate('livetvtuner.html');
}
function showDeviceMenu(button, tunerDeviceId) {
var items = [];
items.push({
name: globalize.translate('ButtonDelete'),
id: 'delete'
});
items.push({
name: globalize.translate('ButtonEdit'),
id: 'edit'
});
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: items,
positionTo: button
}).then(function (id) {
switch (id) {
case 'delete':
deleteDevice(dom.parentWithClass(button, 'page'), tunerDeviceId);
break;
case 'edit':
Dashboard.navigate('livetvtuner.html?id=' + tunerDeviceId);
}
});
});
}
function onDevicesListClick(e) {
var card = dom.parentWithClass(e.target, 'card');
if (card) {
var id = card.getAttribute('data-id');
var btnCardOptions = dom.parentWithClass(e.target, 'btnCardOptions');
if (btnCardOptions) {
showDeviceMenu(btnCardOptions, id);
} else {
Dashboard.navigate('livetvtuner.html?id=' + id);
} }
});
});
}
function mapChannels(page, providerId) {
import('components/channelMapper/channelMapper').then(({default: channelMapper}) => {
new channelMapper({
serverId: ApiClient.serverInfo().Id,
providerId: providerId
}).show();
});
}
function deleteProvider(page, id) {
const message = globalize.translate('MessageConfirmDeleteGuideProvider');
import('confirm').then(({default: confirm}) => {
confirm(message, globalize.translate('HeaderDeleteProvider')).then(function () {
loading.show();
ApiClient.ajax({
type: 'DELETE',
url: ApiClient.getUrl('LiveTv/ListingProviders', {
Id: id
})
}).then(function () {
reload(page);
}, function () {
reload(page);
});
});
});
}
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'm3u':
return 'M3U';
case 'hdhomerun':
return 'HDHomeRun';
case 'hauppauge':
return 'Hauppauge';
case 'satip':
return 'DVB';
default:
return 'Unknown';
}
}
function getProviderName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'schedulesdirect':
return 'Schedules Direct';
case 'xmltv':
return 'XMLTV';
default:
return 'Unknown';
}
}
function getProviderConfigurationUrl(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'xmltv':
return 'livetvguideprovider.html?type=xmltv';
case 'schedulesdirect':
return 'livetvguideprovider.html?type=schedulesdirect';
}
}
function addProvider(button) {
const menuItems = [];
menuItems.push({
name: 'Schedules Direct',
id: 'SchedulesDirect'
});
menuItems.push({
name: 'XMLTV',
id: 'xmltv'
});
import('actionsheet').then(({default: actionsheet}) => {
actionsheet.show({
items: menuItems,
positionTo: button,
callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id));
}
});
});
}
function addDevice(button) {
Dashboard.navigate('livetvtuner.html');
}
function showDeviceMenu(button, tunerDeviceId) {
const items = [];
items.push({
name: globalize.translate('ButtonDelete'),
id: 'delete'
});
items.push({
name: globalize.translate('ButtonEdit'),
id: 'edit'
});
import('actionsheet').then(({default: actionsheet}) => {
actionsheet.show({
items: items,
positionTo: button
}).then(function (id) {
switch (id) {
case 'delete':
deleteDevice(dom.parentWithClass(button, 'page'), tunerDeviceId);
break;
case 'edit':
Dashboard.navigate('livetvtuner.html?id=' + tunerDeviceId);
}
});
});
}
function onDevicesListClick(e) {
const card = dom.parentWithClass(e.target, 'card');
if (card) {
const id = card.getAttribute('data-id');
const btnCardOptions = dom.parentWithClass(e.target, 'btnCardOptions');
if (btnCardOptions) {
showDeviceMenu(btnCardOptions, id);
} else {
Dashboard.navigate('livetvtuner.html?id=' + id);
} }
} }
}
export default function () {
$(document).on('pageinit', '#liveTvStatusPage', function () { $(document).on('pageinit', '#liveTvStatusPage', function () {
var page = this; const page = this;
$('.btnAddDevice', page).on('click', function () { $('.btnAddDevice', page).on('click', function () {
addDevice(this); addDevice(this);
}); });
@ -301,21 +312,21 @@ define(['jQuery', 'globalize', 'scripts/taskbutton', 'dom', 'libraryMenu', 'layo
}); });
page.querySelector('.devicesList').addEventListener('click', onDevicesListClick); page.querySelector('.devicesList').addEventListener('click', onDevicesListClick);
}).on('pageshow', '#liveTvStatusPage', function () { }).on('pageshow', '#liveTvStatusPage', function () {
var page = this; const page = this;
reload(page); reload(page);
taskButton.default({ taskButton({
mode: 'on', mode: 'on',
progressElem: page.querySelector('.refreshGuideProgress'), progressElem: page.querySelector('.refreshGuideProgress'),
taskKey: 'RefreshGuide', taskKey: 'RefreshGuide',
button: page.querySelector('.btnRefresh') button: page.querySelector('.btnRefresh')
}); });
}).on('pagehide', '#liveTvStatusPage', function () { }).on('pagehide', '#liveTvStatusPage', function () {
var page = this; const page = this;
taskButton.default({ taskButton({
mode: 'off', mode: 'off',
progressElem: page.querySelector('.refreshGuideProgress'), progressElem: page.querySelector('.refreshGuideProgress'),
taskKey: 'RefreshGuide', taskKey: 'RefreshGuide',
button: page.querySelector('.btnRefresh') button: page.querySelector('.btnRefresh')
}); });
}); });
}); }

View file

@ -1,232 +1,228 @@
define(['globalize', 'loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button', 'emby-checkbox', 'emby-select'], function (globalize, loading, libraryMenu, dom) { import globalize from 'globalize';
'use strict'; import loading from 'loading';
import dom from 'dom';
import 'emby-input';
import 'emby-button';
import 'emby-checkbox';
import 'emby-select';
function isM3uVariant(type) { function isM3uVariant(type) {
return ['nextpvr'].indexOf(type || '') !== -1; return ['nextpvr'].indexOf(type || '') !== -1;
} }
function fillTypes(view, currentId) { function fillTypes(view, currentId) {
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) { return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) {
var selectType = view.querySelector('.selectType'); const selectType = view.querySelector('.selectType');
var html = ''; let html = '';
html += types.map(function (tuner) { html += types.map(function (tuner) {
return '<option value="' + tuner.Id + '">' + tuner.Name + '</option>'; return '<option value="' + tuner.Id + '">' + tuner.Name + '</option>';
}).join(''); }).join('');
html += '<option value="other">'; html += '<option value="other">';
html += globalize.translate('TabOther'); html += globalize.translate('TabOther');
html += '</option>'; html += '</option>';
selectType.innerHTML = html; selectType.innerHTML = html;
selectType.disabled = null != currentId; selectType.disabled = currentId != null;
selectType.value = ''; selectType.value = '';
onTypeChange.call(selectType);
});
}
function reload(view, providerId) {
view.querySelector('.txtDevicePath').value = '';
view.querySelector('.chkFavorite').checked = false;
view.querySelector('.txtDevicePath').value = '';
if (providerId) {
ApiClient.getNamedConfiguration('livetv').then(function (config) {
var info = config.TunerHosts.filter(function (i) {
return i.Id === providerId;
})[0];
fillTunerHostInfo(view, info);
});
}
}
function fillTunerHostInfo(view, info) {
var selectType = view.querySelector('.selectType');
var type = info.Type || '';
if (info.Source && isM3uVariant(info.Source)) {
type = info.Source;
}
selectType.value = type;
onTypeChange.call(selectType); onTypeChange.call(selectType);
view.querySelector('.txtDevicePath').value = info.Url || ''; });
view.querySelector('.txtFriendlyName').value = info.FriendlyName || ''; }
view.querySelector('.txtUserAgent').value = info.UserAgent || '';
view.querySelector('.fldDeviceId').value = info.DeviceId || '';
view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly;
view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding;
view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping;
view.querySelector('.txtTunerCount').value = info.TunerCount || '0';
}
function submitForm(page) { function reload(view, providerId) {
loading.show(); view.querySelector('.txtDevicePath').value = '';
var info = { view.querySelector('.chkFavorite').checked = false;
Type: page.querySelector('.selectType').value, view.querySelector('.txtDevicePath').value = '';
Url: page.querySelector('.txtDevicePath').value || null,
UserAgent: page.querySelector('.txtUserAgent').value || null,
FriendlyName: page.querySelector('.txtFriendlyName').value || null,
DeviceId: page.querySelector('.fldDeviceId').value || null,
TunerCount: page.querySelector('.txtTunerCount').value || 0,
ImportFavoritesOnly: page.querySelector('.chkFavorite').checked,
AllowHWTranscoding: page.querySelector('.chkTranscode').checked,
EnableStreamLooping: page.querySelector('.chkStreamLoop').checked
};
if (isM3uVariant(info.Type)) { if (providerId) {
info.Source = info.Type; ApiClient.getNamedConfiguration('livetv').then(function (config) {
info.Type = 'm3u'; const info = config.TunerHosts.filter(function (i) {
} return i.Id === providerId;
})[0];
var id = getParameterByName('id'); fillTunerHostInfo(view, info);
if (id) {
info.Id = id;
}
ApiClient.ajax({
type: 'POST',
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify(info),
contentType: 'application/json'
}).then(function (result) {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate('livetvstatus.html');
}, function () {
loading.hide();
Dashboard.alert({
message: globalize.translate('ErrorSavingTvProvider')
});
}); });
} }
}
function getRequirePromise(deps) { function fillTunerHostInfo(view, info) {
return new Promise(function (resolve, reject) { const selectType = view.querySelector('.selectType');
require(deps, resolve); let type = info.Type || '';
});
if (info.Source && isM3uVariant(info.Source)) {
type = info.Source;
} }
function getDetectedDevice() { selectType.value = type;
return getRequirePromise(['tunerPicker']).then(function (tunerPicker) { onTypeChange.call(selectType);
return new tunerPicker().show({ view.querySelector('.txtDevicePath').value = info.Url || '';
serverId: ApiClient.serverId() view.querySelector('.txtFriendlyName').value = info.FriendlyName || '';
}); view.querySelector('.txtUserAgent').value = info.UserAgent || '';
}); view.querySelector('.fldDeviceId').value = info.DeviceId || '';
} view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly;
view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding;
view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping;
view.querySelector('.txtTunerCount').value = info.TunerCount || '0';
}
function onTypeChange() { function submitForm(page) {
var value = this.value; loading.show();
var view = dom.parentWithClass(this, 'page'); const info = {
var mayIncludeUnsupportedDrmChannels = 'hdhomerun' === value; Type: page.querySelector('.selectType').value,
var supportsTranscoding = 'hdhomerun' === value; Url: page.querySelector('.txtDevicePath').value || null,
var supportsFavorites = 'hdhomerun' === value; UserAgent: page.querySelector('.txtUserAgent').value || null,
var supportsTunerIpAddress = 'hdhomerun' === value; FriendlyName: page.querySelector('.txtFriendlyName').value || null,
var supportsTunerFileOrUrl = 'm3u' === value; DeviceId: page.querySelector('.fldDeviceId').value || null,
var supportsStreamLooping = 'm3u' === value; TunerCount: page.querySelector('.txtTunerCount').value || 0,
var supportsTunerCount = 'm3u' === value; ImportFavoritesOnly: page.querySelector('.chkFavorite').checked,
var supportsUserAgent = 'm3u' === value; AllowHWTranscoding: page.querySelector('.chkTranscode').checked,
var suppportsSubmit = 'other' !== value; EnableStreamLooping: page.querySelector('.chkStreamLoop').checked
var supportsSelectablePath = supportsTunerFileOrUrl;
var txtDevicePath = view.querySelector('.txtDevicePath');
if (supportsTunerIpAddress) {
txtDevicePath.label(globalize.translate('LabelTunerIpAddress'));
view.querySelector('.fldPath').classList.remove('hide');
} else if (supportsTunerFileOrUrl) {
txtDevicePath.label(globalize.translate('LabelFileOrUrl'));
view.querySelector('.fldPath').classList.remove('hide');
} else {
view.querySelector('.fldPath').classList.add('hide');
}
if (supportsSelectablePath) {
view.querySelector('.btnSelectPath').classList.remove('hide');
view.querySelector('.txtDevicePath').setAttribute('required', 'required');
} else {
view.querySelector('.btnSelectPath').classList.add('hide');
view.querySelector('.txtDevicePath').removeAttribute('required');
}
if (supportsUserAgent) {
view.querySelector('.fldUserAgent').classList.remove('hide');
} else {
view.querySelector('.fldUserAgent').classList.add('hide');
}
if (supportsFavorites) {
view.querySelector('.fldFavorites').classList.remove('hide');
} else {
view.querySelector('.fldFavorites').classList.add('hide');
}
if (supportsTranscoding) {
view.querySelector('.fldTranscode').classList.remove('hide');
} else {
view.querySelector('.fldTranscode').classList.add('hide');
}
if (supportsStreamLooping) {
view.querySelector('.fldStreamLoop').classList.remove('hide');
} else {
view.querySelector('.fldStreamLoop').classList.add('hide');
}
if (supportsTunerCount) {
view.querySelector('.fldTunerCount').classList.remove('hide');
view.querySelector('.txtTunerCount').setAttribute('required', 'required');
} else {
view.querySelector('.fldTunerCount').classList.add('hide');
view.querySelector('.txtTunerCount').removeAttribute('required');
}
if (mayIncludeUnsupportedDrmChannels) {
view.querySelector('.drmMessage').classList.remove('hide');
} else {
view.querySelector('.drmMessage').classList.add('hide');
}
if (suppportsSubmit) {
view.querySelector('.button-submit').classList.remove('hide');
} else {
view.querySelector('.button-submit').classList.add('hide');
}
}
return function (view, params) {
if (!params.id) {
view.querySelector('.btnDetect').classList.remove('hide');
}
view.addEventListener('viewshow', function () {
var currentId = params.id;
fillTypes(view, currentId).then(function () {
reload(view, currentId);
});
});
view.querySelector('form').addEventListener('submit', function (e) {
submitForm(view);
e.preventDefault();
e.stopPropagation();
return false;
});
view.querySelector('.selectType').addEventListener('change', onTypeChange);
view.querySelector('.btnDetect').addEventListener('click', function () {
getDetectedDevice().then(function (info) {
fillTunerHostInfo(view, info);
});
});
view.querySelector('.btnSelectPath').addEventListener('click', function () {
require(['directorybrowser'], function (directoryBrowser) {
var picker = new directoryBrowser.default();
picker.show({
includeFiles: true,
callback: function (path) {
if (path) {
view.querySelector('.txtDevicePath').value = path;
}
picker.close();
}
});
});
});
}; };
});
if (isM3uVariant(info.Type)) {
info.Source = info.Type;
info.Type = 'm3u';
}
if (getParameterByName('id')) {
info.Id = getParameterByName('id');
}
ApiClient.ajax({
type: 'POST',
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify(info),
contentType: 'application/json'
}).then(function (result) {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate('livetvstatus.html');
}, function () {
loading.hide();
Dashboard.alert({
message: globalize.translate('ErrorSavingTvProvider')
});
});
}
function getDetectedDevice() {
return import('tunerPicker').then(({default: tunerPicker}) => {
return new tunerPicker().show({
serverId: ApiClient.serverId()
});
});
}
function onTypeChange() {
const value = this.value;
const view = dom.parentWithClass(this, 'page');
const mayIncludeUnsupportedDrmChannels = value === 'hdhomerun';
const supportsTranscoding = value === 'hdhomerun';
const supportsFavorites = value === 'hdhomerun';
const supportsTunerIpAddress = value === 'hdhomerun';
const supportsTunerFileOrUrl = value === 'm3u';
const supportsStreamLooping = value === 'm3u';
const supportsTunerCount = value === 'm3u';
const supportsUserAgent = value === 'm3u';
const suppportsSubmit = value !== 'other';
const supportsSelectablePath = supportsTunerFileOrUrl;
const txtDevicePath = view.querySelector('.txtDevicePath');
if (supportsTunerIpAddress) {
txtDevicePath.label(globalize.translate('LabelTunerIpAddress'));
view.querySelector('.fldPath').classList.remove('hide');
} else if (supportsTunerFileOrUrl) {
txtDevicePath.label(globalize.translate('LabelFileOrUrl'));
view.querySelector('.fldPath').classList.remove('hide');
} else {
view.querySelector('.fldPath').classList.add('hide');
}
if (supportsSelectablePath) {
view.querySelector('.btnSelectPath').classList.remove('hide');
view.querySelector('.txtDevicePath').setAttribute('required', 'required');
} else {
view.querySelector('.btnSelectPath').classList.add('hide');
view.querySelector('.txtDevicePath').removeAttribute('required');
}
if (supportsUserAgent) {
view.querySelector('.fldUserAgent').classList.remove('hide');
} else {
view.querySelector('.fldUserAgent').classList.add('hide');
}
if (supportsFavorites) {
view.querySelector('.fldFavorites').classList.remove('hide');
} else {
view.querySelector('.fldFavorites').classList.add('hide');
}
if (supportsTranscoding) {
view.querySelector('.fldTranscode').classList.remove('hide');
} else {
view.querySelector('.fldTranscode').classList.add('hide');
}
if (supportsStreamLooping) {
view.querySelector('.fldStreamLoop').classList.remove('hide');
} else {
view.querySelector('.fldStreamLoop').classList.add('hide');
}
if (supportsTunerCount) {
view.querySelector('.fldTunerCount').classList.remove('hide');
view.querySelector('.txtTunerCount').setAttribute('required', 'required');
} else {
view.querySelector('.fldTunerCount').classList.add('hide');
view.querySelector('.txtTunerCount').removeAttribute('required');
}
if (mayIncludeUnsupportedDrmChannels) {
view.querySelector('.drmMessage').classList.remove('hide');
} else {
view.querySelector('.drmMessage').classList.add('hide');
}
if (suppportsSubmit) {
view.querySelector('.button-submit').classList.remove('hide');
} else {
view.querySelector('.button-submit').classList.add('hide');
}
}
export default function (view, params) {
if (!params.id) {
view.querySelector('.btnDetect').classList.remove('hide');
}
view.addEventListener('viewshow', function () {
const currentId = params.id;
fillTypes(view, currentId).then(function () {
reload(view, currentId);
});
});
view.querySelector('form').addEventListener('submit', function (e) {
submitForm(view);
e.preventDefault();
e.stopPropagation();
return false;
});
view.querySelector('.selectType').addEventListener('change', onTypeChange);
view.querySelector('.btnDetect').addEventListener('click', function () {
getDetectedDevice().then(function (info) {
fillTunerHostInfo(view, info);
});
});
view.querySelector('.btnSelectPath').addEventListener('click', function () {
import('directorybrowser').then(({default: directorybrowser}) => {
const picker = new directorybrowser();
picker.show({
includeFiles: true,
callback: function (path) {
if (path) {
view.querySelector('.txtDevicePath').value = path;
}
picker.close();
}
});
});
});
}

View file

@ -1,6 +1,9 @@
define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); var key = getSavedQueryKey(context);
@ -48,7 +51,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
var viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector('.itemsContainer'); var itemsContainer = tabContent.querySelector('.itemsContainer');
if ('List' == viewStyle) { if (viewStyle == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
itemsContainer.classList.remove('vertical-wrap'); itemsContainer.classList.remove('vertical-wrap');
} else { } else {

View file

@ -1,6 +1,9 @@
define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
'use strict'; 'use strict';
loading = loading.default || loading;
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); var key = getSavedQueryKey();
@ -54,13 +57,13 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
var elem = entry.target; var elem = entry.target;
var id = elem.getAttribute('data-id'); var id = elem.getAttribute('data-id');
var viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
var limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9;
if (enableScrollX()) { if (enableScrollX()) {
limit = 10; limit = 10;
} }
var enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary';
var query = { var query = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending', SortOrder: 'Ascending',

View file

@ -1,6 +1,9 @@
define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) { define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent, options) { return function (view, params, tabContent, options) {
function onViewStyleChange() { function onViewStyleChange() {
if (self.getCurrentViewStyle() == 'List') { if (self.getCurrentViewStyle() == 'List') {

View file

@ -1,6 +1,8 @@
define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) { define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager;
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop; return !layoutManager.desktop;
} }

View file

@ -1,6 +1,9 @@
define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) {
'use strict'; 'use strict';
loading = loading.default || loading;
libraryBrowser = libraryBrowser.default || libraryBrowser;
return function (view, params, tabContent) { return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); var key = getSavedQueryKey(context);

View file

@ -1,7 +1,18 @@
define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { import playbackManager from 'playbackManager';
'use strict'; import loading from 'loading';
import events from 'events';
import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import AlphaPicker from 'alphaPicker';
import listView from 'listView';
import cardBuilder from 'cardBuilder';
import * as userSettings from 'userSettings';
import globalize from 'globalize';
import 'emby-itemscontainer';
return function (view, params, tabContent) { /* eslint-disable indent */
export default function (view, params, tabContent) {
function playAll() { function playAll() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
playbackManager.play({ playbackManager.play({
@ -18,7 +29,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
} }
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); const key = getSavedQueryKey();
if (!pageData) { if (!pageData) {
pageData = { pageData = {
@ -59,10 +70,10 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
if ('List' == viewStyle) { if (viewStyle == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
itemsContainer.classList.remove('vertical-wrap'); itemsContainer.classList.remove('vertical-wrap');
} else { } else {
@ -76,7 +87,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(); const query = getQuery();
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) { if (isLoading) {
@ -102,8 +113,8 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(page); updateFilterControls(page);
var html; let html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({ const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -113,7 +124,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
if (viewStyle == 'List') { if (viewStyle == 'List') {
html = listView.getListViewHtml({ html = listView.getListViewHtml({
items: result.Items, items: result.Items,
@ -144,50 +155,48 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
overlayPlayButton: true overlayPlayButton: true
}); });
} }
var i; let elems = tabContent.querySelectorAll('.paging');
var length;
var elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; elems[i].innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); elems = tabContent.querySelectorAll('.btnNextPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onNextPageClick); elems[i].addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); elems = tabContent.querySelectorAll('.btnPreviousPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onPreviousPageClick); elems[i].addEventListener('click', onPreviousPageClick);
} }
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query); libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(tabContent); autoFocuser.autoFocus(tabContent);
}); });
}); });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(); const query = getQuery();
self.alphaPicker.value(query.NameStartsWithOrGreater); self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var savedQueryKey; let savedQueryKey;
var pageData; let pageData;
var self = this; const self = this;
var isLoading = false; let isLoading = false;
self.showFilterMenu = function () { self.showFilterMenu = function () {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => {
var filterDialog = new filterDialogFactory({ const filterDialog = new filterDialogFactory({
query: getQuery(), query: getQuery(),
mode: 'albums', mode: 'albums',
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
@ -205,17 +214,17 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
}; };
function initPage(tabContent) { function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector('.alphaPicker'); const alphaPickerElement = tabContent.querySelector('.alphaPicker');
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
alphaPickerElement.addEventListener('alphavaluechanged', function (e) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) {
var newValue = e.detail.value; const newValue = e.detail.value;
var query = getQuery(); const query = getQuery();
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
reloadItems(tabContent); reloadItems(tabContent);
}); });
self.alphaPicker = new AlphaPicker.default({ self.alphaPicker = new AlphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: 'click' valueChangeEvent: 'click'
}); });
@ -259,12 +268,12 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
button: e.target button: e.target
}); });
}); });
var btnSelectView = tabContent.querySelector('.btnSelectView'); const btnSelectView = tabContent.querySelector('.btnSelectView');
btnSelectView.addEventListener('click', function (e) { btnSelectView.addEventListener('click', function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(','));
}); });
btnSelectView.addEventListener('layoutchange', function (e) { btnSelectView.addEventListener('layoutchange', function (e) {
var viewStyle = e.detail.viewStyle; const viewStyle = e.detail.viewStyle;
getPageData().view = viewStyle; getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
getQuery().StartIndex = 0; getQuery().StartIndex = 0;
@ -284,5 +293,6 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
}; };
self.destroy = function () {}; self.destroy = function () {};
}; }
});
/* eslint-enable indent */

View file

@ -1,13 +1,22 @@
define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, appHost, userSettings) { import loading from 'loading';
'use strict'; import events from 'events';
import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import AlphaPicker from 'alphaPicker';
import listView from 'listView';
import cardBuilder from 'cardBuilder';
import * as userSettings from 'userSettings';
import 'emby-itemscontainer';
return function (view, params, tabContent) { /* eslint-disable indent */
export default function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); const key = getSavedQueryKey(context);
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
var queryValues = { const queryValues = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending', SortOrder: 'Ascending',
Recursive: true, Recursive: true,
@ -45,10 +54,10 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
if ('List' == viewStyle) { if (viewStyle == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
itemsContainer.classList.remove('vertical-wrap'); itemsContainer.classList.remove('vertical-wrap');
} else { } else {
@ -62,8 +71,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); const query = getQuery(page);
var promise = self.mode == 'albumartists' ? const promise = self.mode == 'albumartists' ?
ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) :
ApiClient.getArtists(ApiClient.getCurrentUserId(), query); ApiClient.getArtists(ApiClient.getCurrentUserId(), query);
promise.then(function (result) { promise.then(function (result) {
@ -91,8 +100,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(page); updateFilterControls(page);
var html; let html;
var pagingHtml = libraryBrowser.getQueryPagingHtml({ const pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -102,7 +111,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
if (viewStyle == 'List') { if (viewStyle == 'List') {
html = listView.getListViewHtml({ html = listView.getListViewHtml({
items: result.Items, items: result.Items,
@ -129,49 +138,47 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
overlayPlayButton: true overlayPlayButton: true
}); });
} }
var i; let elems = tabContent.querySelectorAll('.paging');
var length;
var elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; elems[i].innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); elems = tabContent.querySelectorAll('.btnNextPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onNextPageClick); elems[i].addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); elems = tabContent.querySelectorAll('.btnPreviousPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onPreviousPageClick); elems[i].addEventListener('click', onPreviousPageClick);
} }
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(tabContent); autoFocuser.autoFocus(tabContent);
}); });
}); });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); const query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater); self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this; const self = this;
var data = {}; const data = {};
var isLoading = false; let isLoading = false;
self.showFilterMenu = function () { self.showFilterMenu = function () {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => {
var filterDialog = new filterDialogFactory({ const filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: self.mode, mode: self.mode,
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
@ -189,17 +196,17 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
}; };
function initPage(tabContent) { function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector('.alphaPicker'); const alphaPickerElement = tabContent.querySelector('.alphaPicker');
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
alphaPickerElement.addEventListener('alphavaluechanged', function (e) { alphaPickerElement.addEventListener('alphavaluechanged', function (e) {
var newValue = e.detail.value; const newValue = e.detail.value;
var query = getQuery(tabContent); const query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
reloadItems(tabContent); reloadItems(tabContent);
}); });
self.alphaPicker = new AlphaPicker.default({ self.alphaPicker = new AlphaPicker({
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: 'click' valueChangeEvent: 'click'
}); });
@ -211,12 +218,12 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
tabContent.querySelector('.btnFilter').addEventListener('click', function () { tabContent.querySelector('.btnFilter').addEventListener('click', function () {
self.showFilterMenu(); self.showFilterMenu();
}); });
var btnSelectView = tabContent.querySelector('.btnSelectView'); const btnSelectView = tabContent.querySelector('.btnSelectView');
btnSelectView.addEventListener('click', function (e) { btnSelectView.addEventListener('click', function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(','));
}); });
btnSelectView.addEventListener('layoutchange', function (e) { btnSelectView.addEventListener('layoutchange', function (e) {
var viewStyle = e.detail.viewStyle; const viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle; getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0; getQuery(tabContent).StartIndex = 0;
@ -234,5 +241,6 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
}; };
self.destroy = function () {}; self.destroy = function () {};
}; }
});
/* eslint-enable indent */

View file

@ -1,10 +1,14 @@
define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { import libraryBrowser from 'libraryBrowser';
'use strict'; import cardBuilder from 'cardBuilder';
import imageLoader from 'imageLoader';
import loading from 'loading';
return function (view, params, tabContent) { /* eslint-disable indent */
export default function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); const key = getSavedQueryKey();
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -34,15 +38,15 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); const query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query); return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); const query = getQuery();
promise.then(function (result) { promise.then(function (result) {
var html = ''; let html = '';
var viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
if (viewStyle == 'Thumb') { if (viewStyle == 'Thumb') {
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
@ -82,13 +86,13 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
}); });
} }
var elem = context.querySelector('#items'); const elem = context.querySelector('#items');
elem.innerHTML = html; elem.innerHTML = html;
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query); libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide(); loading.hide();
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(context); autoFocuser.autoFocus(context);
}); });
}); });
@ -99,8 +103,8 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
self.renderTab(); self.renderTab();
} }
var self = this; const self = this;
var data = {}; const data = {};
self.getViewStyles = function () { self.getViewStyles = function () {
return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); return 'Poster,PosterCard,Thumb,ThumbCard'.split(',');
@ -117,7 +121,7 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
}; };
self.enableViewSelection = true; self.enableViewSelection = true;
var promise; let promise;
self.preRender = function () { self.preRender = function () {
promise = getPromise(); promise = getPromise();
@ -126,5 +130,6 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
self.renderTab = function () { self.renderTab = function () {
reloadItems(tabContent, promise); reloadItems(tabContent, promise);
}; };
}; }
});
/* eslint-enable indent */

View file

@ -1,10 +1,14 @@
define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { import libraryBrowser from 'libraryBrowser';
'use strict'; import cardBuilder from 'cardBuilder';
import imageLoader from 'imageLoader';
import loading from 'loading';
return function (view, params, tabContent) { /* eslint-disable indent */
export default function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); const key = getSavedQueryKey();
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -35,14 +39,14 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); const query = getQuery();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query); return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); const query = getQuery();
promise.then(function (result) { promise.then(function (result) {
var html = ''; let html = '';
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: 'square', shape: 'square',
@ -53,26 +57,26 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
allowBottomPadding: true, allowBottomPadding: true,
cardLayout: false cardLayout: false
}); });
var elem = context.querySelector('#items'); const elem = context.querySelector('#items');
elem.innerHTML = html; elem.innerHTML = html;
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query); libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide(); loading.hide();
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(context); autoFocuser.autoFocus(context);
}); });
}); });
} }
var self = this; const self = this;
var data = {}; const data = {};
self.getCurrentViewStyle = function () { self.getCurrentViewStyle = function () {
return getPageData().view; return getPageData().view;
}; };
var promise; let promise;
self.preRender = function () { self.preRender = function () {
promise = getPromise(); promise = getPromise();
@ -81,5 +85,6 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
self.renderTab = function () { self.renderTab = function () {
reloadItems(tabContent, promise); reloadItems(tabContent, promise);
}; };
}; }
});
/* eslint-enable indent */

View file

@ -1,8 +1,24 @@
define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'libraryMenu', 'playbackManager', 'mainTabsManager', 'globalize', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button', 'flexStyles'], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager, globalize) { import browser from 'browser';
'use strict'; import layoutManager from 'layoutManager';
import * as userSettings from 'userSettings';
import inputManager from 'inputManager';
import loading from 'loading';
import cardBuilder from 'cardBuilder';
import dom from 'dom';
import imageLoader from 'imageLoader';
import libraryMenu from 'libraryMenu';
import * as mainTabsManager from 'mainTabsManager';
import globalize from 'globalize';
import 'scrollStyles';
import 'emby-itemscontainer';
import 'emby-tabs';
import 'emby-button';
import 'flexStyles';
/* eslint-disable indent */
function itemsPerRow() { function itemsPerRow() {
var screenWidth = dom.getWindowSize().innerWidth; const screenWidth = dom.getWindowSize().innerWidth;
if (screenWidth >= 1920) { if (screenWidth >= 1920) {
return 9; return 9;
@ -29,8 +45,8 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
function loadLatest(page, parentId) { function loadLatest(page, parentId) {
loading.show(); loading.show();
var userId = ApiClient.getCurrentUserId(); const userId = ApiClient.getCurrentUserId();
var options = { const options = {
IncludeItemTypes: 'Audio', IncludeItemTypes: 'Audio',
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(), Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', Fields: 'PrimaryImageAspectRatio,BasicSyncInfo',
@ -41,7 +57,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
}; };
ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) {
var elem = page.querySelector('#recentlyAddedSongs'); var elem = page.querySelector('#recentlyAddedSongs');
elem.innerHTML = cardBuilder.getCardsHtml({ elem.innerHTML = cardBuilder.getCardsHtml({
items: items, items: items,
showUnplayedIndicator: false, showUnplayedIndicator: false,
@ -59,14 +74,14 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
imageLoader.lazyChildren(elem); imageLoader.lazyChildren(elem);
loading.hide(); loading.hide();
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page); autoFocuser.autoFocus(page);
}); });
}); });
} }
function loadRecentlyPlayed(page, parentId) { function loadRecentlyPlayed(page, parentId) {
var options = { const options = {
SortBy: 'DatePlayed', SortBy: 'DatePlayed',
SortOrder: 'Descending', SortOrder: 'Descending',
IncludeItemTypes: 'Audio', IncludeItemTypes: 'Audio',
@ -80,7 +95,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
EnableTotalRecordCount: false EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector('#recentlyPlayed'); const elem = page.querySelector('#recentlyPlayed');
if (result.Items.length) { if (result.Items.length) {
elem.classList.remove('hide'); elem.classList.remove('hide');
@ -89,6 +104,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
} }
var itemsContainer = elem.querySelector('.itemsContainer'); var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.innerHTML = cardBuilder.getCardsHtml({ itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
showUnplayedIndicator: false, showUnplayedIndicator: false,
@ -108,7 +124,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
} }
function loadFrequentlyPlayed(page, parentId) { function loadFrequentlyPlayed(page, parentId) {
var options = { const options = {
SortBy: 'PlayCount', SortBy: 'PlayCount',
SortOrder: 'Descending', SortOrder: 'Descending',
IncludeItemTypes: 'Audio', IncludeItemTypes: 'Audio',
@ -122,7 +138,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
EnableTotalRecordCount: false EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector('#topPlayed'); const elem = page.querySelector('#topPlayed');
if (result.Items.length) { if (result.Items.length) {
elem.classList.remove('hide'); elem.classList.remove('hide');
@ -155,7 +171,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
loadRecentlyPlayed(tabContent, parentId); loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId);
require(['components/favoriteitems'], function (favoriteItems) { import('components/favoriteitems').then(({default: favoriteItems}) => {
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']);
}); });
} }
@ -206,10 +222,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
} }
} }
return function (view, params) { export default function (view, params) {
function reload() { function reload() {
loading.show(); loading.show();
var tabContent = view.querySelector(".pageTabContent[data-index='0']"); const tabContent = view.querySelector(".pageTabContent[data-index='0']");
loadSuggestionsTab(view, tabContent, params.topParentId); loadSuggestionsTab(view, tabContent, params.topParentId);
} }
@ -252,46 +268,48 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; let depends;
switch (index) { switch (index) {
case 0: case 0:
depends = 'controllers/music/musicrecommended';
break; break;
case 1: case 1:
depends.push('controllers/music/musicalbums'); depends = 'controllers/music/musicalbums';
break; break;
case 2: case 2:
case 3: case 3:
depends.push('controllers/music/musicartists'); depends = 'controllers/music/musicartists';
break; break;
case 4: case 4:
depends.push('controllers/music/musicplaylists'); depends = 'controllers/music/musicplaylists';
break; break;
case 5: case 5:
depends.push('controllers/music/songs'); depends = 'controllers/music/songs';
break; break;
case 6: case 6:
depends.push('controllers/music/musicgenres'); depends = 'controllers/music/musicgenres';
break; break;
case 7: case 7:
depends.push('scripts/searchtab'); depends = 'scripts/searchtab';
break;
} }
require(depends, function (controllerFactory) { import(depends).then(({default: controllerFactory}) => {
var tabContent; let tabContent;
if (0 == index) { if (index == 0) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent; self.tabContent = tabContent;
} }
var controller = tabControllers[index]; let controller = tabControllers[index];
if (!controller) { if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
@ -353,10 +371,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
self.initTab = function () { self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']"); const tabContent = view.querySelector(".pageTabContent[data-index='0']");
var containers = tabContent.querySelectorAll('.itemsContainer'); const containers = tabContent.querySelectorAll('.itemsContainer');
for (var i = 0, length = containers.length; i < length; i++) { for (let i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX()); setScrollClasses(containers[i], enableScrollX());
} }
}; };
@ -365,12 +383,12 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
reload(); reload();
}; };
var tabControllers = []; const tabControllers = [];
var renderedTabs = []; const renderedTabs = [];
view.addEventListener('viewshow', function (e) { view.addEventListener('viewshow', function (e) {
initTabs(); initTabs();
if (!view.getAttribute('data-title')) { if (!view.getAttribute('data-title')) {
var parentId = params.topParentId; const parentId = params.topParentId;
if (parentId) { if (parentId) {
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) { ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
@ -395,5 +413,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', '
} }
}); });
}); });
}; }
});
/* eslint-enable indent */

View file

@ -1,10 +1,18 @@
define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { import events from 'events';
'use strict'; import libraryBrowser from 'libraryBrowser';
import imageLoader from 'imageLoader';
import listView from 'listView';
import loading from 'loading';
import * as userSettings from 'userSettings';
import globalize from 'globalize';
import 'emby-itemscontainer';
return function (view, params, tabContent) { /* eslint-disable indent */
export default function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context); const key = getSavedQueryKey(context);
var pageData = data[key]; let pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
@ -46,7 +54,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); const query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) { if (isLoading) {
@ -71,9 +79,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var i; const pagingHtml = libraryBrowser.getQueryPagingHtml({
var length;
var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
@ -83,49 +89,49 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS
sortButton: false, sortButton: false,
filterButton: false filterButton: false
}); });
var html = listView.getListViewHtml({ const html = listView.getListViewHtml({
items: result.Items, items: result.Items,
action: 'playallfromhere', action: 'playallfromhere',
smallIcon: true, smallIcon: true,
artist: true, artist: true,
addToListButton: true addToListButton: true
}); });
var elems = tabContent.querySelectorAll('.paging'); let elems = tabContent.querySelectorAll('.paging');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; elems[i].innerHTML = pagingHtml;
} }
elems = tabContent.querySelectorAll('.btnNextPage'); elems = tabContent.querySelectorAll('.btnNextPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onNextPageClick); elems[i].addEventListener('click', onNextPageClick);
} }
elems = tabContent.querySelectorAll('.btnPreviousPage'); elems = tabContent.querySelectorAll('.btnPreviousPage');
for (i = 0, length = elems.length; i < length; i++) { for (let i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener('click', onPreviousPageClick); elems[i].addEventListener('click', onPreviousPageClick);
} }
var itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
require(['autoFocuser'], function (autoFocuser) { import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page); autoFocuser.autoFocus(page);
}); });
}); });
} }
var self = this; const self = this;
var data = {}; const data = {};
var isLoading = false; let isLoading = false;
self.showFilterMenu = function () { self.showFilterMenu = function () {
require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => {
var filterDialog = new filterDialogFactory({ const filterDialog = new filterDialogFactory({
query: getQuery(tabContent), query: getQuery(tabContent),
mode: 'songs', mode: 'songs',
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
@ -193,5 +199,6 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS
}; };
self.destroy = function () {}; self.destroy = function () {};
}; }
});
/* eslint-enable indent */

View file

@ -28,7 +28,7 @@
<span class="xlargePaperIconButton material-icons fiber_manual_record"></span> <span class="xlargePaperIconButton material-icons fiber_manual_record"></span>
</button> </button>
<button is="paper-icon-button-light" class="btnPreviousTrack autoSize hide"> <button is="paper-icon-button-light" class="btnPreviousTrack autoSize hide" title="${PreviousTrack}">
<span class="xlargePaperIconButton material-icons skip_previous"></span> <span class="xlargePaperIconButton material-icons skip_previous"></span>
</button> </button>
@ -44,7 +44,7 @@
<span class="xlargePaperIconButton material-icons fast_forward"></span> <span class="xlargePaperIconButton material-icons fast_forward"></span>
</button> </button>
<button is="paper-icon-button-light" class="btnNextTrack autoSize hide"> <button is="paper-icon-button-light" class="btnNextTrack autoSize hide" title="${NextTrack}">
<span class="xlargePaperIconButton material-icons skip_next"></span> <span class="xlargePaperIconButton material-icons skip_next"></span>
</button> </button>

View file

@ -1,6 +1,7 @@
import playbackManager from 'playbackManager'; import playbackManager from 'playbackManager';
import dom from 'dom'; import dom from 'dom';
import inputManager from 'inputManager'; import inputManager from 'inputManager';
import mouseManager from 'mouseManager';
import datetime from 'datetime'; import datetime from 'datetime';
import itemHelper from 'itemHelper'; import itemHelper from 'itemHelper';
import mediaInfo from 'mediaInfo'; import mediaInfo from 'mediaInfo';
@ -21,18 +22,18 @@ import 'css!assets/css/videoosd';
/* eslint-disable indent */ /* eslint-disable indent */
function seriesImageUrl(item, options) { function seriesImageUrl(item, options) {
if ('Episode' !== item.Type) { if (item.Type !== 'Episode') {
return null; return null;
} }
options = options || {}; options = options || {};
options.type = options.type || 'Primary'; options.type = options.type || 'Primary';
if ('Primary' === options.type && item.SeriesPrimaryImageTag) { if (options.type === 'Primary' && item.SeriesPrimaryImageTag) {
options.tag = item.SeriesPrimaryImageTag; options.tag = item.SeriesPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
} }
if ('Thumb' === options.type) { if (options.type === 'Thumb') {
if (item.SeriesThumbImageTag) { if (item.SeriesThumbImageTag) {
options.tag = item.SeriesThumbImageTag; options.tag = item.SeriesThumbImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options);
@ -56,7 +57,7 @@ import 'css!assets/css/videoosd';
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options);
} }
if ('Primary' === options.type && item.AlbumId && item.AlbumPrimaryImageTag) { if (options.type === 'Primary' && item.AlbumId && item.AlbumPrimaryImageTag) {
options.tag = item.AlbumPrimaryImageTag; options.tag = item.AlbumPrimaryImageTag;
return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options);
} }
@ -103,7 +104,7 @@ import 'css!assets/css/videoosd';
function onDoubleClick(e) { function onDoubleClick(e) {
const clientX = e.clientX; const clientX = e.clientX;
if (null != clientX) { if (clientX != null) {
if (clientX < dom.getWindowSize().innerWidth / 2) { if (clientX < dom.getWindowSize().innerWidth / 2) {
playbackManager.rewind(currentPlayer); playbackManager.rewind(currentPlayer);
} else { } else {
@ -116,7 +117,7 @@ import 'css!assets/css/videoosd';
} }
function getDisplayItem(item) { function getDisplayItem(item) {
if ('TvChannel' === item.Type) { if (item.Type === 'TvChannel') {
const apiClient = connectionManager.getApiClient(item.ServerId); const apiClient = connectionManager.getApiClient(item.ServerId);
return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) { return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) {
return { return {
@ -132,7 +133,7 @@ import 'css!assets/css/videoosd';
} }
function updateRecordingButton(item) { function updateRecordingButton(item) {
if (!item || 'Program' !== item.Type) { if (!item || item.Type !== 'Program') {
if (recordingButtonManager) { if (recordingButtonManager) {
recordingButtonManager.destroy(); recordingButtonManager.destroy();
recordingButtonManager = null; recordingButtonManager = null;
@ -175,8 +176,8 @@ import 'css!assets/css/videoosd';
const osdTitle = view.querySelector('.osdTitle'); const osdTitle = view.querySelector('.osdTitle');
titleElement = osdTitle; titleElement = osdTitle;
let displayName = itemHelper.getDisplayName(displayItem, { let displayName = itemHelper.getDisplayName(displayItem, {
includeParentInfo: 'Program' !== displayItem.Type, includeParentInfo: displayItem.Type !== 'Program',
includeIndexNumber: 'Program' !== displayItem.Type includeIndexNumber: displayItem.Type !== 'Program'
}); });
if (!displayName) { if (!displayName) {
@ -197,8 +198,8 @@ import 'css!assets/css/videoosd';
tomatoes: false, tomatoes: false,
endsAt: false, endsAt: false,
episodeTitle: false, episodeTitle: false,
originalAirDate: 'Program' !== displayItem.Type, originalAirDate: displayItem.Type !== 'Program',
episodeTitleIndexNumber: 'Program' !== displayItem.Type, episodeTitleIndexNumber: displayItem.Type !== 'Program',
programIndicator: false programIndicator: false
}); });
const osdMediaInfo = view.querySelector('.osdMediaInfo'); const osdMediaInfo = view.querySelector('.osdMediaInfo');
@ -270,7 +271,7 @@ import 'css!assets/css/videoosd';
} }
function shouldEnableProgressByTimeOfDay(item) { function shouldEnableProgressByTimeOfDay(item) {
return !('TvChannel' !== item.Type || !item.CurrentProgram); return !(item.Type !== 'TvChannel' || !item.CurrentProgram);
} }
function updateNowPlayingInfo(player, state) { function updateNowPlayingInfo(player, state) {
@ -329,24 +330,24 @@ import 'css!assets/css/videoosd';
if (item) { if (item) {
let imgUrl = seriesImageUrl(item, { let imgUrl = seriesImageUrl(item, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Primary' type: 'Primary'
}) || seriesImageUrl(item, { }) || seriesImageUrl(item, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Thumb' type: 'Thumb'
}) || imageUrl(item, { }) || imageUrl(item, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Primary' type: 'Primary'
}); });
if (!imgUrl && secondaryItem && (imgUrl = seriesImageUrl(secondaryItem, { if (!imgUrl && secondaryItem && (imgUrl = seriesImageUrl(secondaryItem, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Primary' type: 'Primary'
}) || seriesImageUrl(secondaryItem, { }) || seriesImageUrl(secondaryItem, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Thumb' type: 'Thumb'
}) || imageUrl(secondaryItem, { }) || imageUrl(secondaryItem, {
maxWidth: osdPoster.clientWidth * 2, maxWidth: osdPoster.clientWidth,
type: 'Primary' type: 'Primary'
})), imgUrl) { })), imgUrl) {
return void (osdPoster.innerHTML = '<img src="' + imgUrl + '" />'); return void (osdPoster.innerHTML = '<img src="' + imgUrl + '" />');
@ -367,10 +368,11 @@ import 'css!assets/css/videoosd';
function hideOsd() { function hideOsd() {
slideUpToHide(headerElement); slideUpToHide(headerElement);
hideMainOsdControls(); hideMainOsdControls();
mouseManager.hideCursor();
} }
function toggleOsd() { function toggleOsd() {
if ('osd' === currentVisibleMenu) { if (currentVisibleMenu === 'osd') {
hideOsd(); hideOsd();
} else if (!currentVisibleMenu) { } else if (!currentVisibleMenu) {
showOsd(); showOsd();
@ -431,10 +433,11 @@ import 'css!assets/css/videoosd';
} }
function hideMainOsdControls() { function hideMainOsdControls() {
if ('osd' === currentVisibleMenu) { if (currentVisibleMenu === 'osd') {
const elem = osdBottomElement; const elem = osdBottomElement;
clearHideAnimationEventListeners(elem); clearHideAnimationEventListeners(elem);
elem.classList.add('videoOsdBottom-hidden'); elem.classList.add('videoOsdBottom-hidden');
dom.addEventListener(elem, transitionEndEventName, onHideAnimationComplete, { dom.addEventListener(elem, transitionEndEventName, onHideAnimationComplete, {
once: true once: true
}); });
@ -460,7 +463,7 @@ import 'css!assets/css/videoosd';
} }
function onPointerMove(e) { function onPointerMove(e) {
if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) { if ((e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse')) === 'mouse') {
const eventX = e.screenX || 0; const eventX = e.screenX || 0;
const eventY = e.screenY || 0; const eventY = e.screenY || 0;
const obj = lastPointerMoveData; const obj = lastPointerMoveData;
@ -488,7 +491,7 @@ import 'css!assets/css/videoosd';
switch (e.detail.command) { switch (e.detail.command) {
case 'left': case 'left':
if ('osd' === currentVisibleMenu) { if (currentVisibleMenu === 'osd') {
showOsd(); showOsd();
} else { } else {
if (!currentVisibleMenu) { if (!currentVisibleMenu) {
@ -500,7 +503,7 @@ import 'css!assets/css/videoosd';
break; break;
case 'right': case 'right':
if ('osd' === currentVisibleMenu) { if (currentVisibleMenu === 'osd') {
showOsd(); showOsd();
} else if (!currentVisibleMenu) { } else if (!currentVisibleMenu) {
e.preventDefault(); e.preventDefault();
@ -615,7 +618,7 @@ import 'css!assets/css/videoosd';
resetUpNextDialog(); resetUpNextDialog();
console.debug('nowplaying event: ' + e.type); console.debug('nowplaying event: ' + e.type);
if ('Video' !== state.NextMediaType) { if (state.NextMediaType !== 'Video') {
view.removeEventListener('viewbeforehide', onViewHideStopPlayback); view.removeEventListener('viewbeforehide', onViewHideStopPlayback);
Emby.Page.back(); Emby.Page.back();
} }
@ -702,7 +705,7 @@ import 'css!assets/css/videoosd';
} }
function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) { function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) {
if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && 'Episode' === currentItem.Type && userSettings.enableNextVideoInfoOverlay()) { if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && currentItem.Type === 'Episode' && userSettings.enableNextVideoInfoOverlay()) {
const showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30; const showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30;
const showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4; const showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4;
const timeRemainingTicks = runtimeTicks - currentTimeTicks; const timeRemainingTicks = runtimeTicks - currentTimeTicks;
@ -714,7 +717,7 @@ import 'css!assets/css/videoosd';
} }
function onUpNextHidden() { function onUpNextHidden() {
if ('upnext' === currentVisibleMenu) { if (currentVisibleMenu === 'upnext') {
currentVisibleMenu = null; currentVisibleMenu = null;
} }
} }
@ -737,7 +740,7 @@ import 'css!assets/css/videoosd';
} }
function refreshProgramInfoIfNeeded(player, item) { function refreshProgramInfoIfNeeded(player, item) {
if ('TvChannel' === item.Type) { if (item.Type === 'TvChannel') {
const program = item.CurrentProgram; const program = item.CurrentProgram;
if (program && program.EndDate) { if (program && program.EndDate) {
@ -778,7 +781,7 @@ import 'css!assets/css/videoosd';
updatePlayPauseState(playState.IsPaused); updatePlayPauseState(playState.IsPaused);
const supportedCommands = playbackManager.getSupportedCommands(player); const supportedCommands = playbackManager.getSupportedCommands(player);
currentPlayerSupportedCommands = supportedCommands; currentPlayerSupportedCommands = supportedCommands;
supportsBrightnessChange = -1 !== supportedCommands.indexOf('SetBrightness'); supportsBrightnessChange = supportedCommands.indexOf('SetBrightness') !== -1;
updatePlayerVolumeState(player, playState.IsMuted, playState.VolumeLevel); updatePlayerVolumeState(player, playState.IsMuted, playState.VolumeLevel);
if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) {
@ -792,13 +795,13 @@ import 'css!assets/css/videoosd';
updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []); updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []);
updateNowPlayingInfo(player, state); updateNowPlayingInfo(player, state);
if (state.MediaSource && state.MediaSource.SupportsTranscoding && -1 !== supportedCommands.indexOf('SetMaxStreamingBitrate')) { if (state.MediaSource && state.MediaSource.SupportsTranscoding && supportedCommands.indexOf('SetMaxStreamingBitrate') !== -1) {
view.querySelector('.btnVideoOsdSettings').classList.remove('hide'); view.querySelector('.btnVideoOsdSettings').classList.remove('hide');
} else { } else {
view.querySelector('.btnVideoOsdSettings').classList.add('hide'); view.querySelector('.btnVideoOsdSettings').classList.add('hide');
} }
const isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; const isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null;
nowPlayingPositionSlider.setIsClear(isProgressClear); nowPlayingPositionSlider.setIsClear(isProgressClear);
if (nowPlayingItem.RunTimeTicks) { if (nowPlayingItem.RunTimeTicks) {
@ -806,19 +809,19 @@ import 'css!assets/css/videoosd';
userSettings.skipForwardLength() * 1000000 / nowPlayingItem.RunTimeTicks); userSettings.skipForwardLength() * 1000000 / nowPlayingItem.RunTimeTicks);
} }
if (-1 === supportedCommands.indexOf('ToggleFullscreen') || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) { if (supportedCommands.indexOf('ToggleFullscreen') === -1 || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) {
view.querySelector('.btnFullscreen').classList.add('hide'); view.querySelector('.btnFullscreen').classList.add('hide');
} else { } else {
view.querySelector('.btnFullscreen').classList.remove('hide'); view.querySelector('.btnFullscreen').classList.remove('hide');
} }
if (-1 === supportedCommands.indexOf('PictureInPicture')) { if (supportedCommands.indexOf('PictureInPicture') === -1) {
view.querySelector('.btnPip').classList.add('hide'); view.querySelector('.btnPip').classList.add('hide');
} else { } else {
view.querySelector('.btnPip').classList.remove('hide'); view.querySelector('.btnPip').classList.remove('hide');
} }
if (-1 === supportedCommands.indexOf('AirPlay')) { if (supportedCommands.indexOf('AirPlay') === -1) {
view.querySelector('.btnAirPlay').classList.add('hide'); view.querySelector('.btnAirPlay').classList.add('hide');
} else { } else {
view.querySelector('.btnAirPlay').classList.remove('hide'); view.querySelector('.btnAirPlay').classList.remove('hide');
@ -866,7 +869,7 @@ import 'css!assets/css/videoosd';
nowPlayingPositionSlider.value = 0; nowPlayingPositionSlider.value = 0;
} }
if (runtimeTicks && null != positionTicks && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && 'Recording' !== currentItem.Type) { if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording') {
endsAtText.innerHTML = '&nbsp;&nbsp;-&nbsp;&nbsp;' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); endsAtText.innerHTML = '&nbsp;&nbsp;-&nbsp;&nbsp;' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true);
} else { } else {
endsAtText.innerHTML = ''; endsAtText.innerHTML = '';
@ -887,11 +890,11 @@ import 'css!assets/css/videoosd';
let showMuteButton = true; let showMuteButton = true;
let showVolumeSlider = true; let showVolumeSlider = true;
if (-1 === supportedCommands.indexOf('Mute')) { if (supportedCommands.indexOf('Mute') === -1) {
showMuteButton = false; showMuteButton = false;
} }
if (-1 === supportedCommands.indexOf('SetVolume')) { if (supportedCommands.indexOf('SetVolume') === -1) {
showVolumeSlider = false; showVolumeSlider = false;
} }
@ -942,7 +945,7 @@ import 'css!assets/css/videoosd';
} }
function updateTimeText(elem, ticks, divider) { function updateTimeText(elem, ticks, divider) {
if (null == ticks) { if (ticks == null) {
elem.innerHTML = ''; elem.innerHTML = '';
return; return;
} }
@ -984,9 +987,9 @@ import 'css!assets/css/videoosd';
} }
function onSettingsOption(selectedOption) { function onSettingsOption(selectedOption) {
if ('stats' === selectedOption) { if (selectedOption === 'stats') {
toggleStats(); toggleStats();
} else if ('suboffset' === selectedOption) { } else if (selectedOption === 'suboffset') {
const player = currentPlayer; const player = currentPlayer;
if (player) { if (player) {
playbackManager.enableShowingSubtitleOffset(player); playbackManager.enableShowingSubtitleOffset(player);
@ -1060,7 +1063,7 @@ import 'css!assets/css/videoosd';
const streams = playbackManager.subtitleTracks(player); const streams = playbackManager.subtitleTracks(player);
let currentIndex = playbackManager.getSubtitleStreamIndex(player); let currentIndex = playbackManager.getSubtitleStreamIndex(player);
if (null == currentIndex) { if (currentIndex == null) {
currentIndex = -1; currentIndex = -1;
} }
@ -1131,8 +1134,9 @@ import 'css!assets/css/videoosd';
clickedElement = e.target; clickedElement = e.target;
const key = keyboardnavigation.getKeyName(e); const key = keyboardnavigation.getKeyName(e);
const isKeyModified = e.ctrlKey || e.altKey || e.metaKey;
if (!currentVisibleMenu && 32 === e.keyCode) { if (!currentVisibleMenu && e.keyCode === 32) {
playbackManager.playPause(currentPlayer); playbackManager.playPause(currentPlayer);
showOsd(); showOsd();
return; return;
@ -1235,8 +1239,10 @@ import 'css!assets/css/videoosd';
case '7': case '7':
case '8': case '8':
case '9': { case '9': {
const percent = parseInt(key, 10) * 10; if (!isKeyModified) {
playbackManager.seekPercent(percent, currentPlayer); const percent = parseInt(key, 10) * 10;
playbackManager.seekPercent(percent, currentPlayer);
}
break; break;
} }
} }

View file

@ -3,21 +3,21 @@ import globalize from 'globalize';
/* eslint-disable indent */ /* eslint-disable indent */
function processForgotPasswordResult(result) { function processForgotPasswordResult(result) {
if ('ContactAdmin' == result.Action) { if (result.Action == 'ContactAdmin') {
return void Dashboard.alert({ return void Dashboard.alert({
message: globalize.translate('MessageContactAdminToResetPassword'), message: globalize.translate('MessageContactAdminToResetPassword'),
title: globalize.translate('HeaderForgotPassword') title: globalize.translate('HeaderForgotPassword')
}); });
} }
if ('InNetworkRequired' == result.Action) { if (result.Action == 'InNetworkRequired') {
return void Dashboard.alert({ return void Dashboard.alert({
message: globalize.translate('MessageForgotPasswordInNetworkRequired'), message: globalize.translate('MessageForgotPasswordInNetworkRequired'),
title: globalize.translate('HeaderForgotPassword') title: globalize.translate('HeaderForgotPassword')
}); });
} }
if ('PinCode' == result.Action) { if (result.Action == 'PinCode') {
let msg = globalize.translate('MessageForgotPasswordFileCreated'); let msg = globalize.translate('MessageForgotPasswordFileCreated');
msg += '<br/>'; msg += '<br/>';
msg += '<br/>'; msg += '<br/>';

View file

@ -58,7 +58,7 @@ import 'emby-itemscontainer';
const viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
const itemsContainer = tabContent.querySelector('.itemsContainer'); const itemsContainer = tabContent.querySelector('.itemsContainer');
if ('List' == viewStyle) { if (viewStyle == 'List') {
itemsContainer.classList.add('vertical-list'); itemsContainer.classList.add('vertical-list');
itemsContainer.classList.remove('vertical-wrap'); itemsContainer.classList.remove('vertical-wrap');
} else { } else {

View file

@ -62,13 +62,13 @@ import 'emby-button';
const elem = entry.target; const elem = entry.target;
const id = elem.getAttribute('data-id'); const id = elem.getAttribute('data-id');
const viewStyle = self.getCurrentViewStyle(); const viewStyle = self.getCurrentViewStyle();
let limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9;
if (enableScrollX()) { if (enableScrollX()) {
limit = 10; limit = 10;
} }
const enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; const enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary';
const query = { const query = {
SortBy: 'SortName', SortBy: 'SortName',
SortOrder: 'Ascending', SortOrder: 'Ascending',

Some files were not shown because too many files have changed in this diff Show more