1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Deminify part 2 (#509)

This de-minifies and de-uglifies `controllers` subdirectory
This commit is contained in:
grafixeyehero 2019-11-06 13:43:39 +03:00 committed by Vasily
parent f98a43f06f
commit 23677db990
66 changed files with 8296 additions and 4227 deletions

View file

@ -1,31 +1,37 @@
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function($, loading, libraryMenu, globalize, connectionManager) { define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function ($, loading, libraryMenu, globalize, connectionManager) {
"use strict"; "use strict";
function populateHistory(packageInfo, page) { function populateHistory(packageInfo, page) {
var html = ""; var html = "";
var length = Math.min(packageInfo.versions.length, 10); var length = Math.min(packageInfo.versions.length, 10);
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
var version = packageInfo.versions[i]; var version = packageInfo.versions[i];
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>"; html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>";
html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>"; html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>";
} }
$("#revisionHistory", page).html(html); $("#revisionHistory", page).html(html);
} }
function populateVersions(packageInfo, page, installedPlugin) { function populateVersions(packageInfo, page, installedPlugin) {
var html = ""; var html = "";
for (var i = 0; i < packageInfo.versions.length; i++) { for (var i = 0; i < packageInfo.versions.length; i++) {
var version = packageInfo.versions[i]; var version = packageInfo.versions[i];
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>"; html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>";
} }
var selectmenu = $("#selectVersion", page).html(html); var selectmenu = $("#selectVersion", page).html(html);
if (!installedPlugin) { if (!installedPlugin) {
$("#pCurrentVersion", page).hide().html(""); $("#pCurrentVersion", page).hide().html("");
} }
var packageVersion = packageInfo.versions.filter(function(current) {
var packageVersion = packageInfo.versions.filter(function (current) {
return "Release" == current.classification; return "Release" == current.classification;
})[0]; })[0];
packageVersion = packageVersion || packageInfo.versions.filter(function(current) { packageVersion = packageVersion || packageInfo.versions.filter(function (current) {
return "Beta" == current.classification; return "Beta" == current.classification;
})[0]; })[0];
@ -36,12 +42,13 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
} }
function renderPackage(pkg, installedPlugins, page) { function renderPackage(pkg, installedPlugins, page) {
var installedPlugin = installedPlugins.filter(function(ip) { var installedPlugin = installedPlugins.filter(function (ip) {
return ip.Name == pkg.name return ip.Name == pkg.name;
})[0]; })[0];
populateVersions(pkg, page, installedPlugin); populateVersions(pkg, page, installedPlugin);
populateHistory(pkg, page); populateHistory(pkg, page);
$(".pluginName", page).html(pkg.name); $(".pluginName", page).html(pkg.name);
if ("Server" == pkg.targetSystem) { if ("Server" == pkg.targetSystem) {
$("#btnInstallDiv", page).removeClass("hide"); $("#btnInstallDiv", page).removeClass("hide");
$("#nonServerMsg", page).hide(); $("#nonServerMsg", page).hide();
@ -52,60 +59,69 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
var msg = globalize.translate("MessageInstallPluginFromApp"); var msg = globalize.translate("MessageInstallPluginFromApp");
$("#nonServerMsg", page).html(msg).show(); $("#nonServerMsg", page).html(msg).show();
} }
if (pkg.shortDescription) { if (pkg.shortDescription) {
$("#tagline", page).show().html(pkg.shortDescription); $("#tagline", page).show().html(pkg.shortDescription);
} else { } else {
$("#tagline", page).hide(); $("#tagline", page).hide();
} }
$("#overview", page).html(pkg.overview || ""); $("#overview", page).html(pkg.overview || "");
$("#developer", page).html(pkg.owner); $("#developer", page).html(pkg.owner);
if (pkg.richDescUrl) { if (pkg.richDescUrl) {
$("#pViewWebsite", page).show(); $("#pViewWebsite", page).show();
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl); $("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
} else { } else {
$("#pViewWebsite", page).hide(); $("#pViewWebsite", page).hide();
} }
if (pkg.previewImage || pkg.thumbImage) { if (pkg.previewImage || pkg.thumbImage) {
var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage; var img = pkg.previewImage ? pkg.previewImage : pkg.thumbImage;
$("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />"); $("#pPreviewImage", page).show().html("<img class='pluginPreviewImg' src='" + img + "' style='max-width: 100%;' />");
} else { } else {
$("#pPreviewImage", page).hide().html(""); $("#pPreviewImage", page).hide().html("");
} }
if (installedPlugin) { if (installedPlugin) {
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>"); var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>");
$("#pCurrentVersion", page).show().html(currentVersionText); $("#pCurrentVersion", page).show().html(currentVersionText);
} else { } else {
$("#pCurrentVersion", page).hide().html(""); $("#pCurrentVersion", page).hide().html("");
} }
loading.hide(); loading.hide();
} }
function alertText(options) { function alertText(options) {
require(["alert"], function(alert) { require(["alert"], function (alert) {
alert(options) alert(options);
}) });
} }
function performInstallation(page, packageName, guid, updateClass, version) { function performInstallation(page, packageName, guid, updateClass, version) {
var developer = $("#developer", page).html().toLowerCase(); var developer = $("#developer", page).html().toLowerCase();
var alertCallback = function() {
var alertCallback = function () {
loading.show(); loading.show();
page.querySelector("#btnInstall").disabled = true; page.querySelector("#btnInstall").disabled = true;
ApiClient.installPlugin(packageName, guid, updateClass, version).then(function() { ApiClient.installPlugin(packageName, guid, updateClass, version).then(function () {
loading.hide(); loading.hide();
alertText(globalize.translate("PluginInstalledMessage")); alertText(globalize.translate("PluginInstalledMessage"));
}); });
}; };
if (developer !== 'jellyfin') { if (developer !== 'jellyfin') {
loading.hide(); loading.hide();
var msg = globalize.translate("MessagePluginInstallDisclaimer"); var msg = globalize.translate("MessagePluginInstallDisclaimer");
msg += "<br/>"; msg += "<br/>";
msg += "<br/>"; msg += "<br/>";
msg += globalize.translate("PleaseConfirmPluginInstallation"); msg += globalize.translate("PleaseConfirmPluginInstallation");
require(["confirm"], function(confirm) {
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function() { require(["confirm"], function (confirm) {
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () {
alertCallback(); alertCallback();
}, function() { }, function () {
console.log('plugin not installed'); console.log('plugin not installed');
}); });
}); });
@ -114,18 +130,19 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
} }
} }
return function(view, params) { return function (view, params) {
$(".addPluginForm", view).on("submit", function() { $(".addPluginForm", view).on("submit", function () {
loading.show(); loading.show();
var page = $(this).parents("#addPluginPage")[0]; var page = $(this).parents("#addPluginPage")[0];
var name = params.name; var name = params.name;
var guid = params.guid; var guid = params.guid;
ApiClient.getInstalledPlugins().then(function(plugins) { ApiClient.getInstalledPlugins().then(function (plugins) {
var installedPlugin = plugins.filter(function(plugin) { var installedPlugin = plugins.filter(function (plugin) {
return plugin.Name == name; return plugin.Name == name;
})[0]; })[0];
var vals = $("#selectVersion", page).val().split("|"); var vals = $("#selectVersion", page).val().split("|");
var version = vals[0]; var version = vals[0];
if (installedPlugin) { if (installedPlugin) {
if (installedPlugin.Version === version) { if (installedPlugin.Version === version) {
loading.hide(); loading.hide();
@ -140,16 +157,16 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e
}); });
return false; return false;
}); });
view.addEventListener("viewshow", function() { view.addEventListener("viewshow", function () {
var page = this; var page = this;
loading.show(); loading.show();
var name = params.name; var name = params.name;
var guid = params.guid; var guid = params.guid;
var promise1 = ApiClient.getPackageInfo(name, guid); var promise1 = ApiClient.getPackageInfo(name, guid);
var promise2 = ApiClient.getInstalledPlugins(); var promise2 = ApiClient.getInstalledPlugins();
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
renderPackage(responses[0], responses[1], page); renderPackage(responses[0], responses[1], page);
}); });
}) });
} };
}); });

View file

@ -57,5 +57,5 @@ define(["appSettings", "loading", "browser", "emby-button"], function(appSetting
appRouter.back(); appRouter.back();
}); });
} }
} };
}); });

View file

@ -1,14 +1,14 @@
define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function(datetime, loading, libraryMenu, dom, globalize) { define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function (datetime, loading, libraryMenu, dom, globalize) {
"use strict"; "use strict";
function revoke(page, key) { function revoke(page, key) {
require(["confirm"], function(confirm) { require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function() { confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function () {
loading.show(); loading.show();
ApiClient.ajax({ ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("Auth/Keys/" + key) url: ApiClient.getUrl("Auth/Keys/" + key)
}).then(function() { }).then(function () {
loadData(page); loadData(page);
}); });
}); });
@ -16,11 +16,23 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
} }
function renderKeys(page, keys) { function renderKeys(page, keys) {
var rows = keys.map(function(item) { var rows = keys.map(function (item) {
var html = ""; var html = "";
html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">', html += '<td class="detailTableBodyCell">', html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AccessToken, html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">', html += item.AppName || "", html += "</td>", html += '<td class="detailTableBodyCell" style="vertical-align:middle;">'; html += '<tr class="detailTableBodyRow detailTableBodyRow-shaded">';
var date = datetime.parseISO8601Date(item.DateCreated, !0); html += '<td class="detailTableBodyCell">';
return html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date), html += "</td>", html += "</tr>" html += '<button type="button" is="emby-button" data-token="' + item.AccessToken + '" class="raised raised-mini btnRevoke" data-mini="true" title="' + globalize.translate("ButtonRevoke") + '" style="margin:0;">' + globalize.translate("ButtonRevoke") + "</button>";
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
html += item.AccessToken;
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
html += item.AppName || "";
html += "</td>";
html += '<td class="detailTableBodyCell" style="vertical-align:middle;">';
var date = datetime.parseISO8601Date(item.DateCreated, true);
html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date);
html += "</td>";
return html += "</tr>";
}).join(""); }).join("");
page.querySelector(".resultBody").innerHTML = rows; page.querySelector(".resultBody").innerHTML = rows;
loading.hide(); loading.hide();
@ -28,42 +40,44 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"]
function loadData(page) { function loadData(page) {
loading.show(); loading.show();
ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function(result) { ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function (result) {
renderKeys(page, result.Items); renderKeys(page, result.Items);
}); });
} }
function showNewKeyPrompt(page) { function showNewKeyPrompt(page) {
require(["prompt"], function(prompt) { require(["prompt"], function (prompt) {
prompt({ prompt({
title: globalize.translate("HeaderNewApiKey"), title: globalize.translate("HeaderNewApiKey"),
label: globalize.translate("LabelAppName"), label: globalize.translate("LabelAppName"),
description: globalize.translate("LabelAppNameExample") description: globalize.translate("LabelAppNameExample")
}).then(function(value) { }).then(function (value) {
ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("Auth/Keys", { url: ApiClient.getUrl("Auth/Keys", {
App: value App: value
}) })
}).then(function() { }).then(function () {
loadData(page) loadData(page);
}) });
}) });
}) });
} }
pageIdOn("pageinit", "apiKeysPage", function() { pageIdOn("pageinit", "apiKeysPage", function () {
var page = this; var page = this;
page.querySelector(".btnNewKey").addEventListener("click", function() { page.querySelector(".btnNewKey").addEventListener("click", function () {
showNewKeyPrompt(page) showNewKeyPrompt(page);
}); });
page.querySelector(".tblApiKeys").addEventListener("click", function(e) { page.querySelector(".tblApiKeys").addEventListener("click", function (e) {
var btnRevoke = dom.parentWithClass(e.target, "btnRevoke"); var btnRevoke = dom.parentWithClass(e.target, "btnRevoke");
btnRevoke && revoke(page, btnRevoke.getAttribute("data-token"))
if (btnRevoke) {
revoke(page, btnRevoke.getAttribute("data-token"));
}
}); });
}); });
pageIdOn("pagebeforeshow", "apiKeysPage", function () {
pageIdOn("pagebeforeshow", "apiKeysPage", function() {
loadData(this); loadData(this);
}) });
}); });

View file

@ -5,8 +5,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
require(["alert"], function (alert) { require(["alert"], function (alert) {
var title; var title;
var text = []; var text = [];
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") { if (displayPlayMethod === "DirectStream") {
title = globalize.translate("DirectStreaming"); title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1")); text.push(globalize.translate("DirectStreamHelp1"));
@ -15,6 +15,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else if (displayPlayMethod === "Transcode") { } else if (displayPlayMethod === "Transcode") {
title = globalize.translate("Transcoding"); title = globalize.translate("Transcoding");
text.push(globalize.translate("MediaIsBeingConverted")); text.push(globalize.translate("MediaIsBeingConverted"));
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
text.push("<br/>"); text.push("<br/>");
text.push(globalize.translate("LabelReasonForTranscoding")); text.push(globalize.translate("LabelReasonForTranscoding"));
@ -23,6 +24,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}); });
} }
} }
alert({ alert({
text: text.join("<br/>"), text: text.join("<br/>"),
title: title title: title
@ -73,6 +75,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
case "sendmessage": case "sendmessage":
showSendMessageForm(btn, session); showSendMessageForm(btn, session);
break; break;
case "transcodinginfo": case "transcodinginfo":
showPlaybackInfo(btn, session); showPlaybackInfo(btn, session);
} }
@ -124,6 +127,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
list.push(session); list.push(session);
} }
} }
return list; return list;
} }
@ -139,7 +143,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (!result.Items.length) { if (!result.Items.length) {
view.querySelector(".activeRecordingsSection").classList.add("hide"); view.querySelector(".activeRecordingsSection").classList.add("hide");
return void (itemsContainer.innerHTML = ""); return void(itemsContainer.innerHTML = "");
} }
view.querySelector(".activeRecordingsSection").classList.remove("hide"); view.querySelector(".activeRecordingsSection").classList.remove("hide");
@ -165,13 +169,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
function reloadSystemInfo(view, apiClient) { function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function (systemInfo) { apiClient.getSystemInfo().then(function (systemInfo) {
view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName); view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName);
var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version); var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version);
if (systemInfo.SystemUpdateLevel !== "Release") { if (systemInfo.SystemUpdateLevel !== "Release") {
localizedVersion += " " + systemInfo.SystemUpdateLevel; localizedVersion += " " + systemInfo.SystemUpdateLevel;
} }
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#versionNumber").innerHTML = localizedVersion;
view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem); view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem);
view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture); view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture);
@ -226,14 +230,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} else { } else {
var nowPlayingItem = session.NowPlayingItem; var nowPlayingItem = session.NowPlayingItem;
var className = "scalableCard card activeSession backdropCard backdropCard-scalable"; var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
html += '<div class="' + className + '" id="' + rowId + '">'; html += '<div class="' + className + '" id="' + rowId + '">';
html += '<div class="cardBox visualCardBox">'; html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">'; html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>'; html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<div class="cardContent">'; html += '<div class="cardContent">';
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem); var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
if (imgUrl) { if (imgUrl) {
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"'; html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>"; html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>";
@ -243,8 +246,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionNowPlayingInnerContent">'; html += '<div class="sessionNowPlayingInnerContent">';
html += '<div class="sessionAppInfo">'; html += '<div class="sessionAppInfo">';
var clientImage = DashboardPage.getClientImage(session); var clientImage = DashboardPage.getClientImage(session);
if (clientImage) { if (clientImage) {
html += clientImage; html += clientImage;
} }
@ -261,28 +264,36 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionTranscodingFramerate"></div>'; html += '<div class="sessionTranscodingFramerate"></div>';
} }
html += '<div class="sessionNowPlayingDetails">' html += '<div class="sessionNowPlayingDetails">';
var nowPlayingName = DashboardPage.getNowPlayingName(session); var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">'; html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html; html += nowPlayingName.html;
html += "</div>"; html += "</div>";
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>"; html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
html += '</div>' html += '</div>';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" }); html += indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
});
} else { } else {
// need to leave the element in just in case the device starts playback // need to leave the element in just in case the device starts playback
html += indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" }); html += indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
});
} }
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" }); html += indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else { } else {
// same issue as playbackProgress element above // same issue as playbackProgress element above
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" }); html += indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
} }
html += "</div>"; html += "</div>";
@ -317,6 +328,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
parentElement.insertAdjacentHTML("beforeend", html); parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession"); var deadSessionElem = parentElement.querySelector(".deadSession");
if (deadSessionElem) { if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(deadSessionElem); deadSessionElem.parentNode.removeChild(deadSessionElem);
} }
@ -340,9 +352,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
for (var i = 0, length = tasks.length; i < length; i++) { for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i]; var task = tasks[i];
html += "<p>"; html += "<p>";
html += task.Name + "<br/>"; html += task.Name + "<br/>";
if (task.State === "Running") { if (task.State === "Running") {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1); var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">'; html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
@ -373,19 +385,24 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
var html = ""; var html = "";
var showTranscodingInfo = false; var showTranscodingInfo = false;
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") { if (displayPlayMethod === "DirectStream") {
html += globalize.translate("DirectStreaming"); html += globalize.translate("DirectStreaming");
} else if (displayPlayMethod === "Transcode") { } else if (displayPlayMethod === "Transcode") {
html += globalize.translate("Transcoding"); html += globalize.translate("Transcoding");
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
html += " (" + session.TranscodingInfo.Framerate + " fps)"; html += " (" + session.TranscodingInfo.Framerate + " fps)";
} }
showTranscodingInfo = true; showTranscodingInfo = true;
} else if (displayPlayMethod === "DirectPlay") { } else if (displayPlayMethod === "DirectPlay") {
html += globalize.translate("DirectPlaying"); html += globalize.translate("DirectPlaying");
} }
if (showTranscodingInfo) { if (showTranscodingInfo) {
var line = []; var line = [];
if (session.TranscodingInfo) { if (session.TranscodingInfo) {
if (session.TranscodingInfo.Bitrate) { if (session.TranscodingInfo.Bitrate) {
if (session.TranscodingInfo.Bitrate > 1e6) { if (session.TranscodingInfo.Bitrate > 1e6) {
@ -493,6 +510,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}, },
getUsersHtml: function (session) { getUsersHtml: function (session) {
var html = []; var html = [];
if (session.UserId) { if (session.UserId) {
html.push(session.UserName); html.push(session.UserName);
} }
@ -516,8 +534,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}, },
updateSession: function (row, session) { updateSession: function (row, session) {
row.classList.remove("deadSession"); row.classList.remove("deadSession");
var nowPlayingItem = session.NowPlayingItem; var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) { if (nowPlayingItem) {
row.classList.add("playingSession"); row.classList.add("playingSession");
} else { } else {
@ -537,6 +555,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} }
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause"); var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) { if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
btnSessionPlayPause.classList.remove("hide"); btnSessionPlayPause.classList.remove("hide");
row.querySelector(".btnSessionStop").classList.remove("hide"); row.querySelector(".btnSessionStop").classList.remove("hide");
@ -565,19 +584,29 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
} }
var playbackProgressElem = row.querySelector(".playbackProgress"); var playbackProgressElem = row.querySelector(".playbackProgress");
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, { containerClass: "playbackProgress" }); playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "playbackProgress"
});
} else { } else {
playbackProgressElem.outerHTML = indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" }); playbackProgressElem.outerHTML = indicators.getProgressHtml(0, {
containerClass: "playbackProgress hide"
});
} }
var transcodingProgress = row.querySelector(".transcodingProgress"); var transcodingProgress = row.querySelector(".transcodingProgress");
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" }); transcodingProgress.outerHTML = indicators.getProgressHtml(percent, {
containerClass: "transcodingProgress"
});
} else { } else {
transcodingProgress.outerHTML = indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" }); transcodingProgress.outerHTML = indicators.getProgressHtml(0, {
containerClass: "transcodingProgress hide"
});
} }
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ""; var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
@ -815,10 +844,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
view.addEventListener("viewdestroy", function () { view.addEventListener("viewdestroy", function () {
var page = this; var page = this;
var userActivityLog = page.userActivityLog; var userActivityLog = page.userActivityLog;
if (userActivityLog) { if (userActivityLog) {
userActivityLog.destroy(); userActivityLog.destroy();
} }
var serverActivityLog = page.serverActivityLog; var serverActivityLog = page.serverActivityLog;
if (serverActivityLog) { if (serverActivityLog) {
serverActivityLog.destroy(); serverActivityLog.destroy();
} }

View file

@ -1,23 +1,25 @@
define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(loading, libraryMenu, dom) { define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function (loading, libraryMenu, dom) {
"use strict"; "use strict";
function load(page, device, deviceOptions) { function load(page, device, deviceOptions) {
page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "", page.querySelector(".reportedName", page).innerHTML = device.Name || "" page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || "";
page.querySelector(".reportedName", page).innerHTML = device.Name || "";
} }
function loadData() { function loadData() {
var page = this; var page = this;
loading.show(); loading.show();
var id = getParameterByName("id"), var id = getParameterByName("id");
promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", { var promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", {
Id: id Id: id
})), }));
promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", { var promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", {
Id: id Id: id
})); }));
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
load(page, responses[0], responses[1]), loading.hide() load(page, responses[0], responses[1]);
}) loading.hide();
});
} }
function save(page) { function save(page) {
@ -31,14 +33,18 @@ define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function(
CustomName: page.querySelector("#txtCustomName").value CustomName: page.querySelector("#txtCustomName").value
}), }),
contentType: "application/json" contentType: "application/json"
}).then(Dashboard.processServerConfigurationUpdateResult) }).then(Dashboard.processServerConfigurationUpdateResult);
} }
function onSubmit(e) { function onSubmit(e) {
var form = this; var form = this;
return save(dom.parentWithClass(form, "page")), e.preventDefault(), !1 save(dom.parentWithClass(form, "page"));
e.preventDefault();
return false;
} }
return function(view, params) {
view.querySelector("form").addEventListener("submit", onSubmit), view.addEventListener("viewshow", loadData) return function (view, params) {
} view.querySelector("form").addEventListener("submit", onSubmit);
}); view.addEventListener("viewshow", loadData);
};
});

View file

@ -1,61 +1,73 @@
define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function(loading, dom, libraryMenu, globalize, imageHelper) { define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper) {
"use strict"; "use strict";
function canDelete(deviceId) { function canDelete(deviceId) {
return deviceId !== ApiClient.deviceId() return deviceId !== ApiClient.deviceId();
} }
function deleteDevice(page, id) { function deleteDevice(page, id) {
var msg = globalize.translate("DeleteDeviceConfirmation"); var msg = globalize.translate("DeleteDeviceConfirmation");
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({ confirm({
text: msg, text: msg,
title: globalize.translate("HeaderDeleteDevice"), title: globalize.translate("HeaderDeleteDevice"),
confirmText: globalize.translate("ButtonDelete"), confirmText: globalize.translate("ButtonDelete"),
primary: "delete" primary: "delete"
}).then(function() { }).then(function () {
loading.show(), ApiClient.ajax({ loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("Devices", { url: ApiClient.getUrl("Devices", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
loadData(page) loadData(page);
}) });
}) });
}) });
} }
function showDeviceMenu(view, btn, deviceId) { function showDeviceMenu(view, btn, deviceId) {
var menuItems = []; var menuItems = [];
canEdit && menuItems.push({
name: globalize.translate("Edit"), if (canEdit) {
id: "open", menuItems.push({
ironIcon: "mode-edit" name: globalize.translate("Edit"),
}), canDelete(deviceId) && menuItems.push({ id: "open",
name: globalize.translate("Delete"), ironIcon: "mode-edit"
id: "delete", });
ironIcon: "delete" }
}), require(["actionsheet"], function(actionsheet) {
if (canDelete(deviceId)) {
menuItems.push({
name: globalize.translate("Delete"),
id: "delete",
ironIcon: "delete"
});
}
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: btn, positionTo: btn,
callback: function(id) { callback: function (id) {
switch (id) { switch (id) {
case "open": case "open":
Dashboard.navigate("device.html?id=" + deviceId); Dashboard.navigate("device.html?id=" + deviceId);
break; break;
case "delete": case "delete":
deleteDevice(view, deviceId) deleteDevice(view, deviceId);
} }
} }
}) });
}) });
} }
function load(page, devices) { function load(page, devices) {
var html = ""; var html = "";
html += devices.map(function(device) { html += devices.map(function (device) {
var deviceHtml = ""; var deviceHtml = "";
deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>"; deviceHtml += "<div data-id='" + device.Id + "' class='card backdropCard'>";
deviceHtml += '<div class="cardBox visualCardBox">'; deviceHtml += '<div class="cardBox visualCardBox">';
@ -63,20 +75,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
deviceHtml += '<div class="cardPadder cardPadder-backdrop"></div>'; deviceHtml += '<div class="cardPadder cardPadder-backdrop"></div>';
deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">'; deviceHtml += '<a is="emby-linkbutton" href="' + (canEdit ? "device.html?id=" + device.Id : "#") + '" class="cardContent cardImageContainer">';
var iconUrl = imageHelper.getDeviceIcon(device.Name); var iconUrl = imageHelper.getDeviceIcon(device.Name);
if (iconUrl) { if (iconUrl) {
deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">"; deviceHtml += '<div class="cardImage" style="background-image:url(\'' + iconUrl + "');background-size: auto 64%;background-position:center center;\">";
deviceHtml += "</div>"; deviceHtml += "</div>";
} else { } else {
deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>'; deviceHtml += '<i class="cardImageIcon md-icon">tablet_android</i>';
} }
deviceHtml += "</a>"; deviceHtml += "</a>";
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += '<div class="cardFooter">'; deviceHtml += '<div class="cardFooter">';
if (canEdit || canDelete(device.Id)) { if (canEdit || canDelete(device.Id)) {
deviceHtml += '<div style="text-align:right; float:right;padding-top:5px;">'; deviceHtml += '<div style="text-align:right; float:right;padding-top:5px;">';
deviceHtml += '<button type="button" is="paper-icon-button-light" data-id="' + device.Id + '" title="' + globalize.translate("Menu") + '" class="btnDeviceMenu"><i class="md-icon">&#xE5D3;</i></button>'; deviceHtml += '<button type="button" is="paper-icon-button-light" data-id="' + device.Id + '" title="' + globalize.translate("Menu") + '" class="btnDeviceMenu"><i class="md-icon">&#xE5D3;</i></button>';
deviceHtml += "</div>"; deviceHtml += "</div>";
} }
deviceHtml += "<div class='cardText'>"; deviceHtml += "<div class='cardText'>";
deviceHtml += device.Name; deviceHtml += device.Name;
deviceHtml += "</div>"; deviceHtml += "</div>";
@ -84,10 +100,12 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
deviceHtml += device.AppName + " " + device.AppVersion; deviceHtml += device.AppName + " " + device.AppVersion;
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += "<div class='cardText cardText-secondary'>"; deviceHtml += "<div class='cardText cardText-secondary'>";
if (device.LastUserName) { if (device.LastUserName) {
deviceHtml += device.LastUserName; deviceHtml += device.LastUserName;
deviceHtml += ", " + humaneDate(device.DateLastActivity); deviceHtml += ", " + humaneDate(device.DateLastActivity);
} }
deviceHtml += "&nbsp;"; deviceHtml += "&nbsp;";
deviceHtml += "</div>"; deviceHtml += "</div>";
deviceHtml += "</div>"; deviceHtml += "</div>";
@ -99,17 +117,24 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
} }
function loadData(page) { function loadData(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function(result) { loading.show();
load(page, result.Items), loading.hide() ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function (result) {
}) load(page, result.Items);
loading.hide();
});
} }
var canEdit = ApiClient.isMinServerVersion("3.4.1.31"); var canEdit = ApiClient.isMinServerVersion("3.4.1.31");
return function(view, params) { return function (view, params) {
view.querySelector(".devicesList").addEventListener("click", function(e) { view.querySelector(".devicesList").addEventListener("click", function (e) {
var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu"); var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu");
btnDeviceMenu && showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"))
}), view.addEventListener("viewshow", function() { if (btnDeviceMenu) {
loadData(this) showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id"));
}) }
} });
view.addEventListener("viewshow", function () {
loadData(this);
});
};
}); });

View file

@ -65,8 +65,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
profile.ContainerProfiles = profile.ContainerProfiles || []; profile.ContainerProfiles = profile.ContainerProfiles || [];
profile.CodecProfiles = profile.CodecProfiles || []; profile.CodecProfiles = profile.CodecProfiles || [];
profile.ResponseProfiles = profile.ResponseProfiles || []; profile.ResponseProfiles = profile.ResponseProfiles || [];
var usersHtml = "<option></option>" + users.map(function (u__w) { var usersHtml = "<option></option>" + users.map(function (u) {
return '<option value="' + u__w.Id + '">' + u__w.Name + "</option>"; return '<option value="' + u.Id + '">' + u.Name + "</option>";
}).join(""); }).join("");
$("#selectUser", page).html(usersHtml).val(profile.UserId || ""); $("#selectUser", page).html(usersHtml).val(profile.UserId || "");
renderSubProfiles(page, profile); renderSubProfiles(page, profile);
@ -74,12 +74,12 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderIdentificationHeaders(page, headers) { function renderIdentificationHeaders(page, headers) {
var index = 0; var index = 0;
var html = '<div class="paperList">' + headers.map(function (h__e) { var html = '<div class="paperList">' + headers.map(function (h) {
var li = '<div class="listItem">'; var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + h__e.Name + ": " + (h__e.Value || "") + "</h3>"; li += '<h3 class="listItemBodyText">' + h.Name + ": " + (h.Value || "") + "</h3>";
li += '<div class="listItemBodyText secondary">' + (h__e.Match || "") + "</div>"; li += '<div class="listItemBodyText secondary">' + (h.Match || "") + "</div>";
li += "</div>"; li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteIdentificationHeader listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>'; li += '<button type="button" is="paper-icon-button-light" class="btnDeleteIdentificationHeader listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>"; li += "</div>";
@ -130,11 +130,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
function renderXmlDocumentAttributes(page, attribute) { function renderXmlDocumentAttributes(page, attribute) {
var html = '<div class="paperList">' + attribute.map(function (h__r) { var html = '<div class="paperList">' + attribute.map(function (h) {
var li = '<div class="listItem">'; var li = '<div class="listItem">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + h__r.Name + " = " + (h__r.Value || "") + "</h3>"; li += '<h3 class="listItemBodyText">' + h.Name + " = " + (h.Value || "") + "</h3>";
li += "</div>"; li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><i class="md-icon">delete</i></button>'; li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><i class="md-icon">delete</i></button>';
return li += "</div>"; return li += "</div>";
@ -172,11 +172,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
function renderSubtitleProfiles(page, profiles) { function renderSubtitleProfiles(page, profiles) {
var index = 0; var index = 0;
var html = '<div class="paperList">' + profiles.map(function (h__t) { var html = '<div class="paperList">' + profiles.map(function (h) {
var li = '<div class="listItem lnkEditSubProfile" data-index="' + index + '">'; var li = '<div class="listItem lnkEditSubProfile" data-index="' + index + '">';
li += '<i class="md-icon listItemIcon">info</i>'; li += '<i class="md-icon listItemIcon">info</i>';
li += '<div class="listItemBody">'; li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">' + (h__t.Format || "") + "</h3>"; li += '<h3 class="listItemBodyText">' + (h.Format || "") + "</h3>";
li += "</div>"; li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>'; li += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
li += "</div>"; li += "</div>";
@ -248,8 +248,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__y = 0, length = profiles.length; i__y < length; i__y++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__y]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -257,7 +257,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__y + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) { if ("Video" == profile.Type) {
@ -270,7 +270,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "</a>"; html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__y + '"><i class="md-icon">delete</i></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>"; html += "</div>";
} }
@ -308,8 +308,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__u = 0, length = profiles.length; i__u < length; i__u++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__u]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -317,7 +317,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__u + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>Protocol: " + (profile.Protocol || "Http") + "</p>"; html += "<p>Protocol: " + (profile.Protocol || "Http") + "</p>";
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
@ -331,7 +331,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "</a>"; html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__u + '"><i class="md-icon">delete</i></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>"; html += "</div>";
} }
@ -394,8 +394,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__i = 0, length = profiles.length; i__i < length; i__i++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__i]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -403,19 +403,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__i + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__o) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__o.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__i + '"><i class="md-icon">delete</i></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>"; html += "</div>";
} }
@ -465,8 +465,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__p = 0, length = profiles.length; i__p < length; i__p++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__p]; var profile = profiles[i];
var type = profile.Type.replace("VideoAudio", "Video Audio"); var type = profile.Type.replace("VideoAudio", "Video Audio");
if (type !== currentType) { if (type !== currentType) {
@ -475,19 +475,19 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__p + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "</p>"; html += "<p>" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "</p>";
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__a) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__a.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__p + '"><i class="md-icon">delete</i></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>"; html += "</div>";
} }
@ -537,8 +537,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">'; html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
var currentType; var currentType;
for (var i__s = 0, length = profiles.length; i__s < length; i__s++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i__s]; var profile = profiles[i];
if (profile.Type !== currentType) { if (profile.Type !== currentType) {
html += '<li data-role="list-divider">' + profile.Type + "</li>"; html += '<li data-role="list-divider">' + profile.Type + "</li>";
@ -546,7 +546,7 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
} }
html += "<div>"; html += "<div>";
html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i__s + '">'; html += '<a is="emby-linkbutton" href="#" class="lnkEditSubProfile" data-profileindex="' + i + '">';
html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>"; html += "<p>" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "</p>";
if ("Video" == profile.Type) { if ("Video" == profile.Type) {
@ -560,14 +560,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
if (profile.Conditions && profile.Conditions.length) { if (profile.Conditions && profile.Conditions.length) {
html += "<p>"; html += "<p>";
html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c__d) { html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) {
return c__d.Property; return c.Property;
}).join(", ")); }).join(", "));
html += "</p>"; html += "</p>";
} }
html += "</a>"; html += "</a>";
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i__s + '"><i class="md-icon">delete</i></button>'; html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile listItemButton" data-profileindex="' + i + '"><i class="md-icon">delete</i></button>';
html += "</div>"; html += "</div>";
} }
@ -649,8 +649,8 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in
profile.Name = $("#txtName", page).val(); profile.Name = $("#txtName", page).val();
profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked(); profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked();
profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked(); profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked();
profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c__f) { profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c) {
return c__f.getAttribute("data-value"); return c.getAttribute("data-value");
}).join(","); }).join(",");
profile.Identification = profile.Identification || {}; profile.Identification = profile.Identification || {};
profile.FriendlyName = $("#txtInfoFriendlyName", page).val(); profile.FriendlyName = $("#txtInfoFriendlyName", page).val();

View file

@ -1,48 +1,75 @@
define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function($, globalize, loading, libraryMenu) { define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function ($, globalize, loading, libraryMenu) {
"use strict"; "use strict";
function loadProfiles(page) { function loadProfiles(page) {
loading.show(), ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function(result) { loading.show();
renderUserProfiles(page, result), renderSystemProfiles(page, result), loading.hide() ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) {
}) renderUserProfiles(page, result);
renderSystemProfiles(page, result);
loading.hide();
});
} }
function renderUserProfiles(page, profiles) { function renderUserProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function(p) { renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function (p) {
return "User" == p.Type return "User" == p.Type;
})) }));
} }
function renderSystemProfiles(page, profiles) { function renderSystemProfiles(page, profiles) {
renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function(p) { renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function (p) {
return "System" == p.Type return "System" == p.Type;
})) }));
} }
function renderProfiles(page, element, profiles) { function renderProfiles(page, element, profiles) {
var html = ""; var html = "";
profiles.length && (html += '<div class="paperList">');
if (profiles.length) {
html += '<div class="paperList">';
}
for (var i = 0, length = profiles.length; i < length; i++) { for (var i = 0, length = profiles.length; i < length; i++) {
var profile = profiles[i]; var profile = profiles[i];
html += '<div class="listItem listItem-border">', html += '<i class="listItemIcon md-icon">live_tv</i>', html += '<div class="listItemBody two-line">', html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>", html += "<div>" + profile.Name + "</div>", html += "</a>", html += "</div>", "User" == profile.Type && (html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>'), html += "</div>" html += '<div class="listItem listItem-border">';
html += '<i class="listItemIcon md-icon">live_tv</i>';
html += '<div class="listItemBody two-line">';
html += "<a is='emby-linkbutton' style='padding:0;margin:0;' data-ripple='false' class='clearLink' href='dlnaprofile.html?id=" + profile.Id + "'>";
html += "<div>" + profile.Name + "</div>";
html += "</a>";
html += "</div>";
if ("User" == profile.Type) {
html += '<button type="button" is="paper-icon-button-light" class="btnDeleteProfile" data-profileid="' + profile.Id + '" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
}
html += "</div>";
} }
profiles.length && (html += "</div>"), element.innerHTML = html, $(".btnDeleteProfile", element).on("click", function() {
if (profiles.length) {
html += "</div>";
}
element.innerHTML = html;
$(".btnDeleteProfile", element).on("click", function () {
var id = this.getAttribute("data-profileid"); var id = this.getAttribute("data-profileid");
deleteProfile(page, id) deleteProfile(page, id);
}) });
} }
function deleteProfile(page, id) { function deleteProfile(page, id) {
require(["confirm"], function(confirm) { require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function() { confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function () {
loading.show(), ApiClient.ajax({ loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("Dlna/Profiles/" + id) url: ApiClient.getUrl("Dlna/Profiles/" + id)
}).then(function() { }).then(function () {
loading.hide(), loadProfiles(page) loading.hide();
}) loadProfiles(page);
}) });
}) });
});
} }
function getTabs() { function getTabs() {
@ -52,10 +79,11 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-
}, { }, {
href: "dlnaprofiles.html", href: "dlnaprofiles.html",
name: globalize.translate("TabProfiles") name: globalize.translate("TabProfiles")
}] }];
} }
$(document).on("pageshow", "#dlnaProfilesPage", function() { $(document).on("pageshow", "#dlnaProfilesPage", function () {
libraryMenu.setTabs("dlna", 1, getTabs), loadProfiles(this) libraryMenu.setTabs("dlna", 1, getTabs);
}) loadProfiles(this);
}); });
});

View file

@ -1,20 +1,34 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) { define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict"; "use strict";
function loadPage(page, config, users) { function loadPage(page, config, users) {
page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo, page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog, $("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds), $("#chkEnableServer", page).checked(config.EnableServer), $("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages), $("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds); page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo;
var usersHtml = users.map(function(u) { page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog;
return '<option value="' + u.Id + '">' + u.Name + "</option>" $("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds);
$("#chkEnableServer", page).checked(config.EnableServer);
$("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages);
$("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds);
var usersHtml = users.map(function (u) {
return '<option value="' + u.Id + '">' + u.Name + "</option>";
}).join(""); }).join("");
$("#selectUser", page).html(usersHtml).val(config.DefaultUserId || ""), loading.hide() $("#selectUser", page).html(usersHtml).val(config.DefaultUserId || "");
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration("dlna").then(function(config) { ApiClient.getNamedConfiguration("dlna").then(function (config) {
config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked, config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked, config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val(), config.EnableServer = $("#chkEnableServer", form).checked(), config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked(), config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val(), config.DefaultUserId = $("#selectUser", form).val(), ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult) config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked;
}), !1 config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked;
config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val();
config.EnableServer = $("#chkEnableServer", form).checked();
config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked();
config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val();
config.DefaultUserId = $("#selectUser", form).val();
ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
} }
function getTabs() { function getTabs() {
@ -24,17 +38,19 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
}, { }, {
href: "dlnaprofiles.html", href: "dlnaprofiles.html",
name: Globalize.translate("TabProfiles") name: Globalize.translate("TabProfiles")
}] }];
} }
$(document).on("pageinit", "#dlnaSettingsPage", function() {
$(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit) $(document).on("pageinit", "#dlnaSettingsPage", function () {
}).on("pageshow", "#dlnaSettingsPage", function() { $(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
libraryMenu.setTabs("dlna", 0, getTabs), loading.show(); }).on("pageshow", "#dlnaSettingsPage", function () {
var page = this, libraryMenu.setTabs("dlna", 0, getTabs);
promise1 = ApiClient.getNamedConfiguration("dlna"), loading.show();
promise2 = ApiClient.getUsers(); var page = this;
Promise.all([promise1, promise2]).then(function(responses) { var promise1 = ApiClient.getNamedConfiguration("dlna");
loadPage(page, responses[0], responses[1]) var promise2 = ApiClient.getUsers();
}) Promise.all([promise1, promise2]).then(function (responses) {
}) loadPage(page, responses[0], responses[1]);
}); });
});
});

View file

@ -1,17 +1,31 @@
define(["loading", "scripts/editorsidebar"], function(loading) { define(["loading", "scripts/editorsidebar"], function (loading) {
"use strict"; "use strict";
function reload(context, itemId) { function reload(context, itemId) {
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) { loading.show();
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide()) if (itemId) {
require(["metadataEditor"], function (metadataEditor) {
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id);
});
} else {
context.querySelector(".editPageInnerContent").innerHTML = "";
loading.hide();
}
} }
return function(view, params) {
view.addEventListener("viewshow", function() { return function (view, params) {
reload(this, MetadataEditor.getCurrentItemId()) view.addEventListener("viewshow", function () {
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) { reload(this, MetadataEditor.getCurrentItemId());
});
MetadataEditor.setCurrentItemId(null);
view.querySelector(".libraryTree").addEventListener("itemclicked", function (event) {
var data = event.detail; var data = event.detail;
data.id != MetadataEditor.getCurrentItemId() && (MetadataEditor.setCurrentItemId(data.id), reload(view, data.id))
}) if (data.id != MetadataEditor.getCurrentItemId()) {
} MetadataEditor.setCurrentItemId(data.id);
}); reload(view, data.id);
}
});
};
});

View file

@ -1,9 +1,9 @@
define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loading, globalize, dom, libraryMenu) { define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, loading, globalize, dom, libraryMenu) {
"use strict"; "use strict";
function loadPage(page, config, systemInfo) { function loadPage(page, config, systemInfo) {
Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function(c) { Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) {
c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec")) c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec"));
}); });
page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding; page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding;
$("#selectVideoDecoder", page).val(config.HardwareAccelerationType); $("#selectVideoDecoder", page).val(config.HardwareAccelerationType);
@ -17,19 +17,22 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false; page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false;
page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", { page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", {
bubbles: true bubbles: true
})), loading.hide() }));
loading.hide();
} }
function onSaveEncodingPathFailure(response) { function onSaveEncodingPathFailure(response) {
loading.hide(); loading.hide();
var msg = ""; var msg = "";
msg = globalize.translate("FFmpegSavePathNotFound"), require(["alert"], function(alert) { msg = globalize.translate("FFmpegSavePathNotFound");
alert(msg)
}) require(["alert"], function (alert) {
alert(msg);
});
} }
function updateEncoder(form) { function updateEncoder(form) {
return ApiClient.getSystemInfo().then(function(systemInfo) { return ApiClient.getSystemInfo().then(function (systemInfo) {
return ApiClient.ajax({ return ApiClient.ajax({
url: ApiClient.getUrl("System/MediaEncoder/Path"), url: ApiClient.getUrl("System/MediaEncoder/Path"),
type: "POST", type: "POST",
@ -37,37 +40,67 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
Path: form.querySelector(".txtEncoderPath").value, Path: form.querySelector(".txtEncoderPath").value,
PathType: "Custom" PathType: "Custom"
} }
}).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure) }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure);
}) });
} }
function onSubmit() { function onSubmit() {
var form = this, var form = this;
onDecoderConfirmed = function() {
loading.show(), ApiClient.getNamedConfiguration("encoding").then(function(config) { var onDecoderConfirmed = function () {
config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val(), config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val(), config.EncodingThreadCount = $("#selectThreadCount", form).val(), config.HardwareAccelerationType = $("#selectVideoDecoder", form).val(), config.VaapiDevice = $("#txtVaapiDevice", form).val(), config.H264Preset = form.querySelector("#selectH264Preset").value, config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"), config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked, config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function(c) { loading.show();
return c.checked ApiClient.getNamedConfiguration("encoding").then(function (config) {
}), function(c) { config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val();
return c.getAttribute("data-codec") config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val();
}), config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked, ApiClient.updateNamedConfiguration("encoding", config).then(function() { config.EncodingThreadCount = $("#selectThreadCount", form).val();
updateEncoder(form) config.HardwareAccelerationType = $("#selectVideoDecoder", form).val();
}) config.VaapiDevice = $("#txtVaapiDevice", form).val();
}) config.H264Preset = form.querySelector("#selectH264Preset").value;
}; config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0");
return $("#selectVideoDecoder", form).val() ? require(["alert"], function(alert) { config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked;
alert({ config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) {
title: globalize.translate("TitleHardwareAcceleration"), return c.checked;
text: globalize.translate("HardwareAccelerationWarning") }), function (c) {
}).then(onDecoderConfirmed) return c.getAttribute("data-codec");
}) : onDecoderConfirmed(), !1 });
config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked;
ApiClient.updateNamedConfiguration("encoding", config).then(function () {
updateEncoder(form);
});
});
};
if ($("#selectVideoDecoder", form).val()) {
require(["alert"], function (alert) {
alert({
title: globalize.translate("TitleHardwareAcceleration"),
text: globalize.translate("HardwareAccelerationWarning")
}).then(onDecoderConfirmed);
});
} else {
onDecoderConfirmed();
}
return false;
} }
function setDecodingCodecsVisible(context, value) { function setDecodingCodecsVisible(context, value) {
value = value || ""; value = value || "";
var any; var any;
Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function(c) { Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function (c) {
-1 === c.getAttribute("data-types").split(",").indexOf(value) ? dom.parentWithTag(c, "LABEL").classList.add("hide") : (dom.parentWithTag(c, "LABEL").classList.remove("hide"), any = !0) if (-1 === c.getAttribute("data-types").split(",").indexOf(value)) {
}), any ? context.querySelector(".decodingCodecsList").classList.remove("hide") : context.querySelector(".decodingCodecsList").classList.add("hide") dom.parentWithTag(c, "LABEL").classList.add("hide");
} else {
dom.parentWithTag(c, "LABEL").classList.remove("hide");
any = true;
}
});
if (any) {
context.querySelector(".decodingCodecsList").classList.remove("hide");
} else {
context.querySelector(".decodingCodecsList").classList.add("hide");
}
} }
function getTabs() { function getTabs() {
@ -80,44 +113,69 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#encodingSettingsPage", function() { $(document).on("pageinit", "#encodingSettingsPage", function () {
var page = this; var page = this;
page.querySelector("#selectVideoDecoder").addEventListener("change", function() { page.querySelector("#selectVideoDecoder").addEventListener("change", function () {
"vaapi" == this.value ? (page.querySelector(".fldVaapiDevice").classList.remove("hide"), page.querySelector("#txtVaapiDevice").setAttribute("required", "required")) : (page.querySelector(".fldVaapiDevice").classList.add("hide"), page.querySelector("#txtVaapiDevice").removeAttribute("required")), this.value ? page.querySelector(".hardwareAccelerationOptions").classList.remove("hide") : page.querySelector(".hardwareAccelerationOptions").classList.add("hide"), setDecodingCodecsVisible(page, this.value) if ("vaapi" == this.value) {
}), $("#btnSelectEncoderPath", page).on("click.selectDirectory", function() { page.querySelector(".fldVaapiDevice").classList.remove("hide");
require(["directorybrowser"], function(directoryBrowser) { page.querySelector("#txtVaapiDevice").setAttribute("required", "required");
var picker = new directoryBrowser; } else {
page.querySelector(".fldVaapiDevice").classList.add("hide");
page.querySelector("#txtVaapiDevice").removeAttribute("required");
}
if (this.value) {
page.querySelector(".hardwareAccelerationOptions").classList.remove("hide");
} else {
page.querySelector(".hardwareAccelerationOptions").classList.add("hide");
}
setDecodingCodecsVisible(page, this.value);
});
$("#btnSelectEncoderPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
includeFiles: !0, includeFiles: true,
callback: function(path) { callback: function (path) {
path && $(".txtEncoderPath", page).val(path), picker.close() if (path) {
$(".txtEncoderPath", page).val(path);
}
picker.close();
} }
}) });
}) });
}), $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() { });
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtTranscodingTempPath", page).val(path), picker.close() if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0, validateWriteable: true,
header: globalize.translate("HeaderSelectTranscodingPath"), header: globalize.translate("HeaderSelectTranscodingPath"),
instruction: globalize.translate("HeaderSelectTranscodingPathHelp") instruction: globalize.translate("HeaderSelectTranscodingPathHelp")
}) });
}) });
}), $(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit) });
}).on("pageshow", "#encodingSettingsPage", function() { $(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#encodingSettingsPage", function () {
loading.show(); loading.show();
libraryMenu.setTabs("playback", 0, getTabs); libraryMenu.setTabs("playback", 0, getTabs);
var page = this; var page = this;
ApiClient.getNamedConfiguration("encoding").then(function(config) { ApiClient.getNamedConfiguration("encoding").then(function (config) {
ApiClient.getSystemInfo().then(function(systemInfo) { ApiClient.getSystemInfo().then(function (systemInfo) {
loadPage(page, config, systemInfo); loadPage(page, config, systemInfo);
}) });
}) });
}) });
}); });

View file

@ -1,37 +1,53 @@
define([], function() { define([], function () {
"use strict"; "use strict";
function processForgotPasswordResult(result) { function processForgotPasswordResult(result) {
if ("ContactAdmin" == result.Action) return void Dashboard.alert({ if ("ContactAdmin" == result.Action) {
message: Globalize.translate("MessageContactAdminToResetPassword"), return void Dashboard.alert({
title: Globalize.translate("HeaderForgotPassword") message: Globalize.translate("MessageContactAdminToResetPassword"),
}); title: Globalize.translate("HeaderForgotPassword")
if ("InNetworkRequired" == result.Action) return void Dashboard.alert({ });
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"), }
title: Globalize.translate("HeaderForgotPassword")
}); if ("InNetworkRequired" == result.Action) {
return void Dashboard.alert({
message: Globalize.translate("MessageForgotPasswordInNetworkRequired"),
title: Globalize.translate("HeaderForgotPassword")
});
}
if ("PinCode" == result.Action) { if ("PinCode" == result.Action) {
var msg = Globalize.translate("MessageForgotPasswordFileCreated"); var msg = Globalize.translate("MessageForgotPasswordFileCreated");
return msg += "<br/>", msg += "<br/>", msg += "Enter PIN here to finish Password Reset<br/>" ,msg += "<br/>",msg += result.PinFile, msg += "<br/>", void Dashboard.alert({ msg += "<br/>";
msg += "<br/>";
msg += "Enter PIN here to finish Password Reset<br/>";
msg += "<br/>";
msg += result.PinFile;
msg += "<br/>";
return void Dashboard.alert({
message: msg, message: msg,
title: Globalize.translate("HeaderForgotPassword"), title: Globalize.translate("HeaderForgotPassword"),
callback: function() { callback: function () {
Dashboard.navigate("forgotpasswordpin.html") Dashboard.navigate("forgotpasswordpin.html");
} }
}) });
} }
} }
return function(view, params) {
return function (view, params) {
function onSubmit(e) { function onSubmit(e) {
return ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword"), url: ApiClient.getUrl("Users/ForgotPassword"),
dataType: "json", dataType: "json",
data: { data: {
EnteredUsername: view.querySelector("#txtName").value EnteredUsername: view.querySelector("#txtName").value
} }
}).then(processForgotPasswordResult), e.preventDefault(), !1 }).then(processForgotPasswordResult);
e.preventDefault();
return false;
} }
view.querySelector("form").addEventListener("submit", onSubmit)
} view.querySelector("form").addEventListener("submit", onSubmit);
};
}); });

View file

@ -1,33 +1,41 @@
define([], function() { define([], function () {
"use strict"; "use strict";
function processForgotPasswordResult(result) { function processForgotPasswordResult(result) {
if (result.Success) { if (result.Success) {
var msg = Globalize.translate("MessagePasswordResetForUsers"); var msg = Globalize.translate("MessagePasswordResetForUsers");
return msg += "<br/>", msg += "<br/>", msg += result.UsersReset.join("<br/>"), void Dashboard.alert({ msg += "<br/>";
msg += "<br/>";
msg += result.UsersReset.join("<br/>");
return void Dashboard.alert({
message: msg, message: msg,
title: Globalize.translate("HeaderPasswordReset"), title: Globalize.translate("HeaderPasswordReset"),
callback: function() { callback: function () {
window.location.href = "index.html" window.location.href = "index.html";
} }
}) });
} }
Dashboard.alert({ Dashboard.alert({
message: Globalize.translate("MessageInvalidForgotPasswordPin"), message: Globalize.translate("MessageInvalidForgotPasswordPin"),
title: Globalize.translate("HeaderPasswordReset") title: Globalize.translate("HeaderPasswordReset")
}) });
} }
return function(view, params) {
return function (view, params) {
function onSubmit(e) { function onSubmit(e) {
return ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("Users/ForgotPassword/Pin"), url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
dataType: "json", dataType: "json",
data: { data: {
Pin: view.querySelector("#txtPin").value Pin: view.querySelector("#txtPin").value
} }
}).then(processForgotPasswordResult), e.preventDefault(), !1 }).then(processForgotPasswordResult);
e.preventDefault();
return false;
} }
view.querySelector("form").addEventListener("submit", onSubmit)
} view.querySelector("form").addEventListener("submit", onSubmit);
}); };
});

View file

@ -1,4 +1,4 @@
define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function(TabbedView, globalize, require) { define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function (TabbedView, globalize, require) {
"use strict"; "use strict";
function getTabs() { function getTabs() {
@ -6,47 +6,70 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-
name: globalize.translate("Home") name: globalize.translate("Home")
}, { }, {
name: globalize.translate("Favorites") name: globalize.translate("Favorites")
}] }];
} }
function getDefaultTabIndex() { function getDefaultTabIndex() {
return 0 return 0;
} }
function getRequirePromise(deps) { function getRequirePromise(deps) {
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
require(deps, resolve) require(deps, resolve);
}) });
} }
function getTabController(index) { function getTabController(index) {
if (null == index) throw new Error("index cannot be null"); if (null == index) {
throw new Error("index cannot be null");
}
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/hometab"); depends.push("controllers/hometab");
break; break;
case 1: case 1:
depends.push("controllers/favorites") depends.push("controllers/favorites");
} }
var instance = this; var instance = this;
return getRequirePromise(depends).then(function(controllerFactory) { return getRequirePromise(depends).then(function (controllerFactory) {
var controller = instance.tabControllers[index]; var controller = instance.tabControllers[index];
if (!controller) { if (!controller) {
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params), instance.tabControllers[index] = controller controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
instance.tabControllers[index] = controller;
} }
return controller
}) return controller;
});
} }
function HomeView(view, params) { function HomeView(view, params) {
TabbedView.call(this, view, params) TabbedView.call(this, view, params);
} }
return Object.assign(HomeView.prototype, TabbedView.prototype), HomeView.prototype.getTabs = getTabs, HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex, HomeView.prototype.getTabController = getTabController, HomeView.prototype.setTitle = function() {
Emby.Page.setTitle(null) Object.assign(HomeView.prototype, TabbedView.prototype);
}, HomeView.prototype.onPause = function() { HomeView.prototype.getTabs = getTabs;
TabbedView.prototype.onPause.call(this), document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader") HomeView.prototype.getDefaultTabIndex = getDefaultTabIndex;
}, HomeView.prototype.onResume = function(options) { HomeView.prototype.getTabController = getTabController;
TabbedView.prototype.onResume.call(this, options), document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
}, HomeView HomeView.prototype.setTitle = function () {
}); Emby.Page.setTitle(null);
};
HomeView.prototype.onPause = function () {
TabbedView.prototype.onPause.call(this);
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader");
};
HomeView.prototype.onResume = function (options) {
TabbedView.prototype.onResume.call(this, options);
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader");
};
return HomeView;
});

View file

@ -1,35 +1,74 @@
define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function(userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
"use strict"; "use strict";
function HomeTab(view, params) { function HomeTab(view, params) {
this.view = view, this.params = params, this.apiClient = connectionManager.currentApiClient(), this.sectionsContainer = view.querySelector(".sections"), view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this)) this.view = view;
this.params = params;
this.apiClient = connectionManager.currentApiClient();
this.sectionsContainer = view.querySelector(".sections");
view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this));
} }
function onHomeScreenSettingsChanged() { function onHomeScreenSettingsChanged() {
this.sectionsRendered = !1, this.paused || this.onResume({ this.sectionsRendered = false;
refresh: !0
}) if (!this.paused) {
this.onResume({
refresh: true
});
}
} }
return HomeTab.prototype.onResume = function(options) {
HomeTab.prototype.onResume = function (options) {
if (this.sectionsRendered) { if (this.sectionsRendered) {
var sectionsContainer = this.sectionsContainer; var sectionsContainer = this.sectionsContainer;
return sectionsContainer ? homeSections.resume(sectionsContainer, options) : Promise.resolve()
if (sectionsContainer) {
return homeSections.resume(sectionsContainer, options);
}
return Promise.resolve();
} }
loading.show(); loading.show();
var view = this.view, var view = this.view;
apiClient = this.apiClient; var apiClient = this.apiClient;
return this.destroyHomeSections(), this.sectionsRendered = !0, apiClient.getCurrentUser().then(function(user) { this.destroyHomeSections();
return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function() { this.sectionsRendered = true;
options.autoFocus && focusManager.autoFocus(view), loading.hide() return apiClient.getCurrentUser().then(function (user) {
}) return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function () {
}) if (options.autoFocus) {
}, HomeTab.prototype.onPause = function() { focusManager.autoFocus(view);
}
loading.hide();
});
});
};
HomeTab.prototype.onPause = function () {
var sectionsContainer = this.sectionsContainer; var sectionsContainer = this.sectionsContainer;
sectionsContainer && homeSections.pause(sectionsContainer)
}, HomeTab.prototype.destroy = function() { if (sectionsContainer) {
this.view = null, this.params = null, this.apiClient = null, this.destroyHomeSections(), this.sectionsContainer = null homeSections.pause(sectionsContainer);
}, HomeTab.prototype.destroyHomeSections = function() { }
};
HomeTab.prototype.destroy = function () {
this.view = null;
this.params = null;
this.apiClient = null;
this.destroyHomeSections();
this.sectionsContainer = null;
};
HomeTab.prototype.destroyHomeSections = function () {
var sectionsContainer = this.sectionsContainer; var sectionsContainer = this.sectionsContainer;
sectionsContainer && homeSections.destroySections(sectionsContainer)
}, HomeTab if (sectionsContainer) {
}); homeSections.destroySections(sectionsContainer);
}
};
return HomeTab;
});

View file

@ -1,21 +1,22 @@
define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function(loading, libraryMenu, dom, globalize) { define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function (loading, libraryMenu, dom, globalize) {
"use strict"; "use strict";
function deletePlugin(page, uniqueid, name) { function deletePlugin(page, uniqueid, name) {
var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name); var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name);
require(["confirm"], function(confirm) {
require(["confirm"], function (confirm) {
confirm({ confirm({
title: globalize.translate("UninstallPluginHeader"), title: globalize.translate("UninstallPluginHeader"),
text: msg, text: msg,
primary: "delete", primary: "delete",
confirmText: globalize.translate("UninstallPluginHeader") confirmText: globalize.translate("UninstallPluginHeader")
}).then(function() { }).then(function () {
loading.show(); loading.show();
ApiClient.uninstallPlugin(uniqueid).then(function() { ApiClient.uninstallPlugin(uniqueid).then(function () {
reloadList(page); reloadList(page);
}); });
}) });
}) });
} }
function showNoConfigurationMessage() { function showNoConfigurationMessage() {
@ -31,23 +32,24 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
} }
function getPluginCardHtml(plugin, pluginConfigurationPages) { function getPluginCardHtml(plugin, pluginConfigurationPages) {
var configPage = pluginConfigurationPages.filter(function(pluginConfigurationPage) { var configPage = pluginConfigurationPages.filter(function (pluginConfigurationPage) {
return pluginConfigurationPage.PluginId == plugin.Id; return pluginConfigurationPage.PluginId == plugin.Id;
})[0]; })[0];
var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null;
var html = ""; var html = "";
html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>"; html += "<div data-id='" + plugin.Id + "' data-name='" + plugin.Name + "' class='card backdropCard'>";
html += '<div class="cardBox visualCardBox">'; html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable">'; html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>'; html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">'; html += configPageUrl ? '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + configPageUrl + '">' : '<div class="cardContent noConfigPluginCard noHoverEffect cardImageContainer">';
if (plugin.ImageUrl) { if (plugin.ImageUrl) {
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">"; html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.ImageUrl + "');\">";
html += "</div>"; html += "</div>";
} else { } else {
html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>'; html += '<i class="cardImageIcon md-icon">&#xE2C7;</i>';
} }
html += configPageUrl ? "</a>" : "</div>"; html += configPageUrl ? "</a>" : "</div>";
html += "</div>"; html += "</div>";
html += '<div class="cardFooter">'; html += '<div class="cardFooter">';
@ -67,21 +69,26 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
} }
function renderPlugins(page, plugins) { function renderPlugins(page, plugins) {
ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function(configPages) { ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function (configPages) {
populateList(page, plugins, configPages); populateList(page, plugins, configPages);
}); });
} }
function populateList(page, plugins, pluginConfigurationPages) { function populateList(page, plugins, pluginConfigurationPages) {
plugins = plugins.sort(function(plugin1, plugin2) { plugins = plugins.sort(function (plugin1, plugin2) {
return plugin1.Name > plugin2.Name ? 1 : -1 if (plugin1.Name > plugin2.Name) {
return 1;
}
return -1;
}); });
var html = plugins.map(function(p) { var html = plugins.map(function (p) {
return getPluginCardHtml(p, pluginConfigurationPages) return getPluginCardHtml(p, pluginConfigurationPages);
}).join(""); }).join("");
var installedPluginsElement = page.querySelector(".installedPlugins"); var installedPluginsElement = page.querySelector(".installedPlugins");
installedPluginsElement.removeEventListener("click", onInstalledPluginsClick); installedPluginsElement.removeEventListener("click", onInstalledPluginsClick);
installedPluginsElement.addEventListener("click", onInstalledPluginsClick); installedPluginsElement.addEventListener("click", onInstalledPluginsClick);
if (plugins.length) { if (plugins.length) {
installedPluginsElement.classList.add("itemsContainer"); installedPluginsElement.classList.add("itemsContainer");
installedPluginsElement.classList.add("vertical-wrap"); installedPluginsElement.classList.add("vertical-wrap");
@ -93,6 +100,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
html += "</a></p>"; html += "</a></p>";
html += "</div>"; html += "</div>";
} }
installedPluginsElement.innerHTML = html; installedPluginsElement.innerHTML = html;
loading.hide(); loading.hide();
} }
@ -103,6 +111,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
var name = card.getAttribute("data-name"); var name = card.getAttribute("data-name");
var configHref = card.querySelector(".cardContent").getAttribute("href"); var configHref = card.querySelector(".cardContent").getAttribute("href");
var menuItems = []; var menuItems = [];
if (configHref) { if (configHref) {
menuItems.push({ menuItems.push({
name: globalize.translate("ButtonSettings"), name: globalize.translate("ButtonSettings"),
@ -110,22 +119,25 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
ironIcon: "mode-edit" ironIcon: "mode-edit"
}); });
} }
menuItems.push({ menuItems.push({
name: globalize.translate("ButtonUninstall"), name: globalize.translate("ButtonUninstall"),
id: "delete", id: "delete",
ironIcon: "delete" ironIcon: "delete"
}); });
require(["actionsheet"], function(actionsheet) {
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: elem, positionTo: elem,
callback: function(resultId) { callback: function (resultId) {
switch (resultId) { switch (resultId) {
case "open": case "open":
Dashboard.navigate(configHref); Dashboard.navigate(configHref);
break; break;
case "delete": case "delete":
deletePlugin(page, id, name) deletePlugin(page, id, name);
} }
} }
}); });
@ -134,7 +146,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
function reloadList(page) { function reloadList(page) {
loading.show(); loading.show();
ApiClient.getInstalledPlugins().then(function(plugins) { ApiClient.getInstalledPlugins().then(function (plugins) {
renderPlugins(page, plugins); renderPlugins(page, plugins);
}); });
} }
@ -146,7 +158,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
}, { }, {
href: "availableplugins.html", href: "availableplugins.html",
name: globalize.translate("TabCatalog") name: globalize.translate("TabCatalog")
}] }];
} }
function onInstalledPluginsClick(e) { function onInstalledPluginsClick(e) {
@ -156,16 +168,18 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
showConnectMessage(); showConnectMessage();
} else { } else {
var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu"); var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu");
btnCardMenu && showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
if (btnCardMenu) {
showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu);
}
} }
} }
pageIdOn("pageshow", "pluginsPage", function() { pageIdOn("pageshow", "pluginsPage", function () {
libraryMenu.setTabs("plugins", 0, getTabs); libraryMenu.setTabs("plugins", 0, getTabs);
reloadList(this); reloadList(this);
}); });
window.PluginsPage = { window.PluginsPage = {
renderPlugins: renderPlugins renderPlugins: renderPlugins
} };
}); });

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,89 +1,119 @@
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function(cardBuilder, imageLoader, libraryBrowser, loading, events) { define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
return pageData || (pageData = { if (!pageData) {
query: { pageData = {
StartIndex: 0, query: {
Limit: 100, StartIndex: 0,
Fields: "PrimaryImageAspectRatio" Limit: 100,
} Fields: "PrimaryImageAspectRatio"
}), pageData }
};
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getChannelsHtml(channels) { function getChannelsHtml(channels) {
return cardBuilder.getCardsHtml({ return cardBuilder.getCardsHtml({
items: channels, items: channels,
shape: "square", shape: "square",
showTitle: !0, showTitle: true,
lazy: !0, lazy: true,
cardLayout: !0, cardLayout: true,
showDetailsMenu: !0, showDetailsMenu: true,
showCurrentProgram: !0, showCurrentProgram: true,
showCurrentProgramTime: !0 showCurrentProgramTime: true
}) });
} }
function renderChannels(context, result) { function renderChannels(context, result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(context) return;
}
query.StartIndex += query.Limit;
reloadItems(context);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(context) return;
}
query.StartIndex -= query.Limit;
reloadItems(context);
} }
var query = getQuery(); var query = getQuery();
context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({ context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
filterButton: !1 filterButton: false
}); });
var html = getChannelsHtml(result.Items), var html = getChannelsHtml(result.Items);
elem = context.querySelector("#items"); var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem); elem.innerHTML = html;
var i, length, elems; imageLoader.lazyChildren(elem);
for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); var i;
for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick) var length;
var elems;
for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
} }
function showFilterMenu(context) { function showFilterMenu(context) {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: getQuery(), query: getQuery(),
mode: "livetvchannels", mode: "livetvchannels",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
reloadItems(context) reloadItems(context);
}), filterDialog.show() });
}) filterDialog.show();
});
} }
function reloadItems(context, save) { function reloadItems(context, save) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(), var query = getQuery();
apiClient = ApiClient; var apiClient = ApiClient;
query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) { query.UserId = apiClient.getCurrentUserId();
apiClient.getLiveTvChannels(query).then(function (result) {
renderChannels(context, result); renderChannels(context, result);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var pageData, self = this, isLoading = false;
tabContent.querySelector(".btnFilter").addEventListener("click", function() { var pageData;
showFilterMenu(tabContent) var self = this;
}), self.renderTab = function() { var isLoading = false;
reloadItems(tabContent) tabContent.querySelector(".btnFilter").addEventListener("click", function () {
} showFilterMenu(tabContent);
} });
self.renderTab = function () {
reloadItems(tabContent);
};
};
}); });

View file

@ -1,16 +1,29 @@
define(["tvguide"], function(tvguide) { define(["tvguide"], function (tvguide) {
"use strict"; "use strict";
return function(view, params, tabContent) {
var guideInstance, self = this; return function (view, params, tabContent) {
self.renderTab = function() { var guideInstance;
guideInstance || (guideInstance = new tvguide({ var self = this;
element: tabContent,
serverId: ApiClient.serverId() self.renderTab = function () {
})) if (!guideInstance) {
}, self.onShow = function() { guideInstance = new tvguide({
guideInstance && guideInstance.resume() element: tabContent,
}, self.onHide = function() { serverId: ApiClient.serverId()
guideInstance && guideInstance.pause() });
} }
} };
});
self.onShow = function () {
if (guideInstance) {
guideInstance.resume();
}
};
self.onHide = function () {
if (guideInstance) {
guideInstance.pause();
}
};
};
});

View file

@ -1,69 +1,106 @@
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function(layoutManager, loading, cardBuilder, appHost, imageLoader) { define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function (layoutManager, loading, cardBuilder, appHost, imageLoader) {
"use strict"; "use strict";
function renderRecordings(elem, recordings, cardOptions, scrollX) { function renderRecordings(elem, recordings, cardOptions, scrollX) {
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide"); if (recordings.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var recordingItems = elem.querySelector(".recordingItems"); var recordingItems = elem.querySelector(".recordingItems");
scrollX ? (recordingItems.classList.add("scrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
if (scrollX) {
recordingItems.classList.add("scrollX");
recordingItems.classList.add("hiddenScrollX");
recordingItems.classList.remove("vertical-wrap");
} else {
recordingItems.classList.remove("scrollX");
recordingItems.classList.remove("hiddenScrollX");
recordingItems.classList.add("vertical-wrap");
}
appHost.supports("imageanalysis"); appHost.supports("imageanalysis");
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
items: recordings, items: recordings,
shape: scrollX ? "autooverflow" : "auto", shape: scrollX ? "autooverflow" : "auto",
defaultShape: scrollX ? "overflowBackdrop" : "backdrop", defaultShape: scrollX ? "overflowBackdrop" : "backdrop",
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
coverImage: !0, coverImage: true,
cardLayout: !1, cardLayout: false,
centerText: !0, centerText: true,
allowBottomPadding: !scrollX, allowBottomPadding: !scrollX,
preferThumb: "auto", preferThumb: "auto",
overlayText: !1 overlayText: false
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems) }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
} }
function renderLatestRecordings(context, promise) { function renderLatestRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#latestRecordings"), result.Items, { renderRecordings(context.querySelector("#latestRecordings"), result.Items, {
showYear: !0, showYear: true,
lines: 2 lines: 2
}, !1), loading.hide() }, false);
}) loading.hide();
});
} }
function renderRecordingFolders(context, promise) { function renderRecordingFolders(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#recordingFolders"), result.Items, { renderRecordings(context.querySelector("#recordingFolders"), result.Items, {
showYear: !1, showYear: false,
showParentTitle: !1 showParentTitle: false
}, !1) }, false);
}) });
} }
function onMoreClick(e) { function onMoreClick(e) {
var type = this.getAttribute("data-type"), var type = this.getAttribute("data-type");
serverId = ApiClient.serverId(); var serverId = ApiClient.serverId();
switch (type) { switch (type) {
case "latest": case "latest":
Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId) Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId);
} }
} }
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function enableFullRender() { function enableFullRender() {
return (new Date).getTime() - lastFullRender > 3e5 return new Date().getTime() - lastFullRender > 300000;
} }
var foldersPromise, latestPromise, self = this,
lastFullRender = 0; var foldersPromise;
for (var moreButtons = tabContent.querySelectorAll(".more"), i = 0, length = moreButtons.length; i < length; i++) moreButtons[i].addEventListener("click", onMoreClick); var latestPromise;
self.preRender = function() { var self = this;
enableFullRender() && (latestPromise = ApiClient.getLiveTvRecordings({ var lastFullRender = 0;
UserId: Dashboard.getCurrentUserId(), var moreButtons = tabContent.querySelectorAll(".more");
Limit: 12,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", for (var i = 0, length = moreButtons.length; i < length; i++) {
EnableTotalRecordCount: !1, moreButtons[i].addEventListener("click", onMoreClick);
EnableImageTypes: "Primary,Thumb,Backdrop"
}), foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()))
}, self.renderTab = function() {
enableFullRender() && (loading.show(), renderLatestRecordings(tabContent, latestPromise), renderRecordingFolders(tabContent, foldersPromise), lastFullRender = (new Date).getTime())
} }
}
}); self.preRender = function () {
if (enableFullRender()) {
latestPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
Limit: 12,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop"
});
foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId());
}
};
self.renderTab = function () {
if (enableFullRender()) {
loading.show();
renderLatestRecordings(tabContent, latestPromise);
renderRecordingFolders(tabContent, foldersPromise);
lastFullRender = new Date().getTime();
}
};
};
});

View file

@ -1,27 +1,50 @@
define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function(layoutManager, cardBuilder, appHost, imageLoader, loading) { define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function (layoutManager, cardBuilder, appHost, imageLoader, loading) {
"use strict"; "use strict";
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function renderRecordings(elem, recordings, cardOptions) { function renderRecordings(elem, recordings, cardOptions) {
recordings.length ? elem.classList.remove("hide") : elem.classList.add("hide"); if (recordings.length) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
var recordingItems = elem.querySelector(".recordingItems"); var recordingItems = elem.querySelector(".recordingItems");
enableScrollX() ? (recordingItems.classList.add("scrollX"), layoutManager.tv && recordingItems.classList.add("smoothScrollX"), recordingItems.classList.add("hiddenScrollX"), recordingItems.classList.remove("vertical-wrap")) : (recordingItems.classList.remove("scrollX"), recordingItems.classList.remove("smoothScrollX"), recordingItems.classList.remove("hiddenScrollX"), recordingItems.classList.add("vertical-wrap"));
var supportsImageAnalysis = appHost.supports("imageanalysis"), if (enableScrollX()) {
cardLayout = appHost.preferVisualCards || supportsImageAnalysis; recordingItems.classList.add("scrollX");
cardLayout = !1, recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
if (layoutManager.tv) {
recordingItems.classList.add("smoothScrollX");
}
recordingItems.classList.add("hiddenScrollX");
recordingItems.classList.remove("vertical-wrap");
} else {
recordingItems.classList.remove("scrollX");
recordingItems.classList.remove("smoothScrollX");
recordingItems.classList.remove("hiddenScrollX");
recordingItems.classList.add("vertical-wrap");
}
var supportsImageAnalysis = appHost.supports("imageanalysis");
var cardLayout = appHost.preferVisualCards || supportsImageAnalysis;
cardLayout = false;
recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({
items: recordings, items: recordings,
shape: enableScrollX() ? "autooverflow" : "auto", shape: enableScrollX() ? "autooverflow" : "auto",
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
coverImage: !0, coverImage: true,
cardLayout: cardLayout, cardLayout: cardLayout,
centerText: !cardLayout, centerText: !cardLayout,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
preferThumb: "auto" preferThumb: "auto"
}, cardOptions || {})), imageLoader.lazyChildren(recordingItems) }, cardOptions || {}));
imageLoader.lazyChildren(recordingItems);
} }
function getBackdropShape() { function getBackdropShape() {
@ -29,52 +52,72 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc
} }
function renderActiveRecordings(context, promise) { function renderActiveRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderRecordings(context.querySelector("#activeRecordings"), result.Items, { renderRecordings(context.querySelector("#activeRecordings"), result.Items, {
shape: enableScrollX() ? "autooverflow" : "auto", shape: enableScrollX() ? "autooverflow" : "auto",
defaultShape: getBackdropShape(), defaultShape: getBackdropShape(),
showParentTitle: !1, showParentTitle: false,
showParentTitleOrTitle: !0, showParentTitleOrTitle: true,
showTitle: !1, showTitle: false,
showAirTime: !0, showAirTime: true,
showAirEndTime: !0, showAirEndTime: true,
showChannelName: !0, showChannelName: true,
coverImage: !0, coverImage: true,
overlayText: !1, overlayText: false,
overlayMoreButton: !0 overlayMoreButton: true
}) });
}) });
} }
function renderTimers(context, timers, options) { function renderTimers(context, timers, options) {
LiveTvHelpers.getTimersHtml(timers, options).then(function(html) { LiveTvHelpers.getTimersHtml(timers, options).then(function (html) {
var elem = context; var elem = context;
html ? elem.classList.remove("hide") : elem.classList.add("hide"), elem.querySelector(".recordingItems").innerHTML = html, imageLoader.lazyChildren(elem)
}) if (html) {
elem.classList.remove("hide");
} else {
elem.classList.add("hide");
}
elem.querySelector(".recordingItems").innerHTML = html;
imageLoader.lazyChildren(elem);
});
} }
function renderUpcomingRecordings(context, promise) { function renderUpcomingRecordings(context, promise) {
promise.then(function(result) { promise.then(function (result) {
renderTimers(context.querySelector("#upcomingRecordings"), result.Items), loading.hide() renderTimers(context.querySelector("#upcomingRecordings"), result.Items);
}) loading.hide();
});
} }
return function(view, params, tabContent) {
var activeRecordingsPromise, upcomingRecordingsPromise, self = this; return function (view, params, tabContent) {
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function() { var activeRecordingsPromise;
self.preRender(), self.renderTab() var upcomingRecordingsPromise;
}), self.preRender = function() { var self = this;
tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function () {
self.preRender();
self.renderTab();
});
self.preRender = function () {
activeRecordingsPromise = ApiClient.getLiveTvRecordings({ activeRecordingsPromise = ApiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(), UserId: Dashboard.getCurrentUserId(),
IsInProgress: !0, IsInProgress: true,
Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo",
EnableTotalRecordCount: !1, EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb,Backdrop" EnableImageTypes: "Primary,Thumb,Backdrop"
}), upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ });
IsActive: !1, upcomingRecordingsPromise = ApiClient.getLiveTvTimers({
IsScheduled: !0 IsActive: false,
}) IsScheduled: true
}, self.renderTab = function() { });
loading.show(), renderActiveRecordings(tabContent, activeRecordingsPromise), renderUpcomingRecordings(tabContent, upcomingRecordingsPromise) };
}
} self.renderTab = function () {
}); loading.show();
renderActiveRecordings(tabContent, activeRecordingsPromise);
renderUpcomingRecordings(tabContent, upcomingRecordingsPromise);
};
};
});

View file

@ -1,4 +1,4 @@
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function(datetime, cardBuilder, imageLoader, appHost, loading) { define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function (datetime, cardBuilder, imageLoader, appHost, loading) {
"use strict"; "use strict";
function renderTimers(context, timers) { function renderTimers(context, timers) {
@ -8,36 +8,44 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i
items: timers, items: timers,
shape: "auto", shape: "auto",
defaultShape: "portrait", defaultShape: "portrait",
showTitle: !0, showTitle: true,
cardLayout: !1, cardLayout: false,
preferThumb: "auto", preferThumb: "auto",
coverImage: !0, coverImage: true,
overlayText: !1, overlayText: false,
showSeriesTimerTime: !0, showSeriesTimerTime: true,
showSeriesTimerChannel: !0, showSeriesTimerChannel: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
lines: 3 lines: 3
}); });
var elem = context.querySelector("#items"); var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide() elem.innerHTML = html;
imageLoader.lazyChildren(elem);
loading.hide();
} }
function reload(context, promise) { function reload(context, promise) {
loading.show(), promise.then(function(result) { loading.show();
renderTimers(context, result.Items) promise.then(function (result) {
}) renderTimers(context, result.Items);
});
} }
var query = { var query = {
SortBy: "SortName", SortBy: "SortName",
SortOrder: "Ascending" SortOrder: "Ascending"
}; };
return function(view, params, tabContent) { return function (view, params, tabContent) {
var timersPromise, self = this; var timersPromise;
self.preRender = function() { var self = this;
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
}, self.renderTab = function() { self.preRender = function () {
reload(tabContent, timersPromise) timersPromise = ApiClient.getLiveTvSeriesTimers(query);
} };
}
}); self.renderTab = function () {
reload(tabContent, timersPromise);
};
};
});

View file

@ -23,6 +23,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (enableScrollX()) { if (enableScrollX()) {
return 12; return 12;
} }
return 9; return 9;
} }
@ -150,15 +151,22 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
} }
function getTabs() { function getTabs() {
return [ return [{
{ name: globalize.translate("Programs") }, name: globalize.translate("Programs")
{ name: globalize.translate("TabGuide") }, }, {
{ name: globalize.translate("TabChannels") }, name: globalize.translate("TabGuide")
{ name: globalize.translate("TabRecordings") }, }, {
{ name: globalize.translate("HeaderSchedule") }, name: globalize.translate("TabChannels")
{ name: globalize.translate("TabSeries") }, }, {
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" } name: globalize.translate("TabRecordings")
]; }, {
name: globalize.translate("HeaderSchedule")
}, {
name: globalize.translate("TabSeries")
}, {
name: globalize.translate("ButtonSearch"),
cssClass: "searchTabButton"
}];
} }
function setScrollClasses(elem, scrollX) { function setScrollClasses(elem, scrollX) {
@ -183,6 +191,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (userSettings.get("landing-" + folderId) === "guide") { if (userSettings.get("landing-" + folderId) === "guide") {
return 1; return 1;
} }
return 0; return 0;
} }
@ -220,21 +229,27 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
switch (index) { switch (index) {
case 0: case 0:
break; break;
case 1: case 1:
depends.push("controllers/livetv/livetvguide"); depends.push("controllers/livetv/livetvguide");
break; break;
case 2: case 2:
depends.push("controllers/livetv/livetvchannels"); depends.push("controllers/livetv/livetvchannels");
break; break;
case 3: case 3:
depends.push("controllers/livetv/livetvrecordings"); depends.push("controllers/livetv/livetvrecordings");
break; break;
case 4: case 4:
depends.push("controllers/livetv/livetvschedule"); depends.push("controllers/livetv/livetvschedule");
break; break;
case 5: case 5:
depends.push("controllers/livetv/livetvseriestimers"); depends.push("controllers/livetv/livetvseriestimers");
break; break;
case 6: case 6:
depends.push("scripts/searchtab"); depends.push("scripts/searchtab");
} }
@ -251,6 +266,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
if (!controller) { if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (0 === index) { if (0 === index) {
controller = self; controller = self;
} else if (6 === index) { } else if (6 === index) {
@ -260,6 +276,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
} else { } else {
controller = new controllerFactory(view, params, tabContent); controller = new controllerFactory(view, params, tabContent);
} }
tabControllers[index] = controller; tabControllers[index] = controller;
if (controller.initTab) { if (controller.initTab) {
@ -347,15 +364,18 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize",
}); });
view.addEventListener("viewshow", function (evt) { view.addEventListener("viewshow", function (evt) {
isViewRestored = evt.detail.isRestored; isViewRestored = evt.detail.isRestored;
if (!isViewRestored) { if (!isViewRestored) {
mainTabsManager.selectedTabIndex(initialTabIndex); mainTabsManager.selectedTabIndex(initialTabIndex);
} }
inputManager.on(window, onInputCommand); inputManager.on(window, onInputCommand);
}); });
view.addEventListener("viewbeforehide", function (e__u) { view.addEventListener("viewbeforehide", function (e) {
if (currentTabController && currentTabController.onHide) { if (currentTabController && currentTabController.onHide) {
currentTabController.onHide(); currentTabController.onHide();
} }
inputManager.off(window, onInputCommand); inputManager.off(window, onInputCommand);
}); });
view.addEventListener("viewdestroy", function (evt) { view.addEventListener("viewdestroy", function (evt) {

View file

@ -1,26 +1,30 @@
define(["events", "loading"], function(events, loading) { define(["events", "loading"], function (events, loading) {
"use strict"; "use strict";
function onListingsSubmitted() { function onListingsSubmitted() {
Dashboard.navigate("livetvstatus.html") Dashboard.navigate("livetvstatus.html");
} }
function init(page, type, providerId) { function init(page, type, providerId) {
var url = "components/tvproviders/" + type + ".js"; var url = "components/tvproviders/" + type + ".js";
require([url], function(factory) {
require([url], function (factory) {
var instance = new factory(page, providerId, {}); var instance = new factory(page, providerId, {});
events.on(instance, "submitted", onListingsSubmitted), instance.init() events.on(instance, "submitted", onListingsSubmitted);
}) instance.init();
});
} }
function loadTemplate(page, type, providerId) { function loadTemplate(page, type, providerId) {
require(["text!./components/tvproviders/" + type + ".template.html"], function(html) { require(["text!./components/tvproviders/" + type + ".template.html"], function (html) {
page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html), init(page, type, providerId) page.querySelector(".providerTemplate").innerHTML = Globalize.translateDocument(html);
}) init(page, type, providerId);
});
} }
pageIdOn("pageshow", "liveTvGuideProviderPage", function() {
pageIdOn("pageshow", "liveTvGuideProviderPage", function () {
loading.show(); loading.show();
var providerId = getParameterByName("id"); var providerId = getParameterByName("id");
loadTemplate(this, getParameterByName("type"), providerId) loadTemplate(this, getParameterByName("type"), providerId);
}) });
}); });

View file

@ -1,79 +1,127 @@
define(["jQuery", "loading", "fnchecked", "emby-button"], function($, loading) { define(["jQuery", "loading", "fnchecked", "emby-button"], function ($, loading) {
"use strict"; "use strict";
function loadPage(page, config) { function loadPage(page, config) {
$(".liveTvSettingsForm", page).show(), $(".noLiveTvServices", page).hide(), $("#selectGuideDays", page).val(config.GuideDays || ""), $("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60), $("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60), page.querySelector("#txtRecordingPath").value = config.RecordingPath || "", page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "", page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "", page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "", page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "", loading.hide() $(".liveTvSettingsForm", page).show();
$(".noLiveTvServices", page).hide();
$("#selectGuideDays", page).val(config.GuideDays || "");
$("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60);
$("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60);
page.querySelector("#txtRecordingPath").value = config.RecordingPath || "";
page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || "";
page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || "";
page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || "";
page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || "";
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
config.GuideDays = $("#selectGuideDays", form).val() || null; config.GuideDays = $("#selectGuideDays", form).val() || null;
var recordingPath = form.querySelector("#txtRecordingPath").value || null, var recordingPath = form.querySelector("#txtRecordingPath").value || null;
movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null, var movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null;
seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null, var seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null;
recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath; var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
config.RecordingPath = recordingPath, config.MovieRecordingPath = movieRecordingPath, config.SeriesRecordingPath = seriesRecordingPath, config.RecordingEncodingFormat = "mkv", config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val(), config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val(), config.RecordingPostProcessor = $("#txtPostProcessor", form).val(), config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val(), ApiClient.updateNamedConfiguration("livetv", config).then(function() { config.RecordingPath = recordingPath;
Dashboard.processServerConfigurationUpdateResult(), showSaveMessage(recordingPathChanged) config.MovieRecordingPath = movieRecordingPath;
}) config.SeriesRecordingPath = seriesRecordingPath;
}), !1 config.RecordingEncodingFormat = "mkv";
config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val();
config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val();
config.RecordingPostProcessor = $("#txtPostProcessor", form).val();
config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val();
ApiClient.updateNamedConfiguration("livetv", config).then(function () {
Dashboard.processServerConfigurationUpdateResult();
showSaveMessage(recordingPathChanged);
});
});
return false;
} }
function showSaveMessage(recordingPathChanged) { function showSaveMessage(recordingPathChanged) {
var msg = ""; var msg = "";
recordingPathChanged && (msg += Globalize.translate("RecordingPathChangeMessage")), msg && require(["alert"], function(alert) {
alert(msg) if (recordingPathChanged) {
}) msg += Globalize.translate("RecordingPathChangeMessage");
}
if (msg) {
require(["alert"], function (alert) {
alert(msg);
});
}
} }
$(document).on("pageinit", "#liveTvSettingsPage", function() {
$(document).on("pageinit", "#liveTvSettingsPage", function () {
var page = this; var page = this;
$(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit), $("#btnSelectRecordingPath", page).on("click.selectDirectory", function() { $(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectRecordingPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtRecordingPath", page).val(path), picker.close() if (path) {
$("#txtRecordingPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0 validateWriteable: true
}) });
}) });
}), $("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function() { });
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtMovieRecordingPath", page).val(path), picker.close() if (path) {
$("#txtMovieRecordingPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0 validateWriteable: true
}) });
}) });
}), $("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function() { });
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtSeriesRecordingPath", page).val(path), picker.close() if (path) {
$("#txtSeriesRecordingPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0 validateWriteable: true
}) });
}) });
}), $("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function() { });
require(["directorybrowser"], function(directoryBrowser) { $("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function () {
var picker = new directoryBrowser; require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
includeFiles: !0, includeFiles: true,
callback: function(path) { callback: function (path) {
path && $("#txtPostProcessor", page).val(path), picker.close() if (path) {
$("#txtPostProcessor", page).val(path);
}
picker.close();
} }
}) });
}) });
}) });
}).on("pageshow", "#liveTvSettingsPage", function() { }).on("pageshow", "#liveTvSettingsPage", function () {
loading.show(); loading.show();
var page = this; var page = this;
ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
loadPage(page, config) loadPage(page, config);
}) });
}) });
}); });

View file

@ -1,42 +1,75 @@
define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) { define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading) {
"use strict"; "use strict";
function getDeviceHtml(device) { function getDeviceHtml(device) {
var padderClass, html = "", var padderClass;
cssClass = "card scalableCard", var html = "";
cardBoxCssClass = "cardBox visualCardBox"; var cssClass = "card scalableCard";
return cssClass += " backdropCard backdropCard-scalable", padderClass = "cardPadder-backdrop", layoutManager.tv && (cssClass += " card-focusscale", cardBoxCssClass += " cardBox-focustransform"), cardBoxCssClass += " card-focuscontent", html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">', html += '<div class="' + cardBoxCssClass + '">', html += '<div class="cardScalable visualCardBox-cardScalable">', html += '<div class="' + padderClass + '"></div>', html += '<div class="cardContent searchImage">', html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>', html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>', html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>", html += '<div class="cardText cardText-secondary">', html += device.Url || "&nbsp;", html += "</div>", html += "</div>", html += "</div>", html += "</div>" var cardBoxCssClass = "cardBox visualCardBox";
cssClass += " backdropCard backdropCard-scalable";
padderClass = "cardPadder-backdrop";
if (layoutManager.tv) {
cssClass += " card-focusscale";
cardBoxCssClass += " cardBox-focustransform";
}
cardBoxCssClass += " card-focuscontent";
html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="' + padderClass + '"></div>';
html += '<div class="cardContent searchImage">';
html += '<div class="cardImageContainer coveredImage"><i class="cardImageIcon md-icon">dvr</i></div>';
html += "</div>";
html += "</div>";
html += '<div class="cardFooter visualCardBox-cardFooter">';
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><i class="md-icon">more_horiz</i></button>';
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + "</div>";
html += '<div class="cardText cardText-secondary">';
html += device.Url || "&nbsp;";
html += "</div>";
html += "</div>";
html += "</div>";
return html += "</div>";
} }
function renderDevices(page, devices) { function renderDevices(page, devices) {
var html = devices.map(getDeviceHtml).join(""); var html = devices.map(getDeviceHtml).join("");
page.querySelector(".devicesList").innerHTML = html page.querySelector(".devicesList").innerHTML = html;
} }
function deleteDevice(page, id) { function deleteDevice(page, id) {
var message = globalize.translate("MessageConfirmDeleteTunerDevice"); var message = globalize.translate("MessageConfirmDeleteTunerDevice");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteDevice")).then(function() { require(["confirm"], function (confirm) {
loading.show(), ApiClient.ajax({ confirm(message, globalize.translate("HeaderDeleteDevice")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("LiveTv/TunerHosts", { url: ApiClient.getUrl("LiveTv/TunerHosts", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
reload(page) reload(page);
}) });
}) });
}) });
} }
function reload(page) { function reload(page) {
loading.show(), ApiClient.getNamedConfiguration("livetv").then(function(config) { loading.show();
renderDevices(page, config.TunerHosts), renderProviders(page, config.ListingProviders) ApiClient.getNamedConfiguration("livetv").then(function (config) {
}), loading.hide() renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders);
});
loading.hide();
} }
function submitAddDeviceForm(page) { function submitAddDeviceForm(page) {
page.querySelector(".dlgAddDevice").close(), loading.show(), ApiClient.ajax({ page.querySelector(".dlgAddDevice").close();
loading.show();
ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"), url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify({ data: JSON.stringify({
@ -44,30 +77,47 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
Url: $("#txtDevicePath", page).val() Url: $("#txtDevicePath", page).val()
}), }),
contentType: "application/json" contentType: "application/json"
}).then(function() { }).then(function () {
reload(page) reload(page);
}, function() { }, function () {
Dashboard.alert({ Dashboard.alert({
message: globalize.translate("ErrorAddingTunerDevice") message: globalize.translate("ErrorAddingTunerDevice")
}) });
}) });
} }
function renderProviders(page, providers) { function renderProviders(page, providers) {
var html = ""; var html = "";
if (providers.length) { if (providers.length) {
html += '<div class="paperList">'; html += '<div class="paperList">';
for (var i = 0, length = providers.length; i < length; i++) { for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i]; var provider = providers[i];
html += '<div class="listItem">', html += '<i class="listItemIcon md-icon">dvr</i>', html += '<div class="listItemBody two-line">', html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">', html += '<h3 class="listItemBodyText">', html += getProviderName(provider.Type), html += "</h3>", html += '<div class="listItemBodyText secondary">', html += provider.Path || provider.ListingsId || "", html += "</div>", html += "</a>", html += "</div>", html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>', html += "</div>" html += '<div class="listItem">';
html += '<i class="listItemIcon md-icon">dvr</i>';
html += '<div class="listItemBody two-line">';
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + "&id=" + provider.Id + '">';
html += '<h3 class="listItemBodyText">';
html += getProviderName(provider.Type);
html += "</h3>";
html += '<div class="listItemBodyText secondary">';
html += provider.Path || provider.ListingsId || "";
html += "</div>";
html += "</a>";
html += "</div>";
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><i class="md-icon listItemAside">more_horiz</i></button>';
html += "</div>";
} }
html += "</div>"
html += "</div>";
} }
var elem = $(".providerList", page).html(html); var elem = $(".providerList", page).html(html);
$(".btnOptions", elem).on("click", function() { $(".btnOptions", elem).on("click", function () {
var id = this.getAttribute("data-id"); var id = this.getAttribute("data-id");
showProviderOptions(page, id, this) showProviderOptions(page, id, this);
}) });
} }
function showProviderOptions(page, providerId, button) { function showProviderOptions(page, providerId, button) {
@ -75,64 +125,74 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({ items.push({
name: globalize.translate("ButtonDelete"), name: globalize.translate("ButtonDelete"),
id: "delete" id: "delete"
}), items.push({ });
items.push({
name: globalize.translate("MapChannels"), name: globalize.translate("MapChannels"),
id: "map" id: "map"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: items, items: items,
positionTo: button positionTo: button
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "delete": case "delete":
deleteProvider(page, providerId); deleteProvider(page, providerId);
break; break;
case "map": case "map":
mapChannels(page, providerId) mapChannels(page, providerId);
} }
}) });
}) });
} }
function mapChannels(page, providerId) { function mapChannels(page, providerId) {
require(["components/channelmapper/channelmapper"], function(channelmapper) { require(["components/channelmapper/channelmapper"], function (channelmapper) {
new channelmapper({ new channelmapper({
serverId: ApiClient.serverInfo().Id, serverId: ApiClient.serverInfo().Id,
providerId: providerId providerId: providerId
}).show() }).show();
}) });
} }
function deleteProvider(page, id) { function deleteProvider(page, id) {
var message = globalize.translate("MessageConfirmDeleteGuideProvider"); var message = globalize.translate("MessageConfirmDeleteGuideProvider");
require(["confirm"], function(confirm) {
confirm(message, globalize.translate("HeaderDeleteProvider")).then(function() { require(["confirm"], function (confirm) {
loading.show(), ApiClient.ajax({ confirm(message, globalize.translate("HeaderDeleteProvider")).then(function () {
loading.show();
ApiClient.ajax({
type: "DELETE", type: "DELETE",
url: ApiClient.getUrl("LiveTv/ListingProviders", { url: ApiClient.getUrl("LiveTv/ListingProviders", {
Id: id Id: id
}) })
}).then(function() { }).then(function () {
reload(page) reload(page);
}, function() { }, function () {
reload(page) reload(page);
}) });
}) });
}) });
} }
function getTunerName(providerId) { function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "m3u": case "m3u":
return "M3U"; return "M3U";
case "hdhomerun": case "hdhomerun":
return "HDHomerun"; return "HDHomerun";
case "hauppauge": case "hauppauge":
return "Hauppauge"; return "Hauppauge";
case "satip": case "satip":
return "DVB"; return "DVB";
default: default:
return "Unknown" return "Unknown";
} }
} }
@ -140,12 +200,15 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "schedulesdirect": case "schedulesdirect":
return "Schedules Direct"; return "Schedules Direct";
case "xmltv": case "xmltv":
return "Xml TV"; return "Xml TV";
case "emby": case "emby":
return "Emby Guide"; return "Emby Guide";
default: default:
return "Unknown" return "Unknown";
} }
} }
@ -153,10 +216,12 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
switch (providerId = providerId.toLowerCase()) { switch (providerId = providerId.toLowerCase()) {
case "xmltv": case "xmltv":
return "livetvguideprovider.html?type=xmltv"; return "livetvguideprovider.html?type=xmltv";
case "schedulesdirect": case "schedulesdirect":
return "livetvguideprovider.html?type=schedulesdirect"; return "livetvguideprovider.html?type=schedulesdirect";
case "emby": case "emby":
return "livetvguideprovider.html?type=emby" return "livetvguideprovider.html?type=emby";
} }
} }
@ -165,22 +230,25 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
menuItems.push({ menuItems.push({
name: "Schedules Direct", name: "Schedules Direct",
id: "SchedulesDirect" id: "SchedulesDirect"
}), menuItems.push({ });
menuItems.push({
name: "Xml TV", name: "Xml TV",
id: "xmltv" id: "xmltv"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: menuItems, items: menuItems,
positionTo: button, positionTo: button,
callback: function(id) { callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id)) Dashboard.navigate(getProviderConfigurationUrl(id));
} }
}) });
}) });
} }
function addDevice(button) { function addDevice(button) {
Dashboard.navigate("livetvtuner.html") Dashboard.navigate("livetvtuner.html");
} }
function showDeviceMenu(button, tunerDeviceId) { function showDeviceMenu(button, tunerDeviceId) {
@ -188,57 +256,73 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo
items.push({ items.push({
name: globalize.translate("ButtonDelete"), name: globalize.translate("ButtonDelete"),
id: "delete" id: "delete"
}), items.push({ });
items.push({
name: globalize.translate("ButtonEdit"), name: globalize.translate("ButtonEdit"),
id: "edit" id: "edit"
}), require(["actionsheet"], function(actionsheet) { });
require(["actionsheet"], function (actionsheet) {
actionsheet.show({ actionsheet.show({
items: items, items: items,
positionTo: button positionTo: button
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "delete": case "delete":
deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId); deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId);
break; break;
case "edit": case "edit":
Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId) Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId);
} }
}) });
}) });
} }
function onDevicesListClick(e) { function onDevicesListClick(e) {
var card = dom.parentWithClass(e.target, "card"); var card = dom.parentWithClass(e.target, "card");
if (card) { if (card) {
var id = card.getAttribute("data-id"), var id = card.getAttribute("data-id");
btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions"); var btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions");
btnCardOptions ? showDeviceMenu(btnCardOptions, id) : Dashboard.navigate("livetvtuner.html?id=" + id)
if (btnCardOptions) {
showDeviceMenu(btnCardOptions, id);
} else {
Dashboard.navigate("livetvtuner.html?id=" + id);
}
} }
} }
$(document).on("pageinit", "#liveTvStatusPage", function() {
$(document).on("pageinit", "#liveTvStatusPage", function () {
var page = this; var page = this;
$(".btnAddDevice", page).on("click", function() { $(".btnAddDevice", page).on("click", function () {
addDevice(this) addDevice(this);
}), $(".formAddDevice", page).on("submit", function() { });
return submitAddDeviceForm(page), !1 $(".formAddDevice", page).on("submit", function () {
}), $(".btnAddProvider", page).on("click", function() { submitAddDeviceForm(page);
addProvider(this) return false;
}), page.querySelector(".devicesList").addEventListener("click", onDevicesListClick) });
}).on("pageshow", "#liveTvStatusPage", function() { $(".btnAddProvider", page).on("click", function () {
addProvider(this);
});
page.querySelector(".devicesList").addEventListener("click", onDevicesListClick);
}).on("pageshow", "#liveTvStatusPage", function () {
var page = this; var page = this;
reload(page), taskButton({ reload(page);
taskButton({
mode: "on", mode: "on",
progressElem: page.querySelector(".refreshGuideProgress"), progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide", taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh") button: page.querySelector(".btnRefresh")
}) });
}).on("pagehide", "#liveTvStatusPage", function() { }).on("pagehide", "#liveTvStatusPage", function () {
var page = this; var page = this;
taskButton({ taskButton({
mode: "off", mode: "off",
progressElem: page.querySelector(".refreshGuideProgress"), progressElem: page.querySelector(".refreshGuideProgress"),
taskKey: "RefreshGuide", taskKey: "RefreshGuide",
button: page.querySelector(".btnRefresh") button: page.querySelector(".btnRefresh")
}) });
}) });
}); });

View file

@ -1,4 +1,4 @@
define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function(globalize, loading, libraryMenu, dom) { define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function (globalize, loading, libraryMenu, dom) {
"use strict"; "use strict";
function isM3uVariant(type) { function isM3uVariant(type) {
@ -6,17 +6,16 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
} }
function fillTypes(view, currentId) { function fillTypes(view, currentId) {
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function(types) { return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function (types) {
var selectType = view.querySelector(".selectType"); var selectType = view.querySelector(".selectType");
var html = ""; var html = "";
html += types.map(function(tuner) { html += types.map(function (tuner) {
return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>"; return '<option value="' + tuner.Id + '">' + tuner.Name + "</option>";
}).join(""); }).join("");
html += '<option value="other">'; html += '<option value="other">';
html += globalize.translate("TabOther"); html += globalize.translate("TabOther");
html += "</option>"; html += "</option>";
selectType.innerHTML = html; selectType.innerHTML = html;
selectType.disabled = null != currentId; selectType.disabled = null != currentId;
selectType.value = ""; selectType.value = "";
onTypeChange.call(selectType); onTypeChange.call(selectType);
@ -27,9 +26,10 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
view.querySelector(".txtDevicePath").value = ""; view.querySelector(".txtDevicePath").value = "";
view.querySelector(".chkFavorite").checked = false; view.querySelector(".chkFavorite").checked = false;
view.querySelector(".txtDevicePath").value = ""; view.querySelector(".txtDevicePath").value = "";
if (providerId) { if (providerId) {
ApiClient.getNamedConfiguration("livetv").then(function(config) { ApiClient.getNamedConfiguration("livetv").then(function (config) {
var info = config.TunerHosts.filter(function(i) { var info = config.TunerHosts.filter(function (i) {
return i.Id === providerId; return i.Id === providerId;
})[0]; })[0];
fillTunerHostInfo(view, info); fillTunerHostInfo(view, info);
@ -40,9 +40,11 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
function fillTunerHostInfo(view, info) { function fillTunerHostInfo(view, info) {
var selectType = view.querySelector(".selectType"); var selectType = view.querySelector(".selectType");
var type = info.Type || ""; var type = info.Type || "";
if (info.Source && isM3uVariant(info.Source)) { if (info.Source && isM3uVariant(info.Source)) {
type = info.Source; type = info.Source;
} }
selectType.value = type; selectType.value = type;
onTypeChange.call(selectType); onTypeChange.call(selectType);
view.querySelector(".txtDevicePath").value = info.Url || ""; view.querySelector(".txtDevicePath").value = info.Url || "";
@ -68,76 +70,164 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button
AllowHWTranscoding: page.querySelector(".chkTranscode").checked, AllowHWTranscoding: page.querySelector(".chkTranscode").checked,
EnableStreamLooping: page.querySelector(".chkStreamLoop").checked EnableStreamLooping: page.querySelector(".chkStreamLoop").checked
}; };
isM3uVariant(info.Type) && (info.Source = info.Type, info.Type = "m3u");
if (isM3uVariant(info.Type)) {
info.Source = info.Type;
info.Type = "m3u";
}
var id = getParameterByName("id"); var id = getParameterByName("id");
id && (info.Id = id);
if (id) {
info.Id = id;
}
info.Id; info.Id;
ApiClient.ajax({ ApiClient.ajax({
type: "POST", type: "POST",
url: ApiClient.getUrl("LiveTv/TunerHosts"), url: ApiClient.getUrl("LiveTv/TunerHosts"),
data: JSON.stringify(info), data: JSON.stringify(info),
contentType: "application/json" contentType: "application/json"
}).then(function(result) { }).then(function (result) {
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("livetvstatus.html") Dashboard.processServerConfigurationUpdateResult();
}, function() { Dashboard.navigate("livetvstatus.html");
loading.hide(), Dashboard.alert({ }, function () {
loading.hide();
Dashboard.alert({
message: globalize.translate("ErrorSavingTvProvider") message: globalize.translate("ErrorSavingTvProvider")
}) });
}) });
} }
function getRequirePromise(deps) { function getRequirePromise(deps) {
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
require(deps, resolve) require(deps, resolve);
}) });
} }
function getDetectedDevice() { function getDetectedDevice() {
return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) { return getRequirePromise(["tunerPicker"]).then(function (tunerPicker) {
return (new tunerPicker).show({ return new tunerPicker().show({
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}) });
}) });
} }
function onTypeChange() { function onTypeChange() {
var value = this.value, var value = this.value;
view = dom.parentWithClass(this, "page"), var view = dom.parentWithClass(this, "page");
mayIncludeUnsupportedDrmChannels = "hdhomerun" === value, var mayIncludeUnsupportedDrmChannels = "hdhomerun" === value;
supportsTranscoding = "hdhomerun" === value, var supportsTranscoding = "hdhomerun" === value;
supportsFavorites = "hdhomerun" === value, var supportsFavorites = "hdhomerun" === value;
supportsTunerIpAddress = "hdhomerun" === value, var supportsTunerIpAddress = "hdhomerun" === value;
supportsTunerFileOrUrl = "m3u" === value, var supportsTunerFileOrUrl = "m3u" === value;
supportsStreamLooping = "m3u" === value, var supportsStreamLooping = "m3u" === value;
supportsTunerCount = "m3u" === value, var supportsTunerCount = "m3u" === value;
supportsUserAgent = "m3u" === value, var supportsUserAgent = "m3u" === value;
suppportsSubmit = "other" !== value, var suppportsSubmit = "other" !== value;
supportsSelectablePath = supportsTunerFileOrUrl, var supportsSelectablePath = supportsTunerFileOrUrl;
txtDevicePath = view.querySelector(".txtDevicePath"); var txtDevicePath = view.querySelector(".txtDevicePath");
supportsTunerIpAddress ? (txtDevicePath.label(globalize.translate("LabelTunerIpAddress")), view.querySelector(".fldPath").classList.remove("hide")) : supportsTunerFileOrUrl ? (txtDevicePath.label(globalize.translate("LabelFileOrUrl")), view.querySelector(".fldPath").classList.remove("hide")) : view.querySelector(".fldPath").classList.add("hide"), supportsSelectablePath ? (view.querySelector(".btnSelectPath").classList.remove("hide"), view.querySelector(".txtDevicePath").setAttribute("required", "required")) : (view.querySelector(".btnSelectPath").classList.add("hide"), view.querySelector(".txtDevicePath").removeAttribute("required")), supportsUserAgent ? view.querySelector(".fldUserAgent").classList.remove("hide") : view.querySelector(".fldUserAgent").classList.add("hide"), supportsFavorites ? view.querySelector(".fldFavorites").classList.remove("hide") : view.querySelector(".fldFavorites").classList.add("hide"), supportsTranscoding ? view.querySelector(".fldTranscode").classList.remove("hide") : view.querySelector(".fldTranscode").classList.add("hide"), supportsStreamLooping ? view.querySelector(".fldStreamLoop").classList.remove("hide") : view.querySelector(".fldStreamLoop").classList.add("hide"), supportsTunerCount ? (view.querySelector(".fldTunerCount").classList.remove("hide"), view.querySelector(".txtTunerCount").setAttribute("required", "required")) : (view.querySelector(".fldTunerCount").classList.add("hide"), view.querySelector(".txtTunerCount").removeAttribute("required")), mayIncludeUnsupportedDrmChannels ? view.querySelector(".drmMessage").classList.remove("hide") : view.querySelector(".drmMessage").classList.add("hide"), suppportsSubmit ? view.querySelector(".button-submit").classList.remove("hide") : view.querySelector(".button-submit").classList.add("hide")
if (supportsTunerIpAddress) {
txtDevicePath.label(globalize.translate("LabelTunerIpAddress"));
view.querySelector(".fldPath").classList.remove("hide");
} else if (supportsTunerFileOrUrl) {
txtDevicePath.label(globalize.translate("LabelFileOrUrl"));
view.querySelector(".fldPath").classList.remove("hide");
} else {
view.querySelector(".fldPath").classList.add("hide");
}
if (supportsSelectablePath) {
view.querySelector(".btnSelectPath").classList.remove("hide");
view.querySelector(".txtDevicePath").setAttribute("required", "required");
} else {
view.querySelector(".btnSelectPath").classList.add("hide");
view.querySelector(".txtDevicePath").removeAttribute("required");
}
if (supportsUserAgent) {
view.querySelector(".fldUserAgent").classList.remove("hide");
} else {
view.querySelector(".fldUserAgent").classList.add("hide");
}
if (supportsFavorites) {
view.querySelector(".fldFavorites").classList.remove("hide");
} else {
view.querySelector(".fldFavorites").classList.add("hide");
}
if (supportsTranscoding) {
view.querySelector(".fldTranscode").classList.remove("hide");
} else {
view.querySelector(".fldTranscode").classList.add("hide");
}
if (supportsStreamLooping) {
view.querySelector(".fldStreamLoop").classList.remove("hide");
} else {
view.querySelector(".fldStreamLoop").classList.add("hide");
}
if (supportsTunerCount) {
view.querySelector(".fldTunerCount").classList.remove("hide");
view.querySelector(".txtTunerCount").setAttribute("required", "required");
} else {
view.querySelector(".fldTunerCount").classList.add("hide");
view.querySelector(".txtTunerCount").removeAttribute("required");
}
if (mayIncludeUnsupportedDrmChannels) {
view.querySelector(".drmMessage").classList.remove("hide");
} else {
view.querySelector(".drmMessage").classList.add("hide");
}
if (suppportsSubmit) {
view.querySelector(".button-submit").classList.remove("hide");
} else {
view.querySelector(".button-submit").classList.add("hide");
}
} }
return function(view, params) {
params.id || view.querySelector(".btnDetect").classList.remove("hide"), view.addEventListener("viewshow", function() { return function (view, params) {
if (!params.id) {
view.querySelector(".btnDetect").classList.remove("hide");
}
view.addEventListener("viewshow", function () {
var currentId = params.id; var currentId = params.id;
fillTypes(view, currentId).then(function() { fillTypes(view, currentId).then(function () {
reload(view, currentId) reload(view, currentId);
}) });
}), view.querySelector("form").addEventListener("submit", function(e) { });
return submitForm(view), e.preventDefault(), e.stopPropagation(), !1 view.querySelector("form").addEventListener("submit", function (e) {
}), view.querySelector(".selectType").addEventListener("change", onTypeChange), view.querySelector(".btnDetect").addEventListener("click", function() { submitForm(view);
getDetectedDevice().then(function(info) { e.preventDefault();
fillTunerHostInfo(view, info) e.stopPropagation();
}) return false;
}), view.querySelector(".btnSelectPath").addEventListener("click", function() { });
require(["directorybrowser"], function(directoryBrowser) { view.querySelector(".selectType").addEventListener("change", onTypeChange);
var picker = new directoryBrowser; view.querySelector(".btnDetect").addEventListener("click", function () {
getDetectedDevice().then(function (info) {
fillTunerHostInfo(view, info);
});
});
view.querySelector(".btnSelectPath").addEventListener("click", function () {
require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser();
picker.show({ picker.show({
includeFiles: !0, includeFiles: true,
callback: function(path) { callback: function (path) {
path && (view.querySelector(".txtDevicePath").value = path), picker.close() if (path) {
view.querySelector(".txtDevicePath").value = path;
}
picker.close();
} }
}) });
}) });
}) });
} };
}); });

View file

@ -1,30 +1,45 @@
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) { define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
"use strict"; "use strict";
function loadPage(page, config, users) { function loadPage(page, config, users) {
var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>"; var html = '<option value="" selected="selected">' + Globalize.translate("OptionNone") + "</option>";
html += users.map(function(user) { html += users.map(function (user) {
return '<option value="' + user.Id + '">' + user.Name + "</option>" return '<option value="' + user.Id + '">' + user.Name + "</option>";
}).join(""), $("#selectUser", page).html(html).val(config.UserId || ""), $("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat), page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo, page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution, page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication, loading.hide() }).join("");
$("#selectUser", page).html(html).val(config.UserId || "");
$("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat);
page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo;
page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution;
page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication;
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getNamedConfiguration(metadataKey).then(function(config) { ApiClient.getNamedConfiguration(metadataKey).then(function (config) {
config.UserId = $("#selectUser", form).val() || null, config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val(), config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked, config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked, config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked, ApiClient.updateNamedConfiguration(metadataKey, config).then(function() { config.UserId = $("#selectUser", form).val() || null;
Dashboard.processServerConfigurationUpdateResult(), showConfirmMessage(config) config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val();
}) config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked;
}), !1 config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked;
config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked;
ApiClient.updateNamedConfiguration(metadataKey, config).then(function () {
Dashboard.processServerConfigurationUpdateResult();
showConfirmMessage(config);
});
});
return false;
} }
function showConfirmMessage(config) { function showConfirmMessage(config) {
var msg = []; var msg = [];
msg.push(Globalize.translate("MetadataSettingChangeHelp")), require(["alert"], function(alert) { msg.push(Globalize.translate("MetadataSettingChangeHelp"));
require(["alert"], function (alert) {
alert({ alert({
text: msg.join("<br/><br/>") text: msg.join("<br/><br/>")
}) });
}) });
} }
function getTabs() { function getTabs() {
@ -40,19 +55,20 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, { }, {
href: "metadatanfo.html", href: "metadatanfo.html",
name: Globalize.translate("TabNfoSettings") name: Globalize.translate("TabNfoSettings")
}] }];
} }
var metadataKey = "xbmcmetadata"; var metadataKey = "xbmcmetadata";
$(document).on("pageinit", "#metadataNfoPage", function() { $(document).on("pageinit", "#metadataNfoPage", function () {
$(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit) $(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#metadataNfoPage", function() { }).on("pageshow", "#metadataNfoPage", function () {
libraryMenu.setTabs("metadata", 3, getTabs), loading.show(); libraryMenu.setTabs("metadata", 3, getTabs);
var page = this, loading.show();
promise1 = ApiClient.getUsers(), var page = this;
promise2 = ApiClient.getNamedConfiguration(metadataKey); var promise1 = ApiClient.getUsers();
Promise.all([promise1, promise2]).then(function(responses) { var promise2 = ApiClient.getNamedConfiguration(metadataKey);
loadPage(page, responses[1], responses[0]) Promise.all([promise1, promise2]).then(function (responses) {
}) loadPage(page, responses[1], responses[0]);
}) });
}); });
});

View file

@ -1,9 +1,11 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) { define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
if (!pageData) { if (!pageData) {
pageData = data[key] = { pageData = data[key] = {
query: { query: {
@ -22,153 +24,223 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query); libraryBrowser.loadSavedQueryValues(key, pageData.query);
} }
return pageData; return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections")), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections");
}
return context.savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ var html;
startIndex: query.StartIndex, var pagingHtml = libraryBrowser.getQueryPagingHtml({
limit: query.Limit, startIndex: query.StartIndex,
totalRecordCount: result.TotalRecordCount, limit: query.Limit,
showLimit: !1, totalRecordCount: result.TotalRecordCount,
updatePageSizeSetting: !1, showLimit: false,
addLayoutButton: !1, updatePageSizeSetting: false,
sortButton: !1, addLayoutButton: false,
filterButton: !1 sortButton: false,
}), filterButton: false
viewStyle = self.getCurrentViewStyle();
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
overlayPlayButton: !0,
centerText: !0,
showTitle: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
lazy: !0,
cardLayout: !0,
showTitle: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "movies",
lazy: !0
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
showTitle: !0,
centerText: !1,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
centerText: !0,
overlayPlayButton: !0,
showTitle: !0
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); var viewStyle = self.getCurrentViewStyle();
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; if (viewStyle == "Thumb") {
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); items: result.Items,
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>"); shape: "backdrop",
preferThumb: true,
context: "movies",
overlayPlayButton: true,
centerText: true,
showTitle: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
lazy: true,
cardLayout: true,
showTitle: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "movies",
lazy: true
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
showTitle: true,
centerText: false,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: "movies",
centerText: true,
overlayPlayButton: true,
showTitle: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.getCurrentViewStyle = function() { var isLoading = false;
return getPageData(tabContent).view
}, self.getCurrentViewStyle = function () {
function(tabContent) { return getPageData(tabContent).view;
tabContent.querySelector(".btnSort").addEventListener("click", function(e) { };
libraryBrowser.showSortMenu({
items: [{ function initPage(tabContent) {
name: Globalize.translate("OptionNameSort"), tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
id: "SortName" libraryBrowser.showSortMenu({
}, { items: [{
name: Globalize.translate("OptionImdbRating"), name: Globalize.translate("OptionNameSort"),
id: "CommunityRating,SortName" id: "SortName"
}, { }, {
name: Globalize.translate("OptionDateAdded"), name: Globalize.translate("OptionImdbRating"),
id: "DateCreated,SortName" id: "CommunityRating,SortName"
}, { }, {
name: Globalize.translate("OptionParentalRating"), name: Globalize.translate("OptionDateAdded"),
id: "OfficialRating,SortName" id: "DateCreated,SortName"
}, { }, {
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionParentalRating"),
id: "PremiereDate,SortName" id: "OfficialRating,SortName"
}], }, {
callback: function() { name: Globalize.translate("OptionReleaseDate"),
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) id: "PremiereDate,SortName"
}, }],
query: getQuery(tabContent), callback: function () {
button: e.target getQuery(tabContent).StartIndex = 0;
}) reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); });
btnSelectView.addEventListener("click", function(e) { var btnSelectView = tabContent.querySelector(".btnSelectView");
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(",")) btnSelectView.addEventListener("click", function (e) {
}), btnSelectView.addEventListener("layoutchange", function(e) { libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(","));
var viewStyle = e.detail.viewStyle; });
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) btnSelectView.addEventListener("layoutchange", function (e) {
}), tabContent.querySelector(".btnNewCollection").addEventListener("click", function() { var viewStyle = e.detail.viewStyle;
require(["collectionEditor"], function(collectionEditor) { getPageData(tabContent).view = viewStyle;
var serverId = ApiClient.serverInfo().Id; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
(new collectionEditor).show({ getQuery(tabContent).StartIndex = 0;
items: [], onViewStyleChange();
serverId: serverId reloadItems(tabContent);
}) });
}) tabContent.querySelector(".btnNewCollection").addEventListener("click", function () {
}) require(["collectionEditor"], function (collectionEditor) {
}(tabContent), onViewStyleChange(), self.renderTab = function() { var serverId = ApiClient.serverInfo().Id;
reloadItems(tabContent) new collectionEditor().show({
}, self.destroy = function() {} items: [],
} serverId: serverId
});
});
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,139 +1,204 @@
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Movie", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
EnableTotalRecordCount: !1 IncludeItemTypes: "Movie",
}, Recursive: true,
view: "Poster" EnableTotalRecordCount: false
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("moviegenres") return libraryBrowser.getSavedQueryKey("moviegenres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function fillItemsContainer(elem) { function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"), var id = elem.getAttribute("data-id");
viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary", if (enableScrollX()) {
query = { limit = 10;
SortBy: "SortName", }
SortOrder: "Ascending",
IncludeItemTypes: "Movie", var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
Recursive: !0, var query = {
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", SortBy: "SortName",
ImageTypeLimit: 1, SortOrder: "Ascending",
EnableImageTypes: enableImageTypes, IncludeItemTypes: "Movie",
Limit: limit, Recursive: true,
GenreIds: id, Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
EnableTotalRecordCount: !1, ImageTypeLimit: 1,
ParentId: params.topParentId EnableImageTypes: enableImageTypes,
}; Limit: limit,
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { GenreIds: id,
EnableTotalRecordCount: false,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem, if (viewStyle == "Thumb") {
shape: getThumbShape(), cardBuilder.buildCards(result.Items, {
preferThumb: !0, itemsContainer: elem,
showTitle: !0, shape: getThumbShape(),
scalable: !0, preferThumb: true,
centerText: !0, showTitle: true,
overlayMoreButton: !0, scalable: true,
allowBottomPadding: !1 centerText: true,
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, { overlayMoreButton: true,
itemsContainer: elem, allowBottomPadding: false
shape: getThumbShape(), });
preferThumb: !0, } else if (viewStyle == "ThumbCard") {
showTitle: !0, cardBuilder.buildCards(result.Items, {
scalable: !0, itemsContainer: elem,
centerText: !1, shape: getThumbShape(),
cardLayout: !0, preferThumb: true,
showYear: !0 showTitle: true,
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { scalable: true,
itemsContainer: elem, centerText: false,
shape: getPortraitShape(), cardLayout: true,
showTitle: !0, showYear: true
scalable: !0, });
centerText: !1, } else if (viewStyle == "PosterCard") {
cardLayout: !0, cardBuilder.buildCards(result.Items, {
showYear: !0 itemsContainer: elem,
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { shape: getPortraitShape(),
itemsContainer: elem, showTitle: true,
shape: getPortraitShape(), scalable: true,
scalable: !0, centerText: false,
overlayMoreButton: !0, cardLayout: true,
allowBottomPadding: !1 showYear: true
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide") });
}) } else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: true,
overlayMoreButton: true,
allowBottomPadding: false
});
}
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) { var elem = context.querySelector("#items");
var html = "";
var items = result.Items;
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i]; var item = items[i];
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "movies", html += '<div class="verticalSection">';
parentId: params.topParentId html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide">&#xE5CC;</i>', html += "</a>", html += "</div>", enableScrollX()) { html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
context: "movies",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += item.Name;
html += "</h2>";
html += '<i class="md-icon hide">&#xE5CC;</i>';
html += "</a>";
html += "</div>";
if (enableScrollX()) {
var scrollXClass = "scrollX hiddenScrollX"; var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">'
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">'; if (layoutManager.tv) {
html += "</div>", html += "</div>" scrollXClass += "smoothScrollX";
}
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
}
html += "</div>";
html += "</div>";
} }
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
}) elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
} }
function fullyReload() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
}); reloadItems(tabContent, promise);
};
};
});

View file

@ -1,7 +1,7 @@
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
"use strict"; "use strict";
return function(view, params, tabContent, options) {
return function (view, params, tabContent, options) {
function onViewStyleChange() { function onViewStyleChange() {
if (self.getCurrentViewStyle() == "List") { if (self.getCurrentViewStyle() == "List") {
itemsContainer.classList.add("vertical-list"); itemsContainer.classList.add("vertical-list");
@ -10,103 +10,141 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.classList.remove("vertical-list"); itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap"); itemsContainer.classList.add("vertical-wrap");
} }
itemsContainer.innerHTML = ""; itemsContainer.innerHTML = "";
} }
function updateFilterControls() { function updateFilterControls() {
self.alphaPicker && self.alphaPicker.value(query.NameStartsWithOrGreater) if (self.alphaPicker) {
self.alphaPicker.value(query.NameStartsWithOrGreater);
}
} }
function fetchData() { function fetchData() {
isLoading = true; isLoading = true;
loading.show(); loading.show();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query) return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
} }
function afterRefresh(result) { function afterRefresh(result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
itemsContainer.refreshItems(); itemsContainer.refreshItems();
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
updateFilterControls(); updateFilterControls();
var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({ var pagingHtml = libraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex, startIndex: query.StartIndex,
limit: query.Limit, limit: query.Limit,
totalRecordCount: result.TotalRecordCount, totalRecordCount: result.TotalRecordCount,
showLimit: !1, showLimit: false,
updatePageSizeSetting: !1, updatePageSizeSetting: false,
addLayoutButton: !1, addLayoutButton: false,
sortButton: !1, sortButton: false,
filterButton: !1 filterButton: false
}); });
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) }
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick); elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) }
elems[i].addEventListener("click", onPreviousPageClick)
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
isLoading = false; isLoading = false;
loading.hide(); loading.hide();
} }
function getItemsHtml(items) { function getItemsHtml(items) {
var html;
var viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
return "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: items, if (viewStyle == "Thumb") {
shape: "backdrop", html = cardBuilder.getCardsHtml({
preferThumb: !0, items: items,
context: "movies", shape: "backdrop",
lazy: !0, preferThumb: true,
overlayPlayButton: !0, context: "movies",
showTitle: !0, lazy: true,
showYear: !0, overlayPlayButton: true,
centerText: !0 showTitle: true,
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({ showYear: true,
items: items, centerText: true
shape: "backdrop", });
preferThumb: !0, } else if (viewStyle == "ThumbCard") {
context: "movies", html = cardBuilder.getCardsHtml({
lazy: !0, items: items,
cardLayout: !0, shape: "backdrop",
showTitle: !0, preferThumb: true,
showYear: !0, context: "movies",
centerText: !0 lazy: true,
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({ cardLayout: true,
items: items, showTitle: true,
shape: "banner", showYear: true,
preferBanner: !0, centerText: true
context: "movies", });
lazy: !0 } else if (viewStyle == "Banner") {
}) : "List" == viewStyle ? listView.getListViewHtml({ html = cardBuilder.getCardsHtml({
items: items, items: items,
context: "movies", shape: "banner",
sortBy: query.SortBy preferBanner: true,
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({ context: "movies",
items: items, lazy: true
shape: "portrait", });
context: "movies", } else if (viewStyle == "List") {
showTitle: !0, html = listView.getListViewHtml({
showYear: !0, items: items,
centerText: !0, context: "movies",
lazy: !0, sortBy: query.SortBy
cardLayout: !0 });
}) : cardBuilder.getCardsHtml({ } else if (viewStyle == "PosterCard") {
items: items, html = cardBuilder.getCardsHtml({
shape: "portrait", items: items,
context: "movies", shape: "portrait",
overlayPlayButton: !0, context: "movies",
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true,
}) lazy: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: items,
shape: "portrait",
context: "movies",
overlayPlayButton: true,
showTitle: true,
showYear: true,
centerText: true
});
}
return html;
} }
function initPage(tabContent) { function initPage(tabContent) {
@ -114,8 +152,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
itemsContainer.getItemsHtml = getItemsHtml; itemsContainer.getItemsHtml = getItemsHtml;
itemsContainer.afterRefresh = afterRefresh; itemsContainer.afterRefresh = afterRefresh;
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement) { if (alphaPickerElement) {
alphaPickerElement.addEventListener("alphavaluechanged", function(e) { alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value; var newValue = e.detail.value;
query.NameStartsWithOrGreater = newValue; query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0; query.StartIndex = 0;
@ -125,109 +164,132 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
element: alphaPickerElement, element: alphaPickerElement,
valueChangeEvent: "click" valueChangeEvent: "click"
}); });
if (layoutManager.desktop || layoutManager.mobile) { if (layoutManager.desktop || layoutManager.mobile) {
alphaPickerElement.classList.add("alphabetPicker-right"); alphaPickerElement.classList.add("alphabetPicker-right");
itemsContainer.classList.remove("padded-left-withalphapicker"); itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker"); itemsContainer.classList.add("padded-right-withalphapicker");
} }
} }
var btnFilter = tabContent.querySelector(".btnFilter"); var btnFilter = tabContent.querySelector(".btnFilter");
btnFilter && btnFilter.addEventListener("click", function() {
self.showFilterMenu() if (btnFilter) {
}); btnFilter.addEventListener("click", function () {
self.showFilterMenu();
});
}
var btnSort = tabContent.querySelector(".btnSort"); var btnSort = tabContent.querySelector(".btnSort");
btnSort && btnSort.addEventListener("click", function(e) {
libraryBrowser.showSortMenu({ if (btnSort) {
items: [{ btnSort.addEventListener("click", function (e) {
name: Globalize.translate("OptionNameSort"), libraryBrowser.showSortMenu({
id: "SortName,ProductionYear" items: [{
}, { name: Globalize.translate("OptionNameSort"),
name: Globalize.translate("OptionImdbRating"), id: "SortName,ProductionYear"
id: "CommunityRating,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionImdbRating"),
name: Globalize.translate("OptionCriticRating"), id: "CommunityRating,SortName,ProductionYear"
id: "CriticRating,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionCriticRating"),
name: Globalize.translate("OptionDateAdded"), id: "CriticRating,SortName,ProductionYear"
id: "DateCreated,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionDateAdded"),
name: Globalize.translate("OptionDatePlayed"), id: "DateCreated,SortName,ProductionYear"
id: "DatePlayed,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionDatePlayed"),
name: Globalize.translate("OptionParentalRating"), id: "DatePlayed,SortName,ProductionYear"
id: "OfficialRating,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionParentalRating"),
name: Globalize.translate("OptionPlayCount"), id: "OfficialRating,SortName,ProductionYear"
id: "PlayCount,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionPlayCount"),
name: Globalize.translate("OptionReleaseDate"), id: "PlayCount,SortName,ProductionYear"
id: "PremiereDate,SortName,ProductionYear" }, {
}, { name: Globalize.translate("OptionReleaseDate"),
name: Globalize.translate("OptionRuntime"), id: "PremiereDate,SortName,ProductionYear"
id: "Runtime,SortName,ProductionYear" }, {
}], name: Globalize.translate("OptionRuntime"),
callback: function() { id: "Runtime,SortName,ProductionYear"
query.StartIndex = 0, userSettings.saveQuerySettings(savedQueryKey, query), itemsContainer.refreshItems() }],
}, callback: function () {
query: query, query.StartIndex = 0;
button: e.target userSettings.saveQuerySettings(savedQueryKey, query);
}) itemsContainer.refreshItems();
}); },
query: query,
button: e.target
});
});
}
var btnSelectView = tabContent.querySelector(".btnSelectView"); var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function(e) { btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")) libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
}), btnSelectView.addEventListener("layoutchange", function(e) { });
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle; var viewStyle = e.detail.viewStyle;
userSettings.set(savedViewKey, viewStyle); userSettings.set(savedViewKey, viewStyle);
query.StartIndex = 0; query.StartIndex = 0;
onViewStyleChange(); onViewStyleChange();
itemsContainer.refreshItems(); itemsContainer.refreshItems();
}) });
} }
var self = this,
itemsContainer = tabContent.querySelector(".itemsContainer"), var self = this;
savedQueryKey = params.topParentId + "-" + options.mode, var itemsContainer = tabContent.querySelector(".itemsContainer");
savedViewKey = savedQueryKey + "-view", var savedQueryKey = params.topParentId + "-" + options.mode;
query = { var savedViewKey = savedQueryKey + "-view";
SortBy: "SortName,ProductionYear", var query = {
SortOrder: "Ascending", SortBy: "SortName,ProductionYear",
IncludeItemTypes: "Movie", SortOrder: "Ascending",
Recursive: !0, IncludeItemTypes: "Movie",
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Recursive: true,
ImageTypeLimit: 1, Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", ImageTypeLimit: 1,
StartIndex: 0, EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
Limit: 100, StartIndex: 0,
ParentId: params.topParentId Limit: 100,
}, ParentId: params.topParentId
isLoading = false; };
if (options.mode === "favorites") query.IsFavorite = true; var isLoading = false;
if (options.mode === "favorites") {
query.IsFavorite = true;
}
query = userSettings.loadQuerySettings(savedQueryKey, query); query = userSettings.loadQuerySettings(savedQueryKey, query);
self.showFilterMenu = function() {
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { self.showFilterMenu = function () {
require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
var filterDialog = new filterDialogFactory({ var filterDialog = new filterDialogFactory({
query: query, query: query,
mode: "movies", mode: "movies",
serverId: ApiClient.serverId() serverId: ApiClient.serverId()
}); });
events.on(filterDialog, "filterchange", function() { events.on(filterDialog, "filterchange", function () {
query.StartIndex = 0, itemsContainer.refreshItems() query.StartIndex = 0;
}), filterDialog.show() itemsContainer.refreshItems();
}) });
filterDialog.show();
});
}; };
self.getCurrentViewStyle = function() {
return userSettings.get(savedViewKey) || "Poster" self.getCurrentViewStyle = function () {
return userSettings.get(savedViewKey) || "Poster";
}; };
self.initTab = function() {
self.initTab = function () {
initPage(tabContent); initPage(tabContent);
onViewStyleChange(); onViewStyleChange();
}; };
self.renderTab = function() {
self.renderTab = function () {
itemsContainer.refreshItems(); itemsContainer.refreshItems();
updateFilterControls(); updateFilterControls();
}; };
self.destroy = function() {
itemsContainer = null self.destroy = function () {
} itemsContainer = null;
} };
};
}); });

View file

@ -1,16 +1,16 @@
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function(events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) { define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager) {
"use strict"; "use strict";
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function loadLatest(page, userId, parentId) { function loadLatest(page, userId, parentId) {
@ -21,118 +21,168 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) { ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var allowBottomPadding = !enableScrollX(), var allowBottomPadding = !enableScrollX();
container = page.querySelector("#recentlyAddedItems"); var container = page.querySelector("#recentlyAddedItems");
cardBuilder.buildCards(items, { cardBuilder.buildCards(items, {
itemsContainer: container, itemsContainer: container,
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) });
}) });
} }
function loadResume(page, userId, parentId) { function loadResume(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
options = { var options = {
SortBy: "DatePlayed", SortBy: "DatePlayed",
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Filters: "IsResumable", Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3, Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: !1, CollapseBoxSetItems: false,
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(userId, options).then(function(result) { ApiClient.getItems(userId, options).then(function (result) {
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide"); if (result.Items.length) {
var allowBottomPadding = !enableScrollX(), page.querySelector("#resumableSection").classList.remove("hide");
container = page.querySelector("#resumableItems"); } else {
page.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = page.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: getThumbShape(), shape: getThumbShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: !1, cardLayout: false,
showTitle: !0, showTitle: true,
showYear: !0, showYear: true,
centerText: !0 centerText: true
}) });
}) });
} }
function getRecommendationHtml(recommendation) { function getRecommendationHtml(recommendation) {
var html = "", var html = "";
title = ""; var title = "";
switch (recommendation.RecommendationType) { switch (recommendation.RecommendationType) {
case "SimilarToRecentlyPlayed": case "SimilarToRecentlyPlayed":
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
break; break;
case "SimilarToLikedItem": case "SimilarToLikedItem":
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
break; break;
case "HasDirectorFromRecentlyPlayed": case "HasDirectorFromRecentlyPlayed":
case "HasLikedDirector": case "HasLikedDirector":
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName); title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
break; break;
case "HasActorFromRecentlyPlayed": case "HasActorFromRecentlyPlayed":
case "HasLikedActor": case "HasLikedActor":
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName) title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName);
break;
} }
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
var allowBottomPadding = !0; html += '<div class="verticalSection">';
return enableScrollX() ? (allowBottomPadding = !1, html += '<div is="emby-itemscontainer" class="itemsContainer scrollX hiddenScrollX padded-left padded-right">') : html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">', html += cardBuilder.getCardsHtml(recommendation.Items, { html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
var allowBottomPadding = true;
if (enableScrollX()) {
allowBottomPadding = false;
html += '<div is="emby-itemscontainer" class="itemsContainer hiddenScrollX padded-left padded-right">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
}
html += cardBuilder.getCardsHtml(recommendation.Items, {
shape: getPortraitShape(), shape: getPortraitShape(),
scalable: !0, scalable: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding allowBottomPadding: allowBottomPadding
}), html += "</div>", html += "</div>" });
html += "</div>";
html += "</div>";
return html;
} }
function loadSuggestions(page, userId, parentId) { function loadSuggestions(page, userId, parentId) {
var screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
url = ApiClient.getUrl("Movies/Recommendations", { var url = ApiClient.getUrl("Movies/Recommendations", {
userId: userId, userId: userId,
categoryLimit: 6, categoryLimit: 6,
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb" EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
}); });
ApiClient.getJSON(url).then(function(recommendations) { ApiClient.getJSON(url).then(function (recommendations) {
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = ""); if (!recommendations.length) {
page.querySelector(".noItemsMessage").classList.remove("hide");
page.querySelector(".recommendations").innerHTML = "";
return;
}
var html = recommendations.map(getRecommendationHtml).join(""); var html = recommendations.map(getRecommendationHtml).join("");
page.querySelector(".noItemsMessage").classList.add("hide"); page.querySelector(".noItemsMessage").classList.add("hide");
var recs = page.querySelector(".recommendations"); var recs = page.querySelector(".recommendations");
recs.innerHTML = html, imageLoader.lazyChildren(recs) recs.innerHTML = html;
}) imageLoader.lazyChildren(recs);
});
} }
function setScrollClasses(elem, scrollX) { function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap")) if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
} }
function initSuggestedTab(page, tabContent) { function initSuggestedTab(page, tabContent) {
for (var containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX()) var containers = tabContent.querySelectorAll(".itemsContainer");
for (var i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
}
} }
function loadSuggestionsTab(view, params, tabContent) { function loadSuggestionsTab(view, params, tabContent) {
var parentId = params.topParentId, var parentId = params.topParentId;
userId = ApiClient.getCurrentUserId(); var userId = ApiClient.getCurrentUserId();
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId) console.log("loadSuggestionsTab");
loadResume(tabContent, userId, parentId);
loadLatest(tabContent, userId, parentId);
loadSuggestions(tabContent, userId, parentId);
} }
function getTabs() { function getTabs() {
@ -151,126 +201,196 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu"
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "suggestions": case "suggestions":
return 1; return 1;
case "favorites": case "favorites":
return 3; return 3;
case "collections": case "collections":
return 4; return 4;
case "genres": case "genres":
return 5; return 5;
default: default:
return 0 return 0;
} }
} }
return function(view, params) {
return function (view, params) {
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex); var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex) loadTab(view, newIndex);
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/movies/movies"); depends.push("controllers/movies/movies");
break; break;
case 1: case 1:
break; break;
case 2: case 2:
depends.push("controllers/movies/movietrailers"); depends.push("controllers/movies/movietrailers");
break; break;
case 3: case 3:
depends.push("controllers/movies/movies"); depends.push("controllers/movies/movies");
break; break;
case 4: case 4:
depends.push("controllers/movies/moviecollections"); depends.push("controllers/movies/moviecollections");
break; break;
case 5: case 5:
depends.push("controllers/movies/moviegenres"); depends.push("controllers/movies/moviegenres");
break; break;
case 6: case 6:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; var tabContent;
index === suggestionsTabIndex && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (index === suggestionsTabIndex) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
collectionType: "movies", if (!controller) {
parentId: params.topParentId tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies" if (index === suggestionsTabIndex) {
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller) controller = self;
}) } else if (index === 6) {
controller = new controllerFactory(view, tabContent, {
collectionType: "movies",
parentId: params.topParentId
});
} else if (index == 0 || index == 3) {
controller = new controllerFactory(view, params, tabContent, {
mode: index ? "favorites" : "movies"
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
} }
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onPlaybackStop(e, state) { function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange()) if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
renderedTabs = [];
mainTabsManager.getTabsElement().triggerTabChange();
}
} }
function onInputCommand(e) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId) e.preventDefault();
Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId);
} }
} }
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)), var isViewRestored;
initialTabIndex = currentTabIndex, var self = this;
suggestionsTabIndex = 1; var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
self.initTab = function() { var initialTabIndex = currentTabIndex;
var suggestionsTabIndex = 1;
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']"); var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
initSuggestedTab(view, tabContent); initSuggestedTab(view, tabContent);
}, self.renderTab = function() {
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent)
}; };
var tabControllers = [],
renderedTabs = []; self.renderTab = function () {
view.addEventListener("viewshow", function(e) { var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
loadSuggestionsTab(view, params, tabContent);
};
var tabControllers = [];
var renderedTabs = [];
view.addEventListener("viewshow", function (e) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
var parentId = params.topParentId; var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name) if (parentId) {
}) : (view.setAttribute("data-title", Globalize.translate("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies"))) ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMovies"));
libraryMenu.setTitle(Globalize.translate("TabMovies"));
}
} }
events.on(playbackManager, "playbackstop", onPlaybackStop), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) { events.on(playbackManager, "playbackstop", onPlaybackStop);
inputManager.off(window, onInputCommand) inputManager.on(window, onInputCommand);
}), view.addEventListener("viewdestroy", function(e) { });
tabControllers.forEach(function(t) { view.addEventListener("viewbeforehide", function (e) {
t.destroy && t.destroy() inputManager.off(window, onInputCommand);
}) });
}) view.addEventListener("viewdestroy", function (e) {
} tabControllers.forEach(function (t) {
}); if (t.destroy) {
t.destroy();
}
});
});
};
});

View file

@ -1,185 +1,261 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) { define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Trailer", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", IncludeItemTypes: "Trailer",
ImageTypeLimit: 1, Recursive: true,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0, ImageTypeLimit: 1,
Limit: pageSize EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
}, StartIndex: 0,
view: libraryBrowser.getSavedView(key) || "Poster" Limit: pageSize
}, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers")), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers");
}
return context.savedQueryKey;
} }
function reloadItems() { function reloadItems() {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(tabContent); var query = getQuery(tabContent);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems() return;
}
query.StartIndex += query.Limit;
reloadItems();
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems() return;
}
query.StartIndex -= query.Limit;
reloadItems();
} }
window.scrollTo(0, 0), updateFilterControls(tabContent);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ window.scrollTo(0, 0);
startIndex: query.StartIndex, updateFilterControls(tabContent);
limit: query.Limit, var pagingHtml = libraryBrowser.getQueryPagingHtml({
totalRecordCount: result.TotalRecordCount, startIndex: query.StartIndex,
showLimit: !1, limit: query.Limit,
updatePageSizeSetting: !1, totalRecordCount: result.TotalRecordCount,
addLayoutButton: !1, showLimit: false,
sortButton: !1, updatePageSizeSetting: false,
filterButton: !1 addLayoutButton: false,
}), sortButton: false,
viewStyle = self.getCurrentViewStyle(); filterButton: false
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
overlayPlayButton: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "movies",
cardLayout: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "movies"
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
showTitle: !0,
showYear: !0,
centerText: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
centerText: !0,
overlayPlayButton: !0,
showTitle: !0,
showYear: !0
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); var html;
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; var viewStyle = self.getCurrentViewStyle();
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); if (viewStyle == "Thumb") {
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>"); html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
overlayPlayButton: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "movies",
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "movies"
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "movies",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
showTitle: true,
showYear: true,
cardLayout: true,
centerText: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "movies",
centerText: true,
overlayPlayButton: true,
showTitle: true,
showYear: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
if (!result.Items.length) {
html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>";
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({ self.showFilterMenu = function () {
query: getQuery(tabContent), require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
mode: "movies", var filterDialog = new filterDialogFactory({
serverId: ApiClient.serverId() query: getQuery(tabContent),
}); mode: "movies",
events.on(filterDialog, "filterchange", function() { serverId: ApiClient.serverId()
getQuery(tabContent).StartIndex = 0, reloadItems() });
}), filterDialog.show() events.on(filterDialog, "filterchange", function () {
}) getQuery(tabContent).StartIndex = 0;
}, self.getCurrentViewStyle = function() { reloadItems();
return getPageData(tabContent).view });
}, filterDialog.show();
function(tabContent) { });
var alphaPickerElement = tabContent.querySelector(".alphaPicker"); };
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value, self.getCurrentViewStyle = function () {
query = getQuery(tabContent); return getPageData(tabContent).view;
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems() };
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement, function initPage(tabContent) {
valueChangeEvent: "click" var alphaPickerElement = tabContent.querySelector(".alphaPicker");
}), layoutManager.desktop || layoutManager.mobile) { alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); var newValue = e.detail.value;
var itemsContainer = tabContent.querySelector(".itemsContainer"); var query = getQuery(tabContent);
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker") query.NameStartsWithOrGreater = newValue;
} query.StartIndex = 0;
tabContent.querySelector(".btnFilter").addEventListener("click", function() { reloadItems();
self.showFilterMenu() });
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { self.alphaPicker = new alphaPicker({
libraryBrowser.showSortMenu({ element: alphaPickerElement,
items: [{ valueChangeEvent: "click"
name: Globalize.translate("OptionNameSort"), });
id: "SortName"
}, { if (layoutManager.desktop || layoutManager.mobile) {
name: Globalize.translate("OptionImdbRating"), tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
id: "CommunityRating,SortName" var itemsContainer = tabContent.querySelector(".itemsContainer");
}, { itemsContainer.classList.remove("padded-left-withalphapicker");
name: Globalize.translate("OptionDateAdded"), itemsContainer.classList.add("padded-right-withalphapicker");
id: "DateCreated,SortName" }
}, {
name: Globalize.translate("OptionDatePlayed"), tabContent.querySelector(".btnFilter").addEventListener("click", function () {
id: "DatePlayed,SortName" self.showFilterMenu();
}, { });
name: Globalize.translate("OptionParentalRating"), tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
id: "OfficialRating,SortName" libraryBrowser.showSortMenu({
}, { items: [{
name: Globalize.translate("OptionPlayCount"), name: Globalize.translate("OptionNameSort"),
id: "PlayCount,SortName" id: "SortName"
}, { }, {
name: Globalize.translate("OptionReleaseDate"), name: Globalize.translate("OptionImdbRating"),
id: "PremiereDate,SortName" id: "CommunityRating,SortName"
}], }, {
callback: function() { name: Globalize.translate("OptionDateAdded"),
getQuery(tabContent).StartIndex = 0, reloadItems() id: "DateCreated,SortName"
}, }, {
query: getQuery(tabContent), name: Globalize.translate("OptionDatePlayed"),
button: e.target id: "DatePlayed,SortName"
}) }, {
}) name: Globalize.translate("OptionParentalRating"),
}(tabContent), self.renderTab = function() { id: "OfficialRating,SortName"
reloadItems(), updateFilterControls(tabContent) }, {
}, self.destroy = function() {} name: Globalize.translate("OptionPlayCount"),
} id: "PlayCount,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems();
},
query: getQuery(tabContent),
button: e.target
});
});
}
initPage(tabContent);
self.renderTab = function () {
reloadItems();
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,190 +1,275 @@
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) { define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function playAll() { function playAll() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
playbackManager.play({ playbackManager.play({
items: [item] items: [item]
}) });
}) });
} }
function shuffle() { function shuffle() {
ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function(item) { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) {
getQuery(); getQuery();
playbackManager.shuffle(item, null) playbackManager.shuffle(item, null);
}) });
} }
function getPageData() { function getPageData() {
var key = getSavedQueryKey(); var key = getSavedQueryKey();
return pageData || (pageData = {
query: { if (!pageData) {
SortBy: "SortName", pageData = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "MusicAlbum", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", IncludeItemTypes: "MusicAlbum",
ImageTypeLimit: 1, Recursive: true,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0, ImageTypeLimit: 1,
Limit: pageSize EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
}, StartIndex: 0,
view: libraryBrowser.getSavedView(key) || "Poster" Limit: pageSize
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return savedQueryKey || (savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums")), savedQueryKey if (!savedQueryKey) {
savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums");
}
return savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(); var query = getQuery();
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ window.scrollTo(0, 0);
startIndex: query.StartIndex, updateFilterControls(page);
limit: query.Limit, var html;
totalRecordCount: result.TotalRecordCount, var pagingHtml = libraryBrowser.getQueryPagingHtml({
showLimit: !1, startIndex: query.StartIndex,
updatePageSizeSetting: !1, limit: query.Limit,
addLayoutButton: !1, totalRecordCount: result.TotalRecordCount,
sortButton: !1, showLimit: false,
filterButton: !1 updatePageSizeSetting: false,
}), addLayoutButton: false,
viewStyle = self.getCurrentViewStyle(); sortButton: false,
html = "List" == viewStyle ? listView.getListViewHtml({ filterButton: false
items: result.Items,
context: "music",
sortBy: query.SortBy,
addToListButton: !0
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
showParentTitle: !0,
lazy: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
showParentTitle: !0,
lazy: !0,
centerText: !0,
overlayPlayButton: !0
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); var viewStyle = self.getCurrentViewStyle();
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; if (viewStyle == "List") {
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); html = listView.getListViewHtml({
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); items: result.Items,
context: "music",
sortBy: query.SortBy,
addToListButton: true
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
showParentTitle: true,
lazy: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
showParentTitle: true,
lazy: true,
centerText: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query); libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(); var query = getQuery();
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var savedQueryKey, pageData, self = this,
pageSize = 100, var savedQueryKey;
isLoading = false; var pageData;
self.showFilterMenu = function() { var self = this;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) { var pageSize = 100;
var filterDialog = new filterDialogFactory({ var isLoading = false;
query: getQuery(),
mode: "albums", self.showFilterMenu = function () {
serverId: ApiClient.serverId() require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
}); var filterDialog = new filterDialogFactory({
events.on(filterDialog, "filterchange", function() { query: getQuery(),
getQuery().StartIndex = 0, reloadItems(tabContent) mode: "albums",
}), filterDialog.show() serverId: ApiClient.serverId()
})
}, self.getCurrentViewStyle = function() {
return getPageData().view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery();
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,SortName"
}, {
name: Globalize.translate("OptionCommunityRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName"
}],
callback: function() {
getQuery().StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(),
button: e.target
})
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); events.on(filterDialog, "filterchange", function () {
btnSelectView.addEventListener("click", function(e) { getQuery().StartIndex = 0;
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) reloadItems(tabContent);
}), btnSelectView.addEventListener("layoutchange", function(e) { });
var viewStyle = e.detail.viewStyle; filterDialog.show();
getPageData().view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle), getQuery().StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) });
}), tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll), tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle) };
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent) self.getCurrentViewStyle = function () {
}, self.destroy = function() {} return getPageData().view;
} };
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery();
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionAlbumArtist"),
id: "AlbumArtist,SortName"
}, {
name: Globalize.translate("OptionCommunityRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "ProductionYear,PremiereDate,SortName"
}],
callback: function () {
getQuery().StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
getQuery().StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll);
tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle);
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,144 +1,226 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) { define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
Recursive: !0, SortBy: "SortName",
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", SortOrder: "Ascending",
StartIndex: 0, Recursive: true,
ImageTypeLimit: 1, Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", StartIndex: 0,
Limit: 100 ImageTypeLimit: 1,
}, EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
view: libraryBrowser.getSavedView(key) || "Poster" Limit: 100
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode)), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey(self.mode);
}
return context.savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
("albumartists" == self.mode ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query)).then(function(result) { var promise = self.mode == 'albumartists' ?
ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) :
ApiClient.getArtists(ApiClient.getCurrentUserId(), query);
promise.then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ window.scrollTo(0, 0);
startIndex: query.StartIndex, updateFilterControls(page);
limit: query.Limit, var html;
totalRecordCount: result.TotalRecordCount, var pagingHtml = libraryBrowser.getQueryPagingHtml({
showLimit: !1, startIndex: query.StartIndex,
updatePageSizeSetting: !1, limit: query.Limit,
addLayoutButton: !1, totalRecordCount: result.TotalRecordCount,
sortButton: !1, showLimit: false,
filterButton: !1 updatePageSizeSetting: false,
}), addLayoutButton: false,
viewStyle = self.getCurrentViewStyle(); sortButton: false,
html = "List" == viewStyle ? listView.getListViewHtml({ filterButton: false
items: result.Items,
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: !0,
coverImage: !0,
lazy: !0,
centerText: !0,
overlayPlayButton: !0
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); var viewStyle = self.getCurrentViewStyle();
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; if (viewStyle == "List") {
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); html = listView.getListViewHtml({
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); items: result.Items,
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "square",
context: "music",
showTitle: true,
coverImage: true,
lazy: true,
centerText: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
data = {}, var self = this;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({ self.showFilterMenu = function () {
query: getQuery(tabContent), require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
mode: self.mode, var filterDialog = new filterDialogFactory({
serverId: ApiClient.serverId() query: getQuery(tabContent),
}); mode: self.mode,
events.on(filterDialog, "filterchange", function() { serverId: ApiClient.serverId()
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); events.on(filterDialog, "filterchange", function () {
btnSelectView.addEventListener("click", function(e) { getQuery(tabContent).StartIndex = 0;
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) reloadItems(tabContent);
}), btnSelectView.addEventListener("layoutchange", function(e) { });
var viewStyle = e.detail.viewStyle; filterDialog.show();
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) });
}) };
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent) self.getCurrentViewStyle = function () {
}, self.destroy = function() {} return getPageData(tabContent).view;
} };
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,91 +1,126 @@
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) { define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
Recursive: !0, SortBy: "SortName",
Fields: "PrimaryImageAspectRatio,ItemCounts", SortOrder: "Ascending",
StartIndex: 0 Recursive: true,
}, Fields: "PrimaryImageAspectRatio,ItemCounts",
view: libraryBrowser.getSavedView(key) || "Poster" StartIndex: 0
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres") return libraryBrowser.getSavedQueryKey("genres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
var html = "", var html = "";
viewStyle = self.getCurrentViewStyle(); var viewStyle = self.getCurrentViewStyle();
"Thumb" == viewStyle ? html = cardBuilder.getCardsHtml({
items: result.Items, if (viewStyle == "Thumb") {
shape: "backdrop", html = cardBuilder.getCardsHtml({
preferThumb: !0, items: result.Items,
context: "music", shape: "backdrop",
centerText: !0, preferThumb: true,
overlayMoreButton: !0, context: 'music',
showTitle: !0 centerText: true,
}) : "ThumbCard" == viewStyle ? html = cardBuilder.getCardsHtml({ overlayMoreButton: true,
items: result.Items, showTitle: true
shape: "backdrop", });
preferThumb: !0, } else if (viewStyle == "ThumbCard") {
context: "music", html = cardBuilder.getCardsHtml({
cardLayout: !0, items: result.Items,
showTitle: !0 shape: "backdrop",
}) : "PosterCard" == viewStyle ? html = cardBuilder.getCardsHtml({ preferThumb: true,
items: result.Items, context: 'music',
shape: "auto", cardLayout: true,
context: "music", showTitle: true,
cardLayout: !0, });
showTitle: !0 } else if (viewStyle == "PosterCard") {
}) : "Poster" == viewStyle && (html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "auto", shape: "auto",
context: "music", context: 'music',
centerText: !0, cardLayout: true,
overlayMoreButton: !0, showTitle: true,
showTitle: !0 });
})); } else if (viewStyle == "Poster") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
context: 'music',
centerText: true,
overlayMoreButton: true,
showTitle: true
});
}
var elem = context.querySelector("#items"); var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide() elem.innerHTML = html;
}) imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
} }
function fullyReload() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
}); reloadItems(tabContent, promise);
};
};
});

View file

@ -1,64 +1,81 @@
define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function(libraryBrowser, cardBuilder, appHost, imageLoader, loading) { define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Playlist", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,SortName,CanDelete", IncludeItemTypes: "Playlist",
StartIndex: 0 Recursive: true,
}, Fields: "PrimaryImageAspectRatio,SortName,CanDelete",
view: libraryBrowser.getSavedView(key) || "Poster" StartIndex: 0
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("genres") return libraryBrowser.getSavedQueryKey("genres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getItems(ApiClient.getCurrentUserId(), query) return ApiClient.getItems(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
var html = ""; var html = "";
html = cardBuilder.getCardsHtml({ html = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
shape: "square", shape: "square",
showTitle: !0, showTitle: true,
coverImage: !0, coverImage: true,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: !0, allowBottomPadding: true,
cardLayout: !1 cardLayout: false
}); });
var elem = context.querySelector("#items"); var elem = context.querySelector("#items");
elem.innerHTML = html, imageLoader.lazyChildren(elem), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide() elem.innerHTML = html;
}) imageLoader.lazyChildren(elem);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
} }
var self = this,
data = {}; var self = this;
self.getCurrentViewStyle = function() { var data = {};
return getPageData(tabContent).view
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
}; };
var promise; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
}); reloadItems(tabContent, promise);
};
};
});

View file

@ -1,49 +1,65 @@
define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function(browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) { define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager) {
"use strict"; "use strict";
function itemsPerRow() { function itemsPerRow() {
var screenWidth = dom.getWindowSize().innerWidth; var screenWidth = dom.getWindowSize().innerWidth;
return screenWidth >= 1920 ? 9 : screenWidth >= 1200 ? 12 : screenWidth >= 1e3 ? 10 : 8
if (screenWidth >= 1920) {
return 9;
}
if (screenWidth >= 1200) {
return 12;
}
if (screenWidth >= 1000) {
return 10;
}
return 8;
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getSquareShape() { function getSquareShape() {
return enableScrollX() ? "overflowSquare" : "square" return enableScrollX() ? "overflowSquare" : "square";
} }
function loadLatest(page, parentId) { function loadLatest(page, parentId) {
loading.show(); loading.show();
var userId = ApiClient.getCurrentUserId(), var userId = ApiClient.getCurrentUserId();
options = { var options = {
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(), Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) { ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) {
var elem = page.querySelector("#recentlyAddedSongs"), var elem = page.querySelector("#recentlyAddedSongs");
supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({ supportsImageAnalysis = false;
elem.innerHTML = cardBuilder.getCardsHtml({
items: items, items: items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
showLatestItemsPopup: !1, showLatestItemsPopup: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayPlayButton: !supportsImageAnalysis, overlayPlayButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(elem), loading.hide() });
}) imageLoader.lazyChildren(elem);
loading.hide();
});
} }
function loadRecentlyPlayed(page, parentId) { function loadRecentlyPlayed(page, parentId) {
@ -52,34 +68,42 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: itemsPerRow(), Limit: itemsPerRow(),
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo", Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed", Filters: "IsPlayed",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector("#recentlyPlayed"); var elem = page.querySelector("#recentlyPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"), if (result.Items.length) {
supportsImageAnalysis = appHost.supports("imageanalysis"); elem.classList.remove("hide");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({ } else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
action: "instantmix", action: "instantmix",
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(itemsContainer) });
}) imageLoader.lazyChildren(itemsContainer);
});
} }
function loadFrequentlyPlayed(page, parentId) { function loadFrequentlyPlayed(page, parentId) {
@ -88,40 +112,53 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Audio", IncludeItemTypes: "Audio",
Limit: itemsPerRow(), Limit: itemsPerRow(),
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,AudioInfo", Fields: "PrimaryImageAspectRatio,AudioInfo",
Filters: "IsPlayed", Filters: "IsPlayed",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
var elem = page.querySelector("#topPlayed"); var elem = page.querySelector("#topPlayed");
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
var itemsContainer = elem.querySelector(".itemsContainer"), if (result.Items.length) {
supportsImageAnalysis = appHost.supports("imageanalysis"); elem.classList.remove("hide");
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({ } else {
elem.classList.add("hide");
}
var itemsContainer = elem.querySelector(".itemsContainer");
var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = false;
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items, items: result.Items,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
shape: getSquareShape(), shape: getSquareShape(),
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
action: "instantmix", action: "instantmix",
lazy: !0, lazy: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
overlayMoreButton: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
coverImage: !0 coverImage: true
}), imageLoader.lazyChildren(itemsContainer) });
}) imageLoader.lazyChildren(itemsContainer);
});
} }
function loadSuggestionsTab(page, tabContent, parentId) { function loadSuggestionsTab(page, tabContent, parentId) {
console.log("loadSuggestionsTab"), loadLatest(tabContent, parentId), loadRecentlyPlayed(tabContent, parentId), loadFrequentlyPlayed(tabContent, parentId), require(["components/favoriteitems"], function(favoriteItems) { console.log("loadSuggestionsTab");
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]) loadLatest(tabContent, parentId);
}) loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId);
require(["components/favoriteitems"], function (favoriteItems) {
favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]);
});
} }
function getTabs() { function getTabs() {
@ -142,135 +179,227 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "albums": case "albums":
return 1; return 1;
case "albumartists": case "albumartists":
return 2; return 2;
case "artists": case "artists":
return 3; return 3;
case "playlists": case "playlists":
return 4; return 4;
case "songs": case "songs":
return 5; return 5;
case "genres": case "genres":
return 6; return 6;
default: default:
return 0 return 0;
} }
} }
return function(view, params) {
return function (view, params) {
function reload() { function reload() {
loading.show(); loading.show();
var tabContent = view.querySelector(".pageTabContent[data-index='0']"); var tabContent = view.querySelector(".pageTabContent[data-index='0']");
loadSuggestionsTab(view, tabContent, params.topParentId) loadSuggestionsTab(view, tabContent, params.topParentId);
} }
function enableScrollX() { function enableScrollX() {
return browser.mobile return browser.mobile;
} }
function setScrollClasses(elem, scrollX) { function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap")) if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
} }
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
loadTab(view, parseInt(e.detail.selectedTabIndex)) loadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
break; break;
case 1: case 1:
depends.push("controllers/music/musicalbums"); depends.push("controllers/music/musicalbums");
break; break;
case 2: case 2:
case 3: case 3:
depends.push("controllers/music/musicartists"); depends.push("controllers/music/musicartists");
break; break;
case 4: case 4:
depends.push("controllers/music/musicplaylists"); depends.push("controllers/music/musicplaylists");
break; break;
case 5: case 5:
depends.push("controllers/music/songs"); depends.push("controllers/music/songs");
break; break;
case 6: case 6:
depends.push("controllers/music/musicgenres"); depends.push("controllers/music/musicgenres");
break; break;
case 7: case 7:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; var tabContent;
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (0 == index) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "music", if (!controller) {
parentId: params.topParentId tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
}) : new controllerFactory(view, params, tabContent), 2 == index ? controller.mode = "albumartists" : 3 == index && (controller.mode = "artists"), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
}) if (index === 0) {
controller = self;
} else if (index === 7) {
controller = new controllerFactory(view, tabContent, {
collectionType: "music",
parentId: params.topParentId
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
if (index == 2) {
controller.mode = "albumartists";
} else if (index == 3) {
controller.mode = "artists";
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
} }
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onInputCommand(e) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId) e.preventDefault();
Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId);
} }
} }
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)), var isViewRestored;
initialTabIndex = currentTabIndex; var self = this;
self.initTab = function() { var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX()) var initialTabIndex = currentTabIndex;
}, self.renderTab = function() {
reload() self.initTab = function () {
}; var tabContent = view.querySelector(".pageTabContent[data-index='0']");
var tabControllers = [], var containers = tabContent.querySelectorAll(".itemsContainer");
renderedTabs = [];
view.addEventListener("viewshow", function(e) { for (var i = 0, length = containers.length; i < length; i++) {
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { setScrollClasses(containers[i], enableScrollX());
var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name)
}) : (view.setAttribute("data-title", Globalize.translate("TabMusic")), libraryMenu.setTitle(Globalize.translate("TabMusic")))
} }
inputManager.on(window, onInputCommand) };
}), view.addEventListener("viewbeforehide", function(e) {
inputManager.off(window, onInputCommand) self.renderTab = function () {
}), view.addEventListener("viewdestroy", function(e) { reload();
tabControllers.forEach(function(t) { };
t.destroy && t.destroy()
}) var tabControllers = [];
}) var renderedTabs = [];
} view.addEventListener("viewshow", function (e) {
}); isViewRestored = e.detail.isRestored;
initTabs();
if (!view.getAttribute("data-title")) {
var parentId = params.topParentId;
if (parentId) {
ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabMusic"));
libraryMenu.setTitle(Globalize.translate("TabMusic"));
}
}
inputManager.on(window, onInputCommand);
});
view.addEventListener("viewbeforehide", function (e) {
inputManager.off(window, onInputCommand);
});
view.addEventListener("viewdestroy", function (e) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
});
};
});

View file

@ -1,135 +1,185 @@
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function(events, libraryBrowser, imageLoader, listView, loading) { define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "Album,SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Audio", SortBy: "Album,SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "AudioInfo,ParentId", IncludeItemTypes: "Audio",
Limit: 100, Recursive: true,
StartIndex: 0, Fields: "AudioInfo,ParentId",
ImageTypeLimit: 1, Limit: 100,
EnableImageTypes: "Primary" StartIndex: 0,
} ImageTypeLimit: 1,
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData EnableImageTypes: "Primary"
}
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs")), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs");
}
return context.savedQueryKey;
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex += query.Limit, reloadItems(tabContent) return;
}
query.StartIndex += query.Limit;
reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
query.StartIndex -= query.Limit, reloadItems(tabContent) return;
}
query.StartIndex -= query.Limit;
reloadItems(tabContent);
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({ var i;
startIndex: query.StartIndex, var length;
limit: query.Limit, var pagingHtml = libraryBrowser.getQueryPagingHtml({
totalRecordCount: result.TotalRecordCount, startIndex: query.StartIndex,
showLimit: !1, limit: query.Limit,
updatePageSizeSetting: !1, totalRecordCount: result.TotalRecordCount,
addLayoutButton: !1, showLimit: false,
sortButton: !1, updatePageSizeSetting: false,
filterButton: !1 addLayoutButton: false,
}), sortButton: false,
html = listView.getListViewHtml({ filterButton: false
items: result.Items, });
action: "playallfromhere", var html = listView.getListViewHtml({
smallIcon: !0, items: result.Items,
artist: !0, action: "playallfromhere",
addToListButton: !0 smallIcon: true,
}), artist: true,
elems = tabContent.querySelectorAll(".paging"); addToListButton: true
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; });
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); var elems = tabContent.querySelectorAll(".paging");
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
data = {}, var self = this;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({ self.showFilterMenu = function () {
query: getQuery(tabContent), require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
mode: "songs", var filterDialog = new filterDialogFactory({
serverId: ApiClient.serverId() query: getQuery(tabContent),
}); mode: "songs",
events.on(filterDialog, "filterchange", function() { serverId: ApiClient.serverId()
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) });
}), filterDialog.show() events.on(filterDialog, "filterchange", function () {
}) getQuery(tabContent).StartIndex = 0;
}, self.getCurrentViewStyle = function() { reloadItems(tabContent);
return getPageData(tabContent).view });
}, filterDialog.show();
function(tabContent) { });
tabContent.querySelector(".btnFilter").addEventListener("click", function() { };
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) { self.getCurrentViewStyle = function () {
libraryBrowser.showSortMenu({ return getPageData(tabContent).view;
items: [{ };
name: Globalize.translate("OptionTrackName"),
id: "Name" function initPage(tabContent) {
}, { tabContent.querySelector(".btnFilter").addEventListener("click", function () {
name: Globalize.translate("OptionAlbum"), self.showFilterMenu();
id: "Album,SortName" });
}, { tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
name: Globalize.translate("OptionAlbumArtist"), libraryBrowser.showSortMenu({
id: "AlbumArtist,Album,SortName" items: [{
}, { name: Globalize.translate("OptionTrackName"),
name: Globalize.translate("OptionArtist"), id: "Name"
id: "Artist,Album,SortName" }, {
}, { name: Globalize.translate("OptionAlbum"),
name: Globalize.translate("OptionDateAdded"), id: "Album,SortName"
id: "DateCreated,SortName" }, {
}, { name: Globalize.translate("OptionAlbumArtist"),
name: Globalize.translate("OptionDatePlayed"), id: "AlbumArtist,Album,SortName"
id: "DatePlayed,SortName" }, {
}, { name: Globalize.translate("OptionArtist"),
name: Globalize.translate("OptionPlayCount"), id: "Artist,Album,SortName"
id: "PlayCount,SortName" }, {
}, { name: Globalize.translate("OptionDateAdded"),
name: Globalize.translate("OptionReleaseDate"), id: "DateCreated,SortName"
id: "PremiereDate,AlbumArtist,Album,SortName" }, {
}, { name: Globalize.translate("OptionDatePlayed"),
name: Globalize.translate("OptionRuntime"), id: "DatePlayed,SortName"
id: "Runtime,AlbumArtist,Album,SortName" }, {
}], name: Globalize.translate("OptionPlayCount"),
callback: function() { id: "PlayCount,SortName"
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent) }, {
}, name: Globalize.translate("OptionReleaseDate"),
query: getQuery(tabContent), id: "PremiereDate,AlbumArtist,Album,SortName"
button: e.target }, {
}) name: Globalize.translate("OptionRuntime"),
}) id: "Runtime,AlbumArtist,Album,SortName"
}(tabContent), self.renderTab = function() { }],
reloadItems(tabContent) callback: function () {
}, self.destroy = function() {} getQuery(tabContent).StartIndex = 0;
} reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
}
initPage(tabContent);
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,85 +1,122 @@
define(["jQuery", "emby-checkbox", "fnchecked"], function($) { define(["jQuery", "emby-checkbox", "fnchecked"], function ($) {
"use strict"; "use strict";
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">'; var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
html += items.map(function(u) { html += items.map(function (u) {
var isChecked = isEnabledList ? -1 != currentList.indexOf(u.Id) : -1 == currentList.indexOf(u.Id), var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
checkedHtml = isChecked ? ' checked="checked"' : ""; var checkedHtml = isChecked ? ' checked="checked"' : "";
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>" return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + "/><span>" + u.Name + "</span></label>";
}).join(""), html += "</div>", elem.html(html).trigger("create") }).join("");
html += "</div>";
elem.html(html).trigger("create");
} }
function reload(page) { function reload(page) {
var type = getParameterByName("type"), var type = getParameterByName("type");
promise1 = ApiClient.getUsers(), var promise1 = ApiClient.getUsers();
promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey), var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")), var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services")); var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services"));
Promise.all([promise1, promise2, promise3, promise4]).then(function(responses) { Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) {
var users = responses[0], var users = responses[0];
notificationOptions = responses[1], var notificationOptions = responses[1];
types = responses[2], var types = responses[2];
services = responses[3], var services = responses[3];
notificationConfig = notificationOptions.Options.filter(function(n) { var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type return n.Type == type;
})[0], })[0];
typeInfo = types.filter(function(n) { var typeInfo = types.filter(function (n) {
return n.Type == type return n.Type == type;
})[0] || {}; })[0] || {};
typeInfo.IsBasedOnUserEvent ? $(".monitorUsers", page).show() : $(".monitorUsers", page).hide(), $(".notificationType", page).html(typeInfo.Name || "Unknown Notification"), notificationConfig || (notificationConfig = {
DisabledMonitorUsers: [], if (typeInfo.IsBasedOnUserEvent) {
SendToUsers: [], $(".monitorUsers", page).show();
DisabledServices: [], } else {
SendToUserMode: "Admins" $(".monitorUsers", page).hide();
}), fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers), fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, !0), fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices), $("#chkEnabled", page).checked(notificationConfig.Enabled || !1), $("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change") }
})
$(".notificationType", page).html(typeInfo.Name || "Unknown Notification");
if (!notificationConfig) {
notificationConfig = {
DisabledMonitorUsers: [],
SendToUsers: [],
DisabledServices: [],
SendToUserMode: "Admins"
};
}
fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers);
fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, true);
fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices);
$("#chkEnabled", page).checked(notificationConfig.Enabled || false);
$("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change");
});
} }
function save(page) { function save(page) {
var type = getParameterByName("type"), var type = getParameterByName("type");
promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey), var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types"));
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
var notificationOptions = responses[0], var notificationOptions = responses[0];
types = responses[1], var types = responses[1];
notificationConfig = notificationOptions.Options.filter(function(n) { var notificationConfig = notificationOptions.Options.filter(function (n) {
return n.Type == type return n.Type == type;
})[0];
notificationConfig || (notificationConfig = {
Type: type
}, notificationOptions.Options.push(notificationConfig));
types.filter(function(n) {
return n.Type == type
})[0]; })[0];
notificationConfig.Enabled = $("#chkEnabled", page).checked(), notificationConfig.SendToUserMode = $("#selectUsers", page).val(), notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function(c) {
return !c.checked if (!notificationConfig) {
}).map(function(c) { notificationConfig = {
return c.getAttribute("data-itemid") Type: type
}), notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function(c) { };
return c.checked notificationOptions.Options.push(notificationConfig);
}).map(function(c) { }
return c.getAttribute("data-itemid")
}), notificationConfig.DisabledServices = $(".chkService", page).get().filter(function(c) { types.filter(function (n) {
return !c.checked return n.Type == type;
}).map(function(c) { })[0];
return c.getAttribute("data-itemid") notificationConfig.Enabled = $("#chkEnabled", page).checked();
}), ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function(r) { notificationConfig.SendToUserMode = $("#selectUsers", page).val();
Dashboard.processServerConfigurationUpdateResult(), Dashboard.navigate("notificationsettings.html") notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function (c) {
}) return !c.checked;
}) }).map(function (c) {
return c.getAttribute("data-itemid");
});
notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function (c) {
return c.checked;
}).map(function (c) {
return c.getAttribute("data-itemid");
});
notificationConfig.DisabledServices = $(".chkService", page).get().filter(function (c) {
return !c.checked;
}).map(function (c) {
return c.getAttribute("data-itemid");
});
ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) {
Dashboard.processServerConfigurationUpdateResult();
Dashboard.navigate("notificationsettings.html");
});
});
} }
function onSubmit() { function onSubmit() {
return save($(this).parents(".page")), !1 save($(this).parents(".page"));
return false;
} }
var notificationsConfigurationKey = "notifications"; var notificationsConfigurationKey = "notifications";
$(document).on("pageinit", "#notificationSettingPage", function() { $(document).on("pageinit", "#notificationSettingPage", function () {
var page = this; var page = this;
$("#selectUsers", page).on("change", function() { $("#selectUsers", page).on("change", function () {
"Custom" == this.value ? $(".selectCustomUsers", page).show() : $(".selectCustomUsers", page).hide() if ("Custom" == this.value) {
}), $(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit) $(".selectCustomUsers", page).show();
}).on("pageshow", "#notificationSettingPage", function() { } else {
reload(this) $(".selectCustomUsers", page).hide();
}) }
}); });
$(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#notificationSettingPage", function () {
reload(this);
});
});

View file

@ -1,11 +1,22 @@
define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function(remotecontrolFactory, libraryMenu) { define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function (remotecontrolFactory, libraryMenu) {
"use strict"; "use strict";
return function(view, params) {
var remoteControl = new remotecontrolFactory; return function (view, params) {
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) { var remoteControl = new remotecontrolFactory();
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow() remoteControl.init(view, view.querySelector(".remoteControlContent"));
}), view.addEventListener("viewbeforehide", function(e) { view.addEventListener("viewshow", function (e) {
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy() libraryMenu.setTransparentMenu(true);
})
} if (remoteControl) {
}); remoteControl.onShow();
}
});
view.addEventListener("viewbeforehide", function (e) {
libraryMenu.setTransparentMenu(false);
if (remoteControl) {
remoteControl.destroy();
}
});
};
});

View file

@ -1,16 +1,25 @@
define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) { define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) {
"use strict"; "use strict";
function loadPage(page, config) { function loadPage(page, config) {
$("#txtMinResumePct", page).val(config.MinResumePct), $("#txtMaxResumePct", page).val(config.MaxResumePct), $("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds), loading.hide() $("#txtMinResumePct", page).val(config.MinResumePct);
$("#txtMaxResumePct", page).val(config.MaxResumePct);
$("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds);
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
config.MinResumePct = $("#txtMinResumePct", form).val(), config.MaxResumePct = $("#txtMaxResumePct", form).val(), config.MinResumeDurationSeconds = $("#txtMinResumeDuration", form).val(), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult) config.MinResumePct = $('#txtMinResumePct', form).val();
}), !1 config.MaxResumePct = $('#txtMaxResumePct', form).val();
config.MinResumeDurationSeconds = $('#txtMinResumeDuration', form).val();
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
} }
function getTabs() { function getTabs() {
@ -23,17 +32,17 @@ define(["jQuery", "loading", "libraryMenu"], function($, loading, libraryMenu) {
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#playbackConfigurationPage", function() { $(document).on("pageinit", "#playbackConfigurationPage", function () {
$(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit) $(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit)
}).on("pageshow", "#playbackConfigurationPage", function() { }).on("pageshow", "#playbackConfigurationPage", function () {
loading.show(); loading.show();
libraryMenu.setTabs("playback", 1, getTabs); libraryMenu.setTabs("playback", 1, getTabs);
var page = this; var page = this;
ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, config) loadPage(page, config);
}) });
}) });
}); });

View file

