mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into migrate-to-ES6-47
This commit is contained in:
commit
b988dd04c5
18 changed files with 429 additions and 365 deletions
|
@ -44,6 +44,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
|
- [Node.js](https://nodejs.org/en/download/)
|
||||||
- [Yarn 1.22.4](https://classic.yarnpkg.com/en/docs/install)
|
- [Yarn 1.22.4](https://classic.yarnpkg.com/en/docs/install)
|
||||||
- Gulp-cli
|
- Gulp-cli
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,8 @@
|
||||||
"src/components/htmlMediaHelper.js",
|
"src/components/htmlMediaHelper.js",
|
||||||
"src/components/imageOptionsEditor/imageOptionsEditor.js",
|
"src/components/imageOptionsEditor/imageOptionsEditor.js",
|
||||||
"src/components/images/imageLoader.js",
|
"src/components/images/imageLoader.js",
|
||||||
|
"src/components/imageDownloader/imageDownloader.js",
|
||||||
|
"src/components/imageeditor/imageeditor.js",
|
||||||
"src/components/imageUploader/imageUploader.js",
|
"src/components/imageUploader/imageUploader.js",
|
||||||
"src/components/indicators/indicators.js",
|
"src/components/indicators/indicators.js",
|
||||||
"src/components/itemContextMenu.js",
|
"src/components/itemContextMenu.js",
|
||||||
|
@ -250,6 +252,8 @@
|
||||||
"src/scripts/imagehelper.js",
|
"src/scripts/imagehelper.js",
|
||||||
"src/scripts/inputManager.js",
|
"src/scripts/inputManager.js",
|
||||||
"src/scripts/keyboardNavigation.js",
|
"src/scripts/keyboardNavigation.js",
|
||||||
|
"src/scripts/libraryBrowser.js",
|
||||||
|
"src/scripts/multiDownload.js",
|
||||||
"src/scripts/playlists.js",
|
"src/scripts/playlists.js",
|
||||||
"src/scripts/settings/appSettings.js",
|
"src/scripts/settings/appSettings.js",
|
||||||
"src/scripts/settings/userSettings.js",
|
"src/scripts/settings/userSettings.js",
|
||||||
|
|
|
@ -1,25 +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) {
|
import dom from 'dom';
|
||||||
'use strict';
|
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';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
/* eslint-disable indent */
|
||||||
|
|
||||||
var enableFocusTransform = !browser.slow && !browser.edge;
|
const enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
var currentItemId;
|
let currentItemId;
|
||||||
var currentItemType;
|
let currentItemType;
|
||||||
var currentResolve;
|
let currentResolve;
|
||||||
var currentReject;
|
let currentReject;
|
||||||
var hasChanges = false;
|
let hasChanges = false;
|
||||||
|
|
||||||
// These images can be large and we're seeing memory problems in safari
|
// 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;
|
let browsableImageStartIndex = 0;
|
||||||
var browsableImageType = 'Primary';
|
let browsableImageType = 'Primary';
|
||||||
var selectedProvider;
|
let selectedProvider;
|
||||||
|
|
||||||
function getBaseRemoteOptions() {
|
function getBaseRemoteOptions() {
|
||||||
var options = {};
|
const options = {};
|
||||||
|
|
||||||
options.itemId = currentItemId;
|
options.itemId = currentItemId;
|
||||||
|
|
||||||
|
@ -29,14 +43,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
function reloadBrowsableImages(page, apiClient) {
|
function reloadBrowsableImages(page, apiClient) {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var options = getBaseRemoteOptions();
|
const options = getBaseRemoteOptions();
|
||||||
|
|
||||||
options.type = browsableImageType;
|
options.type = browsableImageType;
|
||||||
options.startIndex = browsableImageStartIndex;
|
options.startIndex = browsableImageStartIndex;
|
||||||
options.limit = browsableImagePageSize;
|
options.limit = browsableImagePageSize;
|
||||||
options.IncludeAllLanguages = page.querySelector('#chkAllLanguages').checked;
|
options.IncludeAllLanguages = page.querySelector('#chkAllLanguages').checked;
|
||||||
|
|
||||||
var provider = selectedProvider || '';
|
const provider = selectedProvider || '';
|
||||||
|
|
||||||
if (provider) {
|
if (provider) {
|
||||||
options.ProviderName = provider;
|
options.ProviderName = provider;
|
||||||
|
@ -47,11 +61,11 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
|
|
||||||
page.querySelector('#selectBrowsableImageType').value = browsableImageType;
|
page.querySelector('#selectBrowsableImageType').value = browsableImageType;
|
||||||
|
|
||||||
var providersHtml = result.Providers.map(function (p) {
|
const providersHtml = result.Providers.map(function (p) {
|
||||||
return '<option value="' + p + '">' + p + '</option>';
|
return '<option value="' + p + '">' + p + '</option>';
|
||||||
});
|
});
|
||||||
|
|
||||||
var selectImageProvider = page.querySelector('#selectImageProvider');
|
const selectImageProvider = page.querySelector('#selectImageProvider');
|
||||||
selectImageProvider.innerHTML = '<option value="">' + globalize.translate('All') + '</option>' + providersHtml;
|
selectImageProvider.innerHTML = '<option value="">' + globalize.translate('All') + '</option>' + providersHtml;
|
||||||
selectImageProvider.value = provider;
|
selectImageProvider.value = provider;
|
||||||
|
|
||||||
|
@ -62,18 +76,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
function renderRemoteImages(page, apiClient, imagesResult, imageType, startIndex, limit) {
|
function renderRemoteImages(page, apiClient, imagesResult, imageType, startIndex, limit) {
|
||||||
page.querySelector('.availableImagesPaging').innerHTML = getPagingHtml(startIndex, limit, imagesResult.TotalRecordCount);
|
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);
|
html += getRemoteImageHtml(imagesResult.Images[i], imageType, apiClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
var availableImagesList = page.querySelector('.availableImagesList');
|
const availableImagesList = page.querySelector('.availableImagesList');
|
||||||
availableImagesList.innerHTML = html;
|
availableImagesList.innerHTML = html;
|
||||||
imageLoader.lazyChildren(availableImagesList);
|
imageLoader.lazyChildren(availableImagesList);
|
||||||
|
|
||||||
var btnNextPage = page.querySelector('.btnNextPage');
|
const btnNextPage = page.querySelector('.btnNextPage');
|
||||||
var btnPreviousPage = page.querySelector('.btnPreviousPage');
|
const btnPreviousPage = page.querySelector('.btnPreviousPage');
|
||||||
|
|
||||||
if (btnNextPage) {
|
if (btnNextPage) {
|
||||||
btnNextPage.addEventListener('click', function () {
|
btnNextPage.addEventListener('click', function () {
|
||||||
|
@ -91,18 +105,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPagingHtml(startIndex, limit, totalRecordCount) {
|
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
|
// 20 is the minimum page size
|
||||||
var showControls = totalRecordCount > limit;
|
const showControls = totalRecordCount > limit;
|
||||||
|
|
||||||
html += '<div class="listPaging">';
|
html += '<div class="listPaging">';
|
||||||
|
|
||||||
html += '<span style="margin-right: 10px;">';
|
html += '<span style="margin-right: 10px;">';
|
||||||
|
|
||||||
var startAtDisplay = totalRecordCount ? startIndex + 1 : 0;
|
const startAtDisplay = totalRecordCount ? startIndex + 1 : 0;
|
||||||
html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount);
|
html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount);
|
||||||
|
|
||||||
html += '</span>';
|
html += '</span>';
|
||||||
|
@ -121,7 +135,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
}
|
}
|
||||||
|
|
||||||
function downloadRemoteImage(page, apiClient, url, type, provider) {
|
function downloadRemoteImage(page, apiClient, url, type, provider) {
|
||||||
var options = getBaseRemoteOptions();
|
const options = getBaseRemoteOptions();
|
||||||
|
|
||||||
options.Type = type;
|
options.Type = type;
|
||||||
options.ImageUrl = url;
|
options.ImageUrl = url;
|
||||||
|
@ -131,7 +145,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
|
|
||||||
apiClient.downloadRemoteImage(options).then(function () {
|
apiClient.downloadRemoteImage(options).then(function () {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
var dlg = dom.parentWithClass(page, 'dialog');
|
const dlg = dom.parentWithClass(page, 'dialog');
|
||||||
dialogHelper.close(dlg);
|
dialogHelper.close(dlg);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -141,17 +155,17 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRemoteImageHtml(image, imageType, apiClient) {
|
function getRemoteImageHtml(image, imageType, apiClient) {
|
||||||
var tagName = layoutManager.tv ? 'button' : 'div';
|
const tagName = layoutManager.tv ? 'button' : 'div';
|
||||||
var enableFooterButtons = !layoutManager.tv;
|
const enableFooterButtons = !layoutManager.tv;
|
||||||
|
|
||||||
// TODO move card creation code to Card component
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var html = '';
|
let html = '';
|
||||||
|
|
||||||
var cssClass = 'card scalableCard imageEditorCard';
|
let cssClass = 'card scalableCard imageEditorCard';
|
||||||
var cardBoxCssClass = 'cardBox visualCardBox';
|
const cardBoxCssClass = 'cardBox visualCardBox';
|
||||||
|
|
||||||
var shape = 'backdrop';
|
let shape;
|
||||||
if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') {
|
if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') {
|
||||||
shape = 'backdrop';
|
shape = 'backdrop';
|
||||||
} else if (imageType === 'Banner') {
|
} else if (imageType === 'Banner') {
|
||||||
|
@ -286,14 +300,14 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
});
|
});
|
||||||
|
|
||||||
page.addEventListener('click', function (e) {
|
page.addEventListener('click', function (e) {
|
||||||
var btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage');
|
const btnDownloadRemoteImage = dom.parentWithClass(e.target, 'btnDownloadRemoteImage');
|
||||||
if (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'));
|
downloadRemoteImage(page, apiClient, card.getAttribute('data-imageurl'), card.getAttribute('data-imagetype'), card.getAttribute('data-imageprovider'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var btnImageCard = dom.parentWithClass(e.target, 'btnImageCard');
|
const btnImageCard = dom.parentWithClass(e.target, 'btnImageCard');
|
||||||
if (btnImageCard) {
|
if (btnImageCard) {
|
||||||
downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider'));
|
downloadRemoteImage(page, apiClient, btnImageCard.getAttribute('data-imageurl'), btnImageCard.getAttribute('data-imagetype'), btnImageCard.getAttribute('data-imageprovider'));
|
||||||
}
|
}
|
||||||
|
@ -304,12 +318,12 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
require(['text!./imageDownloader.template.html'], function (template) {
|
require(['text!./imageDownloader.template.html'], function (template) {
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
|
||||||
currentItemId = itemId;
|
currentItemId = itemId;
|
||||||
currentItemType = itemType;
|
currentItemType = itemType;
|
||||||
|
|
||||||
var dialogOptions = {
|
const dialogOptions = {
|
||||||
removeOnClose: true
|
removeOnClose: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -319,7 +333,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
dialogOptions.size = 'small';
|
dialogOptions.size = 'small';
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
const dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.innerHTML = globalize.translateHtml(template, 'core');
|
dlg.innerHTML = globalize.translateHtml(template, 'core');
|
||||||
|
|
||||||
|
@ -332,7 +346,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
|
|
||||||
dialogHelper.open(dlg);
|
dialogHelper.open(dlg);
|
||||||
|
|
||||||
var editorContent = dlg.querySelector('.formDialogContent');
|
const editorContent = dlg.querySelector('.formDialogContent');
|
||||||
initEditor(editorContent, apiClient);
|
initEditor(editorContent, apiClient);
|
||||||
|
|
||||||
dlg.querySelector('.btnCancel').addEventListener('click', function () {
|
dlg.querySelector('.btnCancel').addEventListener('click', function () {
|
||||||
|
@ -344,7 +358,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
}
|
}
|
||||||
|
|
||||||
function onDialogClosed() {
|
function onDialogClosed() {
|
||||||
var dlg = this;
|
const dlg = this;
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
scrollHelper.centerFocus.off(dlg, false);
|
scrollHelper.centerFocus.off(dlg, false);
|
||||||
|
@ -358,18 +372,20 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
export function show(itemId, serverId, itemType, imageType) {
|
||||||
show: function (itemId, serverId, itemType, imageType) {
|
return new Promise(function (resolve, reject) {
|
||||||
return new Promise(function (resolve, reject) {
|
currentResolve = resolve;
|
||||||
currentResolve = resolve;
|
currentReject = reject;
|
||||||
currentReject = reject;
|
hasChanges = false;
|
||||||
hasChanges = false;
|
browsableImageStartIndex = 0;
|
||||||
browsableImageStartIndex = 0;
|
browsableImageType = imageType || 'Primary';
|
||||||
browsableImageType = imageType || 'Primary';
|
selectedProvider = null;
|
||||||
selectedProvider = null;
|
showEditor(itemId, serverId, itemType);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
showEditor(itemId, serverId, itemType);
|
export default {
|
||||||
});
|
show: show
|
||||||
}
|
};
|
||||||
};
|
|
||||||
});
|
/* eslint-enable indent */
|
||||||
|
|
|
@ -1,15 +1,31 @@
|
||||||
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) {
|
import dialogHelper from 'dialogHelper';
|
||||||
'use strict';
|
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';
|
||||||
|
|
||||||
|
/* eslint-disable indent */
|
||||||
|
|
||||||
|
const enableFocusTransform = !browser.slow && !browser.edge;
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
|
||||||
var enableFocusTransform = !browser.slow && !browser.edge;
|
let currentItem;
|
||||||
|
let hasChanges = false;
|
||||||
var currentItem;
|
|
||||||
var hasChanges = false;
|
|
||||||
|
|
||||||
function getBaseRemoteOptions() {
|
function getBaseRemoteOptions() {
|
||||||
var options = {};
|
const options = {};
|
||||||
|
|
||||||
options.itemId = currentItem.Id;
|
options.itemId = currentItem.Id;
|
||||||
|
|
||||||
|
@ -19,7 +35,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
function reload(page, item, focusContext) {
|
function reload(page, item, focusContext) {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var apiClient;
|
let apiClient;
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
apiClient = connectionManager.getApiClient(item.ServerId);
|
apiClient = connectionManager.getApiClient(item.ServerId);
|
||||||
|
@ -34,7 +50,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
|
|
||||||
function addListeners(container, className, eventName, fn) {
|
function addListeners(container, className, eventName, fn) {
|
||||||
container.addEventListener(eventName, function (e) {
|
container.addEventListener(eventName, function (e) {
|
||||||
var elem = dom.parentWithClass(e.target, className);
|
const elem = dom.parentWithClass(e.target, className);
|
||||||
if (elem) {
|
if (elem) {
|
||||||
fn.call(elem, e);
|
fn.call(elem, e);
|
||||||
}
|
}
|
||||||
|
@ -45,8 +61,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
currentItem = item;
|
currentItem = item;
|
||||||
|
|
||||||
apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) {
|
apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) {
|
||||||
var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
|
const btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
|
||||||
for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) {
|
for (let i = 0, length = btnBrowseAllImages.length; i < length; i++) {
|
||||||
if (providers.length) {
|
if (providers.length) {
|
||||||
btnBrowseAllImages[i].classList.remove('hide');
|
btnBrowseAllImages[i].classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
|
@ -89,10 +105,10 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) {
|
function getCardHtml(image, index, numImages, apiClient, imageProviders, imageSize, tagName, enableFooterButtons) {
|
||||||
// TODO move card creation code to Card component
|
// TODO move card creation code to Card component
|
||||||
|
|
||||||
var html = '';
|
let html = '';
|
||||||
|
|
||||||
var cssClass = 'card scalableCard imageEditorCard';
|
let cssClass = 'card scalableCard imageEditorCard';
|
||||||
var cardBoxCssClass = 'cardBox visualCardBox';
|
const cardBoxCssClass = 'cardBox visualCardBox';
|
||||||
|
|
||||||
cssClass += ' backdropCard backdropCard-scalable';
|
cssClass += ' backdropCard backdropCard-scalable';
|
||||||
|
|
||||||
|
@ -122,7 +138,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
|
|
||||||
html += '<div class="cardContent">';
|
html += '<div class="cardContent">';
|
||||||
|
|
||||||
var imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize });
|
const imageUrl = getImageUrl(currentItem, apiClient, image.ImageType, image.ImageIndex, { maxWidth: imageSize });
|
||||||
|
|
||||||
html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center center;background-size:contain;"></div>';
|
html += '<div class="cardImageContainer" style="background-image:url(\'' + imageUrl + '\');background-position:center center;background-size:contain;"></div>';
|
||||||
|
|
||||||
|
@ -174,7 +190,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteImage(context, itemId, type, index, apiClient, enableConfirmation) {
|
function deleteImage(context, itemId, type, index, apiClient, enableConfirmation) {
|
||||||
var afterConfirm = function () {
|
const afterConfirm = function () {
|
||||||
apiClient.deleteItemImage(itemId, type, index).then(function () {
|
apiClient.deleteItemImage(itemId, type, index).then(function () {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
reload(context);
|
reload(context);
|
||||||
|
@ -186,8 +202,8 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
require(['confirm'], function (confirm) {
|
import('confirm').then(({default: confirm}) => {
|
||||||
confirm.default({
|
confirm({
|
||||||
|
|
||||||
text: globalize.translate('ConfirmDeleteImage'),
|
text: globalize.translate('ConfirmDeleteImage'),
|
||||||
confirmText: globalize.translate('Delete'),
|
confirmText: globalize.translate('Delete'),
|
||||||
|
@ -202,27 +218,26 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
reload(context, null, focusContext);
|
reload(context, null, focusContext);
|
||||||
}, function () {
|
}, function () {
|
||||||
require(['alert'], function (alert) {
|
import('alert').then(({default: alert}) => {
|
||||||
alert(globalize.translate('DefaultErrorMessage'));
|
alert(globalize.translate('DefaultErrorMessage'));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderImages(page, item, apiClient, images, imageProviders, elem) {
|
function renderImages(page, item, apiClient, images, imageProviders, elem) {
|
||||||
var html = '';
|
let html = '';
|
||||||
|
|
||||||
var imageSize = 300;
|
let imageSize = 300;
|
||||||
var windowSize = dom.getWindowSize();
|
const windowSize = dom.getWindowSize();
|
||||||
if (windowSize.innerWidth >= 1280) {
|
if (windowSize.innerWidth >= 1280) {
|
||||||
imageSize = Math.round(windowSize.innerWidth / 4);
|
imageSize = Math.round(windowSize.innerWidth / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
var tagName = layoutManager.tv ? 'button' : 'div';
|
const tagName = layoutManager.tv ? 'button' : 'div';
|
||||||
var enableFooterButtons = !layoutManager.tv;
|
const enableFooterButtons = !layoutManager.tv;
|
||||||
|
|
||||||
for (var i = 0, length = images.length; i < length; i++) {
|
|
||||||
var image = images[i];
|
|
||||||
|
|
||||||
|
for (let i = 0, length = images.length; i < length; i++) {
|
||||||
|
const image = images[i];
|
||||||
html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons);
|
html += getCardHtml(image, i, length, apiClient, imageProviders, imageSize, tagName, enableFooterButtons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +246,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderStandardImages(page, apiClient, item, imageInfos, imageProviders) {
|
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';
|
return i.ImageType !== 'Screenshot' && i.ImageType !== 'Backdrop' && i.ImageType !== 'Chapter';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -239,7 +254,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) {
|
function renderBackdrops(page, apiClient, item, imageInfos, imageProviders) {
|
||||||
var images = imageInfos.filter(function (i) {
|
const images = imageInfos.filter(function (i) {
|
||||||
return i.ImageType === 'Backdrop';
|
return i.ImageType === 'Backdrop';
|
||||||
}).sort(function (a, b) {
|
}).sort(function (a, b) {
|
||||||
return a.ImageIndex - b.ImageIndex;
|
return a.ImageIndex - b.ImageIndex;
|
||||||
|
@ -254,7 +269,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) {
|
function renderScreenshots(page, apiClient, item, imageInfos, imageProviders) {
|
||||||
var images = imageInfos.filter(function (i) {
|
const images = imageInfos.filter(function (i) {
|
||||||
return i.ImageType === 'Screenshot';
|
return i.ImageType === 'Screenshot';
|
||||||
}).sort(function (a, b) {
|
}).sort(function (a, b) {
|
||||||
return a.ImageIndex - b.ImageIndex;
|
return a.ImageIndex - b.ImageIndex;
|
||||||
|
@ -269,7 +284,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function showImageDownloader(page, imageType) {
|
function showImageDownloader(page, imageType) {
|
||||||
require(['imageDownloader'], function (ImageDownloader) {
|
import('imageDownloader').then(({default: ImageDownloader}) => {
|
||||||
ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () {
|
ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
reload(page);
|
reload(page);
|
||||||
|
@ -278,17 +293,17 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function showActionSheet(context, imageCard) {
|
function showActionSheet(context, imageCard) {
|
||||||
var itemId = imageCard.getAttribute('data-id');
|
const itemId = imageCard.getAttribute('data-id');
|
||||||
var serverId = imageCard.getAttribute('data-serverid');
|
const serverId = imageCard.getAttribute('data-serverid');
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
|
|
||||||
var type = imageCard.getAttribute('data-imagetype');
|
const type = imageCard.getAttribute('data-imagetype');
|
||||||
var index = parseInt(imageCard.getAttribute('data-index'));
|
const index = parseInt(imageCard.getAttribute('data-index'));
|
||||||
var providerCount = parseInt(imageCard.getAttribute('data-providers'));
|
const providerCount = parseInt(imageCard.getAttribute('data-providers'));
|
||||||
var numImages = parseInt(imageCard.getAttribute('data-numimages'));
|
const numImages = parseInt(imageCard.getAttribute('data-numimages'));
|
||||||
|
|
||||||
require(['actionsheet'], function (actionSheet) {
|
import('actionsheet').then(({default: actionSheet}) => {
|
||||||
var commands = [];
|
const commands = [];
|
||||||
|
|
||||||
commands.push({
|
commands.push({
|
||||||
name: globalize.translate('Delete'),
|
name: globalize.translate('Delete'),
|
||||||
|
@ -345,9 +360,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
function initEditor(context, options) {
|
function initEditor(context, options) {
|
||||||
var uploadButtons = context.querySelectorAll('.btnOpenUploadMenu');
|
const uploadButtons = context.querySelectorAll('.btnOpenUploadMenu');
|
||||||
var isFileInputSupported = appHost.supports('fileinput');
|
const isFileInputSupported = appHost.supports('fileinput');
|
||||||
for (var i = 0, length = uploadButtons.length; i < length; i++) {
|
for (let i = 0, length = uploadButtons.length; i < length; i++) {
|
||||||
if (isFileInputSupported) {
|
if (isFileInputSupported) {
|
||||||
uploadButtons[i].classList.remove('hide');
|
uploadButtons[i].classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
|
@ -356,9 +371,9 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
}
|
}
|
||||||
|
|
||||||
addListeners(context, 'btnOpenUploadMenu', 'click', function () {
|
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({
|
imageUploader.show({
|
||||||
|
|
||||||
theme: options.theme,
|
theme: options.theme,
|
||||||
|
@ -388,32 +403,32 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
});
|
});
|
||||||
|
|
||||||
addListeners(context, 'btnDeleteImage', 'click', function () {
|
addListeners(context, 'btnDeleteImage', 'click', function () {
|
||||||
var type = this.getAttribute('data-imagetype');
|
const type = this.getAttribute('data-imagetype');
|
||||||
var index = this.getAttribute('data-index');
|
let index = this.getAttribute('data-index');
|
||||||
index = index === 'null' ? null : parseInt(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);
|
deleteImage(context, currentItem.Id, type, index, apiClient, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
addListeners(context, 'btnMoveImage', 'click', function () {
|
addListeners(context, 'btnMoveImage', 'click', function () {
|
||||||
var type = this.getAttribute('data-imagetype');
|
const type = this.getAttribute('data-imagetype');
|
||||||
var index = this.getAttribute('data-index');
|
const index = this.getAttribute('data-index');
|
||||||
var newIndex = this.getAttribute('data-newindex');
|
const newIndex = this.getAttribute('data-newindex');
|
||||||
var apiClient = connectionManager.getApiClient(currentItem.ServerId);
|
const apiClient = connectionManager.getApiClient(currentItem.ServerId);
|
||||||
moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer'));
|
moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showEditor(options, resolve, reject) {
|
function showEditor(options, resolve, reject) {
|
||||||
var itemId = options.itemId;
|
const itemId = options.itemId;
|
||||||
var serverId = options.serverId;
|
const serverId = options.serverId;
|
||||||
|
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
require(['text!./imageeditor.template.html'], function (template) {
|
import('text!./imageeditor.template.html').then(({default: template}) => {
|
||||||
var apiClient = connectionManager.getApiClient(serverId);
|
const apiClient = connectionManager.getApiClient(serverId);
|
||||||
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
|
apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) {
|
||||||
var dialogOptions = {
|
const dialogOptions = {
|
||||||
removeOnClose: true
|
removeOnClose: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -423,7 +438,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
dialogOptions.size = 'small';
|
dialogOptions.size = 'small';
|
||||||
}
|
}
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog(dialogOptions);
|
const dlg = dialogHelper.createDialog(dialogOptions);
|
||||||
|
|
||||||
dlg.classList.add('formDialog');
|
dlg.classList.add('formDialog');
|
||||||
|
|
||||||
|
@ -461,13 +476,15 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
export function show (options) {
|
||||||
show: function (options) {
|
return new Promise(function (resolve, reject) {
|
||||||
return new Promise(function (resolve, reject) {
|
hasChanges = false;
|
||||||
hasChanges = false;
|
showEditor(options, resolve, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
showEditor(options, resolve, reject);
|
export default {
|
||||||
});
|
show
|
||||||
}
|
};
|
||||||
};
|
|
||||||
});
|
/* eslint-enable indent */
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'us
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData() {
|
function getPageData() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData(context) {
|
function getPageData(context) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData() {
|
function getPageData() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser',
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent, options) {
|
return function (view, params, tabContent, options) {
|
||||||
function onViewStyleChange() {
|
function onViewStyleChange() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData(context) {
|
function getPageData(context) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function playAll() {
|
function playAll() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData(context) {
|
function getPageData(context) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData() {
|
function getPageData() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData() {
|
function getPageData() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
loading = loading.default || loading;
|
loading = loading.default || loading;
|
||||||
|
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||||
|
|
||||||
return function (view, params, tabContent) {
|
return function (view, params, tabContent) {
|
||||||
function getPageData(context) {
|
function getPageData(context) {
|
||||||
|
|
|
@ -1,199 +1,216 @@
|
||||||
define(['userSettings', 'globalize'], function (userSettings, globalize) {
|
import * as userSettings from 'userSettings';
|
||||||
'use strict';
|
import globalize from 'globalize';
|
||||||
|
|
||||||
var libraryBrowser = {
|
export function getSavedQueryKey(modifier) {
|
||||||
getSavedQueryKey: function (modifier) {
|
return window.location.href.split('#')[0] + (modifier || '');
|
||||||
return window.location.href.split('#')[0] + (modifier || '');
|
}
|
||||||
},
|
|
||||||
loadSavedQueryValues: function (key, query) {
|
|
||||||
var values = userSettings.get(key);
|
|
||||||
|
|
||||||
if (values) {
|
export function loadSavedQueryValues(key, query) {
|
||||||
values = JSON.parse(values);
|
var values = userSettings.get(key);
|
||||||
return Object.assign(query, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
return query;
|
if (values) {
|
||||||
},
|
values = JSON.parse(values);
|
||||||
saveQueryValues: function (key, query) {
|
return Object.assign(query, values);
|
||||||
var values = {};
|
}
|
||||||
|
|
||||||
if (query.SortBy) {
|
return query;
|
||||||
values.SortBy = query.SortBy;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (query.SortOrder) {
|
export function saveQueryValues(key, query) {
|
||||||
values.SortOrder = query.SortOrder;
|
var values = {};
|
||||||
}
|
|
||||||
|
|
||||||
userSettings.set(key, JSON.stringify(values));
|
if (query.SortBy) {
|
||||||
},
|
values.SortBy = query.SortBy;
|
||||||
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 (!views) {
|
if (query.SortOrder) {
|
||||||
dispatchEvent = false;
|
values.SortOrder = query.SortOrder;
|
||||||
views = button.getAttribute('data-layouts');
|
}
|
||||||
views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard'];
|
|
||||||
}
|
|
||||||
|
|
||||||
var menuItems = views.map(function (v) {
|
userSettings.set(key, JSON.stringify(values));
|
||||||
return {
|
}
|
||||||
name: globalize.translate('Option' + v),
|
|
||||||
id: v,
|
|
||||||
selected: currentLayout == v
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
require(['actionsheet'], function (actionsheet) {
|
export function saveViewSetting (key, value) {
|
||||||
actionsheet.show({
|
userSettings.set(key + '-_view', value);
|
||||||
items: menuItems,
|
}
|
||||||
positionTo: button,
|
|
||||||
callback: function (id) {
|
|
||||||
button.dispatchEvent(new CustomEvent('layoutchange', {
|
|
||||||
detail: {
|
|
||||||
viewStyle: id
|
|
||||||
},
|
|
||||||
bubbles: true,
|
|
||||||
cancelable: false
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (!dispatchEvent) {
|
export function getSavedView (key) {
|
||||||
if (window.$) {
|
return userSettings.get(key + '-_view');
|
||||||
$(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;
|
|
||||||
|
|
||||||
if (html += '<div class="listPaging">', showControls) {
|
export function showLayoutMenu (button, currentLayout, views) {
|
||||||
html += '<span style="vertical-align:middle;">';
|
var dispatchEvent = true;
|
||||||
html += globalize.translate('ListPaging', (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount);
|
|
||||||
html += '</span>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) {
|
if (!views) {
|
||||||
html += '<div style="display:inline-block;">';
|
dispatchEvent = false;
|
||||||
|
views = button.getAttribute('data-layouts');
|
||||||
|
views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard'];
|
||||||
|
}
|
||||||
|
|
||||||
if (showControls) {
|
var menuItems = views.map(function (v) {
|
||||||
html += '<button is="paper-icon-button-light" class="btnPreviousPage autoSize" ' + (startIndex ? '' : 'disabled') + '><span class="material-icons arrow_back"></span></button>';
|
return {
|
||||||
html += '<button is="paper-icon-button-light" class="btnNextPage autoSize" ' + (startIndex + limit >= totalRecordCount ? 'disabled' : '') + '><span class="material-icons arrow_forward"></span></button>';
|
name: globalize.translate('Option' + v),
|
||||||
}
|
id: v,
|
||||||
|
selected: currentLayout == v
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
if (options.addLayoutButton) {
|
import('actionsheet').then(({default: actionsheet}) => {
|
||||||
html += '<button is="paper-icon-button-light" title="' + globalize.translate('ButtonSelectView') + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || '') + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || '') + '\');"><span class="material-icons view_comfy"></span></button>';
|
actionsheet.show({
|
||||||
}
|
items: menuItems,
|
||||||
|
positionTo: button,
|
||||||
|
callback: function (id) {
|
||||||
|
button.dispatchEvent(new CustomEvent('layoutchange', {
|
||||||
|
detail: {
|
||||||
|
viewStyle: id
|
||||||
|
},
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: false
|
||||||
|
}));
|
||||||
|
|
||||||
if (options.sortButton) {
|
if (!dispatchEvent) {
|
||||||
html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + globalize.translate('ButtonSort') + '"><span class="material-icons sort_by_alpha"></span></button>';
|
if (window.$) {
|
||||||
}
|
$(button).trigger('layoutchange', [id]);
|
||||||
|
|
||||||
if (options.filterButton) {
|
|
||||||
html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + globalize.translate('ButtonFilter') + '"><span class="material-icons filter_list"></span></button>';
|
|
||||||
}
|
|
||||||
|
|
||||||
html += '</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
return html += '</div>';
|
|
||||||
},
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function onSortOrderChange() {
|
export function getQueryPagingHtml (options) {
|
||||||
var newValue = this.value;
|
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) {
|
if (html += '<div class="listPaging">', showControls) {
|
||||||
var changed = options.query.SortOrder != newValue;
|
html += '<span style="vertical-align:middle;">';
|
||||||
options.query.SortOrder = newValue;
|
html += globalize.translate('ListPaging', (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount);
|
||||||
options.query.StartIndex = 0;
|
html += '</span>';
|
||||||
|
}
|
||||||
|
|
||||||
if (options.callback && changed) {
|
if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) {
|
||||||
options.callback();
|
html += '<div style="display:inline-block;">';
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var dlg = dialogHelper.createDialog({
|
if (showControls) {
|
||||||
removeOnClose: true,
|
html += '<button is="paper-icon-button-light" class="btnPreviousPage autoSize" ' + (startIndex ? '' : 'disabled') + '><span class="material-icons arrow_back"></span></button>';
|
||||||
modal: false,
|
html += '<button is="paper-icon-button-light" class="btnNextPage autoSize" ' + (startIndex + limit >= totalRecordCount ? 'disabled' : '') + '><span class="material-icons arrow_forward"></span></button>';
|
||||||
entryAnimationDuration: 160,
|
|
||||||
exitAnimationDuration: 200
|
|
||||||
});
|
|
||||||
dlg.classList.add('ui-body-a');
|
|
||||||
dlg.classList.add('background-theme-a');
|
|
||||||
dlg.classList.add('formDialog');
|
|
||||||
var html = '';
|
|
||||||
html += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">';
|
|
||||||
html += '<h2 style="margin:0 0 .5em;">';
|
|
||||||
html += globalize.translate('HeaderSortBy');
|
|
||||||
html += '</h2>';
|
|
||||||
var i;
|
|
||||||
var length;
|
|
||||||
var isChecked;
|
|
||||||
html += '<div>';
|
|
||||||
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 += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortBy" data-id="' + option.id + '" value="' + radioValue + '" class="menuSortBy" ' + isChecked + ' /><span>' + option.name + '</span></label>';
|
|
||||||
}
|
|
||||||
|
|
||||||
html += '</div>';
|
|
||||||
html += '<h2 style="margin: 1em 0 .5em;">';
|
|
||||||
html += globalize.translate('HeaderSortOrder');
|
|
||||||
html += '</h2>';
|
|
||||||
html += '<div>';
|
|
||||||
isChecked = 'Ascending' == options.query.SortOrder ? ' checked' : '';
|
|
||||||
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + ' /><span>' + globalize.translate('OptionAscending') + '</span></label>';
|
|
||||||
isChecked = 'Descending' == options.query.SortOrder ? ' checked' : '';
|
|
||||||
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + ' /><span>' + globalize.translate('OptionDescending') + '</span></label>';
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
window.LibraryBrowser = libraryBrowser;
|
if (options.addLayoutButton) {
|
||||||
return libraryBrowser;
|
html += '<button is="paper-icon-button-light" title="' + globalize.translate('ButtonSelectView') + '" class="btnChangeLayout autoSize" data-layouts="' + (options.layouts || '') + '" onclick="LibraryBrowser.showLayoutMenu(this, \'' + (options.currentLayout || '') + '\');"><span class="material-icons view_comfy"></span></button>';
|
||||||
});
|
}
|
||||||
|
|
||||||
|
if (options.sortButton) {
|
||||||
|
html += '<button is="paper-icon-button-light" class="btnSort autoSize" title="' + globalize.translate('ButtonSort') + '"><span class="material-icons sort_by_alpha"></span></button>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.filterButton) {
|
||||||
|
html += '<button is="paper-icon-button-light" class="btnFilter autoSize" title="' + globalize.translate('ButtonFilter') + '"><span class="material-icons filter_list"></span></button>';
|
||||||
|
}
|
||||||
|
|
||||||
|
html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
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 += '<div style="margin:0;padding:1.25em 1.5em 1.5em;">';
|
||||||
|
html += '<h2 style="margin:0 0 .5em;">';
|
||||||
|
html += globalize.translate('HeaderSortBy');
|
||||||
|
html += '</h2>';
|
||||||
|
var i;
|
||||||
|
var length;
|
||||||
|
var isChecked;
|
||||||
|
html += '<div>';
|
||||||
|
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 += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortBy" data-id="' + option.id + '" value="' + radioValue + '" class="menuSortBy" ' + isChecked + ' /><span>' + option.name + '</span></label>';
|
||||||
|
}
|
||||||
|
|
||||||
|
html += '</div>';
|
||||||
|
html += '<h2 style="margin: 1em 0 .5em;">';
|
||||||
|
html += globalize.translate('HeaderSortOrder');
|
||||||
|
html += '</h2>';
|
||||||
|
html += '<div>';
|
||||||
|
isChecked = 'Ascending' == options.query.SortOrder ? ' checked' : '';
|
||||||
|
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Ascending" class="menuSortOrder" ' + isChecked + ' /><span>' + globalize.translate('OptionAscending') + '</span></label>';
|
||||||
|
isChecked = 'Descending' == options.query.SortOrder ? ' checked' : '';
|
||||||
|
html += '<label class="radio-label-block"><input type="radio" is="emby-radio" name="SortOrder" value="Descending" class="menuSortOrder" ' + isChecked + ' /><span>' + globalize.translate('OptionDescending') + '</span></label>';
|
||||||
|
html += '</div>';
|
||||||
|
html += '</div>';
|
||||||
|
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;
|
||||||
|
|
|
@ -1,66 +1,65 @@
|
||||||
define(['browser'], function (browser) {
|
import browser from 'browser';
|
||||||
'use strict';
|
|
||||||
|
|
||||||
function fallback(urls) {
|
function fallback(urls) {
|
||||||
var i = 0;
|
var i = 0;
|
||||||
|
|
||||||
(function createIframe() {
|
(function createIframe() {
|
||||||
var frame = document.createElement('iframe');
|
var frame = document.createElement('iframe');
|
||||||
frame.style.display = 'none';
|
frame.style.display = 'none';
|
||||||
frame.src = urls[i++];
|
frame.src = urls[i++];
|
||||||
document.documentElement.appendChild(frame);
|
document.documentElement.appendChild(frame);
|
||||||
|
|
||||||
// the download init has to be sequential otherwise IE only use the first
|
// the download init has to be sequential otherwise IE only use the first
|
||||||
var interval = setInterval(function () {
|
var interval = setInterval(function () {
|
||||||
if (frame.contentWindow.document.readyState === 'complete' || frame.contentWindow.document.readyState === 'interactive') {
|
if (frame.contentWindow.document.readyState === 'complete' || frame.contentWindow.document.readyState === 'interactive') {
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
|
|
||||||
// Safari needs a timeout
|
// Safari needs a timeout
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
frame.parentNode.removeChild(frame);
|
frame.parentNode.removeChild(frame);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
if (i < urls.length) {
|
if (i < urls.length) {
|
||||||
createIframe();
|
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);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
"ButtonDown": "Zeslabit",
|
"ButtonDown": "Zeslabit",
|
||||||
"ButtonDownload": "Stáhnout",
|
"ButtonDownload": "Stáhnout",
|
||||||
"ButtonEdit": "Upravit",
|
"ButtonEdit": "Upravit",
|
||||||
"ButtonEditImages": "Editace obrázků",
|
"ButtonEditImages": "Editovat obrázky",
|
||||||
"ButtonEditOtherUserPreferences": "Editace uživatelského profilu, avataru a osobních preferencí.",
|
"ButtonEditOtherUserPreferences": "Editace uživatelského profilu, avataru a osobních preferencí.",
|
||||||
"ButtonFilter": "Filtr",
|
"ButtonFilter": "Filtr",
|
||||||
"ButtonForgotPassword": "Zapomenuté heslo",
|
"ButtonForgotPassword": "Zapomenuté heslo",
|
||||||
|
@ -170,7 +170,7 @@
|
||||||
"DropShadow": "Stín",
|
"DropShadow": "Stín",
|
||||||
"EasyPasswordHelp": "Váš jednoduchý kód PIN slouží k přístupu v režimu offline v podporovaných klientech Jellyfin a k snadnému přihlášení v místní síti.",
|
"EasyPasswordHelp": "Váš jednoduchý kód PIN slouží k přístupu v režimu offline v podporovaných klientech Jellyfin a k snadnému přihlášení v místní síti.",
|
||||||
"Edit": "Upravit",
|
"Edit": "Upravit",
|
||||||
"EditImages": "Editace obrázků",
|
"EditImages": "Editovat obrázky",
|
||||||
"EditSubtitles": "Editovat titulky",
|
"EditSubtitles": "Editovat titulky",
|
||||||
"EnableBackdrops": "Povolit pozadí",
|
"EnableBackdrops": "Povolit pozadí",
|
||||||
"EnableBackdropsHelp": "Pokud je povoleno, pozadí je zobrazeno pro některé stránky při procházení vaší knihovny.",
|
"EnableBackdropsHelp": "Pokud je povoleno, pozadí je zobrazeno pro některé stránky při procházení vaší knihovny.",
|
||||||
|
@ -236,7 +236,7 @@
|
||||||
"HeaderAddScheduledTaskTrigger": "Přidat Spouštěč",
|
"HeaderAddScheduledTaskTrigger": "Přidat Spouštěč",
|
||||||
"HeaderAddToCollection": "Přidat do Kolekce",
|
"HeaderAddToCollection": "Přidat do Kolekce",
|
||||||
"HeaderAddToPlaylist": "Přidat do playlistu",
|
"HeaderAddToPlaylist": "Přidat do playlistu",
|
||||||
"HeaderAddUpdateImage": "Přidat/Aktualizovat obrázek",
|
"HeaderAddUpdateImage": "Přidat/aktualizovat obrázek",
|
||||||
"HeaderAddUser": "Přidat uživatele",
|
"HeaderAddUser": "Přidat uživatele",
|
||||||
"HeaderAdditionalParts": "Další součásti",
|
"HeaderAdditionalParts": "Další součásti",
|
||||||
"HeaderAdmin": "Administrátor",
|
"HeaderAdmin": "Administrátor",
|
||||||
|
@ -284,7 +284,7 @@
|
||||||
"HeaderDirectPlayProfileHelp": "Přidat profil přímého přehrání pro definici formátů, které přístroj zvládne přehrávat nativně.",
|
"HeaderDirectPlayProfileHelp": "Přidat profil přímého přehrání pro definici formátů, které přístroj zvládne přehrávat nativně.",
|
||||||
"HeaderDisplay": "Zobrazení",
|
"HeaderDisplay": "Zobrazení",
|
||||||
"HeaderEasyPinCode": "Jednoduchý pin kód",
|
"HeaderEasyPinCode": "Jednoduchý pin kód",
|
||||||
"HeaderEditImages": "Editace obrázků",
|
"HeaderEditImages": "Editovat obrázky",
|
||||||
"HeaderEnabledFields": "Povolené pole",
|
"HeaderEnabledFields": "Povolené pole",
|
||||||
"HeaderEnabledFieldsHelp": "Zrušte zaškrtnutí, abyste zabránily změnám dat.",
|
"HeaderEnabledFieldsHelp": "Zrušte zaškrtnutí, abyste zabránily změnám dat.",
|
||||||
"HeaderEpisodes": "Epizody",
|
"HeaderEpisodes": "Epizody",
|
||||||
|
@ -419,7 +419,7 @@
|
||||||
"Hide": "Skrýt",
|
"Hide": "Skrýt",
|
||||||
"HideWatchedContentFromLatestMedia": "Skrýt přehrané položky ze seznamu nejnovějších médií",
|
"HideWatchedContentFromLatestMedia": "Skrýt přehrané položky ze seznamu nejnovějších médií",
|
||||||
"Home": "Domů",
|
"Home": "Domů",
|
||||||
"Identify": "Identifikuj",
|
"Identify": "Identifikovat",
|
||||||
"Images": "Obrázky",
|
"Images": "Obrázky",
|
||||||
"ImportFavoriteChannelsHelp": "Pokud je povoleno, jen kanály označené jako oblíbené budou importována na zařízení tuneru.",
|
"ImportFavoriteChannelsHelp": "Pokud je povoleno, jen kanály označené jako oblíbené budou importována na zařízení tuneru.",
|
||||||
"ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze Jellyfin a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.",
|
"ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze Jellyfin a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.",
|
||||||
|
|
|
@ -814,7 +814,7 @@
|
||||||
"LabelffmpegPathHelp": "O local para o programa ffmpeg, ou pasta contendo ffmpeg.",
|
"LabelffmpegPathHelp": "O local para o programa ffmpeg, ou pasta contendo ffmpeg.",
|
||||||
"LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas IP/máscara de rede para redes que serão consideradas como redes locais ao forçar restrições de banda. Se definida, todos os outros endereços IP serão considerados como estando em uma rede externa e estarão sujeitos a restrições de banda externa. Se deixada em branco, apenas a sub-rede do servidor é considerada como rede local.",
|
"LanNetworksHelp": "Lista separada por vírgula de endereços IP ou entradas IP/máscara de rede para redes que serão consideradas como redes locais ao forçar restrições de banda. Se definida, todos os outros endereços IP serão considerados como estando em uma rede externa e estarão sujeitos a restrições de banda externa. Se deixada em branco, apenas a sub-rede do servidor é considerada como rede local.",
|
||||||
"Large": "Grande",
|
"Large": "Grande",
|
||||||
"LatestFromLibrary": "Recentes {0}",
|
"LatestFromLibrary": "{0} recentes",
|
||||||
"LearnHowYouCanContribute": "Saiba como você pode contribuir.",
|
"LearnHowYouCanContribute": "Saiba como você pode contribuir.",
|
||||||
"LibraryAccessHelp": "Selecione as bibliotecas para compartilhar com este usuário. Administradores poderão editar todas as pastas usando o gerenciador de metadados.",
|
"LibraryAccessHelp": "Selecione as bibliotecas para compartilhar com este usuário. Administradores poderão editar todas as pastas usando o gerenciador de metadados.",
|
||||||
"Like": "Curti",
|
"Like": "Curti",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue