diff --git a/package.json b/package.json index 74c8ae27ce..5db40a0efe 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,8 @@ "src/components/htmlMediaHelper.js", "src/components/imageOptionsEditor/imageOptionsEditor.js", "src/components/images/imageLoader.js", + "src/components/imageDownloader/imageDownloader.js", + "src/components/imageeditor/imageeditor.js", "src/components/imageUploader/imageUploader.js", "src/components/indicators/indicators.js", "src/components/itemContextMenu.js", diff --git a/src/components/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js index 8c278a62b6..2be2ef09b2 100644 --- a/src/components/imageDownloader/imageDownloader.js +++ b/src/components/imageDownloader/imageDownloader.js @@ -1,23 +1,39 @@ -define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader', 'browser', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'emby-checkbox', 'paper-icon-button-light', 'emby-button', 'formDialogStyle', 'cardStyle'], function (dom, loading, appHost, dialogHelper, connectionManager, imageLoader, browser, layoutManager, scrollHelper, globalize, require) { - 'use strict'; +import dom from 'dom'; +import loading from 'loading'; +import appHost from 'apphost'; +import dialogHelper from 'dialogHelper'; +import connectionManager from 'connectionManager'; +import imageLoader from 'imageLoader'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import scrollHelper from 'scrollHelper'; +import globalize from 'globalize'; +import require from 'require'; +import 'emby-checkbox'; +import 'paper-icon-button-light'; +import 'emby-button'; +import 'formDialogStyle'; +import 'cardStyle'; - var enableFocusTransform = !browser.slow && !browser.edge; +/* eslint-disable indent */ - var currentItemId; - var currentItemType; - var currentResolve; - var currentReject; - var hasChanges = false; + const enableFocusTransform = !browser.slow && !browser.edge; + + let currentItemId; + let currentItemType; + let currentResolve; + let currentReject; + let hasChanges = false; // These images can be large and we're seeing memory problems in safari - var browsableImagePageSize = browser.slow ? 6 : 30; + const browsableImagePageSize = browser.slow ? 6 : 30; - var browsableImageStartIndex = 0; - var browsableImageType = 'Primary'; - var selectedProvider; + let browsableImageStartIndex = 0; + let browsableImageType = 'Primary'; + let selectedProvider; function getBaseRemoteOptions() { - var options = {}; + const options = {}; options.itemId = currentItemId; @@ -27,14 +43,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image function reloadBrowsableImages(page, apiClient) { loading.show(); - var options = getBaseRemoteOptions(); + const options = getBaseRemoteOptions(); options.type = browsableImageType; options.startIndex = browsableImageStartIndex; options.limit = browsableImagePageSize; options.IncludeAllLanguages = page.querySelector('#chkAllLanguages').checked; - var provider = selectedProvider || ''; + const provider = selectedProvider || ''; if (provider) { options.ProviderName = provider; @@ -45,11 +61,11 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image page.querySelector('#selectBrowsableImageType').value = browsableImageType; - var providersHtml = result.Providers.map(function (p) { + const providersHtml = result.Providers.map(function (p) { return ''; }); - var selectImageProvider = page.querySelector('#selectImageProvider'); + const selectImageProvider = page.querySelector('#selectImageProvider'); selectImageProvider.innerHTML = '' + providersHtml; selectImageProvider.value = provider; @@ -60,18 +76,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image function renderRemoteImages(page, apiClient, imagesResult, imageType, startIndex, limit) { page.querySelector('.availableImagesPaging').innerHTML = getPagingHtml(startIndex, limit, imagesResult.TotalRecordCount); - var html = ''; + let html = ''; - for (var i = 0, length = imagesResult.Images.length; i < length; i++) { + for (let i = 0, length = imagesResult.Images.length; i < length; i++) { html += getRemoteImageHtml(imagesResult.Images[i], imageType, apiClient); } - var availableImagesList = page.querySelector('.availableImagesList'); + const availableImagesList = page.querySelector('.availableImagesList'); availableImagesList.innerHTML = html; imageLoader.lazyChildren(availableImagesList); - var btnNextPage = page.querySelector('.btnNextPage'); - var btnPreviousPage = page.querySelector('.btnPreviousPage'); + const btnNextPage = page.querySelector('.btnNextPage'); + const btnPreviousPage = page.querySelector('.btnPreviousPage'); if (btnNextPage) { btnNextPage.addEventListener('click', function () { @@ -89,18 +105,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } function getPagingHtml(startIndex, limit, totalRecordCount) { - var html = ''; + let html = ''; - var recordsEnd = Math.min(startIndex + limit, totalRecordCount); + const recordsEnd = Math.min(startIndex + limit, totalRecordCount); // 20 is the minimum page size - var showControls = totalRecordCount > limit; + const showControls = totalRecordCount > limit; html += '
'; html += ''; - var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; + const startAtDisplay = totalRecordCount ? startIndex + 1 : 0; html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount); html += ''; @@ -119,7 +135,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } function downloadRemoteImage(page, apiClient, url, type, provider) { - var options = getBaseRemoteOptions(); + const options = getBaseRemoteOptions(); options.Type = type; options.ImageUrl = url; @@ -129,7 +145,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image apiClient.downloadRemoteImage(options).then(function () { hasChanges = true; - var dlg = dom.parentWithClass(page, 'dialog'); + const dlg = dom.parentWithClass(page, 'dialog'); dialogHelper.close(dlg); }); } @@ -139,17 +155,17 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } function getRemoteImageHtml(image, imageType, apiClient) { - var tagName = layoutManager.tv ? 'button' : 'div'; - var enableFooterButtons = !layoutManager.tv; + const tagName = layoutManager.tv ? 'button' : 'div'; + const enableFooterButtons = !layoutManager.tv; // TODO move card creation code to Card component - var html = ''; + let html = ''; - var cssClass = 'card scalableCard imageEditorCard'; - var cardBoxCssClass = 'cardBox visualCardBox'; + let cssClass = 'card scalableCard imageEditorCard'; + const cardBoxCssClass = 'cardBox visualCardBox'; - var shape = 'backdrop'; + let shape; if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') { shape = 'backdrop'; } else if (imageType === 'Banner') { @@ -284,14 +300,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image }); page.addEventListener('click', function (e) { - var btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage'); + const btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage'); if (btnDownloadRemoteImage) { - var card = dom.parentWithClass(btnDownloadRemoteImage, 'card'); + const card = dom.parentWithClass(btnDownloadRemoteImage, 'card'); downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider')); return; } - var btnImageCard = dom.parentWithClass(e.target, 'btnImageCard'); + const btnImageCard = dom.parentWithClass(e.target, 'btnImageCard'); if (btnImageCard) { downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider')); } @@ -302,12 +318,12 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image loading.show(); require(['text!./imageDownloader.template.html'], function (template) { - var apiClient = connectionManager.getApiClient(serverId); + const apiClient = connectionManager.getApiClient(serverId); currentItemId = itemId; currentItemType = itemType; - var dialogOptions = { + const dialogOptions = { removeOnClose: true }; @@ -317,7 +333,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.innerHTML = globalize.translateHtml(template, 'core'); @@ -330,7 +346,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image dialogHelper.open(dlg); - var editorContent = dlg.querySelector('.formDialogContent'); + const editorContent = dlg.querySelector('.formDialogContent'); initEditor(editorContent, apiClient); dlg.querySelector('.btnCancel').addEventListener('click', function () { @@ -342,7 +358,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } function onDialogClosed() { - var dlg = this; + const dlg = this; if (layoutManager.tv) { scrollHelper.centerFocus.off(dlg, false); @@ -356,18 +372,20 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } } - return { - show: function (itemId, serverId, itemType, imageType) { - return new Promise(function (resolve, reject) { - currentResolve = resolve; - currentReject = reject; - hasChanges = false; - browsableImageStartIndex = 0; - browsableImageType = imageType || 'Primary'; - selectedProvider = null; +export function show(itemId, serverId, itemType, imageType) { + return new Promise(function (resolve, reject) { + currentResolve = resolve; + currentReject = reject; + hasChanges = false; + browsableImageStartIndex = 0; + browsableImageType = imageType || 'Primary'; + selectedProvider = null; + showEditor(itemId, serverId, itemType); + }); +} - showEditor(itemId, serverId, itemType); - }); - } - }; -}); +export default { + show: show +}; + +/* eslint-enable indent */ diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 125a2dc062..78c35bb15f 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -1,13 +1,29 @@ -define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 'focusManager', 'globalize', 'scrollHelper', 'imageLoader', 'require', 'browser', 'apphost', 'cardStyle', 'formDialogStyle', 'emby-button', 'paper-icon-button-light', 'css!./imageeditor'], function (dialogHelper, connectionManager, loading, dom, layoutManager, focusManager, globalize, scrollHelper, imageLoader, require, browser, appHost) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import dom from 'dom'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import globalize from 'globalize'; +import scrollHelper from 'scrollHelper'; +import imageLoader from 'imageLoader'; +import browser from 'browser'; +import appHost from 'apphost'; +import 'cardStyle'; +import 'formDialogStyle'; +import 'emby-button'; +import 'paper-icon-button-light'; +import 'css!./imageeditor'; - var enableFocusTransform = !browser.slow && !browser.edge; +/* eslint-disable indent */ - var currentItem; - var hasChanges = false; + const enableFocusTransform = !browser.slow && !browser.edge; + + let currentItem; + let hasChanges = false; function getBaseRemoteOptions() { - var options = {}; + const options = {}; options.itemId = currentItem.Id; @@ -17,7 +33,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', function reload(page, item, focusContext) { loading.show(); - var apiClient; + let apiClient; if (item) { apiClient = connectionManager.getApiClient(item.ServerId); @@ -32,7 +48,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', function addListeners(container, className, eventName, fn) { container.addEventListener(eventName, function (e) { - var elem = dom.parentWithClass(e.target, className); + const elem = dom.parentWithClass(e.target, className); if (elem) { fn.call(elem, e); } @@ -43,8 +59,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', currentItem = item; apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) { - var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages'); - for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) { + const btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages'); + for (let i = 0, length = btnBrowseAllImages.length; i < length; i++) { if (providers.length) { btnBrowseAllImages[i].classList.remove('hide'); } else { @@ -87,10 +103,10 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) { // TODO move card creation code to Card component - var html = ''; + let html = ''; - var cssClass = 'card scalableCard imageEditorCard'; - var cardBoxCssClass = 'cardBox visualCardBox'; + let cssClass = 'card scalableCard imageEditorCard'; + const cardBoxCssClass = 'cardBox visualCardBox'; cssClass += ' backdropCard backdropCard-scalable'; @@ -120,7 +136,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', html += '
'; - var imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize }); + const imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize }); html += '
'; @@ -172,7 +188,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function deleteImage(context, itemId, type, index, apiClient, enableConfirmation) { - var afterConfirm = function () { + const afterConfirm = function () { apiClient.deleteItemImage(itemId, type, index).then(function () { hasChanges = true; reload(context); @@ -184,8 +200,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', return; } - require(['confirm'], function (confirm) { - confirm.default({ + import('confirm').then(({default: confirm}) => { + confirm({ text: globalize.translate('ConfirmDeleteImage'), confirmText: globalize.translate('Delete'), @@ -200,27 +216,26 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', hasChanges = true; reload(context, null, focusContext); }, function () { - require(['alert'], function (alert) { + import('alert').then(({default: alert}) => { alert(globalize.translate('DefaultErrorMessage')); }); }); } function renderImages(page, item, apiClient, images, imageProviders, elem) { - var html = ''; + let html = ''; - var imageSize = 300; - var windowSize = dom.getWindowSize(); + let imageSize = 300; + const windowSize = dom.getWindowSize(); if (windowSize.innerWidth >= 1280) { imageSize = Math.round(windowSize.innerWidth / 4); } - var tagName = layoutManager.tv ? 'button' : 'div'; - var enableFooterButtons = !layoutManager.tv; - - for (var i = 0, length = images.length; i < length; i++) { - var image = images[i]; + const tagName = layoutManager.tv ? 'button' : 'div'; + const enableFooterButtons = !layoutManager.tv; + for (let i = 0, length = images.length; i < length; i++) { + const image = images[i]; html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons); } @@ -229,7 +244,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function renderStandardImages(page, apiClient, item, imageInfos, imageProviders) { - var images = imageInfos.filter(function (i) { + const images = imageInfos.filter(function (i) { return i.ImageType !== 'Screenshot' && i.ImageType !== 'Backdrop' && i.ImageType !== 'Chapter'; }); @@ -237,7 +252,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) { - var images = imageInfos.filter(function (i) { + const images = imageInfos.filter(function (i) { return i.ImageType === 'Backdrop'; }).sort(function (a, b) { return a.ImageIndex - b.ImageIndex; @@ -252,7 +267,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) { - var images = imageInfos.filter(function (i) { + const images = imageInfos.filter(function (i) { return i.ImageType === 'Screenshot'; }).sort(function (a, b) { return a.ImageIndex - b.ImageIndex; @@ -267,7 +282,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function showImageDownloader(page, imageType) { - require(['imageDownloader'], function (ImageDownloader) { + import('imageDownloader').then(({default: ImageDownloader}) => { ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () { hasChanges = true; reload(page); @@ -276,17 +291,17 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function showActionSheet(context, imageCard) { - var itemId = imageCard.getAttribute('data-id'); - var serverId = imageCard.getAttribute('data-serverid'); - var apiClient = connectionManager.getApiClient(serverId); + const itemId = imageCard.getAttribute('data-id'); + const serverId = imageCard.getAttribute('data-serverid'); + const apiClient = connectionManager.getApiClient(serverId); - var type = imageCard.getAttribute('data-imagetype'); - var index = parseInt(imageCard.getAttribute('data-index')); - var providerCount = parseInt(imageCard.getAttribute('data-providers')); - var numImages = parseInt(imageCard.getAttribute('data-numimages')); + const type = imageCard.getAttribute('data-imagetype'); + const index = parseInt(imageCard.getAttribute('data-index')); + const providerCount = parseInt(imageCard.getAttribute('data-providers')); + const numImages = parseInt(imageCard.getAttribute('data-numimages')); - require(['actionsheet'], function (actionSheet) { - var commands = []; + import('actionsheet').then(({default: actionSheet}) => { + const commands = []; commands.push({ name: globalize.translate('Delete'), @@ -343,9 +358,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } function initEditor(context, options) { - var uploadButtons = context.querySelectorAll('.btnOpenUploadMenu'); - var isFileInputSupported = appHost.supports('fileinput'); - for (var i = 0, length = uploadButtons.length; i < length; i++) { + const uploadButtons = context.querySelectorAll('.btnOpenUploadMenu'); + const isFileInputSupported = appHost.supports('fileinput'); + for (let i = 0, length = uploadButtons.length; i < length; i++) { if (isFileInputSupported) { uploadButtons[i].classList.remove('hide'); } else { @@ -354,9 +369,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', } addListeners(context, 'btnOpenUploadMenu', 'click', function () { - var imageType = this.getAttribute('data-imagetype'); + const imageType = this.getAttribute('data-imagetype'); - require(['imageUploader'], function (imageUploader) { + import('imageUploader').then(({default: imageUploader}) => { imageUploader.show({ theme: options.theme, @@ -386,32 +401,32 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', }); addListeners(context, 'btnDeleteImage', 'click', function () { - var type = this.getAttribute('data-imagetype'); - var index = this.getAttribute('data-index'); + const type = this.getAttribute('data-imagetype'); + let index = this.getAttribute('data-index'); index = index === 'null' ? null : parseInt(index); - var apiClient = connectionManager.getApiClient(currentItem.ServerId); + const apiClient = connectionManager.getApiClient(currentItem.ServerId); deleteImage(context, currentItem.Id, type, index, apiClient, true); }); addListeners(context, 'btnMoveImage', 'click', function () { - var type = this.getAttribute('data-imagetype'); - var index = this.getAttribute('data-index'); - var newIndex = this.getAttribute('data-newindex'); - var apiClient = connectionManager.getApiClient(currentItem.ServerId); + const type = this.getAttribute('data-imagetype'); + const index = this.getAttribute('data-index'); + const newIndex = this.getAttribute('data-newindex'); + const apiClient = connectionManager.getApiClient(currentItem.ServerId); moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer')); }); } function showEditor(options, resolve, reject) { - var itemId = options.itemId; - var serverId = options.serverId; + const itemId = options.itemId; + const serverId = options.serverId; loading.show(); - require(['text!./imageeditor.template.html'], function (template) { - var apiClient = connectionManager.getApiClient(serverId); + import('text!./imageeditor.template.html').then(({default: template}) => { + const apiClient = connectionManager.getApiClient(serverId); apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { - var dialogOptions = { + const dialogOptions = { removeOnClose: true }; @@ -421,7 +436,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); @@ -459,13 +474,15 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', }); } - return { - show: function (options) { - return new Promise(function (resolve, reject) { - hasChanges = false; +export function show (options) { + return new Promise(function (resolve, reject) { + hasChanges = false; + showEditor(options, resolve, reject); + }); +} - showEditor(options, resolve, reject); - }); - } - }; -}); +export default { + show +}; + +/* eslint-enable indent */