@ -1,111 +1,237 @@
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function($, loading, datetime, dom, globalize) { define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function ($, loading, datetime, dom, globalize) {
"use strict"; "use strict";
function fillTimeOfDay(select) { function fillTimeOfDay(select) {
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
name: ScheduledTaskPage.getDisplayTime(1e4 * i), var options = [];
value: 1e4 * i
}); for (var i = 0; i < 86400000; i += 900000) {
select.innerHTML = options.map(function(o) { options.push({
return '<option value="' + o.value + '">' + o.name + "</option>" name: ScheduledTaskPage.getDisplayTime(i * 10000),
}).join("") value: i * 10000
});
}
select.innerHTML = options.map(function (o) {
return '<option value="' + o.value + '">' + o.name + '</option>';
}).join("");
} }
Array.prototype.remove = function(from, to) {
Array.prototype.remove = function (from, to) {
var rest = this.slice((to || from) + 1 || this.length); var rest = this.slice((to || from) + 1 || this.length);
return this.length = from < 0 ? this.length + from : from, this.push.apply(this, rest) this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
}; };
var ScheduledTaskPage = { var ScheduledTaskPage = {
refreshScheduledTask: function(view) { refreshScheduledTask: function (view) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
ScheduledTaskPage.loadScheduledTask(view, task) ScheduledTaskPage.loadScheduledTask(view, task);
}) });
}, },
loadScheduledTask: function(view, task) { loadScheduledTask: function (view, task) {
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() { $(".taskName", view).html(task.Name);
ScheduledTaskPage.loadTaskTriggers(view, task) $("#pTaskDescription", view).html(task.Description);
}), loading.hide()
require(["listViewStyle"], function () {
ScheduledTaskPage.loadTaskTriggers(view, task);
});
loading.hide();
}, },
loadTaskTriggers: function(context, task) { loadTaskTriggers: function (context, task) {
var html = ""; var html = "";
html += '<div class="paperList">'; html += '<div class="paperList">';
for (var i = 0, length = task.Triggers.length; i < length; i++) { for (var i = 0, length = task.Triggers.length; i < length; i++) {
var trigger = task.Triggers[i]; var trigger = task.Triggers[i];
if (html += '<div class="listItem listItem-border">', html += '<i class="md-icon listItemIcon">schedule</i>', trigger.MaxRuntimeTicks ? html += '<div class="listItemBody two-line">' : html += '<div class="listItemBody">', html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>", trigger.MaxRuntimeTicks) {
html += '<div class="listItem listItem-border">';
html += '<i class="md-icon listItemIcon">schedule</i>';
if (trigger.MaxRuntimeMs) {
html += '<div class="listItemBody two-line">';
} else {
html += '<div class="listItemBody">';
}
html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "</div>";
if (trigger.MaxRuntimeMs) {
html += '<div class="listItemBodyText secondary">'; html += '<div class="listItemBodyText secondary">';
var hours = trigger.MaxRuntimeTicks / 36e9; var hours = trigger.MaxRuntimeTicks / 36e9;
html += 1 == hours ? globalize.translate("ValueTimeLimitSingleHour") : globalize.translate("ValueTimeLimitMultiHour", hours), html += "</div>" if (hours == 1) {
html += globalize.translate("ValueTimeLimitSingleHour");
} else {
html += globalize.translate("ValueTimeLimitMultiHour", hours);
}
html += "</div>";
} }
html += "</div>", html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>', html += "</div>"
html += "</div>";
html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonDelete") + '"><i class="md-icon">delete</i></button>';
html += "</div>";
} }
html += "</div>", context.querySelector(".taskTriggers").innerHTML = html
html += "</div>";
context.querySelector(".taskTriggers").innerHTML = html;
}, },
getTriggerFriendlyName: function(trigger) { getTriggerFriendlyName: function (trigger) {
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); if ("DailyTrigger" == trigger.Type) {
if ("WeeklyTrigger" == trigger.Type) return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) return "On wake from sleep"; }
if ("IntervalTrigger" == trigger.Type) {
if ("WeeklyTrigger" == trigger.Type) {
return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
}
if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) {
return "On wake from sleep";
}
if (trigger.Type == "IntervalTrigger") {
var hours = trigger.IntervalTicks / 36e9; var hours = trigger.IntervalTicks / 36e9;
return .25 == hours ? "Every 15 minutes" : .5 == hours ? "Every 30 minutes" : .75 == hours ? "Every 45 minutes" : 1 == hours ? "Every hour" : "Every " + hours + " hours"
if (hours == .25) {
return "Every 15 minutes";
}
if (hours == .5) {
return "Every 30 minutes";
}
if (hours == .75) {
return "Every 45 minutes";
}
if (hours == 1) {
return "Every hour";
}
return "Every " + hours + " hours";
} }
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type
if (trigger.Type == "StartupTrigger") {
return "On application startup";
}
return trigger.Type;
}, },
getDisplayTime: function(ticks) { getDisplayTime: function (ticks) {
var ms = ticks / 1e4, var ms = ticks / 1e4;
now = new Date; var now = new Date();
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now) now.setHours(0, 0, 0, 0);
now.setTime(now.getTime() + ms);
return datetime.getDisplayTime(now);
}, },
showAddTriggerPopup: function(view) { showAddTriggerPopup: function (view) {
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide") $("#selectTriggerType", view).val("DailyTrigger");
view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {}));
$("#popupAddTrigger", view).removeClass("hide");
}, },
confirmDeleteTrigger: function(view, index) { confirmDeleteTrigger: function (view, index) {
require(["confirm"], function(confirm) { require(["confirm"], function (confirm) {
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() { confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function () {
ScheduledTaskPage.deleteTrigger(view, index) ScheduledTaskPage.deleteTrigger(view, index);
}) });
}) });
}, },
deleteTrigger: function(view, index) { deleteTrigger: function (view, index) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() { task.Triggers.remove(index);
ScheduledTaskPage.refreshScheduledTask(view) ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
}) ScheduledTaskPage.refreshScheduledTask(view);
}) });
});
}, },
refreshTriggerFields: function(page, triggerType) { refreshTriggerFields: function (page, triggerType) {
"DailyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "WeeklyTrigger" == triggerType ? ($("#fldTimeOfDay", page).show(), $("#fldDayOfWeek", page).show(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).attr("required", "required")) : "SystemEventTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).show(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required")) : "IntervalTrigger" == triggerType ? ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).show(), $("#selectTimeOfDay", page).removeAttr("required")) : "StartupTrigger" == triggerType && ($("#fldTimeOfDay", page).hide(), $("#fldDayOfWeek", page).hide(), $("#fldSelectSystemEvent", page).hide(), $("#fldSelectInterval", page).hide(), $("#selectTimeOfDay", page).removeAttr("required")) if (triggerType == "DailyTrigger") {
$("#fldTimeOfDay", page).show();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).attr("required", "required");
} else if (triggerType == "WeeklyTrigger") {
$("#fldTimeOfDay", page).show();
$("#fldDayOfWeek", page).show();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).attr("required", "required");
} else if (triggerType == "SystemEventTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).show();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).removeAttr("required");
} else if (triggerType == "IntervalTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).show();
$("#selectTimeOfDay", page).removeAttr("required");
} else if (triggerType == "StartupTrigger") {
$("#fldTimeOfDay", page).hide();
$("#fldDayOfWeek", page).hide();
$("#fldSelectSystemEvent", page).hide();
$("#fldSelectInterval", page).hide();
$("#selectTimeOfDay", page).removeAttr("required");
}
}, },
getTriggerToAdd: function(page) { getTriggerToAdd: function (page) {
var trigger = { var trigger = {
Type: $("#selectTriggerType", page).val() Type: $("#selectTriggerType", page).val()
}; };
"DailyTrigger" == trigger.Type ? trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val() : "WeeklyTrigger" == trigger.Type ? (trigger.DayOfWeek = $("#selectDayOfWeek", page).val(), trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val()) : "SystemEventTrigger" == trigger.Type ? trigger.SystemEvent = $("#selectSystemEvent", page).val() : "IntervalTrigger" == trigger.Type && (trigger.IntervalTicks = $("#selectInterval", page).val());
if (trigger.Type == "DailyTrigger") {
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
} else if (trigger.Type == "WeeklyTrigger") {
trigger.DayOfWeek = $("#selectDayOfWeek", page).val();
trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val();
} else if (trigger.Type == "SystemEventTrigger") {
trigger.SystemEvent = $("#selectSystemEvent", page).val();
} else if (trigger.Type == "IntervalTrigger") {
trigger.IntervalTicks = $("#selectInterval", page).val();
}
var timeLimit = $("#txtTimeLimit", page).val() || "0"; var timeLimit = $("#txtTimeLimit", page).val() || "0";
return timeLimit = 36e5 * parseFloat(timeLimit), trigger.MaxRuntimeMs = timeLimit || null, trigger timeLimit = parseFloat(timeLimit) * 3600000;
trigger.MaxRuntimeMs = timeLimit || null;
return trigger;
} }
}; };
return function(view, params) { return function (view, params) {
function onSubmit(e) { function onSubmit(e) {
loading.show(); loading.show();
var id = getParameterByName("id"); var id = getParameterByName("id");
ApiClient.getScheduledTask(id).then(function(task) { ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() { task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
$("#popupAddTrigger").addClass("hide"), ScheduledTaskPage.refreshScheduledTask(view) ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
}) $("#popupAddTrigger").addClass("hide");
}), e.preventDefault() ScheduledTaskPage.refreshScheduledTask(view);
});
});
e.preventDefault();
} }
view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit), fillTimeOfDay(view.querySelector("#selectTimeOfDay")), $(view.querySelector("#popupAddTrigger").parentNode).trigger("create"), view.querySelector(".selectTriggerType").addEventListener("change", function() {
ScheduledTaskPage.refreshTriggerFields(view, this.value) view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit);
}), view.querySelector(".btnAddTrigger").addEventListener("click", function() { fillTimeOfDay(view.querySelector("#selectTimeOfDay"));
ScheduledTaskPage.showAddTriggerPopup(view) $(view.querySelector("#popupAddTrigger").parentNode).trigger("create");
}), view.addEventListener("click", function(e) { view.querySelector(".selectTriggerType").addEventListener("change", function () {
ScheduledTaskPage.refreshTriggerFields(view, this.value);
});
view.querySelector(".btnAddTrigger").addEventListener("click", function () {
ScheduledTaskPage.showAddTriggerPopup(view);
});
view.addEventListener("click", function (e) {
var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger"); var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
}), view.addEventListener("viewshow", function() { if (btnDeleteTrigger) {
ScheduledTaskPage.refreshScheduledTask(view) ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")));
}) }
} });
}); view.addEventListener("viewshow", function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
};
});

View file

@ -1,21 +1,36 @@
define(["focusManager", "searchFields", "searchResults", "events"], function(focusManager, SearchFields, SearchResults, events) { define(["focusManager", "searchFields", "searchResults", "events"], function (focusManager, SearchFields, SearchResults, events) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
function onSearch(e, value) { function onSearch(e, value) {
self.searchResults.search(value) self.searchResults.search(value);
} }
var self = this; var self = this;
view.addEventListener("viewshow", function() { view.addEventListener("viewshow", function () {
self.searchFields || (self.searchFields = new SearchFields({ if (!self.searchFields) {
element: view.querySelector(".searchFields") self.searchFields = new SearchFields({
}), self.searchResults = new SearchResults({ element: view.querySelector(".searchFields")
element: view.querySelector(".searchResults"), });
serverId: params.serverId || ApiClient.serverId(), self.searchResults = new SearchResults({
parentId: params.parentId, element: view.querySelector(".searchResults"),
collectionType: params.collectionType serverId: params.serverId || ApiClient.serverId(),
}), events.on(self.searchFields, "search", onSearch)) parentId: params.parentId,
}), view.addEventListener("viewdestroy", function() { collectionType: params.collectionType
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null) });
}) events.on(self.searchFields, "search", onSearch);
} }
}); });
view.addEventListener("viewdestroy", function () {
if (self.searchFields) {
self.searchFields.destroy();
self.searchFields = null;
}
if (self.searchResults) {
self.searchResults.destroy();
self.searchResults = null;
}
});
};
});

View file

@ -1,50 +1,56 @@
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) { define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom) {
"use strict"; "use strict";
function renderSelectServerItems(view, servers) { function renderSelectServerItems(view, servers) {
var items = servers.map(function(server) { var items = servers.map(function (server) {
return { return {
name: server.Name, name: server.Name,
showIcon: !0, showIcon: true,
icon: "&#xE307;", icon: "&#xE307;",
cardType: "", cardType: "",
id: server.Id, id: server.Id,
server: server server: server
} };
}); });
var html = items.map(function(item) { var html = items.map(function (item) {
var cardImageContainer; var cardImageContainer;
if (item.showIcon) {
cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>"; if (item.showIcon) {
} else { cardImageContainer = '<i class="cardImageIcon md-icon">' + item.icon + "</i>";
cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>'; } else {
} cardImageContainer = '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
var cardBoxCssClass = "cardBox"; }
if (layoutManager.tv) {
cardBoxCssClass += " cardBox-focustransform"; var cardBoxCssClass = "cardBox";
}
var innerOpening = '<div class="' + cardBoxCssClass + '">'; if (layoutManager.tv) {
var cardContainer = ''; cardBoxCssClass += " cardBox-focustransform";
cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">'; }
cardContainer += innerOpening;
cardContainer += '<div class="cardScalable card-focuscontent">'; var innerOpening = '<div class="' + cardBoxCssClass + '">';
cardContainer += '<div class="cardPadder cardPadder-square">'; var cardContainer = '';
cardContainer += '</div>'; cardContainer += '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable" style="display:inline-block;" data-id="' + item.id + '" data-url="' + (item.url || "") + '" data-cardtype="' + item.cardType + '">';
cardContainer += '<div class="cardContent">'; cardContainer += innerOpening;
cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">'; cardContainer += '<div class="cardScalable card-focuscontent">';
cardContainer += cardImageContainer; cardContainer += '<div class="cardPadder cardPadder-square">';
cardContainer += '</div>'; cardContainer += '</div>';
cardContainer += '</div>'; cardContainer += '<div class="cardContent">';
cardContainer += '</div>'; cardContainer += '<div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">';
cardContainer += '<div class="cardFooter">'; cardContainer += cardImageContainer;
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>'; cardContainer += '</div>';
cardContainer += '</div></div></button>'; cardContainer += '</div>';
return cardContainer; cardContainer += '</div>';
cardContainer += '<div class="cardFooter">';
cardContainer += '<div class="cardText cardTextCentered">' + item.name + '</div>';
cardContainer += '</div></div></button>';
return cardContainer;
}).join(""); }).join("");
var itemsContainer = view.querySelector(".servers"); var itemsContainer = view.querySelector(".servers");
if (!items.length) { if (!items.length) {
html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>"; html = '<p>' + globalize.translate("MessageNoServersAvailable") + "</p>";
} }
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
loading.hide(); loading.hide();
} }
@ -73,7 +79,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
} }
function alertTextWithOptions(options) { function alertTextWithOptions(options) {
require(["alert"], function(alert) { require(["alert"], function (alert) {
alert(options); alert(options);
}); });
} }
@ -82,38 +88,42 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure")); alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
} }
return function(view, params) { return function (view, params) {
function connectToServer(server) { function connectToServer(server) {
loading.show(); loading.show();
connectionManager.connectToServer(server, { connectionManager.connectToServer(server, {
enableAutoLogin: appSettings.enableAutoLogin() enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) { }).then(function (result) {
loading.hide(); loading.hide();
var apiClient = result.ApiClient; var apiClient = result.ApiClient;
switch (result.State) { switch (result.State) {
case "SignedIn": case "SignedIn":
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient);
Dashboard.navigate("home.html"); Dashboard.navigate("home.html");
break; break;
case "ServerSignIn": case "ServerSignIn":
Dashboard.onServerChanged(null, null, apiClient); Dashboard.onServerChanged(null, null, apiClient);
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id); Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
break; break;
case "ServerUpdateNeeded": case "ServerUpdateNeeded":
alertTextWithOptions({ alertTextWithOptions({
text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"), text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"),
html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>') html: globalize.translate("core#ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
}); });
break; break;
default: default:
showServerConnectionFailure(); showServerConnectionFailure();
} }
}) });
} }
function deleteServer(server) { function deleteServer(server) {
loading.show(); loading.show();
connectionManager.deleteServer(server.Id).then(function() { connectionManager.deleteServer(server.Id).then(function () {
loading.hide(); loading.hide();
loadServers(); loadServers();
}); });
@ -132,20 +142,22 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
actionSheet.show({ actionSheet.show({
items: menuItems, items: menuItems,
title: server.Name title: server.Name
}).then(function(id) { }).then(function (id) {
switch (id) { switch (id) {
case "connect": case "connect":
connectToServer(server); connectToServer(server);
break; break;
case "delete": case "delete":
deleteServer(server); deleteServer(server);
} }
}) });
} }
function onServersRetrieved(result) { function onServersRetrieved(result) {
servers = result; servers = result;
renderSelectServerItems(view, result); renderSelectServerItems(view, result);
if (layoutManager.tv) { if (layoutManager.tv) {
focusManager.autoFocus(view); focusManager.autoFocus(view);
} }
@ -158,25 +170,29 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
var servers; var servers;
updatePageStyle(view, params); updatePageStyle(view, params);
view.addEventListener("viewshow", function (e) {
view.addEventListener("viewshow", function(e) {
var isRestored = e.detail.isRestored; var isRestored = e.detail.isRestored;
appRouter.setTitle(null); appRouter.setTitle(null);
if (!isRestored) loadServers();
if (!isRestored) {
loadServers();
}
}); });
view.querySelector(".servers").addEventListener("click", function(e) { view.querySelector(".servers").addEventListener("click", function (e) {
var card = dom.parentWithClass(e.target, "card"); var card = dom.parentWithClass(e.target, "card");
if (card) { if (card) {
var url = card.getAttribute("data-url"); var url = card.getAttribute("data-url");
if (url) { if (url) {
appRouter.show(url); appRouter.show(url);
} else { } else {
var id = card.getAttribute("data-id"); var id = card.getAttribute("data-id");
onServerClick(servers.filter(function(s) { onServerClick(servers.filter(function (s) {
return s.Id === id; return s.Id === id;
})[0]); })[0]);
} }
} }
}) });
} };
}); });

View file

@ -1,14 +1,31 @@
define(["components/activitylog", "globalize"], function(ActivityLog, globalize) { define(["components/activitylog", "globalize"], function (ActivityLog, globalize) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
var activityLog; var activityLog;
"false" !== params.useractivity ? (view.querySelector(".activityItems").setAttribute("data-useractivity", "true"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity")) : (view.querySelector(".activityItems").setAttribute("data-useractivity", "false"), view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts")), view.addEventListener("viewshow", function() {
activityLog || (activityLog = new ActivityLog({ if (params.useractivity !== "false") {
serverId: ApiClient.serverId(), view.querySelector(".activityItems").setAttribute("data-useractivity", "true");
element: view.querySelector(".activityItems") view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity");
})) } else {
}), view.addEventListener("viewdestroy", function() { view.querySelector(".activityItems").setAttribute("data-useractivity", "false");
activityLog && activityLog.destroy(), activityLog = null view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts");
}) }
}
}); view.addEventListener("viewshow", function () {
if (!activityLog) {
activityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: view.querySelector(".activityItems")
});
}
});
view.addEventListener("viewdestroy", function () {
if (activityLog) {
activityLog.destroy();
}
activityLog = null;
});
};
});

View file

@ -1,169 +1,233 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function(loading, events, libraryBrowser, imageLoader, listView, cardBuilder) { define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SeriesSortName,SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Episode", SortBy: "SeriesSortName,SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", IncludeItemTypes: "Episode",
IsMissing: !1, Recursive: true,
ImageTypeLimit: 1, Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData",
EnableImageTypes: "Primary,Backdrop,Thumb", IsMissing: false,
StartIndex: 0, ImageTypeLimit: 1,
Limit: pageSize EnableImageTypes: "Primary,Backdrop,Thumb",
}, StartIndex: 0,
view: libraryBrowser.getSavedView(key) || "Poster" Limit: pageSize
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes")), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes");
}
return context.savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
reloadItems(tabContent) reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
reloadItems(tabContent) reloadItems(tabContent);
} }
window.scrollTo(0, 0); window.scrollTo(0, 0);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ var html;
startIndex: query.StartIndex, var pagingHtml = libraryBrowser.getQueryPagingHtml({
limit: query.Limit, startIndex: query.StartIndex,
totalRecordCount: result.TotalRecordCount, limit: query.Limit,
showLimit: !1, totalRecordCount: result.TotalRecordCount,
updatePageSizeSetting: !1, showLimit: false,
addLayoutButton: !1, updatePageSizeSetting: false,
sortButton: !1, addLayoutButton: false,
filterButton: !1 sortButton: false,
}), filterButton: false
viewStyle = self.getCurrentViewStyle(),
itemsContainer = tabContent.querySelector(".itemsContainer");
html = "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy,
showParentTitle: !0
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: !0,
showParentTitle: !0,
scalable: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: !0,
showParentTitle: !0,
overlayText: !1,
centerText: !0,
scalable: !0,
overlayPlayButton: !0
}); });
var i, length, elems; var viewStyle = self.getCurrentViewStyle();
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++) var itemsContainer = tabContent.querySelector(".itemsContainer");
if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
sortBy: query.SortBy,
showParentTitle: true
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: true,
showParentTitle: true,
scalable: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
showTitle: true,
showParentTitle: true,
overlayText: false,
centerText: true,
scalable: true,
overlayPlayButton: true
});
}
var i;
var length;
var elems;
elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml; elems[i].innerHTML = pagingHtml;
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) }
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick); elems[i].addEventListener("click", onNextPageClick);
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) }
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick); elems[i].addEventListener("click", onPreviousPageClick);
}
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({ self.showFilterMenu = function () {
query: getQuery(tabContent), require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
mode: "episodes", var filterDialog = new filterDialogFactory({
serverId: ApiClient.serverId() query: getQuery(tabContent),
}); mode: "episodes",
events.on(filterDialog, "filterchange", function() { serverId: ApiClient.serverId()
reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionTvdbRating"),
id: "CommunityRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPremiereDate"),
id: "PremiereDate,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName"
}],
callback: function() {
reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); events.on(filterDialog, "filterchange", function () {
btnSelectView.addEventListener("click", function(e) { reloadItems(tabContent);
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")) });
}), btnSelectView.addEventListener("layoutchange", function(e) { filterDialog.show();
var viewStyle = e.detail.viewStyle; });
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), onViewStyleChange(), reloadItems(tabContent) };
})
}(tabContent), onViewStyleChange(), self.renderTab = function() { self.getCurrentViewStyle = function () {
reloadItems(tabContent) return getPageData(tabContent).view;
}, self.destroy = function() {} };
}
function initPage(tabContent) {
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionTvdbRating"),
id: "CommunityRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPremiereDate"),
id: "PremiereDate,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SeriesSortName,SortName"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SeriesSortName,SortName"
}],
callback: function () {
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,139 +1,200 @@
define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function(layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData() { function getPageData() {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Series", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
EnableTotalRecordCount: !1 IncludeItemTypes: "Series",
}, Recursive: true,
view: "Poster" EnableTotalRecordCount: false
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery() { function getQuery() {
return getPageData().query return getPageData().query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("seriesgenres") return libraryBrowser.getSavedQueryKey("seriesgenres");
} }
function getPromise() { function getPromise() {
loading.show(); loading.show();
var query = getQuery(); var query = getQuery();
return ApiClient.getGenres(ApiClient.getCurrentUserId(), query) return ApiClient.getGenres(ApiClient.getCurrentUserId(), query);
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function getPortraitShape() { function getPortraitShape() {
return enableScrollX() ? "overflowPortrait" : "portrait" return enableScrollX() ? "overflowPortrait" : "portrait";
} }
function fillItemsContainer(elem) { function fillItemsContainer(elem) {
var id = elem.getAttribute("data-id"), var id = elem.getAttribute("data-id");
viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9;
enableScrollX() && (limit = 10);
var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary", if (enableScrollX()) {
query = { limit = 10;
SortBy: "SortName", }
SortOrder: "Ascending",
IncludeItemTypes: "Series", var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary";
Recursive: !0, var query = {
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", SortBy: "SortName",
ImageTypeLimit: 1, SortOrder: "Ascending",
EnableImageTypes: enableImageTypes, IncludeItemTypes: "Series",
Limit: limit, Recursive: true,
GenreIds: id, Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
EnableTotalRecordCount: !1, ImageTypeLimit: 1,
ParentId: params.topParentId EnableImageTypes: enableImageTypes,
}; Limit: limit,
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { GenreIds: id,
EnableTotalRecordCount: false,
ParentId: params.topParentId
};
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
var supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
"Thumb" == viewStyle ? cardBuilder.buildCards(result.Items, {
itemsContainer: elem, if (viewStyle == "Thumb") {
shape: getThumbShape(), cardBuilder.buildCards(result.Items, {
preferThumb: !0, itemsContainer: elem,
showTitle: !0, shape: getThumbShape(),
scalable: !0, preferThumb: true,
centerText: !0, showTitle: true,
overlayMoreButton: !0, scalable: true,
allowBottomPadding: !1 centerText: true,
}) : "ThumbCard" == viewStyle ? cardBuilder.buildCards(result.Items, { overlayMoreButton: true,
itemsContainer: elem, allowBottomPadding: false
shape: getThumbShape(), });
preferThumb: !0, } else if (viewStyle == "ThumbCard") {
showTitle: !0, cardBuilder.buildCards(result.Items, {
scalable: !0, itemsContainer: elem,
centerText: !1, shape: getThumbShape(),
cardLayout: !0, preferThumb: true,
showYear: !0 showTitle: true,
}) : "PosterCard" == viewStyle ? cardBuilder.buildCards(result.Items, { scalable: true,
itemsContainer: elem, centerText: false,
shape: getPortraitShape(), cardLayout: true,
showTitle: !0, showYear: true
scalable: !0, });
centerText: !1, } else if (viewStyle == "PosterCard") {
cardLayout: !0, cardBuilder.buildCards(result.Items, {
showYear: !0 itemsContainer: elem,
}) : "Poster" == viewStyle && cardBuilder.buildCards(result.Items, { shape: getPortraitShape(),
itemsContainer: elem, showTitle: true,
shape: getPortraitShape(), scalable: true,
scalable: !0, centerText: false,
overlayMoreButton: !0, cardLayout: true,
allowBottomPadding: !1 showYear: true
}), result.Items.length >= query.Limit && tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide") });
}) } else if (viewStyle == "Poster") {
cardBuilder.buildCards(result.Items, {
itemsContainer: elem,
shape: getPortraitShape(),
scalable: true,
overlayMoreButton: true,
allowBottomPadding: false
});
}
if (result.Items.length >= query.Limit) {
tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide");
}
});
} }
function reloadItems(context, promise) { function reloadItems(context, promise) {
var query = getQuery(); var query = getQuery();
promise.then(function(result) { promise.then(function (result) {
for (var elem = context.querySelector("#items"), html = "", items = result.Items, i = 0, length = items.length; i < length; i++) { var elem = context.querySelector("#items");
var html = "";
var items = result.Items;
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i]; var item = items[i];
if (html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, { html += '<div class="verticalSection">';
context: "tvshows", html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
parentId: params.topParentId html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item, {
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">', html += '<h2 class="sectionTitle sectionTitle-cards">', html += item.Name, html += "</h2>", html += '<i class="md-icon hide">&#xE5CC;</i>', html += "</a>", html += "</div>", enableScrollX()) { context: "tvshows",
parentId: params.topParentId
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton btnMoreFromGenre' + item.Id + '">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += item.Name;
html += "</h2>";
html += '<i class="md-icon hide">&#xE5CC;</i>';
html += "</a>";
html += "</div>";
if (enableScrollX()) {
var scrollXClass = "scrollX hiddenScrollX"; var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">' if (layoutManager.tv) {
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">'; scrollXClass += "smoothScrollX";
html += "</div>", html += "</div>" }
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' lazy padded-left padded-right" data-id="' + item.Id + '">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap lazy padded-left padded-right" data-id="' + item.Id + '">';
}
html += "</div>";
html += "</div>";
} }
elem.innerHTML = html, lazyLoader.lazyChildren(elem, fillItemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
}) elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
loading.hide();
});
} }
function fullyReload() { function fullyReload() {
self.preRender(), self.renderTab() self.preRender();
self.renderTab();
} }
var self = this,
data = {}; var self = this;
self.getViewStyles = function() { var data = {};
return "Poster,PosterCard,Thumb,ThumbCard".split(",")
}, self.getCurrentViewStyle = function() { self.getViewStyles = function () {
return getPageData(tabContent).view return "Poster,PosterCard,Thumb,ThumbCard".split(",");
}, self.setCurrentViewStyle = function(viewStyle) { };
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), fullyReload()
}, self.enableViewSelection = !0; self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
fullyReload();
};
self.enableViewSelection = true;
var promise; var promise;
self.preRender = function() {
promise = getPromise() self.preRender = function () {
}, self.renderTab = function() { promise = getPromise();
reloadItems(tabContent, promise) };
}
} self.renderTab = function () {
}); reloadItems(tabContent, promise);
};
};
});

View file

@ -1,52 +1,60 @@
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function(loading, groupedcards, cardBuilder, appHost, imageLoader) { define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function (loading, groupedcards, cardBuilder, appHost, imageLoader) {
"use strict"; "use strict";
function getLatestPromise(context, params) { function getLatestPromise(context, params) {
loading.show(); loading.show();
var userId = ApiClient.getCurrentUserId(), var userId = ApiClient.getCurrentUserId();
parentId = params.topParentId, var parentId = params.topParentId;
options = { var options = {
IncludeItemTypes: "Episode", IncludeItemTypes: "Episode",
Limit: 30, Limit: 30,
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb" EnableImageTypes: "Primary,Backdrop,Thumb"
}; };
return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)) return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options));
} }
function loadLatest(context, params, promise) { function loadLatest(context, params, promise) {
promise.then(function(items) { promise.then(function (items) {
var html = ""; var html = "";
appHost.supports("imageanalysis"); appHost.supports("imageanalysis");
html += cardBuilder.getCardsHtml({ html += cardBuilder.getCardsHtml({
items: items, items: items,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
showSeriesYear: !0, showSeriesYear: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
cardLayout: !1, cardLayout: false,
showUnplayedIndicator: !1, showUnplayedIndicator: false,
showChildCountIndicator: !0, showChildCountIndicator: true,
centerText: !0, centerText: true,
lazy: !0, lazy: true,
overlayPlayButton: !0, overlayPlayButton: true,
lines: 2 lines: 2
}); });
var elem = context.querySelector("#latestEpisodes"); var elem = context.querySelector("#latestEpisodes");
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide() elem.innerHTML = html;
}) imageLoader.lazyChildren(elem);
loading.hide();
});
} }
return function(view, params, tabContent) {
return function (view, params, tabContent) {
var self = this; var self = this;
var latestPromise; var latestPromise;
self.preRender = function() {
latestPromise = getLatestPromise(view, params) self.preRender = function () {
}, self.renderTab = function() { latestPromise = getLatestPromise(view, params);
loadLatest(tabContent, params, latestPromise) };
}, tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick)
} self.renderTab = function () {
}); loadLatest(tabContent, params, latestPromise);
};
tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick);
};
});

View file

@ -1,4 +1,4 @@
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function(events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) { define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager) {
"use strict"; "use strict";
function getTabs() { function getTabs() {
@ -19,30 +19,51 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
}, { }, {
name: Globalize.translate("ButtonSearch"), name: Globalize.translate("ButtonSearch"),
cssClass: "searchTabButton" cssClass: "searchTabButton"
}] }];
} }
function getDefaultTabIndex(folderId) { function getDefaultTabIndex(folderId) {
switch (userSettings.get("landing-" + folderId)) { switch (userSettings.get("landing-" + folderId)) {
case "suggestions": case "suggestions":
return 1; return 1;
case "latest": case "latest":
return 2; return 2;
case "favorites": case "favorites":
return 1; return 1;
case "genres": case "genres":
return 4; return 4;
default: default:
return 0 return 0;
} }
} }
function setScrollClasses(elem, scrollX) { function setScrollClasses(elem, scrollX) {
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap")) if (scrollX) {
elem.classList.add("hiddenScrollX");
if (layoutManager.tv) {
elem.classList.add("smoothScrollX");
}
elem.classList.add("scrollX");
elem.classList.remove("vertical-wrap");
} else {
elem.classList.remove("hiddenScrollX");
elem.classList.remove("smoothScrollX");
elem.classList.remove("scrollX");
elem.classList.add("vertical-wrap");
}
} }
return function(view, params) {
return function (view, params) {
function reload() { function reload() {
loading.show(), loadResume(), loadNextUp() loading.show();
loadResume();
loadNextUp();
} }
function loadNextUp() { function loadNextUp() {
@ -52,178 +73,263 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do
UserId: ApiClient.getCurrentUserId(), UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb", EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) { query.ParentId = libraryMenu.getTopParentId();
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide"); ApiClient.getNextUpEpisodes(query).then(function (result) {
if (result.Items.length) {
view.querySelector(".noNextUpItems").classList.add("hide");
} else {
view.querySelector(".noNextUpItems").classList.remove("hide");
}
var container = view.querySelector("#nextUpItems"); var container = view.querySelector("#nextUpItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: "backdrop", shape: "backdrop",
scalable: !0, scalable: true,
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
cardLayout: !1 cardLayout: false
}), loading.hide() });
}) loading.hide();
});
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function loadResume() { function loadResume() {
var parentId = libraryMenu.getTopParentId(), var parentId = libraryMenu.getTopParentId();
screenWidth = dom.getWindowSize().innerWidth, var screenWidth = dom.getWindowSize().innerWidth;
limit = screenWidth >= 1600 ? 5 : 6, var limit = screenWidth >= 1600 ? 5 : 6;
options = { var options = {
SortBy: "DatePlayed", SortBy: "DatePlayed",
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Episode", IncludeItemTypes: "Episode",
Filters: "IsResumable", Filters: "IsResumable",
Limit: limit, Limit: limit,
Recursive: !0, Recursive: true,
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
ExcludeLocationTypes: "Virtual", ExcludeLocationTypes: "Virtual",
ParentId: parentId, ParentId: parentId,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb", EnableImageTypes: "Primary,Backdrop,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) {
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide"); if (result.Items.length) {
var allowBottomPadding = !enableScrollX(), view.querySelector("#resumableSection").classList.remove("hide");
container = view.querySelector("#resumableItems"); } else {
view.querySelector("#resumableSection").classList.add("hide");
}
var allowBottomPadding = !enableScrollX();
var container = view.querySelector("#resumableItems");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: container, itemsContainer: container,
preferThumb: !0, preferThumb: true,
shape: getThumbShape(), shape: getThumbShape(),
scalable: !0, scalable: true,
showTitle: !0, showTitle: true,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
centerText: !0, centerText: true,
overlayPlayButton: !0, overlayPlayButton: true,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: !1 cardLayout: false
}) });
}) });
} }
function onBeforeTabChange(e) { function onBeforeTabChange(e) {
preLoadTab(view, parseInt(e.detail.selectedTabIndex)) preLoadTab(view, parseInt(e.detail.selectedTabIndex));
} }
function onTabChange(e) { function onTabChange(e) {
var newIndex = parseInt(e.detail.selectedTabIndex); var newIndex = parseInt(e.detail.selectedTabIndex);
loadTab(view, newIndex) loadTab(view, newIndex);
} }
function getTabContainers() { function getTabContainers() {
return view.querySelectorAll(".pageTabContent") return view.querySelectorAll(".pageTabContent");
} }
function initTabs() { function initTabs() {
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange) mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
} }
function getTabController(page, index, callback) { function getTabController(page, index, callback) {
var depends = []; var depends = [];
switch (index) { switch (index) {
case 0: case 0:
depends.push("controllers/shows/tvshows"); depends.push("controllers/shows/tvshows");
break; break;
case 1: case 1:
break; break;
case 2: case 2:
depends.push("controllers/shows/tvlatest"); depends.push("controllers/shows/tvlatest");
break; break;
case 3: case 3:
depends.push("controllers/shows/tvupcoming"); depends.push("controllers/shows/tvupcoming");
break; break;
case 4: case 4:
depends.push("controllers/shows/tvgenres"); depends.push("controllers/shows/tvgenres");
break; break;
case 5: case 5:
depends.push("controllers/shows/tvstudios"); depends.push("controllers/shows/tvstudios");
break; break;
case 6: case 6:
depends.push("controllers/shows/episodes"); depends.push("controllers/shows/episodes");
break; break;
case 7: case 7:
depends.push("scripts/searchtab") depends.push("scripts/searchtab");
} }
require(depends, function(controllerFactory) {
require(depends, function (controllerFactory) {
var tabContent; var tabContent;
1 === index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
if (index === 1) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
var controller = tabControllers[index]; var controller = tabControllers[index];
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
collectionType: "tvshows", if (!controller) {
parentId: params.topParentId tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
}) if (index === 1) {
controller = self;
} else if (index === 7) {
controller = new controllerFactory(view, tabContent, {
collectionType: "tvshows",
parentId: params.topParentId
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
} }
function preLoadTab(page, index) { function preLoadTab(page, index) {
getTabController(page, index, function(controller) { getTabController(page, index, function (controller) {
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender() if (renderedTabs.indexOf(index) == -1 && controller.preRender) {
}) controller.preRender();
}
});
} }
function loadTab(page, index) { function loadTab(page, index) {
currentTabIndex = index, getTabController(page, index, function(controller) { currentTabIndex = index;
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab()) getTabController(page, index, function (controller) {
}) initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
renderedTabs.push(index);
controller.renderTab();
}
});
} }
function onPlaybackStop(e, state) { function onPlaybackStop(e, state) {
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange()) if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") {
renderedTabs = [];
mainTabsManager.getTabsElement().triggerTabChange();
}
} }
function onWebSocketMessage(e, data) { function onWebSocketMessage(e, data) {
var msg = data; var msg = data;
"UserDataChanged" === msg.MessageType && msg.Data.UserId == ApiClient.getCurrentUserId() && (renderedTabs = [])
if (msg.MessageType === "UserDataChanged" && msg.Data.UserId == ApiClient.getCurrentUserId()) {
renderedTabs = [];
}
} }
function onInputCommand(e) { function onInputCommand(e) {
switch (e.detail.command) { switch (e.detail.command) {
case "search": case "search":
e.preventDefault(), Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId) e.preventDefault();
Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId);
} }
} }
var isViewRestored, self = this,
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)), var isViewRestored;
initialTabIndex = currentTabIndex; var self = this;
self.initTab = function() { var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
var initialTabIndex = currentTabIndex;
self.initTab = function () {
var tabContent = self.tabContent; var tabContent = self.tabContent;
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX()); setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX());
}, self.renderTab = function() {
reload()
}; };
var tabControllers = [],
renderedTabs = []; self.renderTab = function () {
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) { reload();
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { };
var tabControllers = [];
var renderedTabs = [];
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX());
view.addEventListener("viewshow", function (e) {
isViewRestored = e.detail.isRestored;
initTabs();
if (!view.getAttribute("data-title")) {
var parentId = params.topParentId; var parentId = params.topParentId;
parentId ? ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function(item) {
view.setAttribute("data-title", item.Name), libraryMenu.setTitle(item.Name) if (parentId) {
}) : (view.setAttribute("data-title", Globalize.translate("TabShows")), libraryMenu.setTitle(Globalize.translate("TabShows"))) ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) {
view.setAttribute("data-title", item.Name);
libraryMenu.setTitle(item.Name);
});
} else {
view.setAttribute("data-title", Globalize.translate("TabShows"));
libraryMenu.setTitle(Globalize.translate("TabShows"));
}
} }
events.on(playbackManager, "playbackstop", onPlaybackStop), events.on(ApiClient, "message", onWebSocketMessage), inputManager.on(window, onInputCommand)
}), view.addEventListener("viewbeforehide", function(e) { events.on(playbackManager, "playbackstop", onPlaybackStop);
inputManager.off(window, onInputCommand), events.off(playbackManager, "playbackstop", onPlaybackStop), events.off(ApiClient, "message", onWebSocketMessage) events.on(ApiClient, "message", onWebSocketMessage);
}), view.addEventListener("viewdestroy", function(e) { inputManager.on(window, onInputCommand);
tabControllers.forEach(function(t) { });
t.destroy && t.destroy() view.addEventListener("viewbeforehide", function (e) {
}) inputManager.off(window, onInputCommand);
}) events.off(playbackManager, "playbackstop", onPlaybackStop);
} events.off(ApiClient, "message", onWebSocketMessage);
});
view.addEventListener("viewdestroy", function (e) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
});
};
}); });

View file

@ -1,199 +1,284 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function(layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) { define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
"use strict"; "use strict";
return function(view, params, tabContent) {
return function (view, params, tabContent) {
function getPageData(context) { function getPageData(context) {
var key = getSavedQueryKey(context), var key = getSavedQueryKey(context);
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Series", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,BasicSyncInfo", IncludeItemTypes: "Series",
ImageTypeLimit: 1, Recursive: true,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
StartIndex: 0, ImageTypeLimit: 1,
Limit: pageSize EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
}, StartIndex: 0,
view: libraryBrowser.getSavedView(key) || "Poster" Limit: pageSize
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData },
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
} }
function getQuery(context) { function getQuery(context) {
return getPageData(context).query return getPageData(context).query;
} }
function getSavedQueryKey(context) { function getSavedQueryKey(context) {
return context.savedQueryKey || (context.savedQueryKey = libraryBrowser.getSavedQueryKey("series")), context.savedQueryKey if (!context.savedQueryKey) {
context.savedQueryKey = libraryBrowser.getSavedQueryKey("series");
}
return context.savedQueryKey;
} }
function onViewStyleChange() { function onViewStyleChange() {
var viewStyle = self.getCurrentViewStyle(), var viewStyle = self.getCurrentViewStyle();
itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
"List" == viewStyle ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
if ("List" == viewStyle) {
itemsContainer.classList.add("vertical-list");
itemsContainer.classList.remove("vertical-wrap");
} else {
itemsContainer.classList.remove("vertical-list");
itemsContainer.classList.add("vertical-wrap");
}
itemsContainer.innerHTML = "";
} }
function reloadItems(page) { function reloadItems(page) {
loading.show(); loading.show();
isLoading = true; isLoading = true;
var query = getQuery(page); var query = getQuery(page);
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) { ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) {
function onNextPageClick() { function onNextPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex += query.Limit; query.StartIndex += query.Limit;
reloadItems(tabContent); reloadItems(tabContent);
} }
function onPreviousPageClick() { function onPreviousPageClick() {
if (isLoading) return; if (isLoading) {
return;
}
query.StartIndex -= query.Limit; query.StartIndex -= query.Limit;
reloadItems(tabContent); reloadItems(tabContent);
} }
window.scrollTo(0, 0), updateFilterControls(page);
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({ window.scrollTo(0, 0);
startIndex: query.StartIndex, updateFilterControls(page);
limit: query.Limit, var html;
totalRecordCount: result.TotalRecordCount, var pagingHtml = libraryBrowser.getQueryPagingHtml({
showLimit: !1, startIndex: query.StartIndex,
updatePageSizeSetting: !1, limit: query.Limit,
addLayoutButton: !1, totalRecordCount: result.TotalRecordCount,
sortButton: !1, showLimit: false,
filterButton: !1 updatePageSizeSetting: false,
}), addLayoutButton: false,
viewStyle = self.getCurrentViewStyle(); sortButton: false,
html = "Thumb" == viewStyle ? cardBuilder.getCardsHtml({ filterButton: false
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "tvshows",
overlayMoreButton: !0,
showTitle: !0,
centerText: !0
}) : "ThumbCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: !0,
context: "tvshows",
cardLayout: !0,
showTitle: !0,
showYear: !0,
centerText: !0
}) : "Banner" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: !0,
context: "tvshows"
}) : "List" == viewStyle ? listView.getListViewHtml({
items: result.Items,
context: "tvshows",
sortBy: query.SortBy
}) : "PosterCard" == viewStyle ? cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
showTitle: !0,
showYear: !0,
centerText: !0,
cardLayout: !0
}) : cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
centerText: !0,
lazy: !0,
overlayMoreButton: !0,
showTitle: !0,
showYear: !0
}); });
var i, length, elems = tabContent.querySelectorAll(".paging"); var viewStyle = self.getCurrentViewStyle();
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml; if (viewStyle == "Thumb") {
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick); html = cardBuilder.getCardsHtml({
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick); items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "tvshows",
overlayMoreButton: true,
showTitle: true,
centerText: true
});
} else if (viewStyle == "ThumbCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "backdrop",
preferThumb: true,
context: "tvshows",
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == "Banner") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "banner",
preferBanner: true,
context: "tvshows"
});
} else if (viewStyle == "List") {
html = listView.getListViewHtml({
items: result.Items,
context: "tvshows",
sortBy: query.SortBy
});
} else if (viewStyle == "PosterCard") {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
showTitle: true,
showYear: true,
centerText: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml({
items: result.Items,
shape: "portrait",
context: "tvshows",
centerText: true,
lazy: true,
overlayMoreButton: true,
showTitle: true,
showYear: true
});
}
var i;
var length;
var elems = tabContent.querySelectorAll(".paging");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].innerHTML = pagingHtml;
}
elems = tabContent.querySelectorAll(".btnNextPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onNextPageClick);
}
elems = tabContent.querySelectorAll(".btnPreviousPage");
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener("click", onPreviousPageClick);
}
var itemsContainer = tabContent.querySelector(".itemsContainer"); var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.innerHTML = html; itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer); imageLoader.lazyChildren(itemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
loading.hide(); loading.hide();
isLoading = false; isLoading = false;
}) });
} }
function updateFilterControls(tabContent) { function updateFilterControls(tabContent) {
var query = getQuery(tabContent); var query = getQuery(tabContent);
self.alphaPicker.value(query.NameStartsWithOrGreater) self.alphaPicker.value(query.NameStartsWithOrGreater);
} }
var self = this,
pageSize = 100, var self = this;
data = {}, var pageSize = 100;
isLoading = false; var data = {};
self.showFilterMenu = function() { var isLoading = false;
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
var filterDialog = new filterDialogFactory({ self.showFilterMenu = function () {
query: getQuery(tabContent), require(["components/filterdialog/filterdialog"], function (filterDialogFactory) {
mode: "series", var filterDialog = new filterDialogFactory({
serverId: ApiClient.serverId() query: getQuery(tabContent),
}); mode: "series",
events.on(filterDialog, "filterchange", function() { serverId: ApiClient.serverId()
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
}), filterDialog.show()
})
}, self.getCurrentViewStyle = function() {
return getPageData(tabContent).view
},
function(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
if (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
var newValue = e.detail.value,
query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, reloadItems(tabContent)
}), self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
}), layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")
}
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
self.showFilterMenu()
}), tabContent.querySelector(".btnSort").addEventListener("click", function(e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function() {
getQuery(tabContent).StartIndex = 0, reloadItems(tabContent)
},
query: getQuery(tabContent),
button: e.target
})
}); });
var btnSelectView = tabContent.querySelector(".btnSelectView"); events.on(filterDialog, "filterchange", function () {
btnSelectView.addEventListener("click", function(e) { getQuery(tabContent).StartIndex = 0;
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")) reloadItems(tabContent);
}), btnSelectView.addEventListener("layoutchange", function(e) { });
var viewStyle = e.detail.viewStyle; filterDialog.show();
getPageData(tabContent).view = viewStyle, libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle), getQuery(tabContent).StartIndex = 0, onViewStyleChange(), reloadItems(tabContent) });
}) };
}(tabContent), onViewStyleChange(), self.renderTab = function() {
reloadItems(tabContent), updateFilterControls(tabContent) self.getCurrentViewStyle = function () {
}, self.destroy = function() {} return getPageData(tabContent).view;
} };
function initPage(tabContent) {
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
alphaPickerElement.addEventListener("alphavaluechanged", function (e) {
var newValue = e.detail.value;
var query = getQuery(tabContent);
query.NameStartsWithOrGreater = newValue;
query.StartIndex = 0;
reloadItems(tabContent);
});
self.alphaPicker = new alphaPicker({
element: alphaPickerElement,
valueChangeEvent: "click"
});
if (layoutManager.desktop || layoutManager.mobile) {
tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right");
var itemsContainer = tabContent.querySelector(".itemsContainer");
itemsContainer.classList.remove("padded-left-withalphapicker");
itemsContainer.classList.add("padded-right-withalphapicker");
}
tabContent.querySelector(".btnFilter").addEventListener("click", function () {
self.showFilterMenu();
});
tabContent.querySelector(".btnSort").addEventListener("click", function (e) {
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
}],
callback: function () {
getQuery(tabContent).StartIndex = 0;
reloadItems(tabContent);
},
query: getQuery(tabContent),
button: e.target
});
});
var btnSelectView = tabContent.querySelector(".btnSelectView");
btnSelectView.addEventListener("click", function (e) {
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","));
});
btnSelectView.addEventListener("layoutchange", function (e) {
var viewStyle = e.detail.viewStyle;
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getQuery(tabContent).StartIndex = 0;
onViewStyleChange();
reloadItems(tabContent);
});
}
initPage(tabContent);
onViewStyleChange();
self.renderTab = function () {
reloadItems(tabContent);
updateFilterControls(tabContent);
};
self.destroy = function () {};
};
}); });

View file

@ -1,52 +1,65 @@
define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function(loading, libraryBrowser, cardBuilder, appHost) { define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loading, libraryBrowser, cardBuilder, appHost) {
"use strict"; "use strict";
function getQuery(params) { function getQuery(params) {
var key = getSavedQueryKey(), var key = getSavedQueryKey();
pageData = data[key]; var pageData = data[key];
return pageData || (pageData = data[key] = {
query: { if (!pageData) {
SortBy: "SortName", pageData = data[key] = {
SortOrder: "Ascending", query: {
IncludeItemTypes: "Series", SortBy: "SortName",
Recursive: !0, SortOrder: "Ascending",
Fields: "DateCreated,PrimaryImageAspectRatio", IncludeItemTypes: "Series",
StartIndex: 0 Recursive: true,
} Fields: "DateCreated,PrimaryImageAspectRatio",
}, pageData.query.ParentId = params.topParentId), pageData.query StartIndex: 0
}
};
pageData.query.ParentId = params.topParentId;
}
return pageData.query;
} }
function getSavedQueryKey() { function getSavedQueryKey() {
return libraryBrowser.getSavedQueryKey("studios") return libraryBrowser.getSavedQueryKey("studios");
} }
function getPromise(context, params) { function getPromise(context, params) {
var query = getQuery(params); var query = getQuery(params);
return loading.show(), ApiClient.getStudios(ApiClient.getCurrentUserId(), query) loading.show();
return ApiClient.getStudios(ApiClient.getCurrentUserId(), query);
} }
function reloadItems(context, params, promise) { function reloadItems(context, params, promise) {
promise.then(function(result) { promise.then(function (result) {
var elem = context.querySelector("#items"); var elem = context.querySelector("#items");
cardBuilder.buildCards(result.Items, { cardBuilder.buildCards(result.Items, {
itemsContainer: elem, itemsContainer: elem,
shape: "backdrop", shape: "backdrop",
preferThumb: !0, preferThumb: true,
showTitle: !0, showTitle: true,
scalable: !0, scalable: true,
centerText: !0, centerText: true,
overlayMoreButton: !0, overlayMoreButton: true,
context: "tvshows" context: "tvshows"
}), loading.hide() });
}) loading.hide();
});
} }
var data = {}; var data = {};
return function(view, params, tabContent) { return function (view, params, tabContent) {
var promise, self = this; var promise;
self.preRender = function() { var self = this;
promise = getPromise(view, params)
}, self.renderTab = function() { self.preRender = function () {
reloadItems(tabContent, params, promise) promise = getPromise(view, params);
} };
}
}); self.renderTab = function () {
reloadItems(tabContent, params, promise);
};
};
});

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function(layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) { define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader) {
"use strict"; "use strict";
function getUpcomingPromise(context, params) { function getUpcomingPromise(context, params) {
@ -9,82 +9,129 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder",
UserId: ApiClient.getCurrentUserId(), UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
EnableTotalRecordCount: !1 EnableTotalRecordCount: false
}; };
return query.ParentId = params.topParentId, ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query)) query.ParentId = params.topParentId;
return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query));
} }
function loadUpcoming(context, params, promise) { function loadUpcoming(context, params, promise) {
promise.then(function(result) { promise.then(function (result) {
var items = result.Items; var items = result.Items;
items.length ? context.querySelector(".noItemsMessage").style.display = "none" : context.querySelector(".noItemsMessage").style.display = "block", renderUpcoming(context.querySelector("#upcomingItems"), items), loading.hide()
}) if (items.length) {
context.querySelector(".noItemsMessage").style.display = "none";
} else {
context.querySelector(".noItemsMessage").style.display = "block";
}
renderUpcoming(context.querySelector("#upcomingItems"), items);
loading.hide();
});
} }
function enableScrollX() { function enableScrollX() {
return !layoutManager.desktop return !layoutManager.desktop;
} }
function getThumbShape() { function getThumbShape() {
return enableScrollX() ? "overflowBackdrop" : "backdrop" return enableScrollX() ? "overflowBackdrop" : "backdrop";
} }
function renderUpcoming(elem, items) { function renderUpcoming(elem, items) {
var i, length, groups = [], var i;
currentGroupName = "", var length;
currentGroup = []; var groups = [];
var currentGroupName = "";
var currentGroup = [];
for (i = 0, length = items.length; i < length; i++) { for (i = 0, length = items.length; i < length; i++) {
var item = items[i], var item = items[i];
dateText = ""; var dateText = "";
if (item.PremiereDate) try {
var premiereDate = datetime.parseISO8601Date(item.PremiereDate, !0); if (item.PremiereDate) {
dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, { try {
weekday: "long", var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true);
month: "short", dateText = datetime.isRelativeDay(premiereDate, -1) ? Globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, {
day: "numeric" weekday: "long",
}) month: "short",
} catch (err) {} day: "numeric"
dateText != currentGroupName ? (currentGroup.length && groups.push({ });
name: currentGroupName, } catch (err) {}
items: currentGroup }
}), currentGroupName = dateText, currentGroup = [item]) : currentGroup.push(item)
if (dateText != currentGroupName) {
if (currentGroup.length) {
groups.push({
name: currentGroupName,
items: currentGroup
});
}
currentGroupName = dateText;
currentGroup = [item];
} else {
currentGroup.push(item);
}
} }
var html = ""; var html = "";
for (i = 0, length = groups.length; i < length; i++) { for (i = 0, length = groups.length; i < length; i++) {
var group = groups[i]; var group = groups[i];
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>"; html += '<div class="verticalSection">';
var allowBottomPadding = !0; html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + group.name + "</h2>";
var allowBottomPadding = true;
if (enableScrollX()) { if (enableScrollX()) {
allowBottomPadding = !1; allowBottomPadding = false;
var scrollXClass = "scrollX hiddenScrollX"; var scrollXClass = "scrollX hiddenScrollX";
layoutManager.tv && (scrollXClass += " smoothScrollX"), html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">'
} else html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">'; if (layoutManager.tv) {
scrollXClass += " smoothScrollX";
}
html += '<div is="emby-itemscontainer" class="itemsContainer ' + scrollXClass + ' padded-left padded-right">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
}
var supportsImageAnalysis = appHost.supports("imageanalysis"); var supportsImageAnalysis = appHost.supports("imageanalysis");
supportsImageAnalysis = !1, html += cardBuilder.getCardsHtml({ supportsImageAnalysis = false;
html += cardBuilder.getCardsHtml({
items: group.items, items: group.items,
showLocationTypeIndicator: !1, showLocationTypeIndicator: false,
shape: getThumbShape(), shape: getThumbShape(),
showTitle: !0, showTitle: true,
preferThumb: !0, preferThumb: true,
lazy: !0, lazy: true,
showDetailsMenu: !0, showDetailsMenu: true,
centerText: !supportsImageAnalysis, centerText: !supportsImageAnalysis,
showParentTitle: !0, showParentTitle: true,
overlayText: !1, overlayText: false,
allowBottomPadding: allowBottomPadding, allowBottomPadding: allowBottomPadding,
cardLayout: supportsImageAnalysis, cardLayout: supportsImageAnalysis,
overlayMoreButton: !0, overlayMoreButton: true,
missingIndicator: !1 missingIndicator: false
}), html += "</div>", html += "</div>" });
html += "</div>";
html += "</div>";
} }
elem.innerHTML = html, imageLoader.lazyChildren(elem)
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
} }
return function(view, params, tabContent) {
var upcomingPromise, self = this; return function (view, params, tabContent) {
self.preRender = function() { var upcomingPromise;
upcomingPromise = getUpcomingPromise(view, params) var self = this;
}, self.renderTab = function() {
loadUpcoming(tabContent, params, upcomingPromise) self.preRender = function () {
} upcomingPromise = getUpcomingPromise(view, params);
} };
});
self.renderTab = function () {
loadUpcoming(tabContent, params, upcomingPromise);
};
};
});

View file

@ -1,16 +1,19 @@
define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) { define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) {
"use strict"; "use strict";
function loadPage(page, config) { function loadPage(page, config) {
$("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || ""), loading.hide() $("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || "");
loading.hide();
} }
function onSubmit() { function onSubmit() {
loading.show(); loading.show();
var form = this; var form = this;
return ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")), ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult) config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0"));
}), !1 ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
});
return false;
} }
function getTabs() { function getTabs() {
@ -23,30 +26,35 @@ define(["jQuery", "libraryMenu", "loading"], function($, libraryMenu, loading) {
}, { }, {
href: "streamingsettings.html", href: "streamingsettings.html",
name: Globalize.translate("TabStreaming") name: Globalize.translate("TabStreaming")
}] }];
} }
$(document).on("pageinit", "#streamingSettingsPage", function() { $(document).on("pageinit", "#streamingSettingsPage", function () {
var page = this; var page = this;
$("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function() { $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () {
require(["directorybrowser"], function(directoryBrowser) { require(["directorybrowser"], function (directoryBrowser) {
var picker = new directoryBrowser; var picker = new directoryBrowser();
picker.show({ picker.show({
callback: function(path) { callback: function (path) {
path && $("#txtTranscodingTempPath", page).val(path), picker.close() if (path) {
$("#txtTranscodingTempPath", page).val(path);
}
picker.close();
}, },
validateWriteable: !0, validateWriteable: true,
header: Globalize.translate("HeaderSelectTranscodingPath"), header: Globalize.translate("HeaderSelectTranscodingPath"),
instruction: Globalize.translate("HeaderSelectTranscodingPathHelp") instruction: Globalize.translate("HeaderSelectTranscodingPathHelp")
}) });
}) });
}), $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit) });
}).on("pageshow", "#streamingSettingsPage", function() { $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#streamingSettingsPage", function () {
loading.show(); loading.show();
libraryMenu.setTabs("playback", 2, getTabs); libraryMenu.setTabs("playback", 2, getTabs);
var page = this; var page = this;
ApiClient.getServerConfiguration().then(function(config) { ApiClient.getServerConfiguration().then(function (config) {
loadPage(page, config) loadPage(page, config);
}) });
}) });
}); });

View file

@ -1,28 +1,49 @@
define(["displaySettings", "userSettingsBuilder", "userSettings"], function(DisplaySettings, userSettingsBuilder, currentUserSettings) { define(["displaySettings", "userSettingsBuilder", "userSettings"], function (DisplaySettings, userSettingsBuilder, currentUserSettings) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?") if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
} }
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder; var settingsInstance;
view.addEventListener("viewshow", function() { var hasChanges;
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({ var userId = params.userId || ApiClient.getCurrentUserId();
serverId: ApiClient.serverId(), var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
userId: userId, view.addEventListener("viewshow", function () {
element: view.querySelector(".settingsContainer"), window.addEventListener("beforeunload", onBeforeUnload);
userSettings: userSettings,
enableSaveButton: !1, if (settingsInstance) {
enableSaveConfirmation: !1 settingsInstance.loadData();
}) } else {
}), view.addEventListener("change", function() { settingsInstance = new DisplaySettings({
hasChanges = !0 serverId: ApiClient.serverId(),
}), view.addEventListener("viewbeforehide", function() { userId: userId,
window.removeEventListener("beforeunload", onBeforeUnload), hasChanges = !1, settingsInstance && settingsInstance.submit() element: view.querySelector(".settingsContainer"),
}), view.addEventListener("viewdestroy", function() { userSettings: userSettings,
settingsInstance && (settingsInstance.destroy(), settingsInstance = null) enableSaveButton: false,
}), view.addEventListener("viewdestroy", function() { enableSaveConfirmation: false
settingsInstance && (settingsInstance.destroy(), settingsInstance = null) });
}) }
} });
}); view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
window.removeEventListener("beforeunload", onBeforeUnload);
hasChanges = false;
if (settingsInstance) {
settingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (settingsInstance) {
settingsInstance.destroy();
settingsInstance = null;
}
});
};
});

View file

@ -1,26 +1,48 @@
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) { define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?") if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
} }
var homescreenSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder; var homescreenSettingsInstance;
view.addEventListener("viewshow", function() { var hasChanges;
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({ var userId = params.userId || ApiClient.getCurrentUserId();
serverId: ApiClient.serverId(), var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
userId: userId, view.addEventListener("viewshow", function () {
element: view.querySelector(".homeScreenSettingsContainer"), window.addEventListener("beforeunload", onBeforeUnload);
userSettings: userSettings,
enableSaveButton: !1, if (homescreenSettingsInstance) {
enableSaveConfirmation: !1 homescreenSettingsInstance.loadData();
}) } else {
}), view.addEventListener("change", function() { homescreenSettingsInstance = new HomescreenSettings({
hasChanges = !0 serverId: ApiClient.serverId(),
}), view.addEventListener("viewbeforehide", function() { userId: userId,
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit() element: view.querySelector(".homeScreenSettingsContainer"),
}), view.addEventListener("viewdestroy", function() { userSettings: userSettings,
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null) enableSaveButton: false,
}) enableSaveConfirmation: false
} });
}); }
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (homescreenSettingsInstance) {
homescreenSettingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (homescreenSettingsInstance) {
homescreenSettingsInstance.destroy();
homescreenSettingsInstance = null;
}
});
};
});

View file

@ -18,7 +18,7 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId); page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
if (appHost.supports("multiserver")) { if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide") page.querySelector(".selectServer").classList.remove("hide");
} else { } else {
page.querySelector(".selectServer").classList.add("hide"); page.querySelector(".selectServer").classList.add("hide");
} }
@ -35,6 +35,6 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".adminSection").classList.add("hide"); page.querySelector(".adminSection").classList.add("hide");
} }
}); });
}) });
} };
}); });

View file

@ -1,26 +1,48 @@
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) { define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function (PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?") if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
} }
var settingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder; var settingsInstance;
view.addEventListener("viewshow", function() { var hasChanges;
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({ var userId = params.userId || ApiClient.getCurrentUserId();
serverId: ApiClient.serverId(), var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
userId: userId, view.addEventListener("viewshow", function () {
element: view.querySelector(".settingsContainer"), window.addEventListener("beforeunload", onBeforeUnload);
userSettings: userSettings,
enableSaveButton: !1, if (settingsInstance) {
enableSaveConfirmation: !1 settingsInstance.loadData();
}) } else {
}), view.addEventListener("change", function() { settingsInstance = new PlaybackSettings({
hasChanges = !0 serverId: ApiClient.serverId(),
}), view.addEventListener("viewbeforehide", function() { userId: userId,
hasChanges = !1, settingsInstance && settingsInstance.submit() element: view.querySelector(".settingsContainer"),
}), view.addEventListener("viewdestroy", function() { userSettings: userSettings,
settingsInstance && (settingsInstance.destroy(), settingsInstance = null) enableSaveButton: false,
}) enableSaveConfirmation: false
} });
}); }
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (settingsInstance) {
settingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (settingsInstance) {
settingsInstance.destroy();
settingsInstance = null;
}
});
};
});

View file

@ -1,26 +1,48 @@
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function(SubtitleSettings, userSettingsBuilder, currentUserSettings) { define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function (SubtitleSettings, userSettingsBuilder, currentUserSettings) {
"use strict"; "use strict";
return function(view, params) {
return function (view, params) {
function onBeforeUnload(e) { function onBeforeUnload(e) {
hasChanges && (e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?") if (hasChanges) {
e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?";
}
} }
var subtitleSettingsInstance, hasChanges, userId = params.userId || ApiClient.getCurrentUserId(),
userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder; var subtitleSettingsInstance;
view.addEventListener("viewshow", function() { var hasChanges;
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({ var userId = params.userId || ApiClient.getCurrentUserId();
serverId: ApiClient.serverId(), var userSettings = userId === ApiClient.getCurrentUserId() ? currentUserSettings : new userSettingsBuilder();
userId: userId, view.addEventListener("viewshow", function () {
element: view.querySelector(".settingsContainer"), window.addEventListener("beforeunload", onBeforeUnload);
userSettings: userSettings,
enableSaveButton: !1, if (subtitleSettingsInstance) {
enableSaveConfirmation: !1 subtitleSettingsInstance.loadData();
}) } else {
}), view.addEventListener("change", function() { subtitleSettingsInstance = new SubtitleSettings({
hasChanges = !0 serverId: ApiClient.serverId(),
}), view.addEventListener("viewbeforehide", function() { userId: userId,
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit() element: view.querySelector(".settingsContainer"),
}), view.addEventListener("viewdestroy", function() { userSettings: userSettings,
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null) enableSaveButton: false,
}) enableSaveConfirmation: false
} });
}); }
});
view.addEventListener("change", function () {
hasChanges = true;
});
view.addEventListener("viewbeforehide", function () {
hasChanges = false;
if (subtitleSettingsInstance) {
subtitleSettingsInstance.submit();
}
});
view.addEventListener("viewdestroy", function () {
if (subtitleSettingsInstance) {
subtitleSettingsInstance.destroy();
subtitleSettingsInstance = null;
}
});
};
});

View file

@ -1,53 +1,84 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) { define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict"; "use strict";
function loadDeleteFolders(page, user, mediaFolders) { function loadDeleteFolders(page, user, mediaFolders) {
ApiClient.getJSON(ApiClient.getUrl("Channels", { ApiClient.getJSON(ApiClient.getUrl("Channels", {
SupportsMediaDeletion: !0 SupportsMediaDeletion: true
})).then(function(channelsResult) { })).then(function (channelsResult) {
var i, length, folder, isChecked, checkedAttribute, html = ""; var i;
for (i = 0, length = mediaFolders.length; i < length; i++) folder = mediaFolders[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"; var length;
for (i = 0, length = channelsResult.Items.length; i < length; i++) folder = channelsResult.Items[i], isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id), checkedAttribute = isChecked ? ' checked="checked"' : "", html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>"; var folder;
$(".deleteAccess", page).html(html).trigger("create"), $("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change") var isChecked;
}) var checkedAttribute;
var html = "";
for (i = 0, length = mediaFolders.length; i < length; i++) {
folder = mediaFolders[i];
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
for (i = 0, length = channelsResult.Items.length; i < length; i++) {
folder = channelsResult.Items[i];
isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
}
$(".deleteAccess", page).html(html).trigger("create");
$("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change");
});
} }
function loadAuthProviders(page, user, providers) { function loadAuthProviders(page, user, providers) {
providers.length > 1 ? page.querySelector(".fldSelectLoginProvider").classList.remove("hide") : page.querySelector(".fldSelectLoginProvider").classList.add("hide"); if (providers.length > 1) {
page.querySelector(".fldSelectLoginProvider").classList.remove("hide");
} else {
page.querySelector(".fldSelectLoginProvider").classList.add("hide");
}
var currentProviderId = user.Policy.AuthenticationProviderId; var currentProviderId = user.Policy.AuthenticationProviderId;
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function(provider) { page.querySelector(".selectLoginProvider").innerHTML = providers.map(function (provider) {
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : ""; var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>" return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
}) });
} }
function loadPasswordResetProviders(page, user, providers) { function loadPasswordResetProviders(page, user, providers) {
providers.length > 1 ? page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide") : page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide"); if (providers.length > 1) {
page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide");
} else {
page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
}
var currentProviderId = user.Policy.PasswordResetProviderId; var currentProviderId = user.Policy.PasswordResetProviderId;
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function(provider) { page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function (provider) {
var selected = (provider.Id === currentProviderId || providers.length < 2) ? " selected" : ""; var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>" return '<option value="' + provider.Id + '"' + selected + ">" + provider.Name + "</option>";
}) });
} }
function loadUser(page, user) { function loadUser(page, user) {
currentUser = user; currentUser = user;
ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function(providers) { ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function (providers) {
loadAuthProviders(page, user, providers) loadAuthProviders(page, user, providers);
}); });
ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function(providers) { ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function (providers) {
loadPasswordResetProviders(page, user, providers) loadPasswordResetProviders(page, user, providers);
}); });
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false IsHidden: false
})).then(function(folders) { })).then(function (folders) {
loadDeleteFolders(page, user, folders.Items) loadDeleteFolders(page, user, folders.Items);
}); });
if (user.Policy.IsDisabled) { if (user.Policy.IsDisabled) {
$(".disabledUserBanner", page).show(); $(".disabledUserBanner", page).show();
} else { } else {
$(".disabledUserBanner", page).hide(); $(".disabledUserBanner", page).hide();
} }
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled"); $("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
$("#fldConnectInfo", page).show(); $("#fldConnectInfo", page).show();
$(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id); $(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id);
@ -78,7 +109,8 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
function onSaveComplete(page, user) { function onSaveComplete(page, user) {
Dashboard.navigate("userprofiles.html"); Dashboard.navigate("userprofiles.html");
loading.hide(); loading.hide();
require(["toast"], function(toast) {
require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved")); toast(Globalize.translate("SettingsSaved"));
}); });
} }
@ -106,45 +138,59 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
user.Policy.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value; user.Policy.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value;
user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value; user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value;
user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked(); user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked();
user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function(c) { user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function (c) {
return c.checked return c.checked;
}).map(function(c) { }).map(function (c) {
return c.getAttribute("data-id") return c.getAttribute("data-id");
});
ApiClient.updateUser(user).then(function () {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page, user);
});
}); });
ApiClient.updateUser(user).then(function() {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
onSaveComplete(page, user)
})
})
} }
function onSubmit() { function onSubmit() {
var page = $(this).parents(".page")[0]; var page = $(this).parents(".page")[0];
return loading.show(), getUser().then(function(result) { loading.show();
saveUser(result, page) getUser().then(function (result) {
}), !1 saveUser(result, page);
});
return false;
} }
function getUser() { function getUser() {
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId) return ApiClient.getUser(userId);
} }
function loadData(page) { function loadData(page) {
loading.show(), getUser().then(function(user) { loading.show();
loadUser(page, user) getUser().then(function (user) {
}) loadUser(page, user);
});
} }
var currentUser; var currentUser;
$(document).on("pageinit", "#editUserPage", function() { $(document).on("pageinit", "#editUserPage", function () {
$(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit), this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30); $(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
this.querySelector(".sharingHelp").innerHTML = Globalize.translate("OptionAllowLinkSharingHelp", 30);
var page = this; var page = this;
$("#chkEnableDeleteAllFolders", this).on("change", function() { $("#chkEnableDeleteAllFolders", this).on("change", function () {
this.checked ? $(".deleteAccess", page).hide() : $(".deleteAccess", page).show() if (this.checked) {
}), ApiClient.getServerConfiguration().then(function(config) { $(".deleteAccess", page).hide();
config.EnableRemoteAccess ? page.querySelector(".fldRemoteAccess").classList.remove("hide") : page.querySelector(".fldRemoteAccess").classList.add("hide") } else {
}) $(".deleteAccess", page).show();
}).on("pagebeforeshow", "#editUserPage", function() { }
loadData(this) });
}) ApiClient.getServerConfiguration().then(function (config) {
if (config.EnableRemoteAccess) {
page.querySelector(".fldRemoteAccess").classList.remove("hide");
} else {
page.querySelector(".fldRemoteAccess").classList.add("hide");
}
});
}).on("pagebeforeshow", "#editUserPage", function () {
loadData(this);
});
}); });

