mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge pull request #3 from LogicalPhallacy/master
update to current master
This commit is contained in:
commit
78ca7e48d1
413 changed files with 1701 additions and 22902 deletions
|
@ -1,140 +0,0 @@
|
|||
define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-linkbutton"], function($, loading, libraryMenu, globalize, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
function populateHistory(packageInfo, page) {
|
||||
for (var html = "", i = 0, length = Math.min(packageInfo.versions.length, 10); i < length; i++) {
|
||||
var version = packageInfo.versions[i];
|
||||
html += '<h2 style="margin:.5em 0;">' + version.versionStr + " (" + version.classification + ")</h2>", html += '<div style="margin-bottom:1.5em;">' + version.description + "</div>"
|
||||
}
|
||||
$("#revisionHistory", page).html(html)
|
||||
}
|
||||
|
||||
function populateVersions(packageInfo, page, installedPlugin) {
|
||||
for (var html = "", i = 0, length = packageInfo.versions.length; i < length; i++) {
|
||||
var version = packageInfo.versions[i];
|
||||
html += '<option value="' + version.versionStr + "|" + version.classification + '">' + version.versionStr + " (" + version.classification + ")</option>"
|
||||
}
|
||||
var selectmenu = $("#selectVersion", page).html(html);
|
||||
installedPlugin || $("#pCurrentVersion", page).hide().html("");
|
||||
var packageVersion = packageInfo.versions.filter(function(current) {
|
||||
return "Release" == current.classification
|
||||
})[0];
|
||||
if (packageVersion || (packageVersion = packageInfo.versions.filter(function(current) {
|
||||
return "Beta" == current.classification
|
||||
})[0]), packageVersion) {
|
||||
var val = packageVersion.versionStr + "|" + packageVersion.classification;
|
||||
selectmenu.val(val)
|
||||
}
|
||||
}
|
||||
|
||||
function renderPackage(pkg, installedPlugins, pluginSecurityInfo, page) {
|
||||
var installedPlugin = installedPlugins.filter(function(ip) {
|
||||
return ip.Name == pkg.name
|
||||
})[0];
|
||||
populateVersions(pkg, page, installedPlugin);
|
||||
populateHistory(pkg, page);
|
||||
$(".pluginName", page).html(pkg.name);
|
||||
if ("Server" == pkg.targetSystem) {
|
||||
$("#btnInstallDiv", page).removeClass("hide");
|
||||
$("#nonServerMsg", page).hide();
|
||||
$("#pSelectVersion", page).removeClass("hide");
|
||||
} else {
|
||||
$("#btnInstallDiv", page).addClass("hide");
|
||||
$("#pSelectVersion", page).addClass("hide");
|
||||
var msg = globalize.translate("MessageInstallPluginFromApp");
|
||||
$("#nonServerMsg", page).html(msg).show();
|
||||
}
|
||||
if (pkg.shortDescription) {
|
||||
$("#tagline", page).show().html(pkg.shortDescription);
|
||||
} else {
|
||||
$("#tagline", page).hide();
|
||||
}
|
||||
$("#overview", page).html(pkg.overview || "");
|
||||
$("#developer", page).html(pkg.owner);
|
||||
if (pkg.richDescUrl) {
|
||||
$("#pViewWebsite", page).show();
|
||||
$("#pViewWebsite a", page).attr("href", pkg.richDescUrl);
|
||||
} else {
|
||||
$("#pViewWebsite", page).hide();
|
||||
}
|
||||
if (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%;' />");
|
||||
} else {
|
||||
$("#pPreviewImage", page).hide().html("");
|
||||
}
|
||||
if (installedPlugin) {
|
||||
var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "<strong>" + installedPlugin.Version + "</strong>");
|
||||
$("#pCurrentVersion", page).show().html(currentVersionText);
|
||||
} else {
|
||||
$("#pCurrentVersion", page).hide().html("");
|
||||
}
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function alertText(options) {
|
||||
require(["alert"], function(alert) {
|
||||
alert(options)
|
||||
})
|
||||
}
|
||||
|
||||
function performInstallation(page, packageName, guid, updateClass, version) {
|
||||
var developer = $("#developer", page).html().toLowerCase(),
|
||||
alertCallback = function(confirmed) {
|
||||
confirmed && (loading.show(), page.querySelector("#btnInstall").disabled = !0, ApiClient.installPlugin(packageName, guid, updateClass, version).then(function() {
|
||||
loading.hide(), alertText(globalize.translate("PluginInstalledMessage"))
|
||||
}))
|
||||
};
|
||||
if ("luke" != developer && "ebr" != developer) {
|
||||
loading.hide();
|
||||
var msg = globalize.translate("MessagePluginInstallDisclaimer");
|
||||
msg += "<br/>", msg += "<br/>", msg += globalize.translate("PleaseConfirmPluginInstallation"), require(["confirm"], function(confirm) {
|
||||
confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function() {
|
||||
alertCallback(!0)
|
||||
}, function() {
|
||||
alertCallback(!1)
|
||||
})
|
||||
})
|
||||
} else alertCallback(!0)
|
||||
}
|
||||
return function(view, params) {
|
||||
var onSubmit = function() {
|
||||
loading.show();
|
||||
var page = $(this).parents("#addPluginPage")[0],
|
||||
name = params.name,
|
||||
guid = params.guid;
|
||||
return ApiClient.getInstalledPlugins().then(function(plugins) {
|
||||
var installedPlugin = plugins.filter(function(ip) {
|
||||
return ip.Name == name
|
||||
})[0],
|
||||
vals = $("#selectVersion", page).val().split("|"),
|
||||
version = vals[0];
|
||||
installedPlugin && installedPlugin.Version == version ? (loading.hide(), Dashboard.alert({
|
||||
message: globalize.translate("MessageAlreadyInstalled"),
|
||||
title: globalize.translate("HeaderPluginInstallation")
|
||||
})) : performInstallation(page, name, guid, vals[1], version)
|
||||
}), !1
|
||||
};
|
||||
$(".addPluginForm", view).on("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var name = params.name,
|
||||
guid = params.guid,
|
||||
promise1 = ApiClient.getPackageInfo(name, guid),
|
||||
promise2 = ApiClient.getInstalledPlugins();
|
||||
connectionManager.getRegistrationInfo("themes", ApiClient, {
|
||||
viewOnly: !0
|
||||
}), Promise.all([promise1, promise2]).then(function(responses) {
|
||||
connectionManager.getRegistrationInfo("themes", ApiClient, {
|
||||
viewOnly: !0
|
||||
}).then(function() {
|
||||
renderPackage(responses[0], responses[1], {
|
||||
IsMBSupporter: !0
|
||||
}, page)
|
||||
}, function() {
|
||||
renderPackage(responses[0], responses[1], {}, page)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,65 +0,0 @@
|
|||
define(["appSettings", "loading", "browser", "emby-linkbutton"], function(appSettings, loading, browser) {
|
||||
"use strict";
|
||||
|
||||
function handleConnectionResult(page, result) {
|
||||
loading.hide();
|
||||
switch (result.State) {
|
||||
case "SignedIn":
|
||||
var apiClient = result.ApiClient;
|
||||
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html");
|
||||
break;
|
||||
case "ServerSignIn":
|
||||
Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id, false, "none");
|
||||
break;
|
||||
case "ServerSelection":
|
||||
Dashboard.navigate("selectserver.html", false, "none");
|
||||
break;
|
||||
case "ServerUpdateNeeded":
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ServerUpdateNeeded", '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
|
||||
});
|
||||
break;
|
||||
case "Unavailable":
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("MessageUnableToConnectToServer"),
|
||||
title: Globalize.translate("HeaderConnectionFailure")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function submitManualServer(page) {
|
||||
var host = page.querySelector("#txtServerHost").value;
|
||||
var port = page.querySelector("#txtServerPort").value;
|
||||
if (port) {
|
||||
host += ":" + port;
|
||||
}
|
||||
|
||||
loading.show();
|
||||
ConnectionManager.connectToAddress(host, {
|
||||
enableAutoLogin: appSettings.enableAutoLogin()
|
||||
}).then(function(result) {
|
||||
handleConnectionResult(page, result);
|
||||
}, function() {
|
||||
handleConnectionResult(page, {
|
||||
State: "Unavailable"
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
view.querySelector(".manualServerForm").addEventListener("submit", onManualServerSubmit);
|
||||
view.querySelector(".btnCancelManualServer").addEventListener("click", goBack);
|
||||
|
||||
function onManualServerSubmit(e) {
|
||||
submitManualServer(view);
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function goBack() {
|
||||
require(["appRouter"], function(appRouter) {
|
||||
appRouter.back();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
|
@ -1,917 +0,0 @@
|
|||
define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "humanedate", "listViewStyle", "emby-linkbutton", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog) {
|
||||
"use strict";
|
||||
|
||||
function onConnectionHelpClick(evt) {
|
||||
evt.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function buttonEnabled(elem, enabled) {
|
||||
if (enabled) {
|
||||
elem.setAttribute("disabled", "");
|
||||
elem.removeAttribute("disabled");
|
||||
} else {
|
||||
elem.setAttribute("disabled", "disabled");
|
||||
}
|
||||
}
|
||||
|
||||
function onEditServerNameClick(evt) {
|
||||
var page = dom.parentWithClass(this, "page");
|
||||
|
||||
require(["prompt"], function (prompt) {
|
||||
prompt({
|
||||
label: globalize.translate("LabelFriendlyServerName"),
|
||||
description: globalize.translate("LabelFriendlyServerNameHelp"),
|
||||
value: page.querySelector(".serverNameHeader").innerHTML,
|
||||
confirmText: globalize.translate("ButtonSave")
|
||||
}).then(function (value) {
|
||||
loading.show();
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
config.ServerName = value;
|
||||
ApiClient.updateServerConfiguration(config).then(function () {
|
||||
page.querySelector(".serverNameHeader").innerHTML = value;
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
evt.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function showPlaybackInfo(btn, session) {
|
||||
require(["alert"], function (alert) {
|
||||
var showTranscodeReasons;
|
||||
var title;
|
||||
var text = [];
|
||||
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
|
||||
var isDirectStream = "DirectStream" === displayPlayMethod;
|
||||
var isTranscode = "Transcode" === displayPlayMethod;
|
||||
|
||||
if (isDirectStream) {
|
||||
title = globalize.translate("DirectStreaming");
|
||||
text.push(globalize.translate("DirectStreamHelp1"));
|
||||
text.push("<br/>");
|
||||
text.push(globalize.translate("DirectStreamHelp2"));
|
||||
} else if (isTranscode) {
|
||||
title = globalize.translate("Transcoding");
|
||||
text.push(globalize.translate("MediaIsBeingConverted"));
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
|
||||
text.push("<br/>");
|
||||
text.push(globalize.translate("LabelReasonForTranscoding"));
|
||||
session.TranscodingInfo.TranscodeReasons.forEach(function (transcodeReason) {
|
||||
text.push(globalize.translate("" + transcodeReason));
|
||||
});
|
||||
}
|
||||
}
|
||||
alert({
|
||||
text: text.join("<br/>"),
|
||||
title: title
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showSendMessageForm(btn, session) {
|
||||
require(["prompt"], function (prompt) {
|
||||
prompt({
|
||||
title: globalize.translate("HeaderSendMessage"),
|
||||
label: globalize.translate("LabelMessageText"),
|
||||
confirmText: globalize.translate("ButtonSend")
|
||||
}).then(function (text) {
|
||||
if (text) {
|
||||
connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, {
|
||||
Text: text,
|
||||
TimeoutMs: 5e3
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showOptionsMenu(btn, session) {
|
||||
require(["actionsheet"], function (actionsheet) {
|
||||
var menuItems = [];
|
||||
|
||||
if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) {
|
||||
menuItems.push({
|
||||
name: globalize.translate("SendMessage"),
|
||||
id: "sendmessage"
|
||||
});
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
|
||||
menuItems.push({
|
||||
name: globalize.translate("ViewPlaybackInfo"),
|
||||
id: "transcodinginfo"
|
||||
});
|
||||
}
|
||||
|
||||
return actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: btn
|
||||
}).then(function (id) {
|
||||
switch (id) {
|
||||
case "sendmessage":
|
||||
showSendMessageForm(btn, session);
|
||||
break;
|
||||
case "transcodinginfo":
|
||||
showPlaybackInfo(btn, session);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onActiveDevicesClick(evt) {
|
||||
var btn = dom.parentWithClass(evt.target, "sessionCardButton");
|
||||
|
||||
if (btn) {
|
||||
var card = dom.parentWithClass(btn, "card");
|
||||
|
||||
if (card) {
|
||||
var sessionId = card.id;
|
||||
var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) {
|
||||
return "session" + dashboardSession.Id === sessionId;
|
||||
})[0];
|
||||
|
||||
if (session) {
|
||||
if (btn.classList.contains("btnCardOptions")) {
|
||||
showOptionsMenu(btn, session);
|
||||
} else if (btn.classList.contains("btnSessionInfo")) {
|
||||
showPlaybackInfo(btn, session);
|
||||
} else if (btn.classList.contains("btnSessionSendMessage")) {
|
||||
showSendMessageForm(btn, session);
|
||||
} else if (btn.classList.contains("btnSessionStop")) {
|
||||
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop");
|
||||
} else if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) {
|
||||
connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function filterSessions(sessions) {
|
||||
var list = [];
|
||||
var minActiveDate = new Date().getTime() - 9e5;
|
||||
|
||||
for (var i = 0, length = sessions.length; i < length; i++) {
|
||||
var session = sessions[i];
|
||||
|
||||
if (!session.NowPlayingItem && !session.UserId) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (datetime.parseISO8601Date(session.LastActivityDate, true).getTime() >= minActiveDate) {
|
||||
list.push(session);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
function refreshActiveRecordings(view, apiClient) {
|
||||
apiClient.getLiveTvRecordings({
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
IsInProgress: true,
|
||||
Fields: "CanDelete,PrimaryImageAspectRatio",
|
||||
EnableTotalRecordCount: false,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop"
|
||||
}).then(function (result) {
|
||||
var itemsContainer = view.querySelector(".activeRecordingItems");
|
||||
|
||||
if (!result.Items.length) {
|
||||
view.querySelector(".activeRecordingsSection").classList.add("hide");
|
||||
return void (itemsContainer.innerHTML = "");
|
||||
}
|
||||
|
||||
view.querySelector(".activeRecordingsSection").classList.remove("hide");
|
||||
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
defaultShape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
coverImage: true,
|
||||
cardLayout: false,
|
||||
centerText: true,
|
||||
preferThumb: "auto",
|
||||
overlayText: false,
|
||||
overlayMoreButton: true,
|
||||
action: "none",
|
||||
centerPlayButton: true
|
||||
});
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
});
|
||||
}
|
||||
|
||||
function reloadSystemInfo(view, apiClient) {
|
||||
apiClient.getSystemInfo().then(function (systemInfo) {
|
||||
view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName;
|
||||
var localizedVersion = globalize.translate("LabelVersionNumber", systemInfo.Version);
|
||||
|
||||
if (systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel) {
|
||||
localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase();
|
||||
}
|
||||
|
||||
if (systemInfo.CanSelfRestart) {
|
||||
view.querySelector("#btnRestartServer").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector("#btnRestartServer").classList.add("hide");
|
||||
}
|
||||
|
||||
view.querySelector("#appVersionNumber").innerHTML = localizedVersion;
|
||||
|
||||
if (systemInfo.SupportsHttps) {
|
||||
view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber);
|
||||
} else {
|
||||
view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber);
|
||||
}
|
||||
|
||||
DashboardPage.renderUrls(view, systemInfo);
|
||||
DashboardPage.renderPaths(view, systemInfo);
|
||||
});
|
||||
}
|
||||
|
||||
function renderInfo(view, sessions, forceUpdate) {
|
||||
sessions = filterSessions(sessions);
|
||||
renderActiveConnections(view, sessions);
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function pollForInfo(view, apiClient, forceUpdate) {
|
||||
apiClient.getSessions({
|
||||
ActiveWithinSeconds: 960
|
||||
}).then(function (sessions) {
|
||||
renderInfo(view, sessions, forceUpdate);
|
||||
});
|
||||
apiClient.getScheduledTasks().then(function (tasks) {
|
||||
renderRunningTasks(view, tasks);
|
||||
});
|
||||
}
|
||||
|
||||
function renderActiveConnections(view, sessions) {
|
||||
var html = "";
|
||||
DashboardPage.sessionsList = sessions;
|
||||
var parentElement = view.querySelector(".activeDevices");
|
||||
var cardElem = parentElement.querySelector(".card");
|
||||
|
||||
if (cardElem) {
|
||||
cardElem.classList.add("deadSession");
|
||||
}
|
||||
|
||||
for (var i = 0, length = sessions.length; i < length; i++) {
|
||||
var session = sessions[i];
|
||||
var rowId = "session" + session.Id;
|
||||
var elem = view.querySelector("#" + rowId);
|
||||
|
||||
if (elem) {
|
||||
DashboardPage.updateSession(elem, session);
|
||||
} else {
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
var className = "scalableCard card activeSession backdropCard backdropCard-scalable";
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
|
||||
className += " transcodingSession";
|
||||
}
|
||||
|
||||
html += '<div class="' + className + '" id="' + rowId + '">';
|
||||
html += '<div class="cardBox visualCardBox">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
html += '<div class="cardContent">';
|
||||
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem);
|
||||
|
||||
if (imgUrl) {
|
||||
html += '<div class="sessionNowPlayingContent sessionNowPlayingContent-withbackground"';
|
||||
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"";
|
||||
} else {
|
||||
html += '<div class="sessionNowPlayingContent"';
|
||||
}
|
||||
|
||||
html += "></div>";
|
||||
html += '<div class="sessionNowPlayingInnerContent">';
|
||||
html += '<div class="sessionAppInfo">';
|
||||
var clientImage = DashboardPage.getClientImage(session);
|
||||
|
||||
if (clientImage) {
|
||||
html += clientImage;
|
||||
}
|
||||
|
||||
html += '<div class="sessionAppName" style="display:inline-block;">';
|
||||
html += '<div class="sessionDeviceName">' + session.DeviceName + "</div>";
|
||||
html += '<div class="sessionAppSecondaryText">' + DashboardPage.getAppSecondaryText(session) + "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
|
||||
html += '<div class="sessionTranscodingFramerate">' + session.TranscodingInfo.Framerate + " fps</div>";
|
||||
} else {
|
||||
html += '<div class="sessionTranscodingFramerate"></div>';
|
||||
}
|
||||
|
||||
var nowPlayingName = DashboardPage.getNowPlayingName(session);
|
||||
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
|
||||
html += nowPlayingName.html;
|
||||
html += "</div>";
|
||||
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
|
||||
html += '<progress class="playbackProgress" min="0" max="100" value="' + 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks + '"></progress>';
|
||||
} else {
|
||||
html += '<progress class="playbackProgress hide" min="0" max="100"></progress>';
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
|
||||
html += '<progress class="transcodingProgress" min="0" max="100" value="' + session.TranscodingInfo.CompletionPercentage.toFixed(1) + '"></progress>';
|
||||
} else {
|
||||
html += '<progress class="transcodingProgress hide" min="0" max="100"></progress>';
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<div class="sessionCardFooter cardFooter">';
|
||||
html += '<div class="sessionCardButtons flex align-items-center justify-content-center">';
|
||||
var btnCssClass;
|
||||
btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId() ? "" : " hide";
|
||||
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionPlayPause paper-icon-button-light ' + btnCssClass + '"><i class="md-icon"></i></button>';
|
||||
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionStop paper-icon-button-light ' + btnCssClass + '"><i class="md-icon"></i></button>';
|
||||
btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide";
|
||||
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionInfo paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate("ViewPlaybackInfo") + '"><i class="md-icon"></i></button>';
|
||||
btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide";
|
||||
html += '<button is="paper-icon-button-light" class="sessionCardButton btnSessionSendMessage paper-icon-button-light ' + btnCssClass + '" title="' + globalize.translate("SendMessage") + '"><i class="md-icon"></i></button>';
|
||||
html += "</div>";
|
||||
html += '<div class="sessionNowPlayingStreamInfo" style="padding:.5em 0 1em;">';
|
||||
html += DashboardPage.getSessionNowPlayingStreamInfo(session);
|
||||
html += "</div>";
|
||||
html += '<div class="flex align-items-center justify-content-center">';
|
||||
var userImage = DashboardPage.getUserImage(session);
|
||||
html += userImage ? '<img style="height:1.71em;border-radius:50px;margin-right:.5em;" src="' + userImage + '" />' : '<div style="height:1.71em;"></div>';
|
||||
html += '<div class="sessionUserName" style="text-transform:uppercase;">';
|
||||
html += DashboardPage.getUsersHtml(session) || " ";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
}
|
||||
|
||||
parentElement.insertAdjacentHTML("beforeend", html);
|
||||
var deadSessionElem = parentElement.querySelector(".deadSession");
|
||||
|
||||
if (deadSessionElem) {
|
||||
deadSessionElem.parentNode.removeChild(deadSessionElem);
|
||||
}
|
||||
}
|
||||
|
||||
function renderRunningTasks(view, tasks) {
|
||||
var html = "";
|
||||
tasks = tasks.filter(function (task) {
|
||||
if ("Idle" != task.State) {
|
||||
return !task.IsHidden;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
if (tasks.length) {
|
||||
view.querySelector(".runningTasksContainer").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".runningTasksContainer").classList.add("hide");
|
||||
}
|
||||
|
||||
for (var i = 0, length = tasks.length; i < length; i++) {
|
||||
var task = tasks[i];
|
||||
|
||||
html += "<p>";
|
||||
html += task.Name + "<br/>";
|
||||
if (task.State === "Running") {
|
||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
||||
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
|
||||
html += progress + "%";
|
||||
html += "</progress>";
|
||||
html += "<span style='color:#00a4dc;margin-left:5px;margin-right:5px;'>" + progress + "%</span>";
|
||||
html += '<button type="button" is="paper-icon-button-light" title="' + globalize.translate("ButtonStop") + '" onclick="DashboardPage.stopTask(this, \'' + task.Id + '\');" class="autoSize"><i class="md-icon">cancel</i></button>';
|
||||
} else if (task.State === "Cancelling") {
|
||||
html += '<span style="color:#cc0000;">' + globalize.translate("LabelStopping") + "</span>";
|
||||
}
|
||||
|
||||
html += "</p>";
|
||||
}
|
||||
|
||||
view.querySelector("#divRunningTasks").innerHTML = html;
|
||||
}
|
||||
|
||||
window.DashboardPage = {
|
||||
renderPaths: function (page, systemInfo) {
|
||||
page.querySelector("#cachePath").innerHTML = systemInfo.CachePath;
|
||||
page.querySelector("#logPath").innerHTML = systemInfo.LogPath;
|
||||
page.querySelector("#transcodingTemporaryPath").innerHTML = systemInfo.TranscodingTempPath;
|
||||
page.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath;
|
||||
},
|
||||
startInterval: function (apiClient) {
|
||||
apiClient.sendMessage("SessionsStart", "0,1500");
|
||||
apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000");
|
||||
},
|
||||
stopInterval: function (apiClient) {
|
||||
apiClient.sendMessage("SessionsStop");
|
||||
apiClient.sendMessage("ScheduledTasksInfoStop");
|
||||
},
|
||||
getSessionNowPlayingStreamInfo: function (session) {
|
||||
var html = "";
|
||||
var showTranscodingInfo = false;
|
||||
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
|
||||
if (displayPlayMethod === "DirectStream") {
|
||||
html += globalize.translate("DirectStreaming");
|
||||
} else if (displayPlayMethod === "Transcode") {
|
||||
html += globalize.translate("Transcoding");
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.Framerate) {
|
||||
html += " (" + session.TranscodingInfo.Framerate + " fps)";
|
||||
}
|
||||
showTranscodingInfo = true;
|
||||
} else if (displayPlayMethod === "DirectPlay") {
|
||||
html += globalize.translate("DirectPlaying");
|
||||
}
|
||||
if (showTranscodingInfo) {
|
||||
var line = [];
|
||||
|
||||
if (session.TranscodingInfo) {
|
||||
if (session.TranscodingInfo.Bitrate) {
|
||||
if (session.TranscodingInfo.Bitrate > 1e6) {
|
||||
line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps");
|
||||
} else {
|
||||
line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " kbps");
|
||||
}
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo.Container) {
|
||||
line.push(session.TranscodingInfo.Container);
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo.VideoCodec) {
|
||||
line.push(session.TranscodingInfo.VideoCodec);
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo.AudioCodec && session.TranscodingInfo.AudioCodec != session.TranscodingInfo.Container) {
|
||||
line.push(session.TranscodingInfo.AudioCodec);
|
||||
}
|
||||
}
|
||||
|
||||
if (line.length) {
|
||||
html += " - " + line.join(" ");
|
||||
}
|
||||
}
|
||||
|
||||
return html || " ";
|
||||
},
|
||||
getSessionNowPlayingTime: function (session) {
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
var html = "";
|
||||
|
||||
if (nowPlayingItem) {
|
||||
if (session.PlayState.PositionTicks) {
|
||||
html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks);
|
||||
} else {
|
||||
html += "--:--:--";
|
||||
}
|
||||
|
||||
html += " / ";
|
||||
|
||||
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
|
||||
html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks);
|
||||
} else {
|
||||
html += "--:--:--";
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
return html;
|
||||
},
|
||||
getAppSecondaryText: function (session) {
|
||||
return session.Client + " " + session.ApplicationVersion;
|
||||
},
|
||||
getNowPlayingName: function (session) {
|
||||
var imgUrl = "";
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
|
||||
if (!nowPlayingItem) {
|
||||
return {
|
||||
html: "Last seen " + humane_date(session.LastActivityDate),
|
||||
image: imgUrl
|
||||
};
|
||||
}
|
||||
|
||||
var topText = itemHelper.getDisplayName(nowPlayingItem);
|
||||
var bottomText = "";
|
||||
|
||||
if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) {
|
||||
bottomText = topText;
|
||||
topText = nowPlayingItem.Artists[0];
|
||||
} else {
|
||||
if (nowPlayingItem.SeriesName || nowPlayingItem.Album) {
|
||||
bottomText = topText;
|
||||
topText = nowPlayingItem.SeriesName || nowPlayingItem.Album;
|
||||
} else if (nowPlayingItem.ProductionYear) {
|
||||
bottomText = nowPlayingItem.ProductionYear;
|
||||
}
|
||||
}
|
||||
|
||||
if (nowPlayingItem.ImageTags && nowPlayingItem.ImageTags.Logo) {
|
||||
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.Id, {
|
||||
tag: nowPlayingItem.ImageTags.Logo,
|
||||
maxHeight: 24,
|
||||
maxWidth: 130,
|
||||
type: "Logo"
|
||||
});
|
||||
} else {
|
||||
if (nowPlayingItem.ParentLogoImageTag) {
|
||||
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, {
|
||||
tag: nowPlayingItem.ParentLogoImageTag,
|
||||
maxHeight: 24,
|
||||
maxWidth: 130,
|
||||
type: "Logo"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (imgUrl) {
|
||||
topText = '<img src="' + imgUrl + '" style="max-height:24px;max-width:130px;" />';
|
||||
}
|
||||
|
||||
return {
|
||||
html: bottomText ? topText + "<br/>" + bottomText : topText,
|
||||
image: imgUrl
|
||||
};
|
||||
},
|
||||
getUsersHtml: function (session) {
|
||||
var html = [];
|
||||
|
||||
if (session.UserId) {
|
||||
html.push(session.UserName);
|
||||
}
|
||||
|
||||
for (var i = 0, length = session.AdditionalUsers.length; i < length; i++) {
|
||||
html.push(session.AdditionalUsers[i].UserName);
|
||||
}
|
||||
|
||||
return html.join(", ");
|
||||
},
|
||||
getUserImage: function (session) {
|
||||
if (session.UserId && session.UserPrimaryImageTag) {
|
||||
return ApiClient.getUserImageUrl(session.UserId, {
|
||||
tag: session.UserPrimaryImageTag,
|
||||
height: 24,
|
||||
type: "Primary"
|
||||
});
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
updateSession: function (row, session) {
|
||||
row.classList.remove("deadSession");
|
||||
var nowPlayingItem = session.NowPlayingItem;
|
||||
|
||||
if (nowPlayingItem) {
|
||||
row.classList.add("playingSession");
|
||||
} else {
|
||||
row.classList.remove("playingSession");
|
||||
}
|
||||
|
||||
if (session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId()) {
|
||||
row.querySelector(".btnSessionSendMessage").classList.remove("hide");
|
||||
} else {
|
||||
row.querySelector(".btnSessionSendMessage").classList.add("hide");
|
||||
}
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length) {
|
||||
row.querySelector(".btnSessionInfo").classList.remove("hide");
|
||||
} else {
|
||||
row.querySelector(".btnSessionInfo").classList.add("hide");
|
||||
}
|
||||
|
||||
var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause");
|
||||
|
||||
if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) {
|
||||
btnSessionPlayPause.classList.remove("hide");
|
||||
row.querySelector(".btnSessionStop").classList.remove("hide");
|
||||
} else {
|
||||
btnSessionPlayPause.classList.add("hide");
|
||||
row.querySelector(".btnSessionStop").classList.add("hide");
|
||||
}
|
||||
|
||||
if (session.PlayState && session.PlayState.IsPaused) {
|
||||
btnSessionPlayPause.querySelector("i").innerHTML = "";
|
||||
} else {
|
||||
btnSessionPlayPause.querySelector("i").innerHTML = "";
|
||||
}
|
||||
|
||||
row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session);
|
||||
row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session);
|
||||
row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session) || " ";
|
||||
row.querySelector(".sessionAppSecondaryText").innerHTML = DashboardPage.getAppSecondaryText(session);
|
||||
row.querySelector(".sessionTranscodingFramerate").innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + " fps" : "";
|
||||
var nowPlayingName = DashboardPage.getNowPlayingName(session);
|
||||
var nowPlayingInfoElem = row.querySelector(".sessionNowPlayingInfo");
|
||||
|
||||
if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc"))) {
|
||||
nowPlayingInfoElem.innerHTML = nowPlayingName.html;
|
||||
nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || "");
|
||||
}
|
||||
|
||||
var playbackProgressElem = row.querySelector(".playbackProgress");
|
||||
|
||||
if (playbackProgressElem) {
|
||||
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
|
||||
var position = session.PlayState.PositionTicks || 0;
|
||||
var value = 100 * position / nowPlayingItem.RunTimeTicks;
|
||||
playbackProgressElem.classList.remove("hide");
|
||||
playbackProgressElem.value = value;
|
||||
} else {
|
||||
playbackProgressElem.classList.add("hide");
|
||||
}
|
||||
}
|
||||
|
||||
var transcodingProgress = row.querySelector(".transcodingProgress");
|
||||
|
||||
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
|
||||
row.classList.add("transcodingSession");
|
||||
transcodingProgress.value = session.TranscodingInfo.CompletionPercentage;
|
||||
transcodingProgress.classList.remove("hide");
|
||||
} else {
|
||||
transcodingProgress.classList.add("hide");
|
||||
row.classList.remove("transcodingSession");
|
||||
}
|
||||
|
||||
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
|
||||
var imgElem = row.querySelector(".sessionNowPlayingContent");
|
||||
|
||||
if (imgUrl != imgElem.getAttribute("data-src")) {
|
||||
imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : "";
|
||||
imgElem.setAttribute("data-src", imgUrl);
|
||||
|
||||
if (imgUrl) {
|
||||
imgElem.classList.add("sessionNowPlayingContent-withbackground");
|
||||
} else {
|
||||
imgElem.classList.remove("sessionNowPlayingContent-withbackground");
|
||||
}
|
||||
}
|
||||
},
|
||||
getClientImage: function (connection) {
|
||||
var iconUrl = (connection.Client.toLowerCase(), connection.DeviceName.toLowerCase(), connection.AppIconUrl);
|
||||
|
||||
if (iconUrl) {
|
||||
if (-1 === iconUrl.indexOf("://")) {
|
||||
iconUrl = ApiClient.getUrl(iconUrl);
|
||||
}
|
||||
|
||||
return "<img src='" + iconUrl + "' />";
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
getNowPlayingImageUrl: function (item) {
|
||||
if (item && item.BackdropImageTags && item.BackdropImageTags.length) {
|
||||
return ApiClient.getScaledImageUrl(item.Id, {
|
||||
type: "Backdrop",
|
||||
width: 275,
|
||||
tag: item.BackdropImageTags[0]
|
||||
});
|
||||
}
|
||||
|
||||
if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
|
||||
return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, {
|
||||
type: "Backdrop",
|
||||
width: 275,
|
||||
tag: item.ParentBackdropImageTags[0]
|
||||
});
|
||||
}
|
||||
|
||||
if (item && item.BackdropImageTag) {
|
||||
return ApiClient.getScaledImageUrl(item.BackdropItemId, {
|
||||
type: "Backdrop",
|
||||
width: 275,
|
||||
tag: item.BackdropImageTag
|
||||
});
|
||||
}
|
||||
|
||||
var imageTags = (item || {}).ImageTags || {};
|
||||
|
||||
if (item && imageTags.Thumb) {
|
||||
return ApiClient.getScaledImageUrl(item.Id, {
|
||||
type: "Thumb",
|
||||
width: 275,
|
||||
tag: imageTags.Thumb
|
||||
});
|
||||
}
|
||||
|
||||
if (item && item.ParentThumbImageTag) {
|
||||
return ApiClient.getScaledImageUrl(item.ParentThumbItemId, {
|
||||
type: "Thumb",
|
||||
width: 275,
|
||||
tag: item.ParentThumbImageTag
|
||||
});
|
||||
}
|
||||
|
||||
if (item && item.ThumbImageTag) {
|
||||
return ApiClient.getScaledImageUrl(item.ThumbItemId, {
|
||||
type: "Thumb",
|
||||
width: 275,
|
||||
tag: item.ThumbImageTag
|
||||
});
|
||||
}
|
||||
|
||||
if (item && imageTags.Primary) {
|
||||
return ApiClient.getScaledImageUrl(item.Id, {
|
||||
type: "Primary",
|
||||
width: 275,
|
||||
tag: imageTags.Primary
|
||||
});
|
||||
}
|
||||
|
||||
if (item && item.PrimaryImageTag) {
|
||||
return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, {
|
||||
type: "Primary",
|
||||
width: 275,
|
||||
tag: item.PrimaryImageTag
|
||||
});
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
systemUpdateTaskKey: "SystemUpdateTask",
|
||||
renderUrls: function (page, systemInfo) {
|
||||
var helpButton = '<a is="emby-linkbutton" class="raised raised-mini button-submit" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Connectivity" target="_blank" style="margin-left:.7em;font-size:84%;padding:.2em .8em;">' + globalize.translate("ButtonHelp") + "</a>";
|
||||
var localUrlElem = page.querySelector(".localUrl");
|
||||
var externalUrlElem = page.querySelector(".externalUrl");
|
||||
|
||||
if (systemInfo.LocalAddress) {
|
||||
var localAccessHtml = globalize.translate("LabelLocalAccessUrl", '<a is="emby-linkbutton" class="button-link" href="' + systemInfo.LocalAddress + '" target="_blank">' + systemInfo.LocalAddress + "</a>");
|
||||
localUrlElem.innerHTML = localAccessHtml + helpButton;
|
||||
localUrlElem.classList.remove("hide");
|
||||
} else {
|
||||
localUrlElem.classList.add("hide");
|
||||
}
|
||||
|
||||
if (systemInfo.WanAddress) {
|
||||
var externalUrl = systemInfo.WanAddress;
|
||||
var remoteAccessHtml = globalize.translate("LabelRemoteAccessUrl", '<a is="emby-linkbutton" class="button-link" href="' + externalUrl + '" target="_blank">' + externalUrl + "</a>");
|
||||
externalUrlElem.innerHTML = remoteAccessHtml + helpButton;
|
||||
externalUrlElem.classList.remove("hide");
|
||||
} else {
|
||||
externalUrlElem.classList.add("hide");
|
||||
}
|
||||
},
|
||||
stopTask: function (btn, id) {
|
||||
var page = dom.parentWithClass(btn, "page");
|
||||
ApiClient.stopScheduledTask(id).then(function () {
|
||||
pollForInfo(page, ApiClient);
|
||||
});
|
||||
},
|
||||
restart: function (btn) {
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm({
|
||||
title: globalize.translate("HeaderRestart"),
|
||||
text: globalize.translate("MessageConfirmRestart"),
|
||||
confirmText: globalize.translate("ButtonRestart"),
|
||||
primary: "cancel"
|
||||
}).then(function () {
|
||||
var page = dom.parentWithClass(btn, "page");
|
||||
buttonEnabled(page.querySelector("#btnRestartServer"), false);
|
||||
buttonEnabled(page.querySelector("#btnShutdown"), false);
|
||||
Dashboard.restartServer();
|
||||
});
|
||||
});
|
||||
},
|
||||
shutdown: function (btn) {
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm({
|
||||
title: globalize.translate("HeaderShutdown"),
|
||||
text: globalize.translate("MessageConfirmShutdown"),
|
||||
confirmText: globalize.translate("ButtonShutdown"),
|
||||
primary: "cancel"
|
||||
}).then(function () {
|
||||
var page = dom.parentWithClass(btn, "page");
|
||||
buttonEnabled(page.querySelector("#btnRestartServer"), false);
|
||||
buttonEnabled(page.querySelector("#btnShutdown"), false);
|
||||
ApiClient.shutdownServer();
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
return function (view, params) {
|
||||
function onRestartRequired(evt, apiClient) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
renderHasPendingRestart(view, apiClient, true);
|
||||
}
|
||||
}
|
||||
|
||||
function onServerShuttingDown(evt, apiClient) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
renderHasPendingRestart(view, apiClient, true);
|
||||
}
|
||||
}
|
||||
|
||||
function onServerRestarting(evt, apiClient) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
renderHasPendingRestart(view, apiClient, true);
|
||||
}
|
||||
}
|
||||
|
||||
function onPackageInstalling(evt, apiClient) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
pollForInfo(view, apiClient, true);
|
||||
reloadSystemInfo(view, apiClient);
|
||||
}
|
||||
}
|
||||
|
||||
function onPackageInstallationCompleted(evt, apiClient) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
pollForInfo(view, apiClient, true);
|
||||
reloadSystemInfo(view, apiClient);
|
||||
}
|
||||
}
|
||||
|
||||
function onSessionsUpdate(evt, apiClient, info) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
renderInfo(view, info);
|
||||
}
|
||||
}
|
||||
|
||||
function onScheduledTasksUpdate(evt, apiClient, info) {
|
||||
if (apiClient.serverId() === serverId) {
|
||||
renderRunningTasks(view, info);
|
||||
}
|
||||
}
|
||||
|
||||
var serverId = ApiClient.serverId();
|
||||
view.querySelector(".btnConnectionHelp").addEventListener("click", onConnectionHelpClick);
|
||||
view.querySelector(".btnEditServerName").addEventListener("click", onEditServerNameClick);
|
||||
view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick);
|
||||
view.addEventListener("viewshow", function () {
|
||||
var page = this;
|
||||
var apiClient = ApiClient;
|
||||
|
||||
if (apiClient) {
|
||||
loading.show();
|
||||
pollForInfo(page, apiClient);
|
||||
DashboardPage.startInterval(apiClient);
|
||||
// TODO we currently don't support packages and thus these events are useless
|
||||
events.on(serverNotifications, "RestartRequired", onRestartRequired);
|
||||
events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown);
|
||||
events.on(serverNotifications, "ServerRestarting", onServerRestarting);
|
||||
events.on(serverNotifications, "PackageInstalling", onPackageInstalling);
|
||||
events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted);
|
||||
events.on(serverNotifications, "Sessions", onSessionsUpdate);
|
||||
events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
|
||||
DashboardPage.lastAppUpdateCheck = null;
|
||||
reloadSystemInfo(page, ApiClient);
|
||||
|
||||
if (!page.userActivityLog) {
|
||||
page.userActivityLog = new ActivityLog({
|
||||
serverId: ApiClient.serverId(),
|
||||
element: page.querySelector(".userActivityItems")
|
||||
});
|
||||
}
|
||||
|
||||
if (ApiClient.isMinServerVersion("3.4.1.25")) {
|
||||
if (!page.serverActivityLog) {
|
||||
page.serverActivityLog = new ActivityLog({
|
||||
serverId: ApiClient.serverId(),
|
||||
element: page.querySelector(".serverActivityItems")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
refreshActiveRecordings(view, apiClient);
|
||||
loading.hide();
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function () {
|
||||
var apiClient = ApiClient;
|
||||
events.off(serverNotifications, "RestartRequired", onRestartRequired);
|
||||
events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown);
|
||||
events.off(serverNotifications, "ServerRestarting", onServerRestarting);
|
||||
events.off(serverNotifications, "PackageInstalling", onPackageInstalling);
|
||||
events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted);
|
||||
events.off(serverNotifications, "Sessions", onSessionsUpdate);
|
||||
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
|
||||
|
||||
if (apiClient) {
|
||||
DashboardPage.stopInterval(apiClient);
|
||||
}
|
||||
});
|
||||
view.addEventListener("viewdestroy", function () {
|
||||
var page = this;
|
||||
var userActivityLog = page.userActivityLog;
|
||||
if (userActivityLog) {
|
||||
userActivityLog.destroy();
|
||||
}
|
||||
var serverActivityLog = page.serverActivityLog;
|
||||
if (serverActivityLog) {
|
||||
serverActivityLog.destroy();
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,17 +0,0 @@
|
|||
define(["loading"], function(loading) {
|
||||
"use strict";
|
||||
|
||||
function reload(context, itemId) {
|
||||
loading.show(), itemId ? require(["metadataEditor"], function(metadataEditor) {
|
||||
metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id)
|
||||
}) : (context.querySelector(".editPageInnerContent").innerHTML = "", loading.hide())
|
||||
}
|
||||
return function(view, params) {
|
||||
view.addEventListener("viewshow", function() {
|
||||
reload(this, MetadataEditor.getCurrentItemId())
|
||||
}), MetadataEditor.setCurrentItemId(null), view.querySelector(".libraryTree").addEventListener("itemclicked", function(event) {
|
||||
var data = event.detail;
|
||||
data.id != MetadataEditor.getCurrentItemId() && (MetadataEditor.setCurrentItemId(data.id), reload(view, data.id))
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,34 +0,0 @@
|
|||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function processForgotPasswordResult(result) {
|
||||
if ("ContactAdmin" == result.Action) return void Dashboard.alert({
|
||||
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 ("PinCode" == result.Action) {
|
||||
var msg = Globalize.translate("MessageForgotPasswordFileCreated");
|
||||
return msg += "<br/>", msg += "<br/>", msg += result.PinFile, msg += "<br/>", void Dashboard.alert({
|
||||
message: msg,
|
||||
title: Globalize.translate("HeaderForgotPassword")
|
||||
})
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
function onSubmit(e) {
|
||||
return ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("Users/ForgotPassword"),
|
||||
dataType: "json",
|
||||
data: {
|
||||
EnteredUsername: view.querySelector("#txtName").value
|
||||
}
|
||||
}).then(processForgotPasswordResult), e.preventDefault(), !1
|
||||
}
|
||||
view.querySelector("form").addEventListener("submit", onSubmit)
|
||||
}
|
||||
});
|
|
@ -1,33 +0,0 @@
|
|||
define([], function() {
|
||||
"use strict";
|
||||
|
||||
function processForgotPasswordResult(result) {
|
||||
if (result.Success) {
|
||||
var msg = Globalize.translate("MessagePasswordResetForUsers");
|
||||
return msg += "<br/>", msg += "<br/>", msg += result.UsersReset.join("<br/>"), void Dashboard.alert({
|
||||
message: msg,
|
||||
title: Globalize.translate("HeaderPasswordReset"),
|
||||
callback: function() {
|
||||
window.location.href = "index.html"
|
||||
}
|
||||
})
|
||||
}
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("MessageInvalidForgotPasswordPin"),
|
||||
title: Globalize.translate("HeaderPasswordReset")
|
||||
})
|
||||
}
|
||||
return function(view, params) {
|
||||
function onSubmit(e) {
|
||||
return ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("Users/ForgotPassword/Pin"),
|
||||
dataType: "json",
|
||||
data: {
|
||||
Pin: view.querySelector("#txtPin").value
|
||||
}
|
||||
}).then(processForgotPasswordResult), e.preventDefault(), !1
|
||||
}
|
||||
view.querySelector("form").addEventListener("submit", onSubmit)
|
||||
}
|
||||
});
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
define(["layoutManager", "loading", "components/categorysyncbuttons", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function(layoutManager, loading, categorysyncbuttons, cardBuilder, appHost, imageLoader) {
|
||||
define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function(layoutManager, loading, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function renderRecordings(elem, recordings, cardOptions, scrollX) {
|
||||
|
@ -54,7 +54,6 @@ define(["layoutManager", "loading", "components/categorysyncbuttons", "cardBuild
|
|||
}
|
||||
var foldersPromise, latestPromise, self = this,
|
||||
lastFullRender = 0;
|
||||
categorysyncbuttons.init(tabContent);
|
||||
for (var moreButtons = tabContent.querySelectorAll(".more"), i = 0, length = moreButtons.length; i < length; i++) moreButtons[i].addEventListener("click", onMoreClick);
|
||||
self.preRender = function() {
|
||||
enableFullRender() && (latestPromise = ApiClient.getLiveTvRecordings({
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function(datetime, cardBuilder, imageLoader, appHost, loading) {
|
||||
"use strict";
|
||||
|
||||
function renderTimers(context, timers) {
|
||||
var html = "";
|
||||
appHost.supports("imageanalysis");
|
||||
html += cardBuilder.getCardsHtml({
|
||||
items: timers,
|
||||
shape: "auto",
|
||||
defaultShape: "portrait",
|
||||
showTitle: !0,
|
||||
cardLayout: !1,
|
||||
preferThumb: "auto",
|
||||
coverImage: !0,
|
||||
overlayText: !1,
|
||||
showSeriesTimerTime: !0,
|
||||
showSeriesTimerChannel: !0,
|
||||
centerText: !0,
|
||||
overlayMoreButton: !0,
|
||||
lines: 3
|
||||
});
|
||||
var elem = context.querySelector("#items");
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem), loading.hide()
|
||||
}
|
||||
|
||||
function reload(context, promise) {
|
||||
loading.show(), promise.then(function(result) {
|
||||
renderTimers(context, result.Items)
|
||||
})
|
||||
}
|
||||
var query = {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending"
|
||||
};
|
||||
return function(view, params, tabContent) {
|
||||
var timersPromise, self = this;
|
||||
self.preRender = function() {
|
||||
timersPromise = ApiClient.getLiveTvSeriesTimers(query)
|
||||
}, self.renderTab = function() {
|
||||
reload(tabContent, timersPromise)
|
||||
}
|
||||
}
|
||||
});
|
|
@ -1,376 +0,0 @@
|
|||
define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getBackdropShape() {
|
||||
if (enableScrollX()) {
|
||||
return "overflowBackdrop";
|
||||
}
|
||||
return "backdrop";
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
if (enableScrollX()) {
|
||||
return "overflowPortrait";
|
||||
}
|
||||
return "portrait";
|
||||
}
|
||||
|
||||
function getLimit() {
|
||||
if (enableScrollX()) {
|
||||
return 12;
|
||||
}
|
||||
return 9;
|
||||
}
|
||||
|
||||
function loadRecommendedPrograms(page) {
|
||||
loading.show();
|
||||
var limit = getLimit();
|
||||
|
||||
if (enableScrollX()) {
|
||||
limit *= 2;
|
||||
}
|
||||
|
||||
ApiClient.getLiveTvRecommendedPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
IsAiring: true,
|
||||
limit: limit,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop",
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "activeProgramItems", "play", {
|
||||
showAirDateTime: false,
|
||||
showAirEndTime: true
|
||||
});
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function reload(page, enableFullRender) {
|
||||
if (enableFullRender) {
|
||||
loadRecommendedPrograms(page);
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsMovie: false,
|
||||
IsSports: false,
|
||||
IsKids: false,
|
||||
IsNews: false,
|
||||
IsSeries: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingEpisodeItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsMovie: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingTvMovieItems", null, {
|
||||
shape: getPortraitShape(),
|
||||
preferThumb: null,
|
||||
showParentTitle: false
|
||||
});
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsSports: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingSportsItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsKids: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingKidsItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsNews: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingNewsItems", null, {
|
||||
showParentTitleOrTitle: true,
|
||||
showTitle: false,
|
||||
showParentTitle: false
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
|
||||
var html = cardBuilder.getCardsHtml(Object.assign({
|
||||
items: items,
|
||||
preferThumb: "auto",
|
||||
inheritThumb: false,
|
||||
shape: enableScrollX() ? "autooverflow" : "auto",
|
||||
defaultShape: getBackdropShape(),
|
||||
showParentTitle: true,
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
coverImage: true,
|
||||
overlayText: false,
|
||||
lazy: true,
|
||||
overlayPlayButton: "play" === overlayButton,
|
||||
overlayMoreButton: "more" === overlayButton,
|
||||
overlayInfoButton: "info" === overlayButton,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
showAirTime: true,
|
||||
showAirDateTime: true
|
||||
}, cardOptions || {}));
|
||||
var elem = page.querySelector("." + sectionClass);
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{ name: globalize.translate("Programs") },
|
||||
{ name: globalize.translate("TabGuide") },
|
||||
{ name: globalize.translate("TabChannels") },
|
||||
{ name: globalize.translate("TabRecordings") },
|
||||
{ name: globalize.translate("HeaderSchedule") },
|
||||
{ name: globalize.translate("TabSeries") },
|
||||
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }
|
||||
];
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
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 getDefaultTabIndex(folderId) {
|
||||
if (userSettings.get("landing-" + folderId) === "guide") {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
function enableFullRender() {
|
||||
return new Date().getTime() - lastFullRender > 3e5;
|
||||
}
|
||||
|
||||
function onBeforeTabChange(evt) {
|
||||
preLoadTab(view, parseInt(evt.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function onTabChange(evt) {
|
||||
var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
|
||||
|
||||
if (previousTabController && previousTabController.onHide) {
|
||||
previousTabController.onHide();
|
||||
}
|
||||
|
||||
loadTab(view, parseInt(evt.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent");
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
|
||||
// TODO int is a little hard to read
|
||||
switch (index) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
depends.push("scripts/livetvguide");
|
||||
break;
|
||||
case 2:
|
||||
depends.push("scripts/livetvchannels");
|
||||
break;
|
||||
case 3:
|
||||
depends.push("scripts/livetvrecordings");
|
||||
break;
|
||||
case 4:
|
||||
depends.push("scripts/livetvschedule");
|
||||
break;
|
||||
case 5:
|
||||
depends.push("scripts/livetvseriestimers");
|
||||
break;
|
||||
case 6:
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
|
||||
require(depends, function (controllerFactory) {
|
||||
var tabContent;
|
||||
|
||||
if (0 == index) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
self.tabContent = tabContent;
|
||||
}
|
||||
|
||||
var controller = tabControllers[index];
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
if (0 === index) {
|
||||
controller = self;
|
||||
} else if (6 === index) {
|
||||
controller = new controllerFactory(view, tabContent, {
|
||||
collectionType: "livetv"
|
||||
});
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
tabControllers[index] = controller;
|
||||
|
||||
if (controller.initTab) {
|
||||
controller.initTab();
|
||||
}
|
||||
}
|
||||
|
||||
callback(controller);
|
||||
});
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function (controller) {
|
||||
if (renderedTabs.indexOf(index) === -1 && controller.preRender) {
|
||||
controller.preRender();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index;
|
||||
getTabController(page, index, function (controller) {
|
||||
initialTabIndex = null;
|
||||
|
||||
if (1 === index) {
|
||||
document.body.classList.add("autoScrollY");
|
||||
} else {
|
||||
document.body.classList.remove("autoScrollY");
|
||||
}
|
||||
|
||||
if (-1 == renderedTabs.indexOf(index)) {
|
||||
if (1 === index) {
|
||||
renderedTabs.push(index);
|
||||
}
|
||||
|
||||
controller.renderTab();
|
||||
} else if (controller.onShow) {
|
||||
controller.onShow();
|
||||
}
|
||||
|
||||
currentTabController = controller;
|
||||
});
|
||||
}
|
||||
|
||||
function onInputCommand(evt) {
|
||||
if (evt.detail.command === "search") {
|
||||
evt.preventDefault();
|
||||
Dashboard.navigate("search.html?collectionType=livetv");
|
||||
}
|
||||
}
|
||||
|
||||
var isViewRestored;
|
||||
var self = this;
|
||||
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv"));
|
||||
var initialTabIndex = currentTabIndex;
|
||||
var lastFullRender = 0;
|
||||
[].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) {
|
||||
var href = link.href;
|
||||
|
||||
if (href) {
|
||||
link.href = href + "&serverId=" + ApiClient.serverId();
|
||||
}
|
||||
});
|
||||
|
||||
self.initTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
var containers = tabContent.querySelectorAll(".itemsContainer");
|
||||
|
||||
for (var i = 0, length = containers.length; i < length; i++) {
|
||||
setScrollClasses(containers[i], enableScrollX());
|
||||
}
|
||||
};
|
||||
|
||||
self.renderTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
|
||||
if (enableFullRender()) {
|
||||
reload(tabContent, true);
|
||||
lastFullRender = new Date().getTime();
|
||||
} else {
|
||||
reload(tabContent);
|
||||
}
|
||||
};
|
||||
|
||||
var currentTabController;
|
||||
var tabControllers = [];
|
||||
var renderedTabs = [];
|
||||
view.addEventListener("viewbeforeshow", function (evt) {
|
||||
isViewRestored = evt.detail.isRestored;
|
||||
initTabs();
|
||||
});
|
||||
view.addEventListener("viewshow", function (evt) {
|
||||
isViewRestored = evt.detail.isRestored;
|
||||
if (!isViewRestored) {
|
||||
mainTabsManager.selectedTabIndex(initialTabIndex);
|
||||
}
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e__u) {
|
||||
if (currentTabController && currentTabController.onHide) {
|
||||
currentTabController.onHide();
|
||||
}
|
||||
document.body.classList.remove("autoScrollY");
|
||||
inputManager.off(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (evt) {
|
||||
tabControllers.forEach(function (tabController) {
|
||||
if (tabController.destroy) {
|
||||
tabController.destroy();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,98 +0,0 @@
|
|||
define(["appSettings", "dom", "connectionManager", "loading", "cardStyle", "emby-checkbox"], function(appSettings, dom, connectionManager, loading) {
|
||||
"use strict";
|
||||
|
||||
function authenticateUserByName(page, apiClient, username, password) {
|
||||
loading.show(), apiClient.authenticateUserByName(username, password).then(function(result) {
|
||||
var newUrl, user = result.User,
|
||||
serverId = getParameterByName("serverid");
|
||||
newUrl = user.Policy.IsAdministrator && !serverId ? "dashboard.html" : "home.html", loading.hide(), Dashboard.onServerChanged(user.Id, result.AccessToken, apiClient), Dashboard.navigate(newUrl)
|
||||
}, function(response) {
|
||||
page.querySelector("#txtManualName").value = "", page.querySelector("#txtManualPassword").value = "", loading.hide(), 401 == response.status ? require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("MessageInvalidUser"))
|
||||
}) : showServerConnectionFailure()
|
||||
})
|
||||
}
|
||||
|
||||
function showServerConnectionFailure() {
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("MessageUnableToConnectToServer"),
|
||||
title: Globalize.translate("HeaderConnectionFailure")
|
||||
})
|
||||
}
|
||||
|
||||
function showManualForm(context, showCancel, focusPassword) {
|
||||
context.querySelector(".chkRememberLogin").checked = appSettings.enableAutoLogin(), context.querySelector(".manualLoginForm").classList.remove("hide"), context.querySelector(".visualLoginForm").classList.add("hide"), focusPassword ? context.querySelector("#txtManualPassword").focus() : context.querySelector("#txtManualName").focus(), showCancel ? context.querySelector(".btnCancel").classList.remove("hide") : context.querySelector(".btnCancel").classList.add("hide")
|
||||
}
|
||||
|
||||
function getRandomMetroColor() {
|
||||
var index = Math.floor(Math.random() * (metroColors.length - 1));
|
||||
return metroColors[index]
|
||||
}
|
||||
|
||||
function getMetroColor(str) {
|
||||
if (str) {
|
||||
for (var character = String(str.substr(0, 1).charCodeAt()), sum = 0, i = 0; i < character.length; i++) sum += parseInt(character.charAt(i));
|
||||
var index = String(sum).substr(-1);
|
||||
return metroColors[index]
|
||||
}
|
||||
return getRandomMetroColor()
|
||||
}
|
||||
|
||||
function loadUserList(context, apiClient, users) {
|
||||
for (var html = "", i = 0, length = users.length; i < length; i++) {
|
||||
var user = users[i];
|
||||
html += '<button type="button" class="card squareCard scalableCard squareCard-scalable"><div class="cardBox cardBox-bottompadded">', html += '<div class="cardScalable">', html += '<div class="cardPadder cardPadder-square"></div>', html += '<div class="cardContent" data-haspw="' + user.HasPassword + '" data-username="' + user.Name + '" data-userid="' + user.Id + '">';
|
||||
var imgUrl;
|
||||
if (user.PrimaryImageTag) imgUrl = apiClient.getUserImageUrl(user.Id, {
|
||||
width: 300,
|
||||
tag: user.PrimaryImageTag,
|
||||
type: "Primary"
|
||||
}), html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');\"></div>";
|
||||
else {
|
||||
var background = getMetroColor(user.Id);
|
||||
imgUrl = "css/images/logindefault.png", html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');background-color:" + background + ';"></div>'
|
||||
}
|
||||
html += "</div>", html += "</div>", html += '<div class="cardFooter visualCardBox-cardFooter">', html += '<div class="cardText singleCardText cardTextCentered">' + user.Name + "</div>", html += "</div>", html += "</div>", html += "</button>"
|
||||
}
|
||||
context.querySelector("#divUsers").innerHTML = html
|
||||
}
|
||||
var metroColors = ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"];
|
||||
return function(view, params) {
|
||||
function getApiClient() {
|
||||
var serverId = params.serverid;
|
||||
return serverId ? connectionManager.getOrCreateApiClient(serverId) : ApiClient
|
||||
}
|
||||
|
||||
function showVisualForm() {
|
||||
view.querySelector(".visualLoginForm").classList.remove("hide"), view.querySelector(".manualLoginForm").classList.add("hide")
|
||||
}
|
||||
view.querySelector("#divUsers").addEventListener("click", function(e) {
|
||||
var card = dom.parentWithClass(e.target, "card"),
|
||||
cardContent = card ? card.querySelector(".cardContent") : null;
|
||||
if (cardContent) {
|
||||
var context = view,
|
||||
id = cardContent.getAttribute("data-userid"),
|
||||
name = cardContent.getAttribute("data-username"),
|
||||
haspw = cardContent.getAttribute("data-haspw");
|
||||
"manual" == id ? (context.querySelector("#txtManualName").value = "", showManualForm(context, !0)) : "false" == haspw ? authenticateUserByName(context, getApiClient(), name, "") : (context.querySelector("#txtManualName").value = name, context.querySelector("#txtManualPassword").value = "", showManualForm(context, !0, !0))
|
||||
}
|
||||
}), view.querySelector(".manualLoginForm").addEventListener("submit", function(e) {
|
||||
appSettings.enableAutoLogin(view.querySelector(".chkRememberLogin").checked);
|
||||
var apiClient = getApiClient();
|
||||
return authenticateUserByName(view, apiClient, view.querySelector("#txtManualName").value, view.querySelector("#txtManualPassword").value), e.preventDefault(), !1
|
||||
}), view.querySelector(".btnForgotPassword").addEventListener("click", function() {
|
||||
Dashboard.navigate("forgotpassword.html")
|
||||
}), view.querySelector(".btnCancel").addEventListener("click", showVisualForm), view.querySelector(".btnManual").addEventListener("click", function() {
|
||||
view.querySelector("#txtManualName").value = "", showManualForm(view, !0)
|
||||
}), view.addEventListener("viewshow", function(e) {
|
||||
loading.show();
|
||||
var apiClient = getApiClient();
|
||||
apiClient.getPublicUsers().then(function(users) {
|
||||
users.length ? users.length && users[0].EnableAutoLogin ? authenticateUserByName(view, apiClient, users[0].Name, "") : (showVisualForm(), loadUserList(view, apiClient, users)) : (view.querySelector("#txtManualName").value = "", showManualForm(view, !1, !1)), loading.hide()
|
||||
});
|
||||
apiClient.getJSON(apiClient.getUrl("Branding/Configuration")).then(function(options) {
|
||||
view.querySelector(".disclaimer").textContent = options.LoginDisclaimer || ""
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,276 +0,0 @@
|
|||
define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "components/categorysyncbuttons", "cardBuilder", "dom", "imageLoader", "playbackManager", "emby-itemscontainer", "emby-tabs", "emby-button"], function(events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, categorysyncbuttons, cardBuilder, dom, imageLoader, playbackManager) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
}
|
||||
|
||||
function loadLatest(page, userId, parentId) {
|
||||
var options = {
|
||||
IncludeItemTypes: "Movie",
|
||||
Limit: 18,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = page.querySelector("#recentlyAddedItems");
|
||||
cardBuilder.buildCards(items, {
|
||||
itemsContainer: container,
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function loadResume(page, userId, parentId) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth,
|
||||
options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Filters: "IsResumable",
|
||||
Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3,
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
CollapseBoxSetItems: !1,
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(userId, options).then(function(result) {
|
||||
result.Items.length ? page.querySelector("#resumableSection").classList.remove("hide") : page.querySelector("#resumableSection").classList.add("hide");
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = page.querySelector("#resumableItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
shape: getThumbShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
cardLayout: !1,
|
||||
showTitle: !0,
|
||||
showYear: !0,
|
||||
centerText: !0
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getRecommendationHtml(recommendation) {
|
||||
var html = "",
|
||||
title = "";
|
||||
switch (recommendation.RecommendationType) {
|
||||
case "SimilarToRecentlyPlayed":
|
||||
title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
case "SimilarToLikedItem":
|
||||
title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
case "HasDirectorFromRecentlyPlayed":
|
||||
case "HasLikedDirector":
|
||||
title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName);
|
||||
break;
|
||||
case "HasActorFromRecentlyPlayed":
|
||||
case "HasLikedActor":
|
||||
title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName)
|
||||
}
|
||||
html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + "</h2>";
|
||||
var allowBottomPadding = !0;
|
||||
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, {
|
||||
shape: getPortraitShape(),
|
||||
scalable: !0,
|
||||
overlayPlayButton: !0,
|
||||
allowBottomPadding: allowBottomPadding
|
||||
}), html += "</div>", html += "</div>"
|
||||
}
|
||||
|
||||
function loadSuggestions(page, userId, parentId) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth,
|
||||
url = ApiClient.getUrl("Movies/Recommendations", {
|
||||
userId: userId,
|
||||
categoryLimit: 6,
|
||||
ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
|
||||
});
|
||||
ApiClient.getJSON(url).then(function(recommendations) {
|
||||
if (!recommendations.length) return page.querySelector(".noItemsMessage").classList.remove("hide"), void(page.querySelector(".recommendations").innerHTML = "");
|
||||
var html = recommendations.map(getRecommendationHtml).join("");
|
||||
page.querySelector(".noItemsMessage").classList.add("hide");
|
||||
var recs = page.querySelector(".recommendations");
|
||||
recs.innerHTML = html, imageLoader.lazyChildren(recs)
|
||||
})
|
||||
}
|
||||
|
||||
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"))
|
||||
}
|
||||
|
||||
function initSuggestedTab(page, tabContent) {
|
||||
for (var containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
|
||||
}
|
||||
|
||||
function loadSuggestionsTab(view, params, tabContent) {
|
||||
var parentId = params.topParentId,
|
||||
userId = ApiClient.getCurrentUserId();
|
||||
console.log("loadSuggestionsTab"), loadResume(tabContent, userId, parentId), loadLatest(tabContent, userId, parentId), loadSuggestions(tabContent, userId, parentId)
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
name: Globalize.translate("Movies")
|
||||
}, {
|
||||
name: Globalize.translate("TabSuggestions")
|
||||
}, {
|
||||
name: Globalize.translate("TabTrailers")
|
||||
}, {
|
||||
name: Globalize.translate("TabFavorites")
|
||||
}, {
|
||||
name: Globalize.translate("TabCollections")
|
||||
}, {
|
||||
name: Globalize.translate("TabGenres")
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "suggestions":
|
||||
return 1;
|
||||
case "favorites":
|
||||
return 3;
|
||||
case "collections":
|
||||
return 4;
|
||||
case "genres":
|
||||
return 5;
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
var newIndex = parseInt(e.detail.selectedTabIndex);
|
||||
loadTab(view, newIndex)
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
switch (index) {
|
||||
case 0:
|
||||
depends.push("scripts/movies");
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
depends.push("scripts/movietrailers");
|
||||
break;
|
||||
case 3:
|
||||
depends.push("scripts/movies");
|
||||
break;
|
||||
case 4:
|
||||
depends.push("scripts/moviecollections");
|
||||
break;
|
||||
case 5:
|
||||
depends.push("scripts/moviegenres");
|
||||
break;
|
||||
case 6:
|
||||
depends.push("scripts/searchtab")
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
var tabContent;
|
||||
index === suggestionsTabIndex && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = index === suggestionsTabIndex ? self : 6 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "movies",
|
||||
parentId: params.topParentId
|
||||
}) : 0 === index || 3 === index ? new controllerFactory(view, params, tabContent, {
|
||||
mode: index ? "favorites" : "movies"
|
||||
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
}
|
||||
|
||||
function onPlaybackStop(e, state) {
|
||||
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId)
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex,
|
||||
suggestionsTabIndex = 1;
|
||||
self.initTab = function() {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
|
||||
categorysyncbuttons.init(tabContent), initSuggestedTab(view, tabContent)
|
||||
}, self.renderTab = function() {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='" + suggestionsTabIndex + "']");
|
||||
loadSuggestionsTab(view, params, tabContent)
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
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("TabMovies")), libraryMenu.setTitle(Globalize.translate("TabMovies")))
|
||||
}
|
||||
events.on(playbackManager, "playbackstop", onPlaybackStop), inputManager.on(window, onInputCommand)
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
inputManager.off(window, onInputCommand)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,279 +0,0 @@
|
|||
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";
|
||||
|
||||
function itemsPerRow() {
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
return screenWidth >= 1920 ? 9 : screenWidth >= 1200 ? 12 : screenWidth >= 1e3 ? 10 : 8
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
}
|
||||
|
||||
function getSquareShape() {
|
||||
return enableScrollX() ? "overflowSquare" : "square"
|
||||
}
|
||||
|
||||
function loadLatest(page, parentId) {
|
||||
loading.show();
|
||||
var userId = ApiClient.getCurrentUserId(),
|
||||
options = {
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(),
|
||||
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function(items) {
|
||||
var elem = page.querySelector("#recentlyAddedSongs"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, elem.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
showUnplayedIndicator: !1,
|
||||
showLatestItemsPopup: !1,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
lazy: !0,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayPlayButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
vibrant: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(elem), loading.hide()
|
||||
})
|
||||
}
|
||||
|
||||
function loadRecentlyPlayed(page, parentId) {
|
||||
var options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: itemsPerRow(),
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,AudioInfo",
|
||||
Filters: "IsPlayed",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
var elem = page.querySelector("#recentlyPlayed");
|
||||
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
var itemsContainer = elem.querySelector(".itemsContainer"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
showUnplayedIndicator: !1,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
action: "instantmix",
|
||||
lazy: !0,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayMoreButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
vibrant: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(itemsContainer)
|
||||
})
|
||||
}
|
||||
|
||||
function loadFrequentlyPlayed(page, parentId) {
|
||||
var options = {
|
||||
SortBy: "PlayCount",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Audio",
|
||||
Limit: itemsPerRow(),
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,AudioInfo",
|
||||
Filters: "IsPlayed",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
var elem = page.querySelector("#topPlayed");
|
||||
result.Items.length ? elem.classList.remove("hide") : elem.classList.add("hide");
|
||||
var itemsContainer = elem.querySelector(".itemsContainer"),
|
||||
supportsImageAnalysis = appHost.supports("imageanalysis");
|
||||
supportsImageAnalysis = !1, itemsContainer.innerHTML = cardBuilder.getCardsHtml({
|
||||
items: result.Items,
|
||||
showUnplayedIndicator: !1,
|
||||
shape: getSquareShape(),
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
action: "instantmix",
|
||||
lazy: !0,
|
||||
centerText: !supportsImageAnalysis,
|
||||
overlayMoreButton: !supportsImageAnalysis,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
cardLayout: supportsImageAnalysis,
|
||||
vibrant: supportsImageAnalysis,
|
||||
coverImage: !0
|
||||
}), imageLoader.lazyChildren(itemsContainer)
|
||||
})
|
||||
}
|
||||
|
||||
function loadSuggestionsTab(page, tabContent, parentId) {
|
||||
console.log("loadSuggestionsTab"), 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() {
|
||||
return [{
|
||||
name: Globalize.translate("TabSuggestions")
|
||||
}, {
|
||||
name: Globalize.translate("TabAlbums")
|
||||
}, {
|
||||
name: Globalize.translate("TabAlbumArtists")
|
||||
}, {
|
||||
name: Globalize.translate("TabArtists")
|
||||
}, {
|
||||
name: Globalize.translate("TabPlaylists")
|
||||
}, {
|
||||
name: Globalize.translate("TabSongs")
|
||||
}, {
|
||||
name: Globalize.translate("TabGenres")
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "albums":
|
||||
return 1;
|
||||
case "albumartists":
|
||||
return 2;
|
||||
case "artists":
|
||||
return 3;
|
||||
case "playlists":
|
||||
return 4;
|
||||
case "songs":
|
||||
return 5;
|
||||
case "genres":
|
||||
return 6;
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
return function(view, params) {
|
||||
function reload() {
|
||||
loading.show();
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
loadSuggestionsTab(view, tabContent, params.topParentId)
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return browser.mobile
|
||||
}
|
||||
|
||||
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"))
|
||||
}
|
||||
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
loadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
switch (index) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
depends.push("scripts/musicalbums");
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
depends.push("scripts/musicartists");
|
||||
break;
|
||||
case 4:
|
||||
depends.push("scripts/musicplaylists");
|
||||
break;
|
||||
case 5:
|
||||
depends.push("scripts/songs");
|
||||
break;
|
||||
case 6:
|
||||
depends.push("scripts/musicgenres");
|
||||
break;
|
||||
case 7:
|
||||
depends.push("scripts/searchtab")
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
var tabContent;
|
||||
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "music",
|
||||
parentId: params.topParentId
|
||||
}) : new controllerFactory(view, params, tabContent), 2 == index ? controller.mode = "albumartists" : 3 == index && (controller.mode = "artists"), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId)
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex;
|
||||
self.initTab = function() {
|
||||
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())
|
||||
}, self.renderTab = function() {
|
||||
reload()
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
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)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,43 +0,0 @@
|
|||
define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], function(appHost, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
return function(view, params) {
|
||||
view.querySelector(".btnLogout").addEventListener("click", function() {
|
||||
Dashboard.logout();
|
||||
});
|
||||
|
||||
view.addEventListener("viewshow", function() {
|
||||
var page = this;
|
||||
var userId = params.userId || Dashboard.getCurrentUserId();
|
||||
|
||||
page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId);
|
||||
page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId);
|
||||
page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
|
||||
page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId);
|
||||
page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId);
|
||||
|
||||
if (appHost.supports("multiserver")) {
|
||||
page.querySelector(".selectServer").classList.remove("hide")
|
||||
} else {
|
||||
page.querySelector(".selectServer").classList.add("hide");
|
||||
}
|
||||
|
||||
connectionManager.user(ApiClient).then(function(user) {
|
||||
if (user.localUser && !user.localUser.EnableAutoLogin) {
|
||||
view.querySelector(".btnLogout").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".btnLogout").classList.add("hide");
|
||||
}
|
||||
});
|
||||
|
||||
Dashboard.getCurrentUser().then(function(user) {
|
||||
page.querySelector(".headerUser").innerHTML = user.Name;
|
||||
if (user.Policy.IsAdministrator) {
|
||||
page.querySelector(".adminSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".adminSection").classList.add("hide");
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,28 +0,0 @@
|
|||
define(["displaySettings", "userSettingsBuilder", "userSettings"], function(DisplaySettings, userSettingsBuilder, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
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;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new DisplaySettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
window.removeEventListener("beforeunload", onBeforeUnload), hasChanges = !1, settingsInstance && settingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,26 +0,0 @@
|
|||
define(["homescreenSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(HomescreenSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
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;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), homescreenSettingsInstance ? homescreenSettingsInstance.loadData() : homescreenSettingsInstance = new HomescreenSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".homeScreenSettingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, homescreenSettingsInstance && homescreenSettingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
homescreenSettingsInstance && (homescreenSettingsInstance.destroy(), homescreenSettingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,26 +0,0 @@
|
|||
define(["playbackSettings", "userSettingsBuilder", "dom", "globalize", "loading", "userSettings", "listViewStyle"], function(PlaybackSettings, userSettingsBuilder, dom, globalize, loading, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
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;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), settingsInstance ? settingsInstance.loadData() : settingsInstance = new PlaybackSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, settingsInstance && settingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
settingsInstance && (settingsInstance.destroy(), settingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,26 +0,0 @@
|
|||
define(["subtitleSettings", "userSettingsBuilder", "userSettings"], function(SubtitleSettings, userSettingsBuilder, currentUserSettings) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
function onBeforeUnload(e) {
|
||||
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;
|
||||
view.addEventListener("viewshow", function() {
|
||||
window.addEventListener("beforeunload", onBeforeUnload), subtitleSettingsInstance ? subtitleSettingsInstance.loadData() : subtitleSettingsInstance = new SubtitleSettings({
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: userId,
|
||||
element: view.querySelector(".settingsContainer"),
|
||||
userSettings: userSettings,
|
||||
enableSaveButton: !1,
|
||||
enableSaveConfirmation: !1
|
||||
})
|
||||
}), view.addEventListener("change", function() {
|
||||
hasChanges = !0
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
hasChanges = !1, subtitleSettingsInstance && subtitleSettingsInstance.submit()
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
subtitleSettingsInstance && (subtitleSettingsInstance.destroy(), subtitleSettingsInstance = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,145 +0,0 @@
|
|||
define(["scripts/userpasswordpage", "loading", "libraryMenu", "apphost", "emby-linkbutton"], function (Userpasswordpage, loading, libraryMenu, appHost) {
|
||||
"use strict";
|
||||
|
||||
function reloadUser(page) {
|
||||
var userId = getParameterByName("userId");
|
||||
loading.show();
|
||||
ApiClient.getUser(userId).then(function (user) {
|
||||
page.querySelector(".username").innerHTML = user.Name;
|
||||
var uploadUserImage = page.querySelector("#uploadUserImage");
|
||||
uploadUserImage.value = "";
|
||||
uploadUserImage.dispatchEvent(new CustomEvent("change", {}));
|
||||
libraryMenu.setTitle(user.Name);
|
||||
var imageUrl = "css/images/logindefault.png";
|
||||
if (user.PrimaryImageTag) {
|
||||
imageUrl = ApiClient.getUserImageUrl(user.Id, {
|
||||
height: 200,
|
||||
tag: user.PrimaryImageTag,
|
||||
type: "Primary"
|
||||
});
|
||||
}
|
||||
var fldImage = page.querySelector("#fldImage");
|
||||
fldImage.classList.remove("hide");
|
||||
fldImage.innerHTML = "<img width='140px' src='" + imageUrl + "' />";
|
||||
Dashboard.getCurrentUser().then(function (loggedInUser) {
|
||||
if (appHost.supports("fileinput") && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
|
||||
page.querySelector(".newImageForm").classList.remove("hide");
|
||||
|
||||
if (user.PrimaryImageTag) {
|
||||
page.querySelector("#btnDeleteImage").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector("#btnDeleteImage").classList.add("hide");
|
||||
}
|
||||
} else {
|
||||
page.querySelector(".newImageForm").classList.add("hide");
|
||||
page.querySelector("#btnDeleteImage").classList.add("hide");
|
||||
}
|
||||
});
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function onFileReaderError(evt) {
|
||||
loading.hide();
|
||||
switch (evt.target.error.code) {
|
||||
case evt.target.error.NOT_FOUND_ERR:
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("FileNotFound"));
|
||||
});
|
||||
break;
|
||||
case evt.target.error.NOT_READABLE_ERR:
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("FileReadError"));
|
||||
});
|
||||
break;
|
||||
case evt.target.error.ABORT_ERR:
|
||||
break;
|
||||
default:
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("FileReadError"));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function onFileReaderAbort(evt) {
|
||||
loading.hide();
|
||||
|
||||
require(["toast"], function (toast) {
|
||||
toast(Globalize.translate("FileReadCancelled"));
|
||||
});
|
||||
}
|
||||
|
||||
function setFiles(page, files) {
|
||||
var file = files[0];
|
||||
|
||||
if (!file || !file.type.match("image.*")) {
|
||||
page.querySelector("#userImageOutput").innerHTML = "";
|
||||
page.querySelector("#fldUpload").classList.add("hide");
|
||||
return void (currentFile = null);
|
||||
}
|
||||
|
||||
currentFile = file;
|
||||
var reader = new FileReader();
|
||||
reader.onerror = onFileReaderError;
|
||||
|
||||
reader.onloadstart = function () {
|
||||
page.querySelector("#fldUpload").classList.add("hide");
|
||||
};
|
||||
|
||||
reader.onabort = onFileReaderAbort;
|
||||
|
||||
reader.onload = function (evt) {
|
||||
var html = ['<img style="max-width:100%;max-height:100%;" src="', evt.target.result, '" title="', escape(file.name), '"/>'].join("");
|
||||
page.querySelector("#userImageOutput").innerHTML = html;
|
||||
page.querySelector("#fldUpload").classList.remove("hide");
|
||||
};
|
||||
|
||||
reader.readAsDataURL(file);
|
||||
}
|
||||
|
||||
function onImageDragOver(evt) {
|
||||
evt.preventDefault();
|
||||
evt.originalEvent.dataTransfer.dropEffect = "Copy";
|
||||
return false;
|
||||
}
|
||||
|
||||
var currentFile;
|
||||
return function (view, params) {
|
||||
reloadUser(view);
|
||||
new Userpasswordpage(view, params);
|
||||
view.querySelector("#userImageDropZone").addEventListener("dragOver", onImageDragOver);
|
||||
view.querySelector("#btnDeleteImage").addEventListener("click", function () {
|
||||
require(["confirm"], function (confirm) {
|
||||
confirm(Globalize.translate("DeleteImageConfirmation"), Globalize.translate("DeleteImage")).then(function () {
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId");
|
||||
ApiClient.deleteUserImage(userId, "primary").then(function () {
|
||||
loading.hide();
|
||||
reloadUser(view);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
view.querySelector(".btnBrowse").addEventListener("click", function () {
|
||||
view.querySelector("#uploadUserImage").click();
|
||||
});
|
||||
view.querySelector(".newImageForm").addEventListener("submit", function (evt) {
|
||||
var file = currentFile;
|
||||
if (!file || "image/png" != file.type && "image/jpeg" != file.type && "image/jpeg" != file.type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
loading.show();
|
||||
var userId = getParameterByName("userId");
|
||||
ApiClient.uploadUserImage(userId, "Primary", file).then(function () {
|
||||
loading.hide();
|
||||
reloadUser(view);
|
||||
});
|
||||
evt.preventDefault();
|
||||
return false;
|
||||
});
|
||||
view.querySelector("#uploadUserImage").addEventListener("change", function (evt) {
|
||||
setFiles(view, evt.target.files);
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,60 +0,0 @@
|
|||
define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-linkbutton"], function(loading, libraryMenu, globalize) {
|
||||
"use strict";
|
||||
|
||||
function reload(page) {
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")).then(function(list) {
|
||||
var html = "";
|
||||
var lastCategory = "";
|
||||
var showHelp = true;
|
||||
html += list.map(function(notification) {
|
||||
var itemHtml = "";
|
||||
if (notification.Category !== lastCategory) {
|
||||
lastCategory = notification.Category;
|
||||
if (lastCategory) {
|
||||
itemHtml += "</div>";
|
||||
itemHtml += "</div>";
|
||||
}
|
||||
itemHtml += '<div class="verticalSection verticalSection-extrabottompadding">';
|
||||
itemHtml += '<div class="sectionTitleContainer" style="margin-bottom:1em;">';
|
||||
itemHtml += '<h2 class="sectionTitle">';
|
||||
itemHtml += notification.Category;
|
||||
itemHtml += "</h2>";
|
||||
if (showHelp) {
|
||||
showHelp = false;
|
||||
itemHtml += '<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Notifications">';
|
||||
itemHtml += globalize.translate("Help");
|
||||
itemHtml += "</a>";
|
||||
}
|
||||
itemHtml += "</div>";
|
||||
itemHtml += '<div class="paperList">';
|
||||
}
|
||||
itemHtml += '<a class="listItem listItem-border" is="emby-linkbutton" data-ripple="false" href="notificationsetting.html?type=' + notification.Type + '">';
|
||||
if (notification.Enabled) {
|
||||
itemHtml += '<i class="listItemIcon md-icon">notifications_active</i>';
|
||||
} else {
|
||||
itemHtml += '<i class="listItemIcon md-icon" style="background-color:#999;">notifications_off</i>';
|
||||
}
|
||||
itemHtml += '<div class="listItemBody">';
|
||||
itemHtml += '<div class="listItemBodyText">' + notification.Name + "</div>";
|
||||
itemHtml += "</div>";
|
||||
itemHtml += '<button type="button" is="paper-icon-button-light"><i class="md-icon">mode_edit</i></button>';
|
||||
itemHtml += "</a>";
|
||||
return itemHtml;
|
||||
}).join("");
|
||||
|
||||
if (list.length) {
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
page.querySelector(".notificationList").innerHTML = html;
|
||||
loading.hide();
|
||||
})
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
view.addEventListener("viewshow", function() {
|
||||
reload(view);
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,11 +0,0 @@
|
|||
define(["components/remotecontrol", "libraryMenu", "emby-button"], function(remotecontrolFactory, libraryMenu) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
var remoteControl = new remotecontrolFactory;
|
||||
remoteControl.init(view, view.querySelector(".remoteControlContent")), view.addEventListener("viewshow", function(e) {
|
||||
libraryMenu.setTransparentMenu(!0), remoteControl && remoteControl.onShow()
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
libraryMenu.setTransparentMenu(!1), remoteControl && remoteControl.destroy()
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,176 +0,0 @@
|
|||
define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) {
|
||||
"use strict";
|
||||
|
||||
function reloadList(page) {
|
||||
loading.show();
|
||||
var promise1 = ApiClient.getAvailablePlugins(query);
|
||||
var promise2 = ApiClient.getInstalledPlugins();
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
populateList({
|
||||
catalogElement: page.querySelector("#pluginTiles"),
|
||||
noItemsElement: page.querySelector("#noPlugins"),
|
||||
availablePlugins: responses[0],
|
||||
installedPlugins: responses[1]
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getHeaderText(category) {
|
||||
category = category.replace(" ", "");
|
||||
if ("Channel" === category) {
|
||||
category = "Channels";
|
||||
} else if ("Theme" === category) {
|
||||
category = "Themes";
|
||||
} else if ("LiveTV" === category) {
|
||||
category = "HeaderLiveTV";
|
||||
} else if ("ScreenSaver" === category) {
|
||||
category = "HeaderScreenSavers";
|
||||
}
|
||||
|
||||
return globalize.translate(category);
|
||||
}
|
||||
|
||||
function populateList(options) {
|
||||
var availablePlugins = options.availablePlugins;
|
||||
var installedPlugins = options.installedPlugins;
|
||||
var allPlugins = availablePlugins.filter(function (plugin) {
|
||||
plugin.category = plugin.category || "General";
|
||||
plugin.categoryDisplayName = getHeaderText(plugin.category);
|
||||
|
||||
if (!options.categories || -1 != options.categories.indexOf(plugin.category)) {
|
||||
if (!options.targetSystem || plugin.targetSystem == options.targetSystem) {
|
||||
return "UserInstalled" == plugin.type;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
availablePlugins = allPlugins.sort(function (a, b) {
|
||||
if (a.category > b.category) {
|
||||
return 1;
|
||||
} else if (b.category > a.category) {
|
||||
return -1;
|
||||
}
|
||||
if (a.name > b.name) {
|
||||
return 1;
|
||||
} else if (b.name > a.name) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
var length;
|
||||
var plugin;
|
||||
var currentCategory;
|
||||
var html = "";
|
||||
|
||||
var hasOpenTag = false;
|
||||
currentCategory = null;
|
||||
if (options.showCategory === false) {
|
||||
html += '<div class="itemsContainer vertical-wrap">';
|
||||
hasOpenTag = true;
|
||||
}
|
||||
for (var i = 0; i < availablePlugins.length; i++) {
|
||||
plugin = availablePlugins[i];
|
||||
var category = plugin.categoryDisplayName;
|
||||
|
||||
if (category != currentCategory) {
|
||||
if (false !== options.showCategory) {
|
||||
if (currentCategory) {
|
||||
hasOpenTag = false;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">' + category + "</h2>";
|
||||
html += '<div class="itemsContainer vertical-wrap">';
|
||||
hasOpenTag = true;
|
||||
}
|
||||
currentCategory = category;
|
||||
}
|
||||
html += getPluginHtml(plugin, options, installedPlugins);
|
||||
}
|
||||
|
||||
if (hasOpenTag) {
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
if (!availablePlugins.length && options.noItemsElement) {
|
||||
options.noItemsElement.classList.add("hide");
|
||||
}
|
||||
|
||||
options.catalogElement.innerHTML = html;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function getPluginHtml(plugin, options, installedPlugins) {
|
||||
var html = "";
|
||||
var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid;
|
||||
|
||||
if (options.context) {
|
||||
href += "&context=" + options.context;
|
||||
}
|
||||
|
||||
var target = plugin.externalUrl ? ' target="_blank"' : "";
|
||||
html += "<div class='card backdropCard'>";
|
||||
html += '<div class="cardBox visualCardBox">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
html += '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + href + '"' + target + ">";
|
||||
|
||||
if (plugin.thumbImage) {
|
||||
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.thumbImage + "');\">";
|
||||
html += "</div>";
|
||||
} else {
|
||||
html += '<i class="cardImageIcon md-icon"></i>';
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
html += '<div class="cardFooter">';
|
||||
html += "<div class='cardText'>";
|
||||
html += plugin.name;
|
||||
html += "</div>";
|
||||
var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) {
|
||||
return ip.Id == plugin.guid;
|
||||
})[0];
|
||||
html += "<div class='cardText cardText-secondary'>";
|
||||
html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " ";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
href: "plugins.html",
|
||||
name: globalize.translate("TabMyPlugins")
|
||||
}, {
|
||||
href: "plugincatalog.html",
|
||||
name: globalize.translate("TabCatalog")
|
||||
}];
|
||||
}
|
||||
|
||||
var query = {
|
||||
TargetSystems: "Server",
|
||||
IsAppStoreSafe: true,
|
||||
IsAdult: false
|
||||
};
|
||||
|
||||
window.PluginCatalog = {
|
||||
renderCatalog: populateList
|
||||
};
|
||||
|
||||
return function (view, params) {
|
||||
view.querySelector("#selectSystem").addEventListener("change", function () {
|
||||
query.TargetSystems = this.value;
|
||||
reloadList(view);
|
||||
});
|
||||
view.addEventListener("viewshow", function () {
|
||||
libraryMenu.setTabs("plugins", 1, getTabs);
|
||||
reloadList(this);
|
||||
});
|
||||
};
|
||||
});
|
434
src/scripts/routes.js
Normal file
434
src/scripts/routes.js
Normal file
|
@ -0,0 +1,434 @@
|
|||
define([
|
||||
"emby-button",
|
||||
"emby-input",
|
||||
"scripts/livetvcomponents",
|
||||
"paper-icon-button-light",
|
||||
"emby-itemscontainer",
|
||||
"emby-collapse",
|
||||
"emby-select",
|
||||
"livetvcss",
|
||||
"emby-checkbox",
|
||||
"emby-slider",
|
||||
"listViewStyle",
|
||||
"dashboardcss"], function () {
|
||||
|
||||
function defineRoute(newRoute) {
|
||||
var path = newRoute.path;
|
||||
console.log("Defining route: " + path);
|
||||
newRoute.dictionary = "core";
|
||||
Emby.Page.addRoute(path, newRoute);
|
||||
}
|
||||
|
||||
console.log("Defining core routes");
|
||||
|
||||
defineRoute({
|
||||
path: "/addplugin.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "addpluginpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/autoorganizelog.html",
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/channelsettings.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/addserver.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
startup: true,
|
||||
controller: "addserver"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dashboard.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "dashboardpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dashboardgeneral.html",
|
||||
controller: "dashboardgeneral",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dashboardhosting.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "dashboardhosting"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/devices/devices.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "devices"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/devices/device.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "device"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dlnaprofile.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dlnaprofiles.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/dlnasettings.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/edititemmetadata.html",
|
||||
controller: "edititemmetadata",
|
||||
autoFocus: false
|
||||
});
|
||||
defineRoute({
|
||||
path: "/encodingsettings.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/forgotpassword.html",
|
||||
anonymous: true,
|
||||
startup: true,
|
||||
controller: "forgotpassword"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/forgotpasswordpin.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
startup: true,
|
||||
controller: "forgotpasswordpin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/home.html",
|
||||
autoFocus: false,
|
||||
controller: "home",
|
||||
transition: "fade",
|
||||
type: "home"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/list/list.html",
|
||||
autoFocus: false,
|
||||
controller: "list",
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/index.html",
|
||||
autoFocus: false,
|
||||
isDefaultRoute: true
|
||||
});
|
||||
defineRoute({
|
||||
path: "/itemdetails.html",
|
||||
controller: "itemdetailpage",
|
||||
autoFocus: false,
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/library.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/librarydisplay.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "librarydisplay"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/librarysettings.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "librarysettings"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetv.html",
|
||||
controller: "livetvsuggested",
|
||||
autoFocus: false,
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetvguideprovider.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetvseriestimer.html",
|
||||
autoFocus: false,
|
||||
controller: "livetvseriestimer"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetvsettings.html",
|
||||
autoFocus: false
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetvstatus.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/livetvtuner.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "livetvtuner"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/log.html",
|
||||
roles: "admin",
|
||||
controller: "logpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/login.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
startup: true,
|
||||
controller: "loginpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/metadataadvanced.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/metadataimages.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/metadatanfo.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/movies.html",
|
||||
autoFocus: false,
|
||||
controller: "moviesrecommended",
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/music.html",
|
||||
controller: "musicrecommended",
|
||||
autoFocus: false,
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/mypreferencesdisplay.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "mypreferencesdisplay"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/mypreferenceshome.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "mypreferenceshome"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/mypreferencessubtitles.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "mypreferencessubtitles"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/mypreferenceslanguages.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "mypreferenceslanguages"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/mypreferencesmenu.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "mypreferencescommon"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/myprofile.html",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
controller: "myprofile"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/notificationsetting.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/notificationsettings.html",
|
||||
controller: "notificationsettings",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/nowplaying.html",
|
||||
controller: "nowplayingpage",
|
||||
autoFocus: false,
|
||||
transition: "fade",
|
||||
fullscreen: true,
|
||||
supportsThemeMedia: true,
|
||||
enableMediaControl: false
|
||||
});
|
||||
defineRoute({
|
||||
path: "/playbackconfiguration.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/plugincatalog.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "plugincatalogpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/plugins.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/scheduledtask.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "scheduledtaskpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/scheduledtasks.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "scheduledtaskspage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/search.html",
|
||||
controller: "searchpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/selectserver.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
startup: true,
|
||||
controller: "selectserver"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/serveractivity.html",
|
||||
autoFocus: false,
|
||||
roles: "admin",
|
||||
controller: "serveractivity"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/serversecurity.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/streamingsettings.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/support.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/tv.html",
|
||||
autoFocus: false,
|
||||
controller: "tvrecommended",
|
||||
transition: "fade"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/useredit.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/userlibraryaccess.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/usernew.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/userparentalcontrol.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/userpassword.html",
|
||||
autoFocus: false,
|
||||
controller: "userpasswordpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/userprofiles.html",
|
||||
autoFocus: false,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizardremoteaccess.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: "wizardremoteaccess"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizardfinish.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: "wizardfinishpage"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizardlibrary.html",
|
||||
autoFocus: false,
|
||||
anonymous: true
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizardsettings.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: "wizardsettings"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizardstart.html",
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: "wizardstart"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/wizarduser.html",
|
||||
controller: "wizarduserpage",
|
||||
autoFocus: false,
|
||||
anonymous: true
|
||||
});
|
||||
defineRoute({
|
||||
path: "/videoosd.html",
|
||||
transition: "fade",
|
||||
controller: "videoosd",
|
||||
autoFocus: false,
|
||||
type: "video-osd",
|
||||
supportsThemeMedia: true,
|
||||
fullscreen: true,
|
||||
enableMediaControl: false
|
||||
});
|
||||
defineRoute({
|
||||
path: "/configurationpage",
|
||||
autoFocus: false,
|
||||
enableCache: false,
|
||||
enableContentQueryString: true,
|
||||
roles: "admin"
|
||||
});
|
||||
defineRoute({
|
||||
path: "/",
|
||||
isDefaultRoute: true,
|
||||
autoFocus: false,
|
||||
});
|
||||
});
|
|
@ -1,111 +0,0 @@
|
|||
define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function($, loading, datetime, dom, globalize) {
|
||||
"use strict";
|
||||
|
||||
function fillTimeOfDay(select) {
|
||||
for (var options = [], i = 0; i < 864e5; i += 9e5) options.push({
|
||||
name: ScheduledTaskPage.getDisplayTime(1e4 * i),
|
||||
value: 1e4 * i
|
||||
});
|
||||
select.innerHTML = options.map(function(o) {
|
||||
return '<option value="' + o.value + '">' + o.name + "</option>"
|
||||
}).join("")
|
||||
}
|
||||
Array.prototype.remove = function(from, to) {
|
||||
var rest = this.slice((to || from) + 1 || this.length);
|
||||
return this.length = from < 0 ? this.length + from : from, this.push.apply(this, rest)
|
||||
};
|
||||
var ScheduledTaskPage = {
|
||||
refreshScheduledTask: function(view) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
ScheduledTaskPage.loadScheduledTask(view, task)
|
||||
})
|
||||
},
|
||||
loadScheduledTask: function(view, task) {
|
||||
$(".taskName", view).html(task.Name), $("#pTaskDescription", view).html(task.Description), require(["listViewStyle"], function() {
|
||||
ScheduledTaskPage.loadTaskTriggers(view, task)
|
||||
}), loading.hide()
|
||||
},
|
||||
loadTaskTriggers: function(context, task) {
|
||||
var html = "";
|
||||
html += '<div class="paperList">';
|
||||
for (var i = 0, length = task.Triggers.length; i < length; 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="listItemBodyText secondary">';
|
||||
var hours = trigger.MaxRuntimeTicks / 36e9;
|
||||
html += 1 == hours ? globalize.translate("ValueTimeLimitSingleHour") : 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>", context.querySelector(".taskTriggers").innerHTML = html
|
||||
},
|
||||
getTriggerFriendlyName: function(trigger) {
|
||||
if ("DailyTrigger" == trigger.Type) return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks);
|
||||
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 ("IntervalTrigger" == trigger.Type) {
|
||||
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"
|
||||
}
|
||||
return "StartupTrigger" == trigger.Type ? "On application startup" : trigger.Type
|
||||
},
|
||||
getDisplayTime: function(ticks) {
|
||||
var ms = ticks / 1e4,
|
||||
now = new Date;
|
||||
return now.setHours(0, 0, 0, 0), now.setTime(now.getTime() + ms), datetime.getDisplayTime(now)
|
||||
},
|
||||
showAddTriggerPopup: function(view) {
|
||||
$("#selectTriggerType", view).val("DailyTrigger"), view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})), $("#popupAddTrigger", view).removeClass("hide")
|
||||
},
|
||||
confirmDeleteTrigger: function(view, index) {
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function() {
|
||||
ScheduledTaskPage.deleteTrigger(view, index)
|
||||
})
|
||||
})
|
||||
},
|
||||
deleteTrigger: function(view, index) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
task.Triggers.remove(index), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
|
||||
ScheduledTaskPage.refreshScheduledTask(view)
|
||||
})
|
||||
})
|
||||
},
|
||||
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"))
|
||||
},
|
||||
getTriggerToAdd: function(page) {
|
||||
var trigger = {
|
||||
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());
|
||||
var timeLimit = $("#txtTimeLimit", page).val() || "0";
|
||||
return timeLimit = 36e5 * parseFloat(timeLimit), trigger.MaxRuntimeMs = timeLimit || null, trigger
|
||||
}
|
||||
};
|
||||
return function(view, params) {
|
||||
function onSubmit(e) {
|
||||
loading.show();
|
||||
var id = getParameterByName("id");
|
||||
ApiClient.getScheduledTask(id).then(function(task) {
|
||||
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)), ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function() {
|
||||
$("#popupAddTrigger").addClass("hide"), 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(".btnAddTrigger").addEventListener("click", function() {
|
||||
ScheduledTaskPage.showAddTriggerPopup(view)
|
||||
}), view.addEventListener("click", function(e) {
|
||||
var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger");
|
||||
btnDeleteTrigger && ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index")))
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
ScheduledTaskPage.refreshScheduledTask(view)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,99 +0,0 @@
|
|||
define(["jQuery", "loading", "events", "globalize", "serverNotifications", "humanedate", "listViewStyle", "emby-linkbutton"], function($, loading, events, globalize, serverNotifications) {
|
||||
"use strict";
|
||||
|
||||
function reloadList(page) {
|
||||
ApiClient.getScheduledTasks({
|
||||
isHidden: !1
|
||||
}).then(function(tasks) {
|
||||
populateList(page, tasks), loading.hide()
|
||||
})
|
||||
}
|
||||
|
||||
function populateList(page, tasks) {
|
||||
tasks = tasks.sort(function(a, b) {
|
||||
return a = a.Category + " " + a.Name, b = b.Category + " " + b.Name, a == b ? 0 : a < b ? -1 : 1
|
||||
});
|
||||
for (var currentCategory, html = "", i = 0, length = tasks.length; i < length; i++) {
|
||||
var task = tasks[i];
|
||||
task.Category != currentCategory && (currentCategory = task.Category, currentCategory && (html += "</div>", html += "</div>"), html += '<div class="verticalSection verticalSection-extrabottompadding">', html += '<div class="sectionTitleContainer" style="margin-bottom:1em;">', html += '<h2 class="sectionTitle">', html += currentCategory, html += "</h2>", 0 === i && (html += '<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Scheduled-tasks">' + globalize.translate("Help") + "</a>"), html += "</div>", html += '<div class="paperList">'), html += '<div class="listItem listItem-border scheduledTaskPaperIconItem" data-status="' + task.State + '">', html += "<a is='emby-linkbutton' style='margin:0;padding:0;' class='clearLink listItemIconContainer' href='scheduledtask.html?id=" + task.Id + "'>", html += '<i class="md-icon listItemIcon">schedule</i>', html += "</a>", html += '<div class="listItemBody two-line">', html += "<a class='clearLink' style='margin:0;padding:0;display:block;text-align:left;' is='emby-linkbutton' href='scheduledtask.html?id=" + task.Id + "'>", html += "<h3 class='listItemBodyText'>" + task.Name + "</h3>", html += "<div class='secondary listItemBodyText' id='taskProgress" + task.Id + "'>" + getTaskProgressHtml(task) + "</div>", html += "</a>", html += "</div>", "Idle" == task.State ? html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStartTask" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStart") + '"><i class="md-icon">play_arrow</i></button>' : "Running" == task.State ? html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStopTask" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStop") + '"><i class="md-icon">stop</i></button>' : html += '<button type="button" is="paper-icon-button-light" id="btnTask' + task.Id + '" class="btnStartTask hide" data-taskid="' + task.Id + '" title="' + globalize.translate("ButtonStart") + '"><i class="md-icon">play_arrow</i></button>', html += "</div>"
|
||||
}
|
||||
tasks.length && (html += "</div>", html += "</div>"), page.querySelector(".divScheduledTasks").innerHTML = html
|
||||
}
|
||||
|
||||
function humane_elapsed(firstDateStr, secondDateStr) {
|
||||
var dt1 = new Date(firstDateStr),
|
||||
dt2 = new Date(secondDateStr),
|
||||
seconds = (dt2.getTime() - dt1.getTime()) / 1e3,
|
||||
numdays = Math.floor(seconds % 31536e3 / 86400),
|
||||
numhours = Math.floor(seconds % 31536e3 % 86400 / 3600),
|
||||
numminutes = Math.floor(seconds % 31536e3 % 86400 % 3600 / 60),
|
||||
numseconds = Math.round(seconds % 31536e3 % 86400 % 3600 % 60),
|
||||
elapsedStr = "";
|
||||
return elapsedStr += 1 == numdays ? numdays + " day " : "", elapsedStr += numdays > 1 ? numdays + " days " : "", elapsedStr += 1 == numhours ? numhours + " hour " : "", elapsedStr += numhours > 1 ? numhours + " hours " : "", elapsedStr += 1 == numminutes ? numminutes + " minute " : "", elapsedStr += numminutes > 1 ? numminutes + " minutes " : "", elapsedStr += elapsedStr.length > 0 ? "and " : "", elapsedStr += 1 == numseconds ? numseconds + " second" : "", elapsedStr += 0 == numseconds || numseconds > 1 ? numseconds + " seconds" : ""
|
||||
}
|
||||
|
||||
function getTaskProgressHtml(task) {
|
||||
var html = "";
|
||||
if ("Idle" == task.State) task.LastExecutionResult && (html += globalize.translate("LabelScheduledTaskLastRan").replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc)).replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)), "Failed" == task.LastExecutionResult.Status ? html += " <span style='color:#FF0000;'>(" + globalize.translate("LabelFailed") + ")</span>" : "Cancelled" == task.LastExecutionResult.Status ? html += " <span style='color:#0026FF;'>(" + globalize.translate("LabelCancelled") + ")</span>" : "Aborted" == task.LastExecutionResult.Status && (html += " <span style='color:#FF0000;'>" + globalize.translate("LabelAbortedByServerShutdown") + "</span>"));
|
||||
else if ("Running" == task.State) {
|
||||
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
|
||||
html += '<div style="display:flex;align-items:center;">';
|
||||
html += '<div class="taskProgressOuter" title="' + progress + '%" style="flex-grow:1;">';
|
||||
html += '<div class="taskProgressInner" style="width:' + progress + '%;">';
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "<span style='color:#00a4dc;margin-left:5px;'>" + progress + "%</span>";
|
||||
html += "</div>";
|
||||
} else {
|
||||
html += "<span style='color:#FF0000;'>" + globalize.translate("LabelStopping") + "</span>";
|
||||
}
|
||||
return html
|
||||
}
|
||||
|
||||
function updateTaskButton(elem, state) {
|
||||
"Idle" == state ? (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")) : "Running" == state ? (elem.classList.remove("btnStartTask"), elem.classList.add("btnStopTask"), elem.classList.remove("hide"), elem.querySelector("i").innerHTML = "stop", elem.title = globalize.translate("ButtonStop")) : (elem.classList.add("btnStartTask"), elem.classList.remove("btnStopTask"), elem.classList.add("hide"), elem.querySelector("i").innerHTML = "play_arrow", elem.title = globalize.translate("ButtonStart")), $(elem).parents(".listItem")[0].setAttribute("data-status", state)
|
||||
}
|
||||
return function(view, params) {
|
||||
function updateTasks(tasks) {
|
||||
for (var i = 0, length = tasks.length; i < length; i++) {
|
||||
var task = tasks[i];
|
||||
view.querySelector("#taskProgress" + task.Id).innerHTML = getTaskProgressHtml(task);
|
||||
updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State)
|
||||
}
|
||||
}
|
||||
|
||||
function onPollIntervalFired() {
|
||||
ApiClient.isMessageChannelOpen() || reloadList(view)
|
||||
}
|
||||
|
||||
function onScheduledTasksUpdate(e, apiClient, info) {
|
||||
apiClient.serverId() === serverId && updateTasks(info)
|
||||
}
|
||||
|
||||
function startInterval() {
|
||||
ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"), pollInterval && clearInterval(pollInterval), pollInterval = setInterval(onPollIntervalFired, 1e4)
|
||||
}
|
||||
|
||||
function stopInterval() {
|
||||
ApiClient.sendMessage("ScheduledTasksInfoStop"), pollInterval && clearInterval(pollInterval)
|
||||
}
|
||||
var pollInterval, serverId = ApiClient.serverId();
|
||||
$(".divScheduledTasks", view).on("click", ".btnStartTask", function() {
|
||||
var button = this,
|
||||
id = button.getAttribute("data-taskid");
|
||||
ApiClient.startScheduledTask(id).then(function() {
|
||||
updateTaskButton(button, "Running"), reloadList(view)
|
||||
})
|
||||
}).on("click", ".btnStopTask", function() {
|
||||
var button = this,
|
||||
id = button.getAttribute("data-taskid");
|
||||
ApiClient.stopScheduledTask(id).then(function() {
|
||||
updateTaskButton(button, ""), reloadList(view)
|
||||
})
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate), stopInterval()
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
loading.show(), startInterval(), reloadList(view), events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,21 +0,0 @@
|
|||
define(["focusManager", "searchFields", "searchResults", "events"], function(focusManager, SearchFields, SearchResults, events) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
function onSearch(e, value) {
|
||||
self.searchResults.search(value)
|
||||
}
|
||||
var self = this;
|
||||
view.addEventListener("viewshow", function() {
|
||||
self.searchFields || (self.searchFields = new SearchFields({
|
||||
element: view.querySelector(".searchFields")
|
||||
}), self.searchResults = new SearchResults({
|
||||
element: view.querySelector(".searchResults"),
|
||||
serverId: params.serverId || ApiClient.serverId(),
|
||||
parentId: params.parentId,
|
||||
collectionType: params.collectionType
|
||||
}), events.on(self.searchFields, "search", onSearch))
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
self.searchFields && (self.searchFields.destroy(), self.searchFields = null), self.searchResults && (self.searchResults.destroy(), self.searchResults = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,140 +0,0 @@
|
|||
define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "backdrop", "globalize", "staticBackdrops", "actionsheet", "dom", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function(loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, backdrop, globalize, staticBackdrops, actionSheet, dom) {
|
||||
"use strict";
|
||||
|
||||
function renderSelectServerItems(view, servers) {
|
||||
var items = servers.map(function(server) {
|
||||
return {
|
||||
name: server.Name,
|
||||
showIcon: !0,
|
||||
icon: "",
|
||||
cardType: "",
|
||||
id: server.Id,
|
||||
server: server
|
||||
}
|
||||
}),
|
||||
html = items.map(function(item) {
|
||||
var cardImageContainer;
|
||||
cardImageContainer = item.showIcon ? '<i class="cardImageIcon md-icon">' + item.icon + "</i>" : '<div class="cardImage" style="' + item.cardImageStyle + '"></div>';
|
||||
var cardBoxCssClass = "cardBox";
|
||||
layoutManager.tv && (cardBoxCssClass += " cardBox-focustransform");
|
||||
var innerOpening = '<div class="' + cardBoxCssClass + '">';
|
||||
return '<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 + '">' + innerOpening + '<div class="cardScalable card-focuscontent"><div class="cardPadder cardPadder-square"></div><div class="cardContent"><div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;">' + cardImageContainer + '</div></div></div><div class="cardFooter"><div class="cardText cardTextCentered">' + item.name + "</div></div></div></button>"
|
||||
}).join(""),
|
||||
itemsContainer = view.querySelector(".servers");
|
||||
items.length || (html = "<p>" + globalize.translate("MessageNoServersAvailableToConnect") + "</p>"), itemsContainer.innerHTML = html, loading.hide()
|
||||
}
|
||||
|
||||
function updatePageStyle(view, params) {
|
||||
"1" == params.showuser ? (view.classList.add("libraryPage"), view.classList.remove("standalonePage"), view.classList.add("noSecondaryNavPage")) : (view.classList.add("standalonePage"), view.classList.remove("libraryPage"), view.classList.remove("noSecondaryNavPage"))
|
||||
}
|
||||
|
||||
function showGeneralError() {
|
||||
loading.hide(), alertText(globalize.translate("DefaultErrorMessage"))
|
||||
}
|
||||
|
||||
function alertText(text) {
|
||||
alertTextWithOptions({
|
||||
text: text
|
||||
})
|
||||
}
|
||||
|
||||
function alertTextWithOptions(options) {
|
||||
require(["alert"], function(alert) {
|
||||
alert(options)
|
||||
})
|
||||
}
|
||||
|
||||
function showServerConnectionFailure() {
|
||||
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"))
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
function connectToServer(server) {
|
||||
loading.show(), connectionManager.connectToServer(server, {
|
||||
enableAutoLogin: appSettings.enableAutoLogin()
|
||||
}).then(function(result) {
|
||||
loading.hide();
|
||||
var apiClient = result.ApiClient;
|
||||
switch (result.State) {
|
||||
case "SignedIn":
|
||||
Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient), Dashboard.navigate("home.html");
|
||||
break;
|
||||
case "ServerSignIn":
|
||||
Dashboard.onServerChanged(null, null, apiClient), Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id);
|
||||
break;
|
||||
case "ServerUpdateNeeded":
|
||||
alertTextWithOptions({
|
||||
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>')
|
||||
});
|
||||
break;
|
||||
default:
|
||||
showServerConnectionFailure()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function deleteServer(server) {
|
||||
loading.show(), connectionManager.deleteServer(server.Id).then(function() {
|
||||
loading.hide(), loadServers()
|
||||
}, function() {
|
||||
loading.hide(), loadServers()
|
||||
})
|
||||
}
|
||||
|
||||
function onServerClick(server) {
|
||||
var menuItems = [];
|
||||
menuItems.push({
|
||||
name: globalize.translate("Connect"),
|
||||
id: "connect"
|
||||
}), menuItems.push({
|
||||
name: globalize.translate("Delete"),
|
||||
id: "delete"
|
||||
});
|
||||
actionSheet.show({
|
||||
items: menuItems,
|
||||
title: server.Name
|
||||
}).then(function(id) {
|
||||
switch (id) {
|
||||
case "connect":
|
||||
connectToServer(server);
|
||||
break;
|
||||
case "delete":
|
||||
deleteServer(server);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function onServersRetrieved(result) {
|
||||
servers = result, renderSelectServerItems(view, result), layoutManager.tv && focusManager.autoFocus(view)
|
||||
}
|
||||
|
||||
function loadServers() {
|
||||
loading.show(), connectionManager.getAvailableServers().then(onServersRetrieved, function(result) {
|
||||
onServersRetrieved([])
|
||||
})
|
||||
}
|
||||
var servers;
|
||||
layoutManager.desktop;
|
||||
updatePageStyle(view, params);
|
||||
var backdropUrl = staticBackdrops.getRandomImageUrl();
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
var isRestored = e.detail.isRestored;
|
||||
appRouter.setTitle(null);
|
||||
backdrop.setBackdrop(backdropUrl);
|
||||
if (!isRestored) loadServers();
|
||||
}), view.querySelector(".servers").addEventListener("click", function(e) {
|
||||
var card = dom.parentWithClass(e.target, "card");
|
||||
if (card) {
|
||||
var url = card.getAttribute("data-url");
|
||||
if (url) appRouter.show(url);
|
||||
else {
|
||||
var id = card.getAttribute("data-id");
|
||||
onServerClick(servers.filter(function(s) {
|
||||
return s.Id === id
|
||||
})[0])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
1073
src/scripts/site.js
1073
src/scripts/site.js
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
define(["loading", "components/categorysyncbuttons", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function(loading, categorysyncbuttons, groupedcards, cardBuilder, appHost, imageLoader) {
|
||||
define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function(loading, groupedcards, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function getLatestPromise(context, params) {
|
||||
|
@ -43,7 +43,6 @@ define(["loading", "components/categorysyncbuttons", "components/groupedcards",
|
|||
}
|
||||
return function(view, params, tabContent) {
|
||||
var self = this;
|
||||
categorysyncbuttons.init(tabContent);
|
||||
var latestPromise;
|
||||
self.preRender = function() {
|
||||
latestPromise = getLatestPromise(view, params)
|
||||
|
|
|
@ -1,229 +0,0 @@
|
|||
define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "components/categorysyncbuttons", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "scrollStyles", "emby-itemscontainer", "emby-button"], function(events, inputManager, libraryMenu, layoutManager, loading, dom, categorysyncbuttons, userSettings, cardBuilder, playbackManager, mainTabsManager) {
|
||||
"use strict";
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
name: Globalize.translate("TabShows")
|
||||
}, {
|
||||
name: Globalize.translate("TabSuggestions")
|
||||
}, {
|
||||
name: Globalize.translate("TabLatest")
|
||||
}, {
|
||||
name: Globalize.translate("TabUpcoming")
|
||||
}, {
|
||||
name: Globalize.translate("TabGenres")
|
||||
}, {
|
||||
name: Globalize.translate("TabNetworks")
|
||||
}, {
|
||||
name: Globalize.translate("TabEpisodes")
|
||||
}, {
|
||||
name: Globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "suggestions":
|
||||
return 1;
|
||||
case "latest":
|
||||
return 2;
|
||||
case "favorites":
|
||||
return 1;
|
||||
case "genres":
|
||||
return 4;
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
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"))
|
||||
}
|
||||
return function(view, params) {
|
||||
function reload() {
|
||||
loading.show(), loadResume(), loadNextUp()
|
||||
}
|
||||
|
||||
function loadNextUp() {
|
||||
var query = {
|
||||
Limit: 24,
|
||||
Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo",
|
||||
UserId: ApiClient.getCurrentUserId(),
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
query.ParentId = libraryMenu.getTopParentId(), ApiClient.getNextUpEpisodes(query).then(function(result) {
|
||||
result.Items.length ? view.querySelector(".noNextUpItems").classList.add("hide") : view.querySelector(".noNextUpItems").classList.remove("hide");
|
||||
var container = view.querySelector("#nextUpItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
shape: "backdrop",
|
||||
scalable: !0,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
cardLayout: !1
|
||||
}), loading.hide()
|
||||
})
|
||||
}
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
}
|
||||
|
||||
function getThumbShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
}
|
||||
|
||||
function loadResume() {
|
||||
var parentId = libraryMenu.getTopParentId(),
|
||||
screenWidth = dom.getWindowSize().innerWidth,
|
||||
limit = screenWidth >= 1600 ? 5 : 6,
|
||||
options = {
|
||||
SortBy: "DatePlayed",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Episode",
|
||||
Filters: "IsResumable",
|
||||
Limit: limit,
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo",
|
||||
ExcludeLocationTypes: "Virtual",
|
||||
ParentId: parentId,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Thumb",
|
||||
EnableTotalRecordCount: !1
|
||||
};
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function(result) {
|
||||
result.Items.length ? view.querySelector("#resumableSection").classList.remove("hide") : view.querySelector("#resumableSection").classList.add("hide");
|
||||
var allowBottomPadding = !enableScrollX(),
|
||||
container = view.querySelector("#resumableItems");
|
||||
cardBuilder.buildCards(result.Items, {
|
||||
itemsContainer: container,
|
||||
preferThumb: !0,
|
||||
shape: getThumbShape(),
|
||||
scalable: !0,
|
||||
showTitle: !0,
|
||||
showParentTitle: !0,
|
||||
overlayText: !1,
|
||||
centerText: !0,
|
||||
overlayPlayButton: !0,
|
||||
allowBottomPadding: allowBottomPadding,
|
||||
cardLayout: !1
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
var newIndex = parseInt(e.detail.selectedTabIndex);
|
||||
loadTab(view, newIndex)
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
switch (index) {
|
||||
case 0:
|
||||
depends.push("scripts/tvshows");
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
depends.push("scripts/tvlatest");
|
||||
break;
|
||||
case 3:
|
||||
depends.push("scripts/tvupcoming");
|
||||
break;
|
||||
case 4:
|
||||
depends.push("scripts/tvgenres");
|
||||
break;
|
||||
case 5:
|
||||
depends.push("scripts/tvstudios");
|
||||
break;
|
||||
case 6:
|
||||
depends.push("scripts/episodes");
|
||||
break;
|
||||
case 7:
|
||||
depends.push("scripts/searchtab")
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
var tabContent;
|
||||
1 === index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 1 === index ? self : 7 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "tvshows",
|
||||
parentId: params.topParentId
|
||||
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, -1 == renderedTabs.indexOf(index) && (renderedTabs.push(index), controller.renderTab())
|
||||
})
|
||||
}
|
||||
|
||||
function onPlaybackStop(e, state) {
|
||||
state.NowPlayingItem && "Video" == state.NowPlayingItem.MediaType && (renderedTabs = [], mainTabsManager.getTabsElement().triggerTabChange())
|
||||
}
|
||||
|
||||
function onWebSocketMessage(e, data) {
|
||||
var msg = data;
|
||||
"UserDataChanged" === msg.MessageType && msg.Data.UserId == ApiClient.getCurrentUserId() && (renderedTabs = [])
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId)
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)),
|
||||
initialTabIndex = currentTabIndex;
|
||||
self.initTab = function() {
|
||||
var tabContent = self.tabContent;
|
||||
setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX()), categorysyncbuttons.init(tabContent)
|
||||
}, self.renderTab = function() {
|
||||
reload()
|
||||
};
|
||||
var tabControllers = [],
|
||||
renderedTabs = [];
|
||||
setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()), view.addEventListener("viewshow", function(e) {
|
||||
if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) {
|
||||
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("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) {
|
||||
inputManager.off(window, onInputCommand), events.off(playbackManager, "playbackstop", onPlaybackStop), events.off(ApiClient, "message", onWebSocketMessage)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
|
@ -48,15 +48,8 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
|
|||
} else {
|
||||
$(".disabledUserBanner", page).hide();
|
||||
}
|
||||
"Guest" == user.ConnectLinkType ? ($("#fldConnectInfo", page).hide(),
|
||||
$("#txtUserName", page).prop("disabled", "disabled")) : ($("#txtUserName", page).prop("disabled", "").removeAttr("disabled"),
|
||||
if ("Guest" == user.ConnectLinkType) {
|
||||
$("#fldConnectInfo", page).hide();
|
||||
$("#txtUserName", page).prop("disabled", "disabled");
|
||||
} else {
|
||||
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
|
||||
$("#fldConnectInfo", page).show();
|
||||
}
|
||||
$("#txtUserName", page).prop("disabled", "").removeAttr("disabled");
|
||||
$("#fldConnectInfo", page).show();
|
||||
$(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id);
|
||||
libraryMenu.setTitle(user.Name);
|
||||
page.querySelector(".username").innerHTML = user.Name;
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
define(["loading", "libraryMenu", "emby-linkbutton"], function(loading, libraryMenu) {
|
||||
"use strict";
|
||||
|
||||
function loadUser(page, params) {
|
||||
var userid = params.userId;
|
||||
ApiClient.getUser(userid).then(function(user) {
|
||||
Dashboard.getCurrentUser().then(function(loggedInUser) {
|
||||
libraryMenu.setTitle(user.Name), page.querySelector(".username").innerHTML = user.Name;
|
||||
var showPasswordSection = !0,
|
||||
showLocalAccessSection = !1;
|
||||
"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 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
|
||||
})
|
||||
}), page.querySelector("#txtCurrentPassword").value = "", page.querySelector("#txtNewPassword").value = "", page.querySelector("#txtNewPasswordConfirm").value = ""
|
||||
}
|
||||
return function(view, params) {
|
||||
function saveEasyPassword() {
|
||||
var userId = params.userId,
|
||||
easyPassword = view.querySelector("#txtEasyPassword").value;
|
||||
easyPassword ? ApiClient.updateEasyPassword(userId, easyPassword).then(function() {
|
||||
onEasyPasswordSaved(userId)
|
||||
}) : onEasyPasswordSaved(userId)
|
||||
}
|
||||
|
||||
function onEasyPasswordSaved(userId) {
|
||||
ApiClient.getUser(userId).then(function(user) {
|
||||
user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked, ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function() {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("MessageSettingsSaved"))
|
||||
}), loadUser(view, params)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function savePassword() {
|
||||
var userId = params.userId,
|
||||
currentPassword = view.querySelector("#txtCurrentPassword").value,
|
||||
newPassword = view.querySelector("#txtNewPassword").value;
|
||||
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)
|
||||
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
|
||||
currentPassword = "";
|
||||
}
|
||||
ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function() {
|
||||
loading.hide(), require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("PasswordSaved"))
|
||||
}), loadUser(view, params)
|
||||
}, function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
title: Globalize.translate("HeaderLoginFailure"),
|
||||
message: Globalize.translate("MessageInvalidUser")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
var form = this;
|
||||
return form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value ? require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("PasswordMatchError"))
|
||||
}) : (loading.show(), savePassword()), e.preventDefault(), !1
|
||||
}
|
||||
|
||||
function onLocalAccessSubmit(e) {
|
||||
return loading.show(), saveEasyPassword(), e.preventDefault(), !1
|
||||
}
|
||||
|
||||
function resetPassword() {
|
||||
var msg = Globalize.translate("PasswordResetConfirmation");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(msg, Globalize.translate("PasswordResetHeader")).then(function() {
|
||||
var userId = params.userId;
|
||||
loading.show(), ApiClient.resetUserPassword(userId).then(function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
message: Globalize.translate("PasswordResetComplete"),
|
||||
title: Globalize.translate("PasswordResetHeader")
|
||||
}), loadUser(view, params)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function resetEasyPassword() {
|
||||
var msg = Globalize.translate("PinCodeResetConfirmation");
|
||||
require(["confirm"], function(confirm) {
|
||||
confirm(msg, Globalize.translate("HeaderPinCodeReset")).then(function() {
|
||||
var userId = params.userId;
|
||||
loading.show(), ApiClient.resetEasyPassword(userId).then(function() {
|
||||
loading.hide(), Dashboard.alert({
|
||||
message: Globalize.translate("PinCodeResetComplete"),
|
||||
title: Globalize.translate("HeaderPinCodeReset")
|
||||
}), 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)
|
||||
})
|
||||
}
|
||||
});
|
File diff suppressed because it is too large
Load diff
|
@ -1,68 +0,0 @@
|
|||
define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "emby-linkbutton"], function(loading, globalize) {
|
||||
"use strict";
|
||||
|
||||
function getApiClient() {
|
||||
return ApiClient
|
||||
}
|
||||
|
||||
function nextWizardPage() {
|
||||
Dashboard.navigate("wizardlibrary.html")
|
||||
}
|
||||
|
||||
function onUpdateUserComplete(result) {
|
||||
if (loading.hide(), result.UserLinkResult) {
|
||||
var msgKey = result.UserLinkResult.IsPending ? "MessagePendingEmbyAccountAdded" : "MessageEmbyAccountAdded";
|
||||
Dashboard.alert({
|
||||
message: globalize.translate(msgKey),
|
||||
title: globalize.translate("HeaderEmbyAccountAdded"),
|
||||
callback: nextWizardPage
|
||||
})
|
||||
} else nextWizardPage()
|
||||
}
|
||||
|
||||
function submit(form) {
|
||||
loading.show();
|
||||
var apiClient = getApiClient();
|
||||
apiClient.ajax({
|
||||
type: "POST",
|
||||
data: {
|
||||
Name: form.querySelector("#txtUsername").value,
|
||||
Password: form.querySelector("#txtManualPassword").value
|
||||
},
|
||||
url: apiClient.getUrl("Startup/User")
|
||||
}).then(onUpdateUserComplete, function(response) {
|
||||
console.log(response);
|
||||
})
|
||||
}
|
||||
|
||||
function onSubmit(e) {
|
||||
var form = this;
|
||||
if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) {
|
||||
require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("PasswordMatchError"));
|
||||
});
|
||||
} else {
|
||||
submit(form);
|
||||
}
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
function onViewShow() {
|
||||
loading.show();
|
||||
var page = this,
|
||||
apiClient = getApiClient();
|
||||
apiClient.getJSON(apiClient.getUrl("Startup/User")).then(function(user) {
|
||||
page.querySelector("#txtUsername").value = user.Name || "";
|
||||
page.querySelector("#txtManualPassword").value = user.Password || "";
|
||||
loading.hide();
|
||||
})
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector(".wizardUserForm").addEventListener("submit", onSubmit), view.addEventListener("viewshow", function() {
|
||||
document.querySelector(".skinHeader").classList.add("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewhide", function() {
|
||||
document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader")
|
||||
}), view.addEventListener("viewshow", onViewShow)
|
||||
}
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue