diff --git a/.eslintignore b/.eslintignore index 8e3aee83f..74b18ddcf 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,3 @@ node_modules dist .idea .vscode -src/libraries diff --git a/.eslintrc.js b/.eslintrc.js index 765db89da..6fd4392e6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,7 @@ module.exports = { root: true, plugins: [ + '@babel', 'promise', 'import', 'eslint-comments' @@ -28,7 +29,7 @@ module.exports = { ], rules: { 'block-spacing': ['error'], - 'brace-style': ['error', "1tbs", { "allowSingleLine": true }], + 'brace-style': ['error', '1tbs', { 'allowSingleLine': true }], 'comma-dangle': ['error', 'never'], 'comma-spacing': ['error'], 'eol-last': ['error'], @@ -39,21 +40,23 @@ module.exports = { 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-trailing-spaces': ['error'], - 'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], - "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], + '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + //'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }], 'one-var': ['error', 'never'], 'padded-blocks': ['error', 'never'], + //'prefer-const': ['error', {'destructuring': 'all'}], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], - 'semi': ['error'], + '@babel/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, @@ -103,6 +106,7 @@ module.exports = { // TODO: Fix warnings and remove these rules 'no-redeclare': ['off'], 'no-useless-escape': ['off'], + 'no-unused-vars': ['off'], // TODO: Remove after ES6 migration is complete 'import/no-unresolved': ['off'] }, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c51cd6b31..46c40b6c9 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,7 @@ - [Thibault Nocchi](https://github.com/ThibaultNocchi) - [MrTimscampi](https://github.com/MrTimscampi) - [Sarab Singh](https://github.com/sarab97) + - [GuilhermeHideki](https://github.com/GuilhermeHideki) - [Andrei Oanca](https://github.com/OancaAndrei) - [Cromefire_](https://github.com/cromefire) diff --git a/package.json b/package.json index 9ce8db2e4..a6f3e8724 100644 --- a/package.json +++ b/package.json @@ -5,21 +5,22 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "^7.10.5", + "@babel/core": "^7.11.1", + "@babel/eslint-parser": "^7.11.3", + "@babel/eslint-plugin": "^7.11.3", "@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.10.3", - "autoprefixer": "^9.8.5", - "babel-eslint": "^11.0.0-beta.2", + "@babel/preset-env": "^7.11.0", + "autoprefixer": "^9.8.6", "babel-loader": "^8.0.6", "browser-sync": "^2.26.12", "copy-webpack-plugin": "^5.1.1", - "css-loader": "^4.0.0", + "css-loader": "^4.2.1", "cssnano": "^4.1.10", "del": "^5.1.0", - "eslint": "^6.8.0", + "eslint": "^7.7.0", "eslint-plugin-compat": "^3.5.1", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.21.2", @@ -37,7 +38,7 @@ "gulp-postcss": "^8.0.0", "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", - "gulp-terser": "^1.2.1", + "gulp-terser": "^1.3.2", "html-webpack-plugin": "^4.3.0", "lazypipe": "^1.0.2", "node-sass": "^4.13.1", @@ -48,7 +49,7 @@ "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.1.0", - "webpack": "^4.44.0", + "webpack": "^4.44.1", "webpack-merge": "^4.2.2", "webpack-stream": "^5.2.1" }, @@ -62,7 +63,7 @@ "fast-text-encoding": "^1.0.3", "flv.js": "^1.5.0", "headroom.js": "^0.11.0", - "hls.js": "^0.14.6", + "hls.js": "^0.14.8", "howler": "^2.2.0", "intersection-observer": "^0.11.0", "jellyfin-apiclient": "^1.4.1", @@ -79,7 +80,7 @@ "sortablejs": "^1.10.2", "swiper": "^5.4.5", "webcomponents.js": "^0.7.24", - "whatwg-fetch": "^3.2.0" + "whatwg-fetch": "^3.4.0" }, "babel": { "presets": [ @@ -94,6 +95,8 @@ "src/components/alert.js", "src/components/alphaPicker/alphaPicker.js", "src/components/appFooter/appFooter.js", + "src/components/apphost.js", + "src/components/appRouter.js", "src/components/autoFocuser.js", "src/components/backdrop/backdrop.js", "src/components/cardbuilder/cardBuilder.js", @@ -106,9 +109,14 @@ "src/components/dialogHelper/dialogHelper.js", "src/components/directorybrowser/directorybrowser.js", "src/components/displaySettings/displaySettings.js", + "src/components/favoriteitems.js", "src/components/fetchhelper.js", "src/components/filterdialog/filterdialog.js", + "src/components/filtermenu/filtermenu.js", + "src/components/focusManager.js", "src/components/groupedcards.js", + "src/components/guide/guide.js", + "src/components/guide/guide-settings.js", "src/components/homeScreenSettings/homeScreenSettings.js", "src/components/homesections/homesections.js", "src/components/htmlMediaHelper.js", @@ -119,11 +127,15 @@ "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/itemsrefresher.js", + "src/components/layoutManager.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", "src/components/libraryoptionseditor/libraryoptionseditor.js", "src/components/listview/listview.js", + "src/components/loading/loading.js", "src/components/maintabsmanager.js", "src/components/mediainfo/mediainfo.js", "src/components/mediaLibraryCreator/mediaLibraryCreator.js", @@ -131,34 +143,70 @@ "src/components/metadataEditor/metadataEditor.js", "src/components/metadataEditor/personEditor.js", "src/components/multiSelect/multiSelect.js", + "src/components/notifications/notifications.js", "src/components/nowPlayingBar/nowPlayingBar.js", + "src/components/packageManager.js", "src/components/playback/brightnessosd.js", "src/components/playback/mediasession.js", "src/components/playback/nowplayinghelper.js", "src/components/playback/playbackorientation.js", + "src/components/playback/playbackmanager.js", "src/components/playback/playerSelectionMenu.js", "src/components/playback/playersettingsmenu.js", "src/components/playback/playmethodhelper.js", + "src/components/playback/playqueuemanager.js", "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", "src/components/playbackSettings/playbackSettings.js", "src/components/playerstats/playerstats.js", "src/components/playlisteditor/playlisteditor.js", "src/components/playmenu.js", + "src/components/pluginManager.js", "src/components/prompt/prompt.js", + "src/components/recordingcreator/recordingbutton.js", + "src/components/recordingcreator/recordingcreator.js", + "src/components/recordingcreator/seriesrecordingeditor.js", + "src/components/recordingcreator/recordinghelper.js", + "src/components/refreshdialog/refreshdialog.js", + "src/components/recordingcreator/recordingeditor.js", + "src/components/recordingcreator/recordingfields.js", + "src/components/qualityOptions.js", + "src/components/remotecontrol/remotecontrol.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/plugins/experimentalWarnings/plugin.js", + "src/plugins/sessionPlayer/plugin.js", + "src/plugins/htmlAudioPlayer/plugin.js", + "src/plugins/chromecastPlayer/plugin.js", + "src/components/slideshow/slideshow.js", + "src/components/sortmenu/sortmenu.js", "src/plugins/htmlVideoPlayer/plugin.js", + "src/plugins/logoScreensaver/plugin.js", + "src/plugins/playAccessValidation/plugin.js", "src/components/search/searchfields.js", "src/components/search/searchresults.js", "src/components/settingshelper.js", "src/components/shortcuts.js", + "src/components/subtitleeditor/subtitleeditor.js", + "src/components/subtitlesync/subtitlesync.js", "src/components/subtitlesettings/subtitleappearancehelper.js", "src/components/subtitlesettings/subtitlesettings.js", "src/components/syncPlay/groupSelectionMenu.js", "src/components/syncPlay/playbackPermissionManager.js", "src/components/syncPlay/syncPlayManager.js", "src/components/syncPlay/timeSyncManager.js", + "src/components/themeMediaPlayer.js", + "src/components/tabbedview/tabbedview.js", + "src/components/viewManager/viewManager.js", + "src/components/tvproviders/schedulesdirect.js", + "src/components/tvproviders/xmltv.js", + "src/components/toast/toast.js", + "src/components/tunerPicker.js", + "src/components/upnextdialog/upnextdialog.js", + "src/components/userdatabuttons/userdatabuttons.js", + "src/components/viewContainer.js", + "src/components/viewSettings/viewSettings.js", + "src/components/castSenderApi.js", "src/controllers/session/addServer/index.js", "src/controllers/session/forgotPassword/index.js", "src/controllers/session/redeemPassword/index.js", @@ -181,11 +229,16 @@ "src/controllers/music/musicplaylists.js", "src/controllers/music/musicrecommended.js", "src/controllers/music/songs.js", - "src/controllers/dashboard/mediaLibrary.js", + "src/controllers/dashboard/library.js", "src/controllers/dashboard/metadataImages.js", "src/controllers/dashboard/metadatanfo.js", "src/controllers/dashboard/networking.js", + "src/controllers/dashboard/notifications/notification/index.js", + "src/controllers/dashboard/notifications/notifications/index.js", "src/controllers/dashboard/playback.js", + "src/controllers/dashboard/plugins/add/index.js", + "src/controllers/dashboard/plugins/installed/index.js", + "src/controllers/dashboard/plugins/available/index.js", "src/controllers/dashboard/plugins/repositories/index.js", "src/controllers/dashboard/scheduledtasks/scheduledtask.js", "src/controllers/dashboard/scheduledtasks/scheduledtasks.js", @@ -197,9 +250,32 @@ "src/controllers/dashboard/users/userparentalcontrol.js", "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", + "src/controllers/home.js", + "src/controllers/list.js", + "src/controllers/edititemmetadata.js", + "src/controllers/favorites.js", + "src/controllers/hometab.js", + "src/controllers/movies/moviecollections.js", + "src/controllers/movies/moviegenres.js", + "src/controllers/movies/movies.js", + "src/controllers/movies/moviesrecommended.js", + "src/controllers/movies/movietrailers.js", + "src/controllers/playback/nowplaying.js", + "src/controllers/playback/videoosd.js", + "src/controllers/itemDetails/index.js", "src/controllers/playback/queue/index.js", "src/controllers/playback/video/index.js", "src/controllers/searchpage.js", + "src/controllers/livetv/livetvguide.js", + "src/controllers/livetvtuner.js", + "src/controllers/livetv/livetvsuggested.js", + "src/controllers/livetvstatus.js", + "src/controllers/livetvguideprovider.js", + "src/controllers/livetvsettings.js", + "src/controllers/livetv/livetvrecordings.js", + "src/controllers/livetv/livetvschedule.js", + "src/controllers/livetv/livetvseriestimers.js", + "src/controllers/livetv/livetvchannels.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", @@ -238,6 +314,9 @@ "src/elements/emby-tabs/emby-tabs.js", "src/elements/emby-textarea/emby-textarea.js", "src/elements/emby-toggle/emby-toggle.js", + "src/libraries/screensavermanager.js", + "src/libraries/navdrawer/navdrawer.js", + "src/libraries/scroller.js", "src/plugins/backdropScreensaver/plugin.js", "src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/tableOfContents.js", @@ -245,6 +324,8 @@ "src/plugins/youtubePlayer/plugin.js", "src/scripts/alphanumericshortcuts.js", "src/scripts/autoBackdrops.js", + "src/scripts/browser.js", + "src/scripts/clientUtils.js", "src/scripts/datetime.js", "src/scripts/deleteHelper.js", "src/scripts/dfnshelper.js", @@ -254,14 +335,24 @@ "src/scripts/filesystem.js", "src/scripts/globalize.js", "src/scripts/imagehelper.js", + "src/scripts/itembynamedetailpage.js", "src/scripts/inputManager.js", + "src/scripts/autoThemes.js", + "src/scripts/themeManager.js", "src/scripts/keyboardNavigation.js", + "src/scripts/libraryMenu.js", "src/scripts/libraryBrowser.js", + "src/scripts/livetvcomponents.js", + "src/scripts/mouseManager.js", "src/scripts/multiDownload.js", "src/scripts/playlists.js", + "src/scripts/scrollHelper.js", + "src/scripts/serverNotifications.js", + "src/scripts/routes.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", "src/scripts/settings/webSettings.js", + "src/scripts/shell.js", "src/scripts/taskbutton.js", "src/scripts/themeLoader.js", "src/scripts/touchHelper.js" @@ -291,6 +382,7 @@ "Firefox ESR" ], "scripts": { + "start": "yarn serve", "serve": "gulp serve --development", "prepare": "gulp --production", "build:development": "gulp --development", diff --git a/scripts/duplicates.py b/scripts/duplicates.py new file mode 100644 index 000000000..2daad9468 --- /dev/null +++ b/scripts/duplicates.py @@ -0,0 +1,33 @@ +import sys +import os +import json + +# load every string in the source language +# print all duplicate values to a file + +cwd = os.getcwd() +source = cwd + '/../src/strings/en-us.json' + +reverse = {} +duplicates = {} + +with open(source) as en: + strings = json.load(en) + for key, value in strings.items(): + if value not in reverse: + reverse[value] = [key] + else: + reverse[value].append(key) + +for key, value in reverse.items(): + if len(value) > 1: + duplicates[key] = value + +print('LENGTH: ' + str(len(duplicates))) +with open('duplicates.txt', 'w') as out: + for item in duplicates: + out.write(json.dumps(item) + ': ') + out.write(json.dumps(duplicates[item]) + '\n') + out.close() + +print('DONE') diff --git a/scripts/scrm.py b/scripts/remove.py similarity index 95% rename from scripts/scrm.py rename to scripts/remove.py index 9bd5bc2a4..dba48537a 100644 --- a/scripts/scrm.py +++ b/scripts/remove.py @@ -11,7 +11,7 @@ langlst = os.listdir(langdir) keys = [] -with open('scout.txt', 'r') as f: +with open('unused.txt', 'r') as f: for line in f: keys.append(line.strip('\n')) diff --git a/scripts/scdup.py b/scripts/source.py similarity index 100% rename from scripts/scdup.py rename to scripts/source.py diff --git a/scripts/scgen.py b/scripts/unused.py similarity index 100% rename from scripts/scgen.py rename to scripts/unused.py diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 61815a590..643fb9ca9 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -236,12 +236,6 @@ text-align: center; } -.layout-desktop .searchTabButton, -.layout-mobile .searchTabButton, -.layout-tv .headerSearchButton { - display: none !important; -} - .mainDrawer-scrollContainer { padding-bottom: 10vh; } @@ -646,7 +640,7 @@ .layout-desktop .detailRibbon, .layout-tv .detailRibbon { margin-top: -7.2em; - height: 7.18em; + height: 7.2em; } .layout-desktop .noBackdrop .detailRibbon, diff --git a/src/assets/css/videoosd.css b/src/assets/css/videoosd.css index 50cb41021..59a485468 100644 --- a/src/assets/css/videoosd.css +++ b/src/assets/css/videoosd.css @@ -7,7 +7,6 @@ } .osdPoster img, -.pageContainer, .videoOsdBottom { bottom: 0; left: 0; @@ -248,11 +247,6 @@ animation: spin 4s linear infinite; } -.pageContainer { - top: 0; - position: fixed; -} - @media all and (max-width: 30em) { .btnFastForward, .btnRewind, diff --git a/src/bundle.js b/src/bundle.js index ae2a59f0d..5a7ffed07 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -2,159 +2,159 @@ * require.js module definitions bundled by webpack */ // Use define from require.js not webpack's define -var _define = window.define; +const _define = window.define; // fetch -var fetch = require('whatwg-fetch'); +const fetch = require('whatwg-fetch'); _define('fetch', function() { return fetch; }); // Blurhash -var blurhash = require('blurhash'); +const blurhash = require('blurhash'); _define('blurhash', function() { return blurhash; }); // query-string -var query = require('query-string'); +const query = require('query-string'); _define('queryString', function() { return query; }); // flvjs -var flvjs = require('flv.js/dist/flv').default; +const flvjs = require('flv.js/dist/flv').default; _define('flvjs', function() { return flvjs; }); // jstree -var jstree = require('jstree'); +const jstree = require('jstree'); require('jstree/dist/themes/default/style.css'); _define('jstree', function() { return jstree; }); // jquery -var jquery = require('jquery'); +const jquery = require('jquery'); _define('jQuery', function() { return jquery; }); // hlsjs -var hlsjs = require('hls.js'); +const hlsjs = require('hls.js'); _define('hlsjs', function() { return hlsjs; }); // howler -var howler = require('howler'); +const howler = require('howler'); _define('howler', function() { return howler; }); // resize-observer-polyfill -var resize = require('resize-observer-polyfill').default; +const resize = require('resize-observer-polyfill').default; _define('resize-observer-polyfill', function() { return resize; }); // swiper -var swiper = require('swiper/js/swiper'); +const swiper = require('swiper/js/swiper'); require('swiper/css/swiper.min.css'); _define('swiper', function() { return swiper; }); // sortable -var sortable = require('sortablejs').default; +const sortable = require('sortablejs').default; _define('sortable', function() { return sortable; }); // webcomponents -var webcomponents = require('webcomponents.js/webcomponents-lite'); +const webcomponents = require('webcomponents.js/webcomponents-lite'); _define('webcomponents', function() { return webcomponents; }); // libass-wasm -var libassWasm = require('libass-wasm'); +const libassWasm = require('libass-wasm'); _define('JavascriptSubtitlesOctopus', function() { return libassWasm; }); // material-icons -var materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); +const materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); _define('material-icons', function() { return materialIcons; }); // noto font -var noto = require('jellyfin-noto'); +const noto = require('jellyfin-noto'); _define('jellyfin-noto', function () { return noto; }); -var epubjs = require('epubjs'); +const epubjs = require('epubjs'); _define('epubjs', function () { return epubjs; }); // page.js -var page = require('page'); +const page = require('page'); _define('page', function() { return page; }); // core-js -var polyfill = require('@babel/polyfill/dist/polyfill'); +const polyfill = require('@babel/polyfill/dist/polyfill'); _define('polyfill', function () { return polyfill; }); // domtokenlist-shim -var classlist = require('classlist.js'); +const classlist = require('classlist.js'); _define('classlist-polyfill', function () { return classlist; }); // Date-FNS -var dateFns = require('date-fns'); +const dateFns = require('date-fns'); _define('date-fns', function () { return dateFns; }); -var dateFnsLocale = require('date-fns/locale'); +const dateFnsLocale = require('date-fns/locale'); _define('date-fns/locale', function () { return dateFnsLocale; }); -var fast_text_encoding = require('fast-text-encoding'); +const fast_text_encoding = require('fast-text-encoding'); _define('fast-text-encoding', function () { return fast_text_encoding; }); // intersection-observer -var intersection_observer = require('intersection-observer'); +const intersection_observer = require('intersection-observer'); _define('intersection-observer', function () { return intersection_observer; }); // screenfull -var screenfull = require('screenfull'); +const screenfull = require('screenfull'); _define('screenfull', function () { return screenfull; }); // headroom.js -var headroom = require('headroom.js/dist/headroom'); +const headroom = require('headroom.js/dist/headroom'); _define('headroom', function () { return headroom; }); // apiclient -var apiclient = require('jellyfin-apiclient'); +const apiclient = require('jellyfin-apiclient'); _define('apiclient', function () { return apiclient.ApiClient; diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index 6b96aad1d..b513766d0 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -49,7 +49,7 @@ import 'formDialogStyle'; }; if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { - return void alert(globalize.translate('ErrorMessageStartHourGreaterThanEnd')); + return void alert(globalize.translate('ErrorStartHourGreaterThanEnd')); } context.submitted = true; diff --git a/src/components/accessSchedule/accessSchedule.template.html b/src/components/accessSchedule/accessSchedule.template.html index 493150ae5..c0f83ccec 100644 --- a/src/components/accessSchedule/accessSchedule.template.html +++ b/src/components/accessSchedule/accessSchedule.template.html @@ -1,5 +1,5 @@
';
+ imageContainer.classList.remove('hide');
+
+ imageLoader.lazyChildren(imageContainer);
+ } else {
+ imageContainer.innerHTML = '';
+ imageContainer.classList.add('hide');
}
- if (imageTags.Primary) {
- return apiClient.getScaledImageUrl(item.Id, {
- type: 'Primary',
- maxHeight: imageHeight,
- tag: item.ImageTags.Primary
- });
- } else if (imageTags.Thumb) {
- return apiClient.getScaledImageUrl(item.Id, {
- type: 'Thumb',
- maxHeight: imageHeight,
- tag: item.ImageTags.Thumb
- });
+ context.querySelector('.recordingDialog-itemName').innerHTML = program.Name;
+ context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name;
+ context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / ');
+ context.querySelector('.itemOverview').innerHTML = program.Overview || '';
+
+ const formDialogFooter = context.querySelector('.formDialogFooter');
+ const now = new Date();
+ if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) {
+ formDialogFooter.classList.remove('hide');
+ } else {
+ formDialogFooter.classList.add('hide');
}
- return null;
+ context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program);
}
- function renderRecording(context, defaultTimer, program, apiClient, refreshRecordingStateOnly) {
- if (!refreshRecordingStateOnly) {
- var imgUrl = getImageUrl(program, apiClient, 200);
- var imageContainer = context.querySelector('.recordingDialog-imageContainer');
+ context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, {
+ });
- if (imgUrl) {
- imageContainer.innerHTML = '
';
- imageContainer.classList.remove('hide');
+ loading.hide();
+}
- imageLoader.lazyChildren(imageContainer);
- } else {
- imageContainer.innerHTML = '';
- imageContainer.classList.add('hide');
- }
+function reload(context, programId, serverId, refreshRecordingStateOnly) {
+ loading.show();
- context.querySelector('.recordingDialog-itemName').innerHTML = program.Name;
- context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name;
- context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / ');
- context.querySelector('.itemOverview').innerHTML = program.Overview || '';
+ const apiClient = connectionManager.getApiClient(serverId);
- var formDialogFooter = context.querySelector('.formDialogFooter');
- var now = new Date();
- if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) {
- formDialogFooter.classList.remove('hide');
- } else {
- formDialogFooter.classList.add('hide');
- }
+ const promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId });
+ const promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId());
- context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program);
- }
+ Promise.all([promise1, promise2]).then(function (responses) {
+ const defaults = responses[0];
+ const program = responses[1];
- context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, {
- });
+ renderRecording(context, defaults, program, apiClient, refreshRecordingStateOnly);
+ });
+}
- loading.hide();
- }
+function executeCloseAction(action, programId, serverId) {
+ if (action === 'play') {
+ import('playbackManager').then(({ default: playbackManager }) => {
+ const apiClient = connectionManager.getApiClient(serverId);
- function reload(context, programId, serverId, refreshRecordingStateOnly) {
- loading.show();
-
- var apiClient = connectionManager.getApiClient(serverId);
-
- var promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId });
- var promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId());
-
- Promise.all([promise1, promise2]).then(function (responses) {
- var defaults = responses[0];
- var program = responses[1];
-
- renderRecording(context, defaults, program, apiClient, refreshRecordingStateOnly);
- });
- }
-
- function executeCloseAction(action, programId, serverId) {
- if (action === 'play') {
- require(['playbackManager'], function (playbackManager) {
- var apiClient = connectionManager.getApiClient(serverId);
-
- apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
- playbackManager.play({
- ids: [item.ChannelId],
- serverId: serverId
- });
- });
- });
- return;
- }
- }
-
- function showEditor(itemId, serverId) {
- return new Promise(function (resolve, reject) {
- closeAction = null;
-
- loading.show();
-
- require(['text!./recordingcreator.template.html'], function (template) {
- var dialogOptions = {
- removeOnClose: true,
- scrollY: false
- };
-
- if (layoutManager.tv) {
- dialogOptions.size = 'fullscreen';
- } else {
- dialogOptions.size = 'small';
- }
-
- var dlg = dialogHelper.createDialog(dialogOptions);
-
- dlg.classList.add('formDialog');
- dlg.classList.add('recordingDialog');
-
- var html = '';
-
- html += globalize.translateHtml(template, 'core');
-
- dlg.innerHTML = html;
-
- currentDialog = dlg;
-
- function onRecordingChanged() {
- reload(dlg, itemId, serverId, true);
- }
-
- dlg.addEventListener('close', function () {
- events.off(currentRecordingFields, 'recordingchanged', onRecordingChanged);
- executeCloseAction(closeAction, itemId, serverId);
-
- if (currentRecordingFields && currentRecordingFields.hasChanged()) {
- resolve();
- } else {
- reject();
- }
- });
-
- if (layoutManager.tv) {
- scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
- }
-
- init(dlg);
-
- reload(dlg, itemId, serverId);
-
- currentRecordingFields = new recordingFields({
- parent: dlg.querySelector('.recordingFields'),
- programId: itemId,
+ apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
+ playbackManager.play({
+ ids: [item.ChannelId],
serverId: serverId
});
-
- events.on(currentRecordingFields, 'recordingchanged', onRecordingChanged);
-
- dialogHelper.open(dlg);
});
});
+ return;
}
+}
- return {
- show: showEditor
- };
-});
+function showEditor(itemId, serverId) {
+ return new Promise(function (resolve, reject) {
+ closeAction = null;
+
+ loading.show();
+
+ import('text!./recordingcreator.template.html').then(({ default: template }) => {
+ const dialogOptions = {
+ removeOnClose: true,
+ scrollY: false
+ };
+
+ if (layoutManager.tv) {
+ dialogOptions.size = 'fullscreen';
+ } else {
+ dialogOptions.size = 'small';
+ }
+
+ const dlg = dialogHelper.createDialog(dialogOptions);
+
+ dlg.classList.add('formDialog');
+ dlg.classList.add('recordingDialog');
+
+ let html = '';
+
+ html += globalize.translateHtml(template, 'core');
+
+ dlg.innerHTML = html;
+
+ currentDialog = dlg;
+
+ function onRecordingChanged() {
+ reload(dlg, itemId, serverId, true);
+ }
+
+ dlg.addEventListener('close', function () {
+ events.off(currentRecordingFields, 'recordingchanged', onRecordingChanged);
+ executeCloseAction(closeAction, itemId, serverId);
+
+ if (currentRecordingFields && currentRecordingFields.hasChanged()) {
+ resolve();
+ } else {
+ reject();
+ }
+ });
+
+ if (layoutManager.tv) {
+ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
+ }
+
+ init(dlg);
+
+ reload(dlg, itemId, serverId);
+
+ currentRecordingFields = new recordingFields({
+ parent: dlg.querySelector('.recordingFields'),
+ programId: itemId,
+ serverId: serverId
+ });
+
+ events.on(currentRecordingFields, 'recordingchanged', onRecordingChanged);
+
+ dialogHelper.open(dlg);
+ });
+ });
+}
+
+export default {
+ show: showEditor
+};
diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js
index 3797cde37..096ea3b62 100644
--- a/src/components/recordingcreator/recordingeditor.js
+++ b/src/components/recordingcreator/recordingeditor.js
@@ -1,145 +1,155 @@
-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';
+import dialogHelper from 'dialogHelper';
+import globalize from 'globalize';
+import layoutManager from 'layoutManager';
+import connectionManager from 'connectionManager';
+import loading from 'loading';
+import scrollHelper from 'scrollHelper';
+import 'scrollStyles';
+import 'emby-button';
+import 'emby-collapse';
+import 'emby-input';
+import 'paper-icon-button-light';
+import 'css!./../formdialog';
+import 'css!./recordingcreator';
+import 'material-icons';
+import 'flexStyles';
- var currentDialog;
- var recordingDeleted = false;
- var currentItemId;
- var currentServerId;
- var currentResolve;
+let currentDialog;
+let recordingDeleted = false;
+let currentItemId;
+let currentServerId;
+let currentResolve;
- function deleteTimer(apiClient, timerId) {
- return new Promise(function (resolve, reject) {
- require(['recordingHelper'], function (recordingHelper) {
- recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject);
- });
+function deleteTimer(apiClient, timerId) {
+ return import('recordingHelper').then(({ default: recordingHelper }) => {
+ recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId());
+ });
+}
+
+function renderTimer(context, item, apiClient) {
+ context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
+ context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
+
+ loading.hide();
+}
+
+function closeDialog(isDeleted) {
+ recordingDeleted = isDeleted;
+ dialogHelper.close(currentDialog);
+}
+
+function onSubmit(e) {
+ const form = this;
+
+ const apiClient = connectionManager.getApiClient(currentServerId);
+
+ apiClient.getLiveTvTimer(currentItemId).then(function (item) {
+ item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
+ item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
+ apiClient.updateLiveTvTimer(item).then(currentResolve);
+ });
+
+ e.preventDefault();
+
+ // Disable default form submission
+ return false;
+}
+
+function init(context) {
+ context.querySelector('.btnCancel').addEventListener('click', function () {
+ closeDialog(false);
+ });
+
+ context.querySelector('.btnCancelRecording').addEventListener('click', function () {
+ const apiClient = connectionManager.getApiClient(currentServerId);
+
+ deleteTimer(apiClient, currentItemId).then(function () {
+ closeDialog(true);
});
- }
+ });
- function renderTimer(context, item, apiClient) {
- context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
- context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
+ context.querySelector('form').addEventListener('submit', onSubmit);
+}
+function reload(context, id) {
+ loading.show();
+ currentItemId = id;
+
+ const apiClient = connectionManager.getApiClient(currentServerId);
+ apiClient.getLiveTvTimer(id).then(function (result) {
+ renderTimer(context, result, apiClient);
loading.hide();
- }
+ });
+}
- function closeDialog(isDeleted) {
- recordingDeleted = isDeleted;
-
- dialogHelper.close(currentDialog);
- }
-
- function onSubmit(e) {
- var form = this;
-
- var apiClient = connectionManager.getApiClient(currentServerId);
-
- apiClient.getLiveTvTimer(currentItemId).then(function (item) {
- item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
- item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
- apiClient.updateLiveTvTimer(item).then(currentResolve);
- });
-
- e.preventDefault();
-
- // Disable default form submission
- return false;
- }
-
- function init(context) {
- context.querySelector('.btnCancel').addEventListener('click', function () {
- closeDialog(false);
- });
-
- context.querySelector('.btnCancelRecording').addEventListener('click', function () {
- var apiClient = connectionManager.getApiClient(currentServerId);
- deleteTimer(apiClient, currentItemId).then(function () {
- closeDialog(true);
- });
- });
-
- context.querySelector('form').addEventListener('submit', onSubmit);
- }
-
- function reload(context, id) {
+function showEditor(itemId, serverId, options) {
+ return new Promise(function (resolve, reject) {
+ recordingDeleted = false;
+ currentServerId = serverId;
loading.show();
- currentItemId = id;
+ options = options || {};
+ currentResolve = resolve;
- var apiClient = connectionManager.getApiClient(currentServerId);
- apiClient.getLiveTvTimer(id).then(function (result) {
- renderTimer(context, result, apiClient);
- loading.hide();
- });
- }
+ import('text!./recordingeditor.template.html').then(({default: template}) => {
+ const dialogOptions = {
+ removeOnClose: true,
+ scrollY: false
+ };
- function showEditor(itemId, serverId, options) {
- return new Promise(function (resolve, reject) {
- recordingDeleted = false;
- currentServerId = serverId;
- loading.show();
- options = options || {};
- currentResolve = resolve;
+ if (layoutManager.tv) {
+ dialogOptions.size = 'fullscreen';
+ }
- require(['text!./recordingeditor.template.html'], function (template) {
- var dialogOptions = {
- removeOnClose: true,
- scrollY: false
- };
+ const dlg = dialogHelper.createDialog(dialogOptions);
- if (layoutManager.tv) {
- dialogOptions.size = 'fullscreen';
+ dlg.classList.add('formDialog');
+ dlg.classList.add('recordingDialog');
+
+ if (!layoutManager.tv) {
+ dlg.style['min-width'] = '20%';
+ dlg.classList.add('dialog-fullscreen-lowres');
+ }
+
+ let html = '';
+
+ html += globalize.translateHtml(template, 'core');
+
+ dlg.innerHTML = html;
+
+ if (options.enableCancel === false) {
+ dlg.querySelector('.formDialogFooter').classList.add('hide');
+ }
+
+ currentDialog = dlg;
+
+ dlg.addEventListener('closing', function () {
+ if (!recordingDeleted) {
+ dlg.querySelector('.btnSubmit').click();
}
-
- var dlg = dialogHelper.createDialog(dialogOptions);
-
- dlg.classList.add('formDialog');
- dlg.classList.add('recordingDialog');
-
- if (!layoutManager.tv) {
- dlg.style['min-width'] = '20%';
- dlg.classList.add('dialog-fullscreen-lowres');
- }
-
- var html = '';
-
- html += globalize.translateHtml(template, 'core');
-
- dlg.innerHTML = html;
-
- if (options.enableCancel === false) {
- dlg.querySelector('.formDialogFooter').classList.add('hide');
- }
-
- currentDialog = dlg;
-
- dlg.addEventListener('closing', function () {
- if (!recordingDeleted) {
- dlg.querySelector('.btnSubmit').click();
- }
- });
-
- dlg.addEventListener('close', function () {
- if (recordingDeleted) {
- resolve({
- updated: true,
- deleted: true
- });
- }
- });
-
- if (layoutManager.tv) {
- scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
- }
-
- init(dlg);
-
- reload(dlg, itemId);
-
- dialogHelper.open(dlg);
});
- });
- }
- return {
- show: showEditor
- };
-});
+ dlg.addEventListener('close', function () {
+ if (recordingDeleted) {
+ resolve({
+ updated: true,
+ deleted: true
+ });
+ }
+ });
+
+ if (layoutManager.tv) {
+ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
+ }
+
+ init(dlg);
+
+ reload(dlg, itemId);
+
+ dialogHelper.open(dlg);
+ });
+ });
+}
+
+export default {
+ show: showEditor
+};
diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js
index 2534eafe6..d9d7c0098 100644
--- a/src/components/recordingcreator/recordingfields.js
+++ b/src/components/recordingcreator/recordingfields.js
@@ -1,219 +1,126 @@
-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';
+import globalize from 'globalize';
+import connectionManager from 'connectionManager';
+import serverNotifications from 'serverNotifications';
+import loading from 'loading';
+import dom from 'dom';
+import recordingHelper from 'recordingHelper';
+import events from 'events';
+import 'paper-icon-button-light';
+import 'emby-button';
+import 'css!./recordingfields';
+import 'flexStyles';
- function loadData(parent, program, apiClient) {
- if (program.IsSeries) {
- parent.querySelector('.recordSeriesContainer').classList.remove('hide');
+/*eslint prefer-const: "error"*/
+
+function loadData(parent, program, apiClient) {
+ if (program.IsSeries) {
+ parent.querySelector('.recordSeriesContainer').classList.remove('hide');
+ } else {
+ parent.querySelector('.recordSeriesContainer').classList.add('hide');
+ }
+
+ if (program.SeriesTimerId) {
+ parent.querySelector('.btnManageSeriesRecording').classList.remove('hide');
+ parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active');
+ parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('CancelSeries');
+ } else {
+ parent.querySelector('.btnManageSeriesRecording').classList.add('hide');
+ parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active');
+ parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('RecordSeries');
+ }
+
+ if (program.TimerId && program.Status !== 'Cancelled') {
+ parent.querySelector('.btnManageRecording').classList.remove('hide');
+ parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active');
+ if (program.Status === 'InProgress') {
+ parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('StopRecording');
} else {
- parent.querySelector('.recordSeriesContainer').classList.add('hide');
+ parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('DoNotRecord');
}
+ } else {
+ parent.querySelector('.btnManageRecording').classList.add('hide');
+ parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active');
+ parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('Record');
+ }
+}
- if (program.SeriesTimerId) {
- parent.querySelector('.btnManageSeriesRecording').classList.remove('hide');
- parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active');
- parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('CancelSeries');
- } else {
- parent.querySelector('.btnManageSeriesRecording').classList.add('hide');
- parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active');
- parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('RecordSeries');
+function fetchData(instance) {
+ const options = instance.options;
+ const apiClient = connectionManager.getApiClient(options.serverId);
+
+ options.parent.querySelector('.recordingFields').classList.remove('hide');
+ return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) {
+ instance.TimerId = program.TimerId;
+ instance.Status = program.Status;
+ instance.SeriesTimerId = program.SeriesTimerId;
+ loadData(options.parent, program, apiClient);
+ });
+}
+
+function onTimerChangedExternally(e, apiClient, data) {
+ const options = this.options;
+ let refresh = false;
+
+ if (data.Id) {
+ if (this.TimerId === data.Id) {
+ refresh = true;
}
-
- if (program.TimerId && program.Status !== 'Cancelled') {
- parent.querySelector('.btnManageRecording').classList.remove('hide');
- parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active');
- if (program.Status === 'InProgress') {
- parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('StopRecording');
- } else {
- parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('DoNotRecord');
- }
- } else {
- parent.querySelector('.btnManageRecording').classList.add('hide');
- parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active');
- parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('Record');
+ }
+ if (data.ProgramId && options) {
+ if (options.programId === data.ProgramId) {
+ refresh = true;
}
}
- function fetchData(instance) {
- var options = instance.options;
- var apiClient = connectionManager.getApiClient(options.serverId);
-
- options.parent.querySelector('.recordingFields').classList.remove('hide');
- return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) {
- instance.TimerId = program.TimerId;
- instance.Status = program.Status;
- instance.SeriesTimerId = program.SeriesTimerId;
- loadData(options.parent, program, apiClient);
- });
+ if (refresh) {
+ this.refresh();
}
+}
- function onTimerChangedExternally(e, apiClient, data) {
- var options = this.options;
- var refresh = false;
+function onSeriesTimerChangedExternally(e, apiClient, data) {
+ const options = this.options;
+ let refresh = false;
- if (data.Id) {
- if (this.TimerId === data.Id) {
- refresh = true;
- }
+ if (data.Id) {
+ if (this.SeriesTimerId === data.Id) {
+ refresh = true;
}
- if (data.ProgramId && options) {
- if (options.programId === data.ProgramId) {
- refresh = true;
- }
- }
-
- if (refresh) {
- this.refresh();
+ }
+ if (data.ProgramId && options) {
+ if (options.programId === data.ProgramId) {
+ refresh = true;
}
}
- function onSeriesTimerChangedExternally(e, apiClient, data) {
- var options = this.options;
- var refresh = false;
-
- if (data.Id) {
- if (this.SeriesTimerId === data.Id) {
- refresh = true;
- }
- }
- if (data.ProgramId && options) {
- if (options.programId === data.ProgramId) {
- refresh = true;
- }
- }
-
- if (refresh) {
- this.refresh();
- }
+ if (refresh) {
+ this.refresh();
}
+}
- function RecordingEditor(options) {
+class RecordingEditor {
+ constructor(options) {
this.options = options;
this.embed();
- var timerChangedHandler = onTimerChangedExternally.bind(this);
+ const timerChangedHandler = onTimerChangedExternally.bind(this);
this.timerChangedHandler = timerChangedHandler;
events.on(serverNotifications, 'TimerCreated', timerChangedHandler);
events.on(serverNotifications, 'TimerCancelled', timerChangedHandler);
- var seriesTimerChangedHandler = onSeriesTimerChangedExternally.bind(this);
+ const seriesTimerChangedHandler = onSeriesTimerChangedExternally.bind(this);
this.seriesTimerChangedHandler = seriesTimerChangedHandler;
events.on(serverNotifications, 'SeriesTimerCreated', seriesTimerChangedHandler);
events.on(serverNotifications, 'SeriesTimerCancelled', seriesTimerChangedHandler);
}
- function onManageRecordingClick(e) {
- var options = this.options;
- if (!this.TimerId || this.Status === 'Cancelled') {
- return;
- }
-
- var self = this;
- require(['recordingEditor'], function (recordingEditor) {
- recordingEditor.show(self.TimerId, options.serverId, {
- enableCancel: false
- }).then(function () {
- self.changed = true;
- });
- });
- }
-
- function onManageSeriesRecordingClick(e) {
- var options = this.options;
-
- if (!this.SeriesTimerId) {
- return;
- }
-
- var self = this;
-
- require(['seriesRecordingEditor'], function (seriesRecordingEditor) {
- seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, {
-
- enableCancel: false
-
- }).then(function () {
- self.changed = true;
- });
- });
- }
-
- function onRecordChange(e) {
- this.changed = true;
-
- var self = this;
- var options = this.options;
- var apiClient = connectionManager.getApiClient(options.serverId);
-
- var button = dom.parentWithTag(e.target, 'BUTTON');
- var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
-
- var hasEnabledTimer = this.TimerId && this.Status !== 'Cancelled';
-
- if (isChecked) {
- if (!hasEnabledTimer) {
- loading.show();
- recordingHelper.createRecording(apiClient, options.programId, false).then(function () {
- events.trigger(self, 'recordingchanged');
- fetchData(self);
- loading.hide();
- });
- }
- } else {
- if (hasEnabledTimer) {
- loading.show();
- recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () {
- events.trigger(self, 'recordingchanged');
- fetchData(self);
- loading.hide();
- });
- }
- }
- }
-
- function sendToast(msg) {
- require(['toast'], function (toast) {
- toast(msg);
- });
- }
-
- function onRecordSeriesChange(e) {
- this.changed = true;
-
- var self = this;
- var options = this.options;
- var apiClient = connectionManager.getApiClient(options.serverId);
-
- var button = dom.parentWithTag(e.target, 'BUTTON');
- var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
-
- if (isChecked) {
- options.parent.querySelector('.recordSeriesContainer').classList.remove('hide');
- if (!this.SeriesTimerId) {
- var promise = this.TimerId ?
- recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) :
- recordingHelper.createRecording(apiClient, options.programId, true);
- promise.then(function () {
- fetchData(self);
- });
- }
- } else {
- if (this.SeriesTimerId) {
- apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () {
- sendToast(globalize.translate('RecordingCancelled'));
- fetchData(self);
- });
- }
- }
- }
-
- RecordingEditor.prototype.embed = function () {
- var self = this;
+ embed() {
+ const self = this;
return new Promise(function (resolve, reject) {
- require(['text!./recordingfields.template.html'], function (template) {
- var options = self.options;
- var context = options.parent;
+ import('text!./recordingfields.template.html').then(({default: template}) => {
+ const options = self.options;
+ const context = options.parent;
context.innerHTML = globalize.translateHtml(template, 'core');
context.querySelector('.singleRecordingButton').addEventListener('click', onRecordChange.bind(self));
@@ -224,29 +131,134 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa
fetchData(self).then(resolve);
});
});
- };
+ }
- RecordingEditor.prototype.hasChanged = function () {
+ hasChanged() {
return this.changed;
- };
+ }
- RecordingEditor.prototype.refresh = function () {
+ refresh() {
fetchData(this);
- };
+ }
- RecordingEditor.prototype.destroy = function () {
- var timerChangedHandler = this.timerChangedHandler;
+ destroy() {
+ const timerChangedHandler = this.timerChangedHandler;
this.timerChangedHandler = null;
events.off(serverNotifications, 'TimerCreated', timerChangedHandler);
events.off(serverNotifications, 'TimerCancelled', timerChangedHandler);
- var seriesTimerChangedHandler = this.seriesTimerChangedHandler;
+ const seriesTimerChangedHandler = this.seriesTimerChangedHandler;
this.seriesTimerChangedHandler = null;
events.off(serverNotifications, 'SeriesTimerCreated', seriesTimerChangedHandler);
events.off(serverNotifications, 'SeriesTimerCancelled', seriesTimerChangedHandler);
- };
+ }
+}
- return RecordingEditor;
-});
+function onManageRecordingClick(e) {
+ const options = this.options;
+ if (!this.TimerId || this.Status === 'Cancelled') {
+ return;
+ }
+
+ const self = this;
+ import('recordingEditor').then(({default: recordingEditor}) => {
+ recordingEditor.show(self.TimerId, options.serverId, {
+ enableCancel: false
+ }).then(function () {
+ self.changed = true;
+ });
+ });
+}
+
+function onManageSeriesRecordingClick(e) {
+ const options = this.options;
+
+ if (!this.SeriesTimerId) {
+ return;
+ }
+
+ const self = this;
+
+ import('seriesRecordingEditor').then(({default: seriesRecordingEditor}) => {
+ seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, {
+
+ enableCancel: false
+
+ }).then(function () {
+ self.changed = true;
+ });
+ });
+}
+
+function onRecordChange(e) {
+ this.changed = true;
+
+ const self = this;
+ const options = this.options;
+ const apiClient = connectionManager.getApiClient(options.serverId);
+
+ const button = dom.parentWithTag(e.target, 'BUTTON');
+ const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
+
+ const hasEnabledTimer = this.TimerId && this.Status !== 'Cancelled';
+
+ if (isChecked) {
+ if (!hasEnabledTimer) {
+ loading.show();
+ recordingHelper.createRecording(apiClient, options.programId, false).then(function () {
+ events.trigger(self, 'recordingchanged');
+ fetchData(self);
+ loading.hide();
+ });
+ }
+ } else {
+ if (hasEnabledTimer) {
+ loading.show();
+ recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () {
+ events.trigger(self, 'recordingchanged');
+ fetchData(self);
+ loading.hide();
+ });
+ }
+ }
+}
+
+function sendToast(msg) {
+ import('toast').then(({default: toast}) => {
+ toast(msg);
+ });
+}
+
+function onRecordSeriesChange(e) {
+ this.changed = true;
+
+ const self = this;
+ const options = this.options;
+ const apiClient = connectionManager.getApiClient(options.serverId);
+
+ const button = dom.parentWithTag(e.target, 'BUTTON');
+ const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active');
+
+ if (isChecked) {
+ options.parent.querySelector('.recordSeriesContainer').classList.remove('hide');
+ if (!this.SeriesTimerId) {
+ const promise = this.TimerId ?
+ recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) :
+ recordingHelper.createRecording(apiClient, options.programId, true);
+ promise.then(function () {
+ fetchData(self);
+ });
+ }
+ } else {
+ if (this.SeriesTimerId) {
+ apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () {
+ sendToast(globalize.translate('RecordingCancelled'));
+ fetchData(self);
+ });
+ }
+ }
+}
+
+export default RecordingEditor;
diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js
index 4a0bdd9b0..13359de2b 100644
--- a/src/components/recordingcreator/recordinghelper.js
+++ b/src/components/recordingcreator/recordinghelper.js
@@ -1,192 +1,195 @@
-define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) {
- 'use strict';
+import globalize from 'globalize';
+import loading from 'loading';
+import connectionManager from 'connectionManager';
- function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
- loading.show();
+/*eslint prefer-const: "error"*/
- return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) {
- if (item.IsSeries) {
- // create series
- return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) {
- return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () {
- loading.hide();
- sendToast(globalize.translate('SeriesRecordingScheduled'));
+function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
+ loading.show();
+
+ return apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) {
+ if (item.IsSeries) {
+ // create series
+ return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) {
+ return apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () {
+ loading.hide();
+ sendToast(globalize.translate('SeriesRecordingScheduled'));
+ });
+ });
+ } else {
+ // cancel
+ if (confirmTimerCancellation) {
+ return cancelTimerWithConfirmation(timerId, apiClient.serverId());
+ }
+
+ return cancelTimer(apiClient.serverId(), timerId, true);
+ }
+ });
+}
+
+function cancelTimerWithConfirmation(timerId, serverId) {
+ return new Promise(function (resolve, reject) {
+ import('confirm').then(({ default: confirm }) => {
+ confirm.default({
+
+ text: globalize.translate('MessageConfirmRecordingCancellation'),
+ primary: 'delete',
+ confirmText: globalize.translate('HeaderCancelRecording'),
+ cancelText: globalize.translate('HeaderKeepRecording')
+
+ }).then(function () {
+ loading.show();
+
+ const apiClient = connectionManager.getApiClient(serverId);
+ cancelTimer(apiClient, timerId, true).then(resolve, reject);
+ }, reject);
+ });
+ });
+}
+
+function cancelSeriesTimerWithConfirmation(timerId, serverId) {
+ return new Promise(function (resolve, reject) {
+ import('confirm').then(({ default: confirm }) => {
+ confirm.default({
+
+ text: globalize.translate('MessageConfirmRecordingCancellation'),
+ primary: 'delete',
+ confirmText: globalize.translate('HeaderCancelSeries'),
+ cancelText: globalize.translate('HeaderKeepSeries')
+
+ }).then(function () {
+ loading.show();
+
+ const apiClient = connectionManager.getApiClient(serverId);
+ apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
+ import('toast').then(({default: toast}) => {
+ toast(globalize.translate('SeriesCancelled'));
});
+
+ loading.hide();
+ resolve();
+ }, reject);
+ }, reject);
+ });
+ });
+}
+
+function cancelTimer(apiClient, timerId, hideLoading) {
+ loading.show();
+ return apiClient.cancelLiveTvTimer(timerId).then(function () {
+ if (hideLoading !== false) {
+ loading.hide();
+ sendToast(globalize.translate('RecordingCancelled'));
+ }
+ });
+}
+
+function createRecording(apiClient, programId, isSeries) {
+ loading.show();
+ return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) {
+ const promise = isSeries ?
+ apiClient.createLiveTvSeriesTimer(item) :
+ apiClient.createLiveTvTimer(item);
+
+ return promise.then(function () {
+ loading.hide();
+ sendToast(globalize.translate('RecordingScheduled'));
+ });
+ });
+}
+
+function sendToast(msg) {
+ import('toast').then(({ default: toast }) => {
+ toast(msg);
+ });
+}
+
+function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) {
+ return new Promise(function (resolve, reject) {
+ import('dialog').then(({ default: dialog }) => {
+ const items = [];
+
+ items.push({
+ name: globalize.translate('HeaderKeepRecording'),
+ id: 'cancel',
+ type: 'submit'
+ });
+
+ if (timerStatus === 'InProgress') {
+ items.push({
+ name: globalize.translate('HeaderStopRecording'),
+ id: 'canceltimer',
+ type: 'cancel'
});
} else {
- // cancel
- if (confirmTimerCancellation) {
- return cancelTimerWithConfirmation(timerId, apiClient.serverId());
- }
-
- return cancelTimer(apiClient.serverId(), timerId, true);
+ items.push({
+ name: globalize.translate('HeaderCancelRecording'),
+ id: 'canceltimer',
+ type: 'cancel'
+ });
}
- });
- }
- function cancelTimerWithConfirmation(timerId, serverId) {
- return new Promise(function (resolve, reject) {
- require(['confirm'], function (confirm) {
- confirm.default({
-
- text: globalize.translate('MessageConfirmRecordingCancellation'),
- primary: 'delete',
- confirmText: globalize.translate('HeaderCancelRecording'),
- cancelText: globalize.translate('HeaderKeepRecording')
-
- }).then(function () {
- loading.show();
-
- var apiClient = connectionManager.getApiClient(serverId);
- cancelTimer(apiClient, timerId, true).then(resolve, reject);
- }, reject);
+ items.push({
+ name: globalize.translate('HeaderCancelSeries'),
+ id: 'cancelseriestimer',
+ type: 'cancel'
});
- });
- }
- function cancelSeriesTimerWithConfirmation(timerId, serverId) {
- return new Promise(function (resolve, reject) {
- require(['confirm'], function (confirm) {
- confirm.default({
+ dialog({
- text: globalize.translate('MessageConfirmRecordingCancellation'),
- primary: 'delete',
- confirmText: globalize.translate('HeaderCancelSeries'),
- cancelText: globalize.translate('HeaderKeepSeries')
+ text: globalize.translate('MessageConfirmRecordingCancellation'),
+ buttons: items
- }).then(function () {
+ }).then(function (result) {
+ const apiClient = connectionManager.getApiClient(serverId);
+
+ if (result === 'canceltimer') {
loading.show();
- var apiClient = connectionManager.getApiClient(serverId);
- apiClient.cancelLiveTvSeriesTimer(timerId).then(function () {
- require(['toast'], function (toast) {
+ cancelTimer(apiClient, timerId, true).then(resolve, reject);
+ } else if (result === 'cancelseriestimer') {
+ loading.show();
+
+ apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () {
+ import('toast').then(({ default: toast }) => {
toast(globalize.translate('SeriesCancelled'));
});
loading.hide();
resolve();
}, reject);
- }, reject);
- });
- });
- }
-
- function cancelTimer(apiClient, timerId, hideLoading) {
- loading.show();
- return apiClient.cancelLiveTvTimer(timerId).then(function () {
- if (hideLoading !== false) {
- loading.hide();
- sendToast(globalize.translate('RecordingCancelled'));
- }
- });
- }
-
- function createRecording(apiClient, programId, isSeries) {
- loading.show();
- return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) {
- var promise = isSeries ?
- apiClient.createLiveTvSeriesTimer(item) :
- apiClient.createLiveTvTimer(item);
-
- return promise.then(function () {
- loading.hide();
- sendToast(globalize.translate('RecordingScheduled'));
- });
- });
- }
-
- function sendToast(msg) {
- require(['toast'], function (toast) {
- toast(msg);
- });
- }
-
- function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) {
- return new Promise(function (resolve, reject) {
- require(['dialog'], function (dialog) {
- var items = [];
-
- items.push({
- name: globalize.translate('HeaderKeepRecording'),
- id: 'cancel',
- type: 'submit'
- });
-
- if (timerStatus === 'InProgress') {
- items.push({
- name: globalize.translate('HeaderStopRecording'),
- id: 'canceltimer',
- type: 'cancel'
- });
} else {
- items.push({
- name: globalize.translate('HeaderCancelRecording'),
- id: 'canceltimer',
- type: 'cancel'
- });
+ resolve();
}
-
- items.push({
- name: globalize.translate('HeaderCancelSeries'),
- id: 'cancelseriestimer',
- type: 'cancel'
- });
-
- dialog({
-
- text: globalize.translate('MessageConfirmRecordingCancellation'),
- buttons: items
-
- }).then(function (result) {
- var apiClient = connectionManager.getApiClient(serverId);
-
- if (result === 'canceltimer') {
- loading.show();
-
- cancelTimer(apiClient, timerId, true).then(resolve, reject);
- } else if (result === 'cancelseriestimer') {
- loading.show();
-
- apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () {
- require(['toast'], function (toast) {
- toast(globalize.translate('SeriesCancelled'));
- });
-
- loading.hide();
- resolve();
- }, reject);
- } else {
- resolve();
- }
- }, reject);
- });
+ }, reject);
});
- }
+ });
+}
- function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) {
- var apiClient = connectionManager.getApiClient(serverId);
- var hasTimer = timerId && timerStatus !== 'Cancelled';
- if (seriesTimerId && hasTimer) {
- // cancel
- return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId);
- } else if (hasTimer && programId) {
- // change to series recording, if possible
- // otherwise cancel individual recording
- return changeRecordingToSeries(apiClient, timerId, programId, true);
- } else if (programId) {
- // schedule recording
- return createRecording(apiClient, programId);
- } else {
- return Promise.reject();
- }
+function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) {
+ const apiClient = connectionManager.getApiClient(serverId);
+ const hasTimer = timerId && timerStatus !== 'Cancelled';
+ if (seriesTimerId && hasTimer) {
+ // cancel
+ return showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId);
+ } else if (hasTimer && programId) {
+ // change to series recording, if possible
+ // otherwise cancel individual recording
+ return changeRecordingToSeries(apiClient, timerId, programId, true);
+ } else if (programId) {
+ // schedule recording
+ return createRecording(apiClient, programId);
+ } else {
+ return Promise.reject();
}
+}
+
+export default {
+ cancelTimer: cancelTimer,
+ createRecording: createRecording,
+ changeRecordingToSeries: changeRecordingToSeries,
+ toggleRecording: toggleRecording,
+ cancelTimerWithConfirmation: cancelTimerWithConfirmation,
+ cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation
+};
- return {
- cancelTimer: cancelTimer,
- createRecording: createRecording,
- changeRecordingToSeries: changeRecordingToSeries,
- toggleRecording: toggleRecording,
- cancelTimerWithConfirmation: cancelTimerWithConfirmation,
- cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation
- };
-});
diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js
index ea20c7267..48fbbcf22 100644
--- a/src/components/recordingcreator/seriesrecordingeditor.js
+++ b/src/components/recordingcreator/seriesrecordingeditor.js
@@ -1,141 +1,200 @@
-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';
+import dialogHelper from 'dialogHelper';
+import globalize from 'globalize';
+import layoutManager from 'layoutManager';
+import connectionManager from 'connectionManager';
+import loading from 'loading';
+import scrollHelper from 'scrollHelper';
+import datetime from 'datetime';
+import 'scrollStyles';
+import 'emby-button';
+import 'emby-checkbox';
+import 'emby-input';
+import 'emby-select';
+import 'paper-icon-button-light';
+import 'css!./../formdialog';
+import 'css!./recordingcreator';
+import 'material-icons';
+import 'flexStyles';
- var currentDialog;
- var recordingUpdated = false;
- var recordingDeleted = false;
- var currentItemId;
- var currentServerId;
+/*eslint prefer-const: "error"*/
- function deleteTimer(apiClient, timerId) {
- return new Promise(function (resolve, reject) {
- require(['recordingHelper'], function (recordingHelper) {
- recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject);
- });
+let currentDialog;
+let recordingUpdated = false;
+let recordingDeleted = false;
+let currentItemId;
+let currentServerId;
+
+function deleteTimer(apiClient, timerId) {
+ return new Promise(function (resolve, reject) {
+ import('recordingHelper').then(({ default: recordingHelper }) => {
+ recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject);
});
+ });
+}
+
+function renderTimer(context, item) {
+ context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
+ context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
+
+ context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one';
+ context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original';
+
+ context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all';
+ context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary;
+ context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0;
+
+ if (item.ChannelName || item.ChannelNumber) {
+ context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber);
+ } else {
+ context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel');
}
- function renderTimer(context, item, apiClient) {
- context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60;
- context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60;
+ context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)));
- context.querySelector('.selectChannels').value = item.RecordAnyChannel ? 'all' : 'one';
- context.querySelector('.selectAirTime').value = item.RecordAnyTime ? 'any' : 'original';
+ loading.hide();
+}
- context.querySelector('.selectShowType').value = item.RecordNewOnly ? 'new' : 'all';
- context.querySelector('.chkSkipEpisodesInLibrary').checked = item.SkipEpisodesInLibrary;
- context.querySelector('.selectKeepUpTo').value = item.KeepUpTo || 0;
+function closeDialog(isDeleted) {
+ recordingUpdated = true;
+ recordingDeleted = isDeleted;
- if (item.ChannelName || item.ChannelNumber) {
- context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('ChannelNameOnly', item.ChannelName || item.ChannelNumber);
- } else {
- context.querySelector('.optionChannelOnly').innerHTML = globalize.translate('OneChannel');
- }
+ dialogHelper.close(currentDialog);
+}
- context.querySelector('.optionAroundTime').innerHTML = globalize.translate('AroundTime', datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate)));
+function onSubmit(e) {
+ const form = this;
+ const apiClient = connectionManager.getApiClient(currentServerId);
+
+ apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
+ item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
+ item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
+ item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all';
+ item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any';
+ item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new';
+ item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked;
+ item.KeepUpTo = form.querySelector('.selectKeepUpTo').value;
+
+ apiClient.updateLiveTvSeriesTimer(item);
+ });
+
+ e.preventDefault();
+
+ // Disable default form submission
+ return false;
+}
+
+function init(context) {
+ fillKeepUpTo(context);
+
+ context.querySelector('.btnCancel').addEventListener('click', function () {
+ closeDialog(false);
+ });
+
+ context.querySelector('.btnCancelRecording').addEventListener('click', function () {
+ const apiClient = connectionManager.getApiClient(currentServerId);
+ deleteTimer(apiClient, currentItemId).then(function () {
+ closeDialog(true);
+ });
+ });
+
+ context.querySelector('form').addEventListener('submit', onSubmit);
+}
+
+function reload(context, id) {
+ const apiClient = connectionManager.getApiClient(currentServerId);
+
+ loading.show();
+ if (typeof id === 'string') {
+ currentItemId = id;
+
+ apiClient.getLiveTvSeriesTimer(id).then(function (result) {
+ renderTimer(context, result);
+ loading.hide();
+ });
+ } else if (id) {
+ currentItemId = id.Id;
+
+ renderTimer(context, id);
loading.hide();
}
+}
- function closeDialog(isDeleted) {
- recordingUpdated = true;
- recordingDeleted = isDeleted;
+function fillKeepUpTo(context) {
+ let html = '';
- dialogHelper.close(currentDialog);
- }
+ for (let i = 0; i <= 50; i++) {
+ let text;
- function onSubmit(e) {
- var form = this;
-
- var apiClient = connectionManager.getApiClient(currentServerId);
-
- apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) {
- item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
- item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
- item.RecordAnyChannel = form.querySelector('.selectChannels').value === 'all';
- item.RecordAnyTime = form.querySelector('.selectAirTime').value === 'any';
- item.RecordNewOnly = form.querySelector('.selectShowType').value === 'new';
- item.SkipEpisodesInLibrary = form.querySelector('.chkSkipEpisodesInLibrary').checked;
- item.KeepUpTo = form.querySelector('.selectKeepUpTo').value;
-
- apiClient.updateLiveTvSeriesTimer(item);
- });
-
- e.preventDefault();
-
- // Disable default form submission
- return false;
- }
-
- function init(context) {
- fillKeepUpTo(context);
-
- context.querySelector('.btnCancel').addEventListener('click', function () {
- closeDialog(false);
- });
-
- context.querySelector('.btnCancelRecording').addEventListener('click', function () {
- var apiClient = connectionManager.getApiClient(currentServerId);
- deleteTimer(apiClient, currentItemId).then(function () {
- closeDialog(true);
- });
- });
-
- context.querySelector('form').addEventListener('submit', onSubmit);
- }
-
- function reload(context, id) {
- var apiClient = connectionManager.getApiClient(currentServerId);
-
- loading.show();
- if (typeof id === 'string') {
- currentItemId = id;
-
- apiClient.getLiveTvSeriesTimer(id).then(function (result) {
- renderTimer(context, result, apiClient);
- loading.hide();
- });
- } else if (id) {
- currentItemId = id.Id;
-
- renderTimer(context, id, apiClient);
- loading.hide();
- }
- }
-
- function fillKeepUpTo(context) {
- var html = '';
-
- for (var i = 0; i <= 50; i++) {
- var text;
-
- if (i === 0) {
- text = globalize.translate('AsManyAsPossible');
- } else if (i === 1) {
- text = globalize.translate('ValueOneEpisode');
- } else {
- text = globalize.translate('ValueEpisodeCount', i);
- }
-
- html += '';
+ if (i === 0) {
+ text = globalize.translate('AsManyAsPossible');
+ } else if (i === 1) {
+ text = globalize.translate('ValueOneEpisode');
+ } else {
+ text = globalize.translate('ValueEpisodeCount', i);
}
- context.querySelector('.selectKeepUpTo').innerHTML = html;
+ html += '';
}
- function onFieldChange(e) {
- this.querySelector('.btnSubmit').click();
- }
+ context.querySelector('.selectKeepUpTo').innerHTML = html;
+}
- function embed(itemId, serverId, options) {
+function onFieldChange() {
+ this.querySelector('.btnSubmit').click();
+}
+
+function embed(itemId, serverId, options) {
+ recordingUpdated = false;
+ recordingDeleted = false;
+ currentServerId = serverId;
+ loading.show();
+ options = options || {};
+
+ import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => {
+ const dialogOptions = {
+ removeOnClose: true,
+ scrollY: false
+ };
+
+ if (layoutManager.tv) {
+ dialogOptions.size = 'fullscreen';
+ } else {
+ dialogOptions.size = 'small';
+ }
+
+ const dlg = options.context;
+
+ dlg.classList.add('hide');
+ dlg.innerHTML = globalize.translateHtml(template, 'core');
+
+ dlg.querySelector('.formDialogHeader').classList.add('hide');
+ dlg.querySelector('.formDialogFooter').classList.add('hide');
+ dlg.querySelector('.formDialogContent').className = '';
+ dlg.querySelector('.dialogContentInner').className = '';
+ dlg.classList.remove('hide');
+
+ dlg.removeEventListener('change', onFieldChange);
+ dlg.addEventListener('change', onFieldChange);
+
+ currentDialog = dlg;
+
+ init(dlg);
+
+ reload(dlg, itemId);
+ });
+}
+
+function showEditor(itemId, serverId, options) {
+ return new Promise(function (resolve, reject) {
recordingUpdated = false;
recordingDeleted = false;
currentServerId = serverId;
loading.show();
options = options || {};
- require(['text!./seriesrecordingeditor.template.html'], function (template) {
- var dialogOptions = {
+ import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => {
+ const dialogOptions = {
removeOnClose: true,
scrollY: false
};
@@ -146,101 +205,58 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
dialogOptions.size = 'small';
}
- var dlg = options.context;
+ const dlg = dialogHelper.createDialog(dialogOptions);
- dlg.classList.add('hide');
- dlg.innerHTML = globalize.translateHtml(template, 'core');
+ dlg.classList.add('formDialog');
+ dlg.classList.add('recordingDialog');
- dlg.querySelector('.formDialogHeader').classList.add('hide');
- dlg.querySelector('.formDialogFooter').classList.add('hide');
- dlg.querySelector('.formDialogContent').className = '';
- dlg.querySelector('.dialogContentInner').className = '';
- dlg.classList.remove('hide');
+ if (!layoutManager.tv) {
+ dlg.style['min-width'] = '20%';
+ }
- dlg.removeEventListener('change', onFieldChange);
- dlg.addEventListener('change', onFieldChange);
+ let html = '';
+
+ html += globalize.translateHtml(template, 'core');
+
+ dlg.innerHTML = html;
+
+ if (options.enableCancel === false) {
+ dlg.querySelector('.formDialogFooter').classList.add('hide');
+ }
currentDialog = dlg;
+ dlg.addEventListener('closing', function () {
+ if (!recordingDeleted) {
+ this.querySelector('.btnSubmit').click();
+ }
+ });
+
+ dlg.addEventListener('close', function () {
+ if (recordingUpdated) {
+ resolve({
+ updated: true,
+ deleted: recordingDeleted
+ });
+ } else {
+ reject();
+ }
+ });
+
+ if (layoutManager.tv) {
+ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
+ }
+
init(dlg);
reload(dlg, itemId);
+
+ dialogHelper.open(dlg);
});
- }
+ });
+}
- function showEditor(itemId, serverId, options) {
- return new Promise(function (resolve, reject) {
- recordingUpdated = false;
- recordingDeleted = false;
- currentServerId = serverId;
- loading.show();
- options = options || {};
-
- require(['text!./seriesrecordingeditor.template.html'], function (template) {
- var dialogOptions = {
- removeOnClose: true,
- scrollY: false
- };
-
- if (layoutManager.tv) {
- dialogOptions.size = 'fullscreen';
- } else {
- dialogOptions.size = 'small';
- }
-
- var dlg = dialogHelper.createDialog(dialogOptions);
-
- dlg.classList.add('formDialog');
- dlg.classList.add('recordingDialog');
-
- if (!layoutManager.tv) {
- dlg.style['min-width'] = '20%';
- }
-
- var html = '';
-
- html += globalize.translateHtml(template, 'core');
-
- dlg.innerHTML = html;
-
- if (options.enableCancel === false) {
- dlg.querySelector('.formDialogFooter').classList.add('hide');
- }
-
- currentDialog = dlg;
-
- dlg.addEventListener('closing', function () {
- if (!recordingDeleted) {
- this.querySelector('.btnSubmit').click();
- }
- });
-
- dlg.addEventListener('close', function () {
- if (recordingUpdated) {
- resolve({
- updated: true,
- deleted: recordingDeleted
- });
- } else {
- reject();
- }
- });
-
- if (layoutManager.tv) {
- scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
- }
-
- init(dlg);
-
- reload(dlg, itemId);
-
- dialogHelper.open(dlg);
- });
- });
- }
-
- return {
- show: showEditor,
- embed: embed
- };
-});
+export default {
+ show: showEditor,
+ embed: embed
+};
diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js
index 40e118350..1ec051744 100644
--- a/src/components/refreshdialog/refreshdialog.js
+++ b/src/components/refreshdialog/refreshdialog.js
@@ -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) {
- 'use strict';
+import dom from 'dom';
+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() {
- var html = '';
+/*eslint prefer-const: "error"*/
- html += '