View file

@ -1,112 +1,178 @@
define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, libraryMenu) { define(["jQuery", "loading", "libraryMenu", "fnchecked"], function ($, loading, libraryMenu) {
"use strict"; "use strict";
function triggerChange(select) { function triggerChange(select) {
var evt = document.createEvent("HTMLEvents"); var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", !1, !0), select.dispatchEvent(evt) evt.initEvent("change", false, true);
select.dispatchEvent(evt);
} }
function loadMediaFolders(page, user, mediaFolders) { function loadMediaFolders(page, user, mediaFolders) {
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">'; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = mediaFolders.length; i < length; i++) { for (var i = 0, length = mediaFolders.length; i < length; i++) {
var folder = mediaFolders[i], var folder = mediaFolders[i];
isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id), var isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : ""; var checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>" html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
} }
html += "</div>", page.querySelector(".folderAccess").innerHTML = html;
html += "</div>";
page.querySelector(".folderAccess").innerHTML = html;
var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders"); var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders");
chkEnableAllFolders.checked = user.Policy.EnableAllFolders, triggerChange(chkEnableAllFolders) chkEnableAllFolders.checked = user.Policy.EnableAllFolders;
triggerChange(chkEnableAllFolders);
} }
function loadChannels(page, user, channels) { function loadChannels(page, user, channels) {
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">'; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = channels.length; i < length; i++) { for (var i = 0, length = channels.length; i < length; i++) {
var folder = channels[i], var folder = channels[i];
isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id), var isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id);
checkedAttribute = isChecked ? ' checked="checked"' : ""; var checkedAttribute = isChecked ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>" html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" ' + checkedAttribute + "><span>" + folder.Name + "</span></label>";
} }
html += "</div>", $(".channelAccess", page).show().html(html), channels.length ? $(".channelAccessContainer", page).show() : $(".channelAccessContainer", page).hide(), $("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change")
html += "</div>";
$(".channelAccess", page).show().html(html);
if (channels.length) {
$(".channelAccessContainer", page).show();
} else {
$(".channelAccessContainer", page).hide();
}
$("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change");
} }
function loadDevices(page, user, devices) { function loadDevices(page, user, devices) {
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">'; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderDevices") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = devices.length; i < length; i++) { for (var i = 0, length = devices.length; i < length; i++) {
var device = devices[i], var device = devices[i];
checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ""; var checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>" html += '<label><input type="checkbox" is="emby-checkbox" class="chkDevice" data-id="' + device.Id + '" ' + checkedAttribute + "><span>" + device.Name + " - " + device.AppName + "</span></label>";
}
html += "</div>";
$(".deviceAccess", page).show().html(html);
$("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change");
if (user.Policy.IsAdministrator) {
page.querySelector(".deviceAccessContainer").classList.add("hide");
} else {
page.querySelector(".deviceAccessContainer").classList.remove("hide");
} }
html += "</div>", $(".deviceAccess", page).show().html(html), $("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change"), user.Policy.IsAdministrator ? page.querySelector(".deviceAccessContainer").classList.add("hide") : page.querySelector(".deviceAccessContainer").classList.remove("hide")
} }
function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) { function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) {
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadChannels(page, user, channels), loadMediaFolders(page, user, mediaFolders), loadDevices(page, user, devices), loading.hide() page.querySelector(".username").innerHTML = user.Name;
libraryMenu.setTitle(user.Name);
loadChannels(page, user, channels);
loadMediaFolders(page, user, mediaFolders);
loadDevices(page, user, devices);
loading.hide();
} }
function onSaveComplete(page) { function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) { loading.hide();
toast(Globalize.translate("SettingsSaved"))
}) require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
} }
function saveUser(user, page) { function saveUser(user, page) {
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(), user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function(c) { user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
return c.checked user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function (c) {
}).map(function(c) { return c.checked;
return c.getAttribute("data-id") }).map(function (c) {
}), user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(), user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function(c) { return c.getAttribute("data-id");
return c.checked });
}).map(function(c) { user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
return c.getAttribute("data-id") user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function (c) {
}), user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked(), user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function(c) { return c.checked;
return c.checked }).map(function (c) {
}).map(function(c) { return c.getAttribute("data-id");
return c.getAttribute("data-id") });
}), user.Policy.BlockedChannels = null, user.Policy.BlockedMediaFolders = null, ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() { user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked();
onSaveComplete(page) user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function (c) {
}) return c.checked;
}).map(function (c) {
return c.getAttribute("data-id");
});
user.Policy.BlockedChannels = null;
user.Policy.BlockedMediaFolders = null;
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
});
} }
function onSubmit() { function onSubmit() {
var page = $(this).parents(".page"); var page = $(this).parents(".page");
loading.show(); loading.show();
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) { ApiClient.getUser(userId).then(function (result) {
saveUser(result, page) saveUser(result, page);
}), !1 });
return false;
} }
$(document).on("pageinit", "#userLibraryAccessPage", function() {
$(document).on("pageinit", "#userLibraryAccessPage", function () {
var page = this; var page = this;
$("#chkEnableAllDevices", page).on("change", function() { $("#chkEnableAllDevices", page).on("change", function () {
this.checked ? $(".deviceAccessListContainer", page).hide() : $(".deviceAccessListContainer", page).show() if (this.checked) {
}), $("#chkEnableAllChannels", page).on("change", function() { $(".deviceAccessListContainer", page).hide();
this.checked ? $(".channelAccessListContainer", page).hide() : $(".channelAccessListContainer", page).show() } else {
}), page.querySelector("#chkEnableAllFolders").addEventListener("change", function() { $(".deviceAccessListContainer", page).show();
this.checked ? page.querySelector(".folderAccessListContainer").classList.add("hide") : page.querySelector(".folderAccessListContainer").classList.remove("hide") }
}), $(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit) });
}).on("pageshow", "#userLibraryAccessPage", function() { $("#chkEnableAllChannels", page).on("change", function () {
if (this.checked) {
$(".channelAccessListContainer", page).hide();
} else {
$(".channelAccessListContainer", page).show();
}
});
page.querySelector("#chkEnableAllFolders").addEventListener("change", function () {
if (this.checked) {
page.querySelector(".folderAccessListContainer").classList.add("hide");
} else {
page.querySelector(".folderAccessListContainer").classList.remove("hide");
}
});
$(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#userLibraryAccessPage", function () {
var page = this; var page = this;
loading.show(); loading.show();
var promise1, userId = getParameterByName("userId"); var promise1;
if (userId) promise1 = ApiClient.getUser(userId); var userId = getParameterByName("userId");
else {
if (userId) {
promise1 = ApiClient.getUser(userId);
} else {
var deferred = $.Deferred(); var deferred = $.Deferred();
deferred.resolveWith(null, [{ deferred.resolveWith(null, [{
Configuration: {} Configuration: {}
}]), promise1 = deferred.promise() }]);
promise1 = deferred.promise();
} }
var promise2 = Dashboard.getCurrentUser(),
promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { var promise2 = Dashboard.getCurrentUser();
IsHidden: !1 var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
})), IsHidden: false
promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")), }));
promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices")); var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels"));
Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function(responses) { var promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices"));
loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items) Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) {
}) loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items);
}) });
}); });
});

View file

@ -1,14 +1,16 @@
define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading) { define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function ($, loading) {
"use strict"; "use strict";
function loadMediaFolders(page, mediaFolders) { function loadMediaFolders(page, mediaFolders) {
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>"; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderLibraries") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">'; html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < mediaFolders.length; i++) { for (var i = 0; i < mediaFolders.length; i++) {
var folder = mediaFolders[i]; var folder = mediaFolders[i];
html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>"; html += '<label><input type="checkbox" is="emby-checkbox" class="chkFolder" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
} }
html += "</div>"; html += "</div>";
$(".folderAccess", page).html(html).trigger("create"); $(".folderAccess", page).html(html).trigger("create");
$("#chkEnableAllFolders", page).checked(true).trigger("change"); $("#chkEnableAllFolders", page).checked(true).trigger("change");
@ -18,17 +20,21 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
var html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>"; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderChannels") + "</h3>";
html += '<div class="checkboxList paperList" style="padding:.5em 1em;">'; html += '<div class="checkboxList paperList" style="padding:.5em 1em;">';
for (var i = 0; i < channels.length; i++) { for (var i = 0; i < channels.length; i++) {
var folder = channels[i]; var folder = channels[i];
html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>"; html += '<label><input type="checkbox" is="emby-checkbox" class="chkChannel" data-id="' + folder.Id + '" checked="checked"/><span>' + folder.Name + "</span></label>";
} }
html += "</div>"; html += "</div>";
$(".channelAccess", page).show().html(html).trigger("create"); $(".channelAccess", page).show().html(html).trigger("create");
if (channels.length) { if (channels.length) {
$(".channelAccessContainer", page).show(); $(".channelAccessContainer", page).show();
} else { } else {
$(".channelAccessContainer", page).hide(); $(".channelAccessContainer", page).hide();
} }
$("#chkEnableAllChannels", page).checked(true).trigger("change"); $("#chkEnableAllChannels", page).checked(true).trigger("change");
} }
@ -37,46 +43,51 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
$("#txtPassword", page).val(""); $("#txtPassword", page).val("");
loading.show(); loading.show();
var promiseFolders = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { var promiseFolders = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", {
IsHidden: false IsHidden: false
})); }));
var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels")); var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels"));
Promise.all([promiseFolders, promiseChannels]).then(function(responses) { Promise.all([promiseFolders, promiseChannels]).then(function (responses) {
loadMediaFolders(page, responses[0].Items); loadMediaFolders(page, responses[0].Items);
loadChannels(page, responses[1].Items); loadChannels(page, responses[1].Items);
loading.hide(); loading.hide();
}) });
} }
function saveUser(page) { function saveUser(page) {
var user = {}; var user = {};
user.Name = $("#txtUsername", page).val(); user.Name = $("#txtUsername", page).val();
user.Password = $("#txtPassword", page).val(); user.Password = $("#txtPassword", page).val();
ApiClient.createUser(user).then(function(user) { ApiClient.createUser(user).then(function (user) {
user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(); user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked();
user.Policy.EnabledFolders = []; user.Policy.EnabledFolders = [];
if (!user.Policy.EnableAllFolders) { if (!user.Policy.EnableAllFolders) {
user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function(i) { user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function (i) {
return i.checked return i.checked;
}).map(function(i) { }).map(function (i) {
return i.getAttribute("data-id"); return i.getAttribute("data-id");
}); });
} }
user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(); user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked();
user.Policy.EnabledChannels = []; user.Policy.EnabledChannels = [];
if (!user.Policy.EnableAllChannels) { if (!user.Policy.EnableAllChannels) {
user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function(i) { user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function (i) {
return i.checked return i.checked;
}).map(function(i) { }).map(function (i) {
return i.getAttribute("data-id"); return i.getAttribute("data-id");
}); });
} }
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() {
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
Dashboard.navigate("useredit.html?userId=" + user.Id); Dashboard.navigate("useredit.html?userId=" + user.Id);
}); });
}, function(response) { }, function (response) {
require(["toast"], function(toast) { require(["toast"], function (toast) {
toast(Globalize.translate("DefaultErrorMessage")); toast(Globalize.translate("DefaultErrorMessage"));
}); });
loading.hide(); loading.hide();
}); });
} }
@ -92,16 +103,16 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
loadUser(page); loadUser(page);
} }
$(document).on("pageinit", "#newUserPage", function() { $(document).on("pageinit", "#newUserPage", function () {
var page = this; var page = this;
$("#chkEnableAllChannels", page).on("change", function() { $("#chkEnableAllChannels", page).on("change", function () {
if (this.checked) { if (this.checked) {
$(".channelAccessListContainer", page).hide(); $(".channelAccessListContainer", page).hide();
} else { } else {
$(".channelAccessListContainer", page).show(); $(".channelAccessListContainer", page).show();
} }
}); });
$("#chkEnableAllFolders", page).on("change", function() { $("#chkEnableAllFolders", page).on("change", function () {
if (this.checked) { if (this.checked) {
$(".folderAccessListContainer", page).hide(); $(".folderAccessListContainer", page).hide();
} else { } else {
@ -109,7 +120,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox"], function($, loading)
} }
}); });
$(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit); $(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit);
}).on("pageshow", "#newUserPage", function() { }).on("pageshow", "#newUserPage", function () {
loadData(this); loadData(this);
}); });
}); });

View file

@ -1,185 +1,271 @@
define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function($, datetime, loading, libraryMenu) { define(["jQuery", "datetime", "loading", "libraryMenu", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu) {
"use strict"; "use strict";
function populateRatings(allParentalRatings, page) { function populateRatings(allParentalRatings, page) {
var html = ""; var html = "";
html += "<option value=''></option>"; html += "<option value=''></option>";
var i, length, rating, ratings = []; var i;
var length;
var rating;
var ratings = [];
for (i = 0, length = allParentalRatings.length; i < length; i++) { for (i = 0, length = allParentalRatings.length; i < length; i++) {
if (rating = allParentalRatings[i], ratings.length) { if (rating = allParentalRatings[i], ratings.length) {
var lastRating = ratings[ratings.length - 1]; var lastRating = ratings[ratings.length - 1];
if (lastRating.Value === rating.Value) { if (lastRating.Value === rating.Value) {
lastRating.Name += "/" + rating.Name; lastRating.Name += "/" + rating.Name;
continue continue;
} }
} }
ratings.push({ ratings.push({
Name: rating.Name, Name: rating.Name,
Value: rating.Value Value: rating.Value
}) });
} }
for (i = 0, length = ratings.length; i < length; i++) rating = ratings[i], html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
$("#selectMaxParentalRating", page).html(html) for (i = 0, length = ratings.length; i < length; i++) {
rating = ratings[i];
html += "<option value='" + rating.Value + "'>" + rating.Name + "</option>";
}
$("#selectMaxParentalRating", page).html(html);
} }
function loadUnratedItems(page, user) { function loadUnratedItems(page, user) {
var items = [{ var items = [{
name: Globalize.translate("OptionBlockBooks"), name: Globalize.translate("OptionBlockBooks"),
value: "Book" value: "Book"
}, { }, {
name: Globalize.translate("OptionBlockChannelContent"), name: Globalize.translate("OptionBlockChannelContent"),
value: "ChannelContent" value: "ChannelContent"
}, { }, {
name: Globalize.translate("OptionBlockLiveTvChannels"), name: Globalize.translate("OptionBlockLiveTvChannels"),
value: "LiveTvChannel" value: "LiveTvChannel"
}, { }, {
name: Globalize.translate("OptionBlockMovies"), name: Globalize.translate("OptionBlockMovies"),
value: "Movie" value: "Movie"
}, { }, {
name: Globalize.translate("OptionBlockMusic"), name: Globalize.translate("OptionBlockMusic"),
value: "Music" value: "Music"
}, { }, {
name: Globalize.translate("OptionBlockTrailers"), name: Globalize.translate("OptionBlockTrailers"),
value: "Trailer" value: "Trailer"
}, { }, {
name: Globalize.translate("OptionBlockTvShows"), name: Globalize.translate("OptionBlockTvShows"),
value: "Series" value: "Series"
}], }];
html = ""; var html = "";
html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>", html += '<div class="checkboxList paperList checkboxList-paperList">'; html += '<h3 class="checkboxListLabel">' + Globalize.translate("HeaderBlockItemsWithNoRating") + "</h3>";
html += '<div class="checkboxList paperList checkboxList-paperList">';
for (var i = 0, length = items.length; i < length; i++) { for (var i = 0, length = items.length; i < length; i++) {
var item = items[i], var item = items[i];
checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ""; var checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : "";
html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>" html += '<label><input type="checkbox" is="emby-checkbox" class="chkUnratedItem" data-itemtype="' + item.value + '" type="checkbox"' + checkedAttribute + "><span>" + item.name + "</span></label>";
} }
html += "</div>", $(".blockUnratedItems", page).html(html).trigger("create")
html += "</div>";
$(".blockUnratedItems", page).html(html).trigger("create");
} }
function loadUser(page, user, allParentalRatings) { function loadUser(page, user, allParentalRatings) {
page.querySelector(".username").innerHTML = user.Name, libraryMenu.setTitle(user.Name), loadUnratedItems(page, user), loadBlockedTags(page, user.Policy.BlockedTags), populateRatings(allParentalRatings, page); page.querySelector(".username").innerHTML = user.Name;
libraryMenu.setTitle(user.Name);
loadUnratedItems(page, user);
loadBlockedTags(page, user.Policy.BlockedTags);
populateRatings(allParentalRatings, page);
var ratingValue = ""; var ratingValue = "";
if (user.Policy.MaxParentalRating)
if (user.Policy.MaxParentalRating) {
for (var i = 0, length = allParentalRatings.length; i < length; i++) { for (var i = 0, length = allParentalRatings.length; i < length; i++) {
var rating = allParentalRatings[i]; var rating = allParentalRatings[i];
user.Policy.MaxParentalRating >= rating.Value && (ratingValue = rating.Value)
if (user.Policy.MaxParentalRating >= rating.Value) {
ratingValue = rating.Value;
}
} }
$("#selectMaxParentalRating", page).val(ratingValue), user.Policy.IsAdministrator ? $(".accessScheduleSection", page).hide() : $(".accessScheduleSection", page).show(), renderAccessSchedule(page, user.Policy.AccessSchedules || []), loading.hide() }
$("#selectMaxParentalRating", page).val(ratingValue);
if (user.Policy.IsAdministrator) {
$(".accessScheduleSection", page).hide();
} else {
$(".accessScheduleSection", page).show();
}
renderAccessSchedule(page, user.Policy.AccessSchedules || []);
loading.hide();
} }
function loadBlockedTags(page, tags) { function loadBlockedTags(page, tags) {
var html = tags.map(function(h) { var html = tags.map(function (h) {
var li = '<div class="listItem">'; var li = '<div class="listItem">';
return li += '<div class="listItemBody">', li += '<h3 class="listItemBodyText">', li += h, li += "</h3>", li += "</div>", li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>', li += "</div>" li += '<div class="listItemBody">';
li += '<h3 class="listItemBodyText">';
li += h;
li += "</h3>";
li += "</div>";
li += '<button type="button" is="paper-icon-button-light" class="blockedTag btnDeleteTag listItemButton" data-tag="' + h + '"><i class="md-icon">delete</i></button>';
return li += "</div>";
}).join(""); }).join("");
html && (html = '<div class="paperList">' + html + "</div>");
if (html) {
html = '<div class="paperList">' + html + "</div>";
}
var elem = $(".blockedTags", page).html(html).trigger("create"); var elem = $(".blockedTags", page).html(html).trigger("create");
$(".btnDeleteTag", elem).on("click", function() { $(".btnDeleteTag", elem).on("click", function () {
var tag = this.getAttribute("data-tag"), var tag = this.getAttribute("data-tag");
newTags = tags.filter(function(t) { var newTags = tags.filter(function (t) {
return t != tag return t != tag;
}); });
loadBlockedTags(page, newTags) loadBlockedTags(page, newTags);
}) });
} }
function deleteAccessSchedule(page, schedules, index) { function deleteAccessSchedule(page, schedules, index) {
schedules.splice(index, 1), renderAccessSchedule(page, schedules) schedules.splice(index, 1);
renderAccessSchedule(page, schedules);
} }
function renderAccessSchedule(page, schedules) { function renderAccessSchedule(page, schedules) {
var html = "", var html = "";
index = 0; var index = 0;
html += schedules.map(function(a) { html += schedules.map(function (a) {
var itemHtml = ""; var itemHtml = "";
return itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">', itemHtml += '<div class="listItemBody two-line">', itemHtml += '<h3 class="listItemBodyText">', itemHtml += Globalize.translate("Option" + a.DayOfWeek), itemHtml += "</h3>", itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>", itemHtml += "</div>", itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>', itemHtml += "</div>", index++, itemHtml itemHtml += '<div class="liSchedule listItem" data-day="' + a.DayOfWeek + '" data-start="' + a.StartHour + '" data-end="' + a.EndHour + '">';
itemHtml += '<div class="listItemBody two-line">';
itemHtml += '<h3 class="listItemBodyText">';
itemHtml += Globalize.translate("Option" + a.DayOfWeek);
itemHtml += "</h3>";
itemHtml += '<div class="listItemBodyText secondary">' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "</div>";
itemHtml += "</div>";
itemHtml += '<button type="button" is="paper-icon-button-light" class="btnDelete listItemButton" data-index="' + index + '"><i class="md-icon">delete</i></button>';
itemHtml += "</div>";
index++;
return itemHtml;
}).join(""); }).join("");
var accessScheduleList = page.querySelector(".accessScheduleList"); var accessScheduleList = page.querySelector(".accessScheduleList");
accessScheduleList.innerHTML = html, $(".btnDelete", accessScheduleList).on("click", function() { accessScheduleList.innerHTML = html;
deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index"))) $(".btnDelete", accessScheduleList).on("click", function () {
}) deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index")));
});
} }
function onSaveComplete(page) { function onSaveComplete(page) {
loading.hide(), require(["toast"], function(toast) { loading.hide();
toast(Globalize.translate("SettingsSaved"))
}) require(["toast"], function (toast) {
toast(Globalize.translate("SettingsSaved"));
});
} }
function saveUser(user, page) { function saveUser(user, page) {
user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null, user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function(i) { user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null;
return i.checked user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function (i) {
}).map(function(i) { return i.checked;
return i.getAttribute("data-itemtype") }).map(function (i) {
}), user.Policy.AccessSchedules = getSchedulesFromPage(page), user.Policy.BlockedTags = getBlockedTagsFromPage(page), ApiClient.updateUserPolicy(user.Id, user.Policy).then(function() { return i.getAttribute("data-itemtype");
onSaveComplete(page) });
}) user.Policy.AccessSchedules = getSchedulesFromPage(page);
user.Policy.BlockedTags = getBlockedTagsFromPage(page);
ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
onSaveComplete(page);
});
} }
function getDisplayTime(hours) { function getDisplayTime(hours) {
var minutes = 0, var minutes = 0;
pct = hours % 1; var pct = hours % 1;
return pct && (minutes = parseInt(60 * pct)), datetime.getDisplayTime(new Date(2e3, 1, 1, hours, minutes, 0, 0))
if (pct) {
minutes = parseInt(60 * pct);
}
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
} }
function showSchedulePopup(page, schedule, index) { function showSchedulePopup(page, schedule, index) {
schedule = schedule || {}, require(["components/accessschedule/accessschedule"], function(accessschedule) { schedule = schedule || {};
require(["components/accessschedule/accessschedule"], function (accessschedule) {
accessschedule.show({ accessschedule.show({
schedule: schedule schedule: schedule
}).then(function(updatedSchedule) { }).then(function (updatedSchedule) {
var schedules = getSchedulesFromPage(page); - 1 == index && (index = schedules.length), schedules[index] = updatedSchedule, renderAccessSchedule(page, schedules) var schedules = getSchedulesFromPage(page);
})
}) if (-1 == index) {
index = schedules.length;
}
schedules[index] = updatedSchedule;
renderAccessSchedule(page, schedules);
});
});
} }
function getSchedulesFromPage(page) { function getSchedulesFromPage(page) {
return $(".liSchedule", page).map(function() { return $(".liSchedule", page).map(function () {
return { return {
DayOfWeek: this.getAttribute("data-day"), DayOfWeek: this.getAttribute("data-day"),
StartHour: this.getAttribute("data-start"), StartHour: this.getAttribute("data-start"),
EndHour: this.getAttribute("data-end") EndHour: this.getAttribute("data-end")
} };
}).get() }).get();
} }
function getBlockedTagsFromPage(page) { function getBlockedTagsFromPage(page) {
return $(".blockedTag", page).map(function() { return $(".blockedTag", page).map(function () {
return this.getAttribute("data-tag") return this.getAttribute("data-tag");
}).get() }).get();
} }
function showBlockedTagPopup(page) { function showBlockedTagPopup(page) {
require(["prompt"], function(prompt) { require(["prompt"], function (prompt) {
prompt({ prompt({
label: Globalize.translate("LabelTag") label: Globalize.translate("LabelTag")
}).then(function(value) { }).then(function (value) {
var tags = getBlockedTagsFromPage(page); - 1 == tags.indexOf(value) && (tags.push(value), loadBlockedTags(page, tags)) var tags = getBlockedTagsFromPage(page);
})
}) if (-1 == tags.indexOf(value)) {
tags.push(value);
loadBlockedTags(page, tags);
}
});
});
} }
window.UserParentalControlPage = { window.UserParentalControlPage = {
onSubmit: function() { onSubmit: function () {
var page = $(this).parents(".page"); var page = $(this).parents(".page");
loading.show(); loading.show();
var userId = getParameterByName("userId"); var userId = getParameterByName("userId");
return ApiClient.getUser(userId).then(function(result) { ApiClient.getUser(userId).then(function (result) {
saveUser(result, page) saveUser(result, page);
}), !1 });
return false;
} }
}, $(document).on("pageinit", "#userParentalControlPage", function() { };
$(document).on("pageinit", "#userParentalControlPage", function () {
var page = this; var page = this;
$(".btnAddSchedule", page).on("click", function() { $(".btnAddSchedule", page).on("click", function () {
showSchedulePopup(page, {}, -1) showSchedulePopup(page, {}, -1);
}), $(".btnAddBlockedTag", page).on("click", function() { });
showBlockedTagPopup(page) $(".btnAddBlockedTag", page).on("click", function () {
}), $(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit) showBlockedTagPopup(page);
}).on("pageshow", "#userParentalControlPage", function() { });
$(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit);
}).on("pageshow", "#userParentalControlPage", function () {
var page = this; var page = this;
loading.show(); loading.show();
var userId = getParameterByName("userId"), var userId = getParameterByName("userId");
promise1 = ApiClient.getUser(userId), var promise1 = ApiClient.getUser(userId);
promise2 = ApiClient.getParentalRatings(); var promise2 = ApiClient.getParentalRatings();
Promise.all([promise1, promise2]).then(function(responses) { Promise.all([promise1, promise2]).then(function (responses) {
loadUser(page, responses[0], responses[1]) loadUser(page, responses[0], responses[1]);
}) });
}) });
}); });

View file

@ -1,101 +1,183 @@
define(["loading", "libraryMenu", "emby-button"], function(loading, libraryMenu) { define(["loading", "libraryMenu", "emby-button"], function (loading, libraryMenu) {
"use strict"; "use strict";
function loadUser(page, params) { function loadUser(page, params) {
var userid = params.userId; var userid = params.userId;
ApiClient.getUser(userid).then(function(user) { ApiClient.getUser(userid).then(function (user) {
Dashboard.getCurrentUser().then(function(loggedInUser) { Dashboard.getCurrentUser().then(function (loggedInUser) {
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name; libraryMenu.setTitle(user.Name);
var showPasswordSection = !0, page.querySelector(".username").innerHTML = user.Name;
showLocalAccessSection = !1; var showPasswordSection = true;
"Guest" == user.ConnectLinkType ? (page.querySelector(".localAccessSection").classList.add("hide"), showPasswordSection = !1) : user.HasConfiguredPassword ? (page.querySelector("#btnResetPassword").classList.remove("hide"), page.querySelector("#fldCurrentPassword").classList.remove("hide"), showLocalAccessSection = !0) : (page.querySelector("#btnResetPassword").classList.add("hide"), page.querySelector("#fldCurrentPassword").classList.add("hide")), showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".passwordSection").classList.remove("hide") : page.querySelector(".passwordSection").classList.add("hide"), showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess) ? page.querySelector(".localAccessSection").classList.remove("hide") : page.querySelector(".localAccessSection").classList.add("hide"); var showLocalAccessSection = false;
if ("Guest" == user.ConnectLinkType) {
page.querySelector(".localAccessSection").classList.add("hide");
showPasswordSection = false;
} else if (user.HasConfiguredPassword) {
page.querySelector("#btnResetPassword").classList.remove("hide");
page.querySelector("#fldCurrentPassword").classList.remove("hide");
showLocalAccessSection = true;
} else {
page.querySelector("#btnResetPassword").classList.add("hide");
page.querySelector("#fldCurrentPassword").classList.add("hide");
}
if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
page.querySelector(".passwordSection").classList.remove("hide");
} else {
page.querySelector(".passwordSection").classList.add("hide");
}
if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
page.querySelector(".localAccessSection").classList.remove("hide");
} else {
page.querySelector(".localAccessSection").classList.add("hide");
}
var txtEasyPassword = page.querySelector("#txtEasyPassword"); var txtEasyPassword = page.querySelector("#txtEasyPassword");
txtEasyPassword.value = "", user.HasConfiguredEasyPassword ? (txtEasyPassword.placeholder = "******", page.querySelector("#btnResetEasyPassword").classList.remove("hide")) : (txtEasyPassword.removeAttribute("placeholder"), txtEasyPassword.placeholder = "", page.querySelector("#btnResetEasyPassword").classList.add("hide")), page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword txtEasyPassword.value = "";
})
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = "" if (user.HasConfiguredEasyPassword) {
txtEasyPassword.placeholder = "******";
page.querySelector("#btnResetEasyPassword").classList.remove("hide");
} else {
txtEasyPassword.removeAttribute("placeholder");
txtEasyPassword.placeholder = "";
page.querySelector("#btnResetEasyPassword").classList.add("hide");
}
page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword;
});
});
page.querySelector("#txtCurrentPassword").value = "";
page.querySelector("#txtNewPassword").value = "";
page.querySelector("#txtNewPasswordConfirm").value = "";
} }
return function(view, params) {
return function (view, params) {
function saveEasyPassword() { function saveEasyPassword() {
var userId = params.userId, var userId = params.userId;
easyPassword = view.querySelector("#txtEasyPassword").value; var easyPassword = view.querySelector("#txtEasyPassword").value;
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
onEasyPasswordSaved(userId) if (easyPassword) {
}) : onEasyPasswordSaved(userId) ApiClient.updateEasyPassword(userId, easyPassword).then(function () {
onEasyPasswordSaved(userId);
});
} else {
onEasyPasswordSaved(userId);
}
} }
function onEasyPasswordSaved(userId) { function onEasyPasswordSaved(userId) {
ApiClient.getUser(userId).then(function(user) { ApiClient.getUser(userId).then(function (user) {
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() { user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked;
loading.hide(), require(["toast"], function(toast) { ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () {
toast(Globalize.translate("MessageSettingsSaved")) loading.hide();
}), loadUser(view, params)
}) require(["toast"], function (toast) {
}) toast(Globalize.translate("MessageSettingsSaved"));
});
loadUser(view, params);
});
});
} }
function savePassword() { function savePassword() {
var userId = params.userId, var userId = params.userId;
currentPassword = view.querySelector("#txtCurrentPassword").value, var currentPassword = view.querySelector("#txtCurrentPassword").value;
newPassword = view.querySelector("#txtNewPassword").value; var newPassword = view.querySelector("#txtNewPassword").value;
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) { if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
// Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank) // Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank)
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
currentPassword = ""; currentPassword = "";
} }
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
loading.hide(), require(["toast"], function(toast) { ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () {
toast(Globalize.translate("PasswordSaved")) loading.hide();
}), loadUser(view, params)
}, function() { require(["toast"], function (toast) {
loading.hide(), Dashboard.alert({ toast(Globalize.translate("PasswordSaved"));
});
loadUser(view, params);
}, function () {
loading.hide();
Dashboard.alert({
title: Globalize.translate("HeaderLoginFailure"), title: Globalize.translate("HeaderLoginFailure"),
message: Globalize.translate("MessageInvalidUser") message: Globalize.translate("MessageInvalidUser")
}) });
}) });
} }
function onSubmit(e) { function onSubmit(e) {
var form = this; var form = this;
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
toast(Globalize.translate("PasswordMatchError")) if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) {
}) : (loading.show(), savePassword()), e.preventDefault(), !1 require(["toast"], function (toast) {
toast(Globalize.translate("PasswordMatchError"));
});
} else {
loading.show();
savePassword();
}
e.preventDefault();
return false;
} }
function onLocalAccessSubmit(e) { function onLocalAccessSubmit(e) {
return loading.show(), saveEasyPassword(), e.preventDefault(), !1 loading.show();
saveEasyPassword();
e.preventDefault();
return false;
} }
function resetPassword() { function resetPassword() {
var msg = Globalize.translate("PasswordResetConfirmation"); var msg = Globalize.translate("PasswordResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function() { require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function () {
var userId = params.userId; var userId = params.userId;
loading.show(), ApiClient.resetUserPassword(userId).then(function() { loading.show();
loading.hide(), Dashboard.alert({ ApiClient.resetUserPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PasswordResetComplete"), message: Globalize.translate("PasswordResetComplete"),
title: Globalize.translate("PasswordResetHeader") title: Globalize.translate("PasswordResetHeader")
}), loadUser(view, params) });
}) loadUser(view, params);
}) });
}) });
});
} }
function resetEasyPassword() { function resetEasyPassword() {
var msg = Globalize.translate("PinCodeResetConfirmation"); var msg = Globalize.translate("PinCodeResetConfirmation");
require(["confirm"], function(confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function() { require(["confirm"], function (confirm) {
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function () {
var userId = params.userId; var userId = params.userId;
loading.show(), ApiClient.resetEasyPassword(userId).then(function() { loading.show();
loading.hide(), Dashboard.alert({ ApiClient.resetEasyPassword(userId).then(function () {
loading.hide();
Dashboard.alert({
message: Globalize.translate("PinCodeResetComplete"), message: Globalize.translate("PinCodeResetComplete"),
title: Globalize.translate("HeaderPinCodeReset") title: Globalize.translate("HeaderPinCodeReset")
}), loadUser(view, params) });
}) loadUser(view, params);
}) });
}) });
});
} }
view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit), view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit), view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword), view.querySelector("#btnResetPassword").addEventListener("click", resetPassword), view.addEventListener("viewshow", function() {
loadUser(view, params) view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit);
}) view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit);
} view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword);
view.querySelector("#btnResetPassword").addEventListener("click", resetPassword);
view.addEventListener("viewshow", function () {
loadUser(view, params);
});
};
}); });

View file

@ -6,7 +6,7 @@ define(["loading"], function (loading) {
ApiClient.ajax({ ApiClient.ajax({
url: ApiClient.getUrl("Startup/Complete"), url: ApiClient.getUrl("Startup/Complete"),
type: "POST" type: "POST"
}).then(function() { }).then(function () {
loading.hide(); loading.hide();
window.location.href = "index.html"; window.location.href = "index.html";
}); });