diff --git a/package.json b/package.json index edda337f2c..74c8ae27ce 100644 --- a/package.json +++ b/package.json @@ -248,6 +248,8 @@ "src/scripts/imagehelper.js", "src/scripts/inputManager.js", "src/scripts/keyboardNavigation.js", + "src/scripts/libraryBrowser.js", + "src/scripts/multiDownload.js", "src/scripts/playlists.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 62906d9d21..3ceda7d476 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,6 +1,8 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData() { if (!pageData) { diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 65abca46e0..44904633fa 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -1,6 +1,8 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData(context) { var key = getSavedQueryKey(context); diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 43f73bfa76..69450989e8 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -1,6 +1,8 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData() { var key = getSavedQueryKey(); diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 82b162e2ad..f4c126c468 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,6 +1,8 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent, options) { function onViewStyleChange() { if (self.getCurrentViewStyle() == 'List') { diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index a9db0abf49..84d7c538ee 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,6 +1,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData(context) { var key = getSavedQueryKey(context); diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 3630e0b9f9..9b4fcde327 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,6 +1,8 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function playAll() { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) { diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index c9a0b06b77..3e86def538 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,6 +1,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, appHost, userSettings) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData(context) { var key = getSavedQueryKey(context); diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index 82f2eba574..948c4da7dd 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -1,6 +1,8 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData() { var key = getSavedQueryKey(); diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index f508489216..19c08812f9 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -1,6 +1,8 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData() { var key = getSavedQueryKey(); diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index aa63ec51fe..74c5106860 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,6 +1,8 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { 'use strict'; + libraryBrowser = libraryBrowser.default || libraryBrowser; + return function (view, params, tabContent) { function getPageData(context) { var key = getSavedQueryKey(context); diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index f9e5e23596..568e73916a 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -1,199 +1,216 @@ -define(['userSettings', 'globalize'], function (userSettings, globalize) { - 'use strict'; +import * as userSettings from 'userSettings'; +import globalize from 'globalize'; - var libraryBrowser = { - getSavedQueryKey: function (modifier) { - return window.location.href.split('#')[0] + (modifier || ''); - }, - loadSavedQueryValues: function (key, query) { - var values = userSettings.get(key); +export function getSavedQueryKey(modifier) { + return window.location.href.split('#')[0] + (modifier || ''); +} - if (values) { - values = JSON.parse(values); - return Object.assign(query, values); - } +export function loadSavedQueryValues(key, query) { + var values = userSettings.get(key); - return query; - }, - saveQueryValues: function (key, query) { - var values = {}; + if (values) { + values = JSON.parse(values); + return Object.assign(query, values); + } - if (query.SortBy) { - values.SortBy = query.SortBy; - } + return query; +} - if (query.SortOrder) { - values.SortOrder = query.SortOrder; - } +export function saveQueryValues(key, query) { + var values = {}; - userSettings.set(key, JSON.stringify(values)); - }, - saveViewSetting: function (key, value) { - userSettings.set(key + '-_view', value); - }, - getSavedView: function (key) { - return userSettings.get(key + '-_view'); - }, - showLayoutMenu: function (button, currentLayout, views) { - var dispatchEvent = true; + if (query.SortBy) { + values.SortBy = query.SortBy; + } - if (!views) { - dispatchEvent = false; - views = button.getAttribute('data-layouts'); - views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard']; - } + if (query.SortOrder) { + values.SortOrder = query.SortOrder; + } - var menuItems = views.map(function (v) { - return { - name: globalize.translate('Option' + v), - id: v, - selected: currentLayout == v - }; - }); + userSettings.set(key, JSON.stringify(values)); +} - require(['actionsheet'], function (actionsheet) { - actionsheet.show({ - items: menuItems, - positionTo: button, - callback: function (id) { - button.dispatchEvent(new CustomEvent('layoutchange', { - detail: { - viewStyle: id - }, - bubbles: true, - cancelable: false - })); +export function saveViewSetting (key, value) { + userSettings.set(key + '-_view', value); +} - if (!dispatchEvent) { - if (window.$) { - $(button).trigger('layoutchange', [id]); - } - } - } - }); - }); - }, - getQueryPagingHtml: function (options) { - var startIndex = options.startIndex; - var limit = options.limit; - var totalRecordCount = options.totalRecordCount; - var html = ''; - var recordsEnd = Math.min(startIndex + limit, totalRecordCount); - var showControls = limit < totalRecordCount; +export function getSavedView (key) { + return userSettings.get(key + '-_view'); +} - if (html += '
', showControls) { - html += ''; - html += globalize.translate('ListPaging', (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount); - html += ''; - } +export function showLayoutMenu (button, currentLayout, views) { + var dispatchEvent = true; - if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) { - html += '
'; + if (!views) { + dispatchEvent = false; + views = button.getAttribute('data-layouts'); + views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard']; + } - if (showControls) { - html += ''; - html += ''; - } + var menuItems = views.map(function (v) { + return { + name: globalize.translate('Option' + v), + id: v, + selected: currentLayout == v + }; + }); - if (options.addLayoutButton) { - html += ''; - } + import('actionsheet').then(({default: actionsheet}) => { + actionsheet.show({ + items: menuItems, + positionTo: button, + callback: function (id) { + button.dispatchEvent(new CustomEvent('layoutchange', { + detail: { + viewStyle: id + }, + bubbles: true, + cancelable: false + })); - if (options.sortButton) { - html += ''; - } - - if (options.filterButton) { - html += ''; - } - - html += '
'; - } - - return html += '
'; - }, - showSortMenu: function (options) { - require(['dialogHelper', 'emby-radio'], function (dialogHelper) { - function onSortByChange() { - var newValue = this.value; - - if (this.checked) { - var changed = options.query.SortBy != newValue; - options.query.SortBy = newValue.replace('_', ','); - options.query.StartIndex = 0; - - if (options.callback && changed) { - options.callback(); - } + if (!dispatchEvent) { + if (window.$) { + $(button).trigger('layoutchange', [id]); } } + } + }); + }); +} - function onSortOrderChange() { - var newValue = this.value; +export function getQueryPagingHtml (options) { + var startIndex = options.startIndex; + var limit = options.limit; + var totalRecordCount = options.totalRecordCount; + var html = ''; + var recordsEnd = Math.min(startIndex + limit, totalRecordCount); + var showControls = limit < totalRecordCount; - if (this.checked) { - var changed = options.query.SortOrder != newValue; - options.query.SortOrder = newValue; - options.query.StartIndex = 0; + if (html += '
', showControls) { + html += ''; + html += globalize.translate('ListPaging', (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount); + html += ''; + } - if (options.callback && changed) { - options.callback(); - } - } - } + if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) { + html += '
'; - var dlg = dialogHelper.createDialog({ - removeOnClose: true, - modal: false, - entryAnimationDuration: 160, - exitAnimationDuration: 200 - }); - dlg.classList.add('ui-body-a'); - dlg.classList.add('background-theme-a'); - dlg.classList.add('formDialog'); - var html = ''; - html += '
'; - html += '

'; - html += globalize.translate('HeaderSortBy'); - html += '

'; - var i; - var length; - var isChecked; - html += '
'; - for (i = 0, length = options.items.length; i < length; i++) { - var option = options.items[i]; - var radioValue = option.id.replace(',', '_'); - isChecked = (options.query.SortBy || '').replace(',', '_') == radioValue ? ' checked' : ''; - html += ''; - } - - html += '
'; - html += '

'; - html += globalize.translate('HeaderSortOrder'); - html += '

'; - html += '
'; - isChecked = 'Ascending' == options.query.SortOrder ? ' checked' : ''; - html += ''; - isChecked = 'Descending' == options.query.SortOrder ? ' checked' : ''; - html += ''; - html += '
'; - html += '
'; - dlg.innerHTML = html; - dialogHelper.open(dlg); - var sortBys = dlg.querySelectorAll('.menuSortBy'); - - for (i = 0, length = sortBys.length; i < length; i++) { - sortBys[i].addEventListener('change', onSortByChange); - } - - var sortOrders = dlg.querySelectorAll('.menuSortOrder'); - - for (i = 0, length = sortOrders.length; i < length; i++) { - sortOrders[i].addEventListener('change', onSortOrderChange); - } - }); + if (showControls) { + html += ''; + html += ''; } - }; - window.LibraryBrowser = libraryBrowser; - return libraryBrowser; -}); + + if (options.addLayoutButton) { + html += ''; + } + + if (options.sortButton) { + html += ''; + } + + if (options.filterButton) { + html += ''; + } + + html += '
'; + } + + return html += '
'; +} + +export function showSortMenu (options) { + require(['dialogHelper', 'emby-radio'], function (dialogHelper) { + function onSortByChange() { + var newValue = this.value; + + if (this.checked) { + var changed = options.query.SortBy != newValue; + options.query.SortBy = newValue.replace('_', ','); + options.query.StartIndex = 0; + + if (options.callback && changed) { + options.callback(); + } + } + } + + function onSortOrderChange() { + var newValue = this.value; + + if (this.checked) { + var changed = options.query.SortOrder != newValue; + options.query.SortOrder = newValue; + options.query.StartIndex = 0; + + if (options.callback && changed) { + options.callback(); + } + } + } + + var dlg = dialogHelper.createDialog({ + removeOnClose: true, + modal: false, + entryAnimationDuration: 160, + exitAnimationDuration: 200 + }); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); + var html = ''; + html += '
'; + html += '

'; + html += globalize.translate('HeaderSortBy'); + html += '

'; + var i; + var length; + var isChecked; + html += '
'; + for (i = 0, length = options.items.length; i < length; i++) { + var option = options.items[i]; + var radioValue = option.id.replace(',', '_'); + isChecked = (options.query.SortBy || '').replace(',', '_') == radioValue ? ' checked' : ''; + html += ''; + } + + html += '
'; + html += '

'; + html += globalize.translate('HeaderSortOrder'); + html += '

'; + html += '
'; + isChecked = 'Ascending' == options.query.SortOrder ? ' checked' : ''; + html += ''; + isChecked = 'Descending' == options.query.SortOrder ? ' checked' : ''; + html += ''; + html += '
'; + html += '
'; + dlg.innerHTML = html; + dialogHelper.open(dlg); + var sortBys = dlg.querySelectorAll('.menuSortBy'); + + for (i = 0, length = sortBys.length; i < length; i++) { + sortBys[i].addEventListener('change', onSortByChange); + } + + var sortOrders = dlg.querySelectorAll('.menuSortOrder'); + + for (i = 0, length = sortOrders.length; i < length; i++) { + sortOrders[i].addEventListener('change', onSortOrderChange); + } + }); +} + +const libraryBrowser = { + getSavedQueryKey, + loadSavedQueryValues, + saveQueryValues, + saveViewSetting, + getSavedView, + showLayoutMenu, + getQueryPagingHtml, + showSortMenu +}; + +window.LibraryBrowser = libraryBrowser; + +export default libraryBrowser; diff --git a/src/scripts/multiDownload.js b/src/scripts/multiDownload.js index d11e52de14..b4ad95a975 100644 --- a/src/scripts/multiDownload.js +++ b/src/scripts/multiDownload.js @@ -1,66 +1,65 @@ -define(['browser'], function (browser) { - 'use strict'; +import browser from 'browser'; - function fallback(urls) { - var i = 0; +function fallback(urls) { + var i = 0; - (function createIframe() { - var frame = document.createElement('iframe'); - frame.style.display = 'none'; - frame.src = urls[i++]; - document.documentElement.appendChild(frame); + (function createIframe() { + var frame = document.createElement('iframe'); + frame.style.display = 'none'; + frame.src = urls[i++]; + document.documentElement.appendChild(frame); - // the download init has to be sequential otherwise IE only use the first - var interval = setInterval(function () { - if (frame.contentWindow.document.readyState === 'complete' || frame.contentWindow.document.readyState === 'interactive') { - clearInterval(interval); + // the download init has to be sequential otherwise IE only use the first + var interval = setInterval(function () { + if (frame.contentWindow.document.readyState === 'complete' || frame.contentWindow.document.readyState === 'interactive') { + clearInterval(interval); - // Safari needs a timeout - setTimeout(function () { - frame.parentNode.removeChild(frame); - }, 1000); + // Safari needs a timeout + setTimeout(function () { + frame.parentNode.removeChild(frame); + }, 1000); - if (i < urls.length) { - createIframe(); - } + if (i < urls.length) { + createIframe(); } - }, 100); - })(); - } - - function sameDomain(url) { - var a = document.createElement('a'); - a.href = url; - - return location.hostname === a.hostname && location.protocol === a.protocol; - } - - function download(url) { - var a = document.createElement('a'); - a.download = ''; - a.href = url; - // firefox doesn't support `a.click()`... - a.dispatchEvent(new MouseEvent('click')); - } - - return function (urls) { - if (!urls) { - throw new Error('`urls` required'); - } - - if (typeof document.createElement('a').download === 'undefined') { - return fallback(urls); - } - - var delay = 0; - - urls.forEach(function (url) { - // the download init has to be sequential for firefox if the urls are not on the same domain - if (browser.firefox && !sameDomain(url)) { - return setTimeout(download.bind(null, url), 100 * ++delay); } + }, 100); + })(); +} + +function sameDomain(url) { + var a = document.createElement('a'); + a.href = url; + + return location.hostname === a.hostname && location.protocol === a.protocol; +} + +function download(url) { + var a = document.createElement('a'); + a.download = ''; + a.href = url; + // firefox doesn't support `a.click()`... + a.dispatchEvent(new MouseEvent('click')); +} + +export default function (urls) { + if (!urls) { + throw new Error('`urls` required'); + } + + if (typeof document.createElement('a').download === 'undefined') { + return fallback(urls); + } + + var delay = 0; + + urls.forEach(function (url) { + // the download init has to be sequential for firefox if the urls are not on the same domain + if (browser.firefox && !sameDomain(url)) { + return setTimeout(download.bind(null, url), 100 * ++delay); + } + + download(url); + }); +} - download(url); - }); - }; -});