diff --git a/.eslintrc.js b/.eslintrc.js index 3e01786246..562b457bf7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -72,15 +72,11 @@ module.exports = { 'sonarjs/cognitive-complexity': ['warn'], // TODO: Enable the following rules and fix issues - 'sonarjs/max-switch-cases': ['off'], 'sonarjs/no-duplicate-string': ['off'], 'sonarjs/no-duplicated-branches': ['off'], - 'sonarjs/no-gratuitous-expressions': ['off'], 'sonarjs/no-identical-functions': ['off'], - 'sonarjs/no-nested-switch': ['off'], 'sonarjs/no-redundant-jump': ['off'], 'sonarjs/no-small-switch': ['off'], - 'sonarjs/no-unused-collection': ['off'], 'sonarjs/prefer-object-literal': ['off'], 'sonarjs/prefer-single-boolean-return': ['off'] }, diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 6f2378eca3..12f535a18d 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -132,6 +132,7 @@ function saveValues(context, settings, settingsKey) { seriesStatuses.push(elems[i].getAttribute('data-filter')); } } + userSettings.setFilter(`${settingsKey}-filter-SeriesStatus`, seriesStatuses.join(',')); // Genres const genres = []; diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index b5842cf884..80da4d7b12 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -144,33 +144,32 @@ class SubtitleSync { } toggle(action) { + if (action && !['hide', 'forceToHide'].includes(action)) { + console.warn('SubtitleSync.toggle called with invalid action', action); + return; + } + if (player && playbackManager.supportSubtitleOffset(player)) { - /* eslint-disable no-fallthrough */ - switch (action) { - case undefined: - // if showing subtitle sync is enabled and if there is an external subtitle stream enabled - if (playbackManager.isShowingSubtitleOffsetEnabled(player) && playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { - // if no subtitle offset is defined or element has focus (offset being defined) - if (!(playbackManager.getPlayerSubtitleOffset(player) || subtitleSyncTextField.hasFocus)) { - // set default offset to '0' = 50% - subtitleSyncSlider.value = '50'; - subtitleSyncTextField.textContent = '0s'; - playbackManager.setSubtitleOffset(0, player); - } - // show subtitle sync - subtitleSyncContainer.classList.remove('hide'); - break; // stop here - } // else continue and hide - case 'hide': - // only break if element has focus - if (subtitleSyncTextField.hasFocus) { - break; + if (!action) { + // if showing subtitle sync is enabled and if there is an external subtitle stream enabled + if (playbackManager.isShowingSubtitleOffsetEnabled(player) && playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { + // if no subtitle offset is defined or element has focus (offset being defined) + if (!(playbackManager.getPlayerSubtitleOffset(player) || subtitleSyncTextField.hasFocus)) { + // set default offset to '0' = 50% + subtitleSyncSlider.value = '50'; + subtitleSyncTextField.textContent = '0s'; + playbackManager.setSubtitleOffset(0, player); } - case 'forceToHide': - subtitleSyncContainer.classList.add('hide'); - break; + // show subtitle sync + subtitleSyncContainer.classList.remove('hide'); + return; + } + } else if (action === 'hide' && subtitleSyncTextField.hasFocus) { + // do not hide if element has focus + return; } - /* eslint-enable no-fallthrough */ + + subtitleSyncContainer.classList.add('hide'); } } } diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 1f260f6d76..f700595c37 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -458,7 +458,7 @@ import confirm from '../../components/confirm/confirm'; html += ' / '; - if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { + if (nowPlayingItem.RunTimeTicks) { html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks); } else { html += '0:00'; diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index 4fd2c0a0c7..cb76fa7977 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -1,57 +1,61 @@ +const BASE_DEVICE_IMAGE_URL = 'assets/img/devices/'; + +function getWebDeviceIcon(browser) { + switch (browser) { + case 'Opera': + case 'Opera TV': + case 'Opera Android': + return BASE_DEVICE_IMAGE_URL + 'opera.svg'; + case 'Chrome': + case 'Chrome Android': + return BASE_DEVICE_IMAGE_URL + 'chrome.svg'; + case 'Firefox': + case 'Firefox Android': + return BASE_DEVICE_IMAGE_URL + 'firefox.svg'; + case 'Safari': + case 'Safari iPad': + case 'Safari iPhone': + return BASE_DEVICE_IMAGE_URL + 'safari.svg'; + case 'Edge Chromium': + case 'Edge Chromium Android': + case 'Edge Chromium iPad': + case 'Edge Chromium iPhone': + return BASE_DEVICE_IMAGE_URL + 'edgechromium.svg'; + case 'Edge': + return BASE_DEVICE_IMAGE_URL + 'edge.svg'; + case 'Internet Explorer': + return BASE_DEVICE_IMAGE_URL + 'msie.svg'; + default: + return BASE_DEVICE_IMAGE_URL + 'html5.svg'; + } +} /* eslint-disable indent */ export function getDeviceIcon(device) { - const baseUrl = 'assets/img/devices/'; switch (device.AppName || device.Client) { case 'Samsung Smart TV': - return baseUrl + 'samsung.svg'; + return BASE_DEVICE_IMAGE_URL + 'samsung.svg'; case 'Xbox One': - return baseUrl + 'xbox.svg'; + return BASE_DEVICE_IMAGE_URL + 'xbox.svg'; case 'Sony PS4': - return baseUrl + 'playstation.svg'; + return BASE_DEVICE_IMAGE_URL + 'playstation.svg'; case 'Kodi': case 'Kodi JellyCon': - return baseUrl + 'kodi.svg'; + return BASE_DEVICE_IMAGE_URL + 'kodi.svg'; case 'Jellyfin Android': case 'AndroidTV': case 'Android TV': - return baseUrl + 'android.svg'; + return BASE_DEVICE_IMAGE_URL + 'android.svg'; case 'Jellyfin Mobile (iOS)': case 'Jellyfin Mobile (iPadOS)': case 'Jellyfin iOS': case 'Infuse': - return baseUrl + 'apple.svg'; + return BASE_DEVICE_IMAGE_URL + 'apple.svg'; case 'Jellyfin Web': - switch (device.Name || device.DeviceName) { - case 'Opera': - case 'Opera TV': - case 'Opera Android': - return baseUrl + 'opera.svg'; - case 'Chrome': - case 'Chrome Android': - return baseUrl + 'chrome.svg'; - case 'Firefox': - case 'Firefox Android': - return baseUrl + 'firefox.svg'; - case 'Safari': - case 'Safari iPad': - case 'Safari iPhone': - return baseUrl + 'safari.svg'; - case 'Edge Chromium': - case 'Edge Chromium Android': - case 'Edge Chromium iPad': - case 'Edge Chromium iPhone': - return baseUrl + 'edgechromium.svg'; - case 'Edge': - return baseUrl + 'edge.svg'; - case 'Internet Explorer': - return baseUrl + 'msie.svg'; - default: - return baseUrl + 'html5.svg'; - } + return getWebDeviceIcon(device.Name || device.DeviceName); default: - return baseUrl + 'other.svg'; + return BASE_DEVICE_IMAGE_URL + 'other.svg'; } } diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index e8b58ce0fe..30d2171ae4 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -123,16 +123,11 @@ function processGeneralCommand(cmd, apiClient) { displayMessage(cmd); break; case 'ToggleOsd': - // todo - break; case 'ToggleContextMenu': - // todo - break; case 'SendKey': // todo break; case 'SendString': - // todo focusManager.sendText(cmd.Arguments.String); break; default: