diff --git a/.eslintrc.js b/.eslintrc.js index 765db89daa..98fa2b817f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,7 @@ module.exports = { root: true, plugins: [ + '@babel', 'promise', 'import', 'eslint-comments' @@ -46,14 +47,15 @@ module.exports = { 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'semi': ['error'], 'space-before-blocks': ['error'], - 'space-infix-ops': 'error' + 'space-infix-ops': 'error', + 'yoda': 'error' }, overrides: [ { files: [ './src/**/*.js' ], - parser: 'babel-eslint', + parser: '@babel/eslint-parser', env: { node: false, amd: true, diff --git a/package.json b/package.json index 3b966e3cdd..cdec2bbc9b 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,14 @@ "license": "GPL-2.0-or-later", "devDependencies": { "@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-private-methods": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.10.5", "@babel/polyfill": "^7.8.7", "@babel/preset-env": "^7.11.0", "autoprefixer": "^9.8.6", - "babel-eslint": "^11.0.0-beta.2", "babel-loader": "^8.0.6", "browser-sync": "^2.26.12", "copy-webpack-plugin": "^5.1.1", @@ -120,6 +121,7 @@ "src/components/imageUploader/imageUploader.js", "src/components/indicators/indicators.js", "src/components/itemContextMenu.js", + "src/components/itemHelper.js", "src/components/itemidentifier/itemidentifier.js", "src/components/itemMediaInfo/itemMediaInfo.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", @@ -201,10 +203,12 @@ "src/controllers/dashboard/users/userparentalcontrol.js", "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", + "src/controllers/itemDetails/index.js", "src/controllers/playback/queue/index.js", "src/controllers/playback/video/index.js", "src/controllers/searchpage.js", "src/controllers/livetvtuner.js", + "src/controllers/livetvstatus.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", @@ -250,6 +254,7 @@ "src/plugins/youtubePlayer/plugin.js", "src/scripts/alphanumericshortcuts.js", "src/scripts/autoBackdrops.js", + "src/scripts/browser.js", "src/scripts/datetime.js", "src/scripts/deleteHelper.js", "src/scripts/dfnshelper.js", diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 9834255003..ab489a3f31 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -16,7 +16,7 @@ import 'listViewStyle'; let color = '#00a4dc'; 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'; icon = 'notification_important'; } @@ -60,13 +60,13 @@ import 'listViewStyle'; } function reloadData(instance, elem, apiClient, startIndex, limit) { - if (null == startIndex) { + if (startIndex == null) { startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0'); } limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7'); const minDate = new Date(); - const hasUserId = 'false' !== elem.getAttribute('data-useractivity'); + const hasUserId = elem.getAttribute('data-useractivity') !== 'false'; // TODO: Use date-fns if (hasUserId) { diff --git a/src/components/apphost.js b/src/components/apphost.js index e7d5bbc2f4..8a5581d817 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -47,7 +47,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder); } else { 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); } @@ -370,7 +370,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g return window.NativeShell.AppHost.supports(command); } - return -1 !== supportedFeatures.indexOf(command.toLowerCase()); + return supportedFeatures.indexOf(command.toLowerCase()) !== -1; }, preferVisualCards: browser.android || browser.chrome, getSyncProfile: getSyncProfile, diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index edb9db28ba..4a37331ef4 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -277,7 +277,7 @@ import 'programStyles'; */ function getImageWidth(shape, screenWidth, isOrientationLandscape) { const imagesPerRow = getPostersPerRow(shape, screenWidth, isOrientationLandscape); - return Math.round(screenWidth / imagesPerRow) * 2; + return Math.round(screenWidth / imagesPerRow); } /** diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 1521650ed0..642a87db2a 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -73,7 +73,7 @@ import browser from 'browser'; if (ImageTag) { return apiClient.getScaledImageUrl(Id, { - maxWidth: maxWidth * 2, + maxWidth: maxWidth, tag: ImageTag, type: 'Chapter', index diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index dde2e5f1c5..7a94b07454 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -129,7 +129,7 @@ import 'emby-itemscontainer'; let promise; - if ('MusicArtist' === section.types) { + if (section.types === 'MusicArtist') { promise = ApiClient.getArtists(userId, options); } else { options.IncludeItemTypes = section.types; @@ -169,7 +169,7 @@ import 'emby-itemscontainer'; preferThumb: section.preferThumb, shape: section.shape, centerText: section.centerText && !cardLayout, - overlayText: false !== section.overlayText, + overlayText: section.overlayText !== false, showTitle: section.showTitle, showParentTitle: section.showParentTitle, scalable: true, @@ -201,7 +201,7 @@ import 'emby-itemscontainer'; if (types) { sections = sections.filter(function (s) { - return -1 !== types.indexOf(s.id); + return types.indexOf(s.id) !== -1; }); } @@ -222,7 +222,7 @@ import 'emby-itemscontainer'; for (let i = 0, length = sections.length; i < length; i++) { const section = sections[i]; 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 () { diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 8ac3cc799c..3361db5f02 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -21,7 +21,7 @@ import connectionManager from 'connectionManager'; if (!actionableParent || actionableParent.classList.contains('cardContent')) { 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]); } diff --git a/src/components/imageOptionsEditor/imageOptionsEditor.js b/src/components/imageOptionsEditor/imageOptionsEditor.js index 6660ecf74c..41fe9b4c94 100644 --- a/src/components/imageOptionsEditor/imageOptionsEditor.js +++ b/src/components/imageOptionsEditor/imageOptionsEditor.js @@ -16,7 +16,7 @@ import 'emby-input'; return { Type: type, MinWidth: 0, - Limit: 'Primary' === type ? 1 : 0 + Limit: type === 'Primary' ? 1 : 0 }; } diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 55e9e10062..7d1ac0e110 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -1,342 +1,350 @@ -define(['apphost', 'globalize'], function (appHost, globalize) { - 'use strict'; +import appHost from 'apphost'; +import globalize from 'globalize'; - function getDisplayName(item, options = {}) { - if (!item) { - throw new Error('null item passed into getDisplayName'); +export function getDisplayName(item, options = {}) { + if (!item) { + 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; } + 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) { - var invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer']; + let number = displayIndexNumber; + let nameSeparator = ' - '; - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } + if (options.includeParentInfo !== false) { + number = 'S' + item.ParentIndexNumber + ':E' + number; + } 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) { - 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; - } + return name; +} - if (item.Type === 'Recording') { - if (item.Status !== 'Completed') { - return false; - } - } +export function supportsAddingToCollection(item) { + const invalidTypes = ['Genre', 'MusicGenre', 'Studio', 'UserView', 'CollectionFolder', 'Audio', 'Program', 'Timer', 'SeriesTimer']; - if (isLocalItem(item)) { + if (item.Type === 'Recording') { + if (item.Status !== 'Completed') { 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) { - var itemType = item.Type; + return !item.CollectionType && invalidTypes.indexOf(item.Type) === -1 && item.MediaType !== 'Photo' && !isLocalItem(item); +} - 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 supportsAddingToPlaylist(item) { + 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; } - function isLocalItem(item) { - if (item && item.Id && item.Id.indexOf('local') === 0) { + if (item.Type === 'Recording') { + 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 false; } - return { - getDisplayName: getDisplayName, - 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; - } - } - } - + if (item.Type === 'Recording') { + if (item.Status !== 'Completed') { return false; - }, + } + } - canEdit: canEdit, + return itemType !== 'Timer' && itemType !== 'SeriesTimer' && canEdit(user, item) && !isLocalItem(item); +} - canEditImages: function (user, item) { - var itemType = item.Type; +export function canSync (user, item) { + if (user && !user.Policy.EnableContentDownloading) { + return false; + } - if (item.MediaType === 'Photo') { - return false; - } + if (isLocalItem(item)) { + return false; + } - if (itemType === 'UserView') { - 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; - } + return item.SupportsSync; +} +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; - }, + } + } + if (isLocalItem(item)) { + return false; + } + return user.Policy.EnablePublicSharing && appHost.supports('sharing'); +} - canRate: function (item) { - if (item.Type === 'Program' - || item.Type === 'Timer' - || item.Type === 'SeriesTimer' - || item.Type === 'CollectionFolder' - || item.Type === 'UserView' - || item.Type === 'Channel' - || !item.UserData) { - return false; - } +export function enableDateAddedDisplay (item) { + return !item.IsFolder && item.MediaType && item.Type !== 'Program' && item.Type !== 'TvChannel' && item.Type !== 'Trailer'; +} - return true; - }, - - 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; - } +export function canMarkPlayed (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; + } + + 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 +}; diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index a6256de24c..ab193c264e 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -219,7 +219,7 @@ import 'emby-input'; html += '