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(e) {
return e.preventDefault(), !1
}
function buttonEnabled(elem, enabled) {
enabled ? (elem.setAttribute("disabled", ""), elem.removeAttribute("disabled")) : elem.setAttribute("disabled", "disabled")
}
function onEditServerNameClick(e) {
var page = dom.parentWithClass(this, "page");
return 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()
})
})
})
}), e.preventDefault(), !1
}
function showPlaybackInfo(btn, session) {
require(["alert"], function(alert) {
var showTranscodeReasons, title, text = [],
displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session),
isDirectStream = "DirectStream" === displayPlayMethod,
isTranscode = "Transcode" === displayPlayMethod;
isDirectStream ? (title = globalize.translate("sharedcomponents#DirectStreaming"), text.push(globalize.translate("sharedcomponents#DirectStreamHelp1")), text.push("
"), text.push(globalize.translate("sharedcomponents#DirectStreamHelp2"))) : isTranscode && (title = globalize.translate("sharedcomponents#Transcoding"), text.push(globalize.translate("sharedcomponents#MediaIsBeingConverted")), session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length && (text.push("
"), text.push(globalize.translate("sharedcomponents#LabelReasonForTranscoding")), showTranscodeReasons = !0)), showTranscodeReasons && session.TranscodingInfo.TranscodeReasons.forEach(function(t) {
text.push(globalize.translate("sharedcomponents#" + t))
}), alert({
text: text.join("
"),
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 = [];
return session.ServerId && session.DeviceId !== connectionManager.deviceId() && menuItems.push({
name: globalize.translate("SendMessage"),
id: "sendmessage"
}), session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length && menuItems.push({
name: globalize.translate("ViewPlaybackInfo"),
id: "transcodinginfo"
}), actionsheet.show({
items: menuItems,
positionTo: btn
}).then(function(id) {
switch (id) {
case "sendmessage":
showSendMessageForm(btn, session);
break;
case "transcodinginfo":
showPlaybackInfo(btn, session)
}
})
})
}
function onActiveDevicesClick(e) {
var btn = dom.parentWithClass(e.target, "sessionCardButton");
if (btn) {
var card = dom.parentWithClass(btn, "card");
if (card) {
var sessionId = card.id,
session = (DashboardPage.sessionsList || []).filter(function(s) {
return "session" + s.Id === sessionId
})[0];
session && (btn.classList.contains("btnCardOptions") ? showOptionsMenu(btn, session) : btn.classList.contains("btnSessionInfo") ? showPlaybackInfo(btn, session) : btn.classList.contains("btnSessionSendMessage") ? showSendMessageForm(btn, session) : btn.classList.contains("btnSessionStop") ? connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop") : btn.classList.contains("btnSessionPlayPause") && session.PlayState && connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause"))
}
}
}
function filterSessions(sessions) {
for (var list = [], minActiveDate = (new Date).getTime() - 9e5, i = 0, length = sessions.length; i < length; i++) {
var session = sessions[i];
if (session.NowPlayingItem || session.UserId) {
datetime.parseISO8601Date(session.LastActivityDate, !0).getTime() >= minActiveDate && list.push(session)
}
}
return list
}
function getPluginSecurityInfo() {
var apiClient = window.ApiClient;
return apiClient ? connectionManager.getRegistrationInfo("themes", apiClient, {
viewOnly: !0
}).then(function(result) {
return {
IsMBSupporter: !0
}
}, function() {
return {
IsMBSupporter: !1
}
}) : Promise.reject()
}
function refreshActiveRecordings(view, apiClient) {
apiClient.getLiveTvRecordings({
UserId: Dashboard.getCurrentUserId(),
IsInProgress: !0,
Fields: "CanDelete,PrimaryImageAspectRatio",
EnableTotalRecordCount: !1,
EnableImageTypes: "Primary,Thumb,Backdrop"
}).then(function(result) {
var itemsContainer = view.querySelector(".activeRecordingItems");
if (!result.Items.length) return view.querySelector(".activeRecordingsSection").classList.add("hide"), void(itemsContainer.innerHTML = "");
view.querySelector(".activeRecordingsSection").classList.remove("hide");
itemsContainer.innerHTML = cardBuilder.getCardsHtml({
items: result.Items,
shape: "auto",
defaultShape: "backdrop",
showTitle: !0,
showParentTitle: !0,
coverImage: !0,
cardLayout: !1,
centerText: !0,
preferThumb: "auto",
overlayText: !1,
overlayMoreButton: !0,
action: "none",
centerPlayButton: !0
}), imageLoader.lazyChildren(itemsContainer)
})
}
function renderHasPendingRestart(view, apiClient, hasPendingRestart) {
if (hasPendingRestart) view.querySelector("#pUpToDate").classList.add("hide"), view.querySelector("#pUpdateNow").classList.add("hide");
else {
if (DashboardPage.lastAppUpdateCheck && (new Date).getTime() - DashboardPage.lastAppUpdateCheck < 18e5) return;
DashboardPage.lastAppUpdateCheck = (new Date).getTime(), apiClient.getAvailableApplicationUpdate().then(function(packageInfo) {
var version = packageInfo[0];
version ? (view.querySelector("#pUpToDate").classList.add("hide"), view.querySelector("#pUpdateNow").classList.remove("hide"), view.querySelector("#newVersionNumber").innerHTML = globalize.translate("VersionXIsAvailableForDownload").replace("{0}", version.versionStr)) : (view.querySelector("#pUpToDate").classList.remove("hide"), view.querySelector("#pUpdateNow").classList.add("hide"))
})
}
}
function reloadSystemInfo(view, apiClient) {
apiClient.getSystemInfo().then(function(systemInfo) {
view.querySelector(".serverNameHeader").innerHTML = systemInfo.ServerName;
var localizedVersion = globalize.translate("LabelVersionNumber", systemInfo.Version);
systemInfo.SystemUpdateLevel && "Release" != systemInfo.SystemUpdateLevel && (localizedVersion += " " + globalize.translate("Option" + systemInfo.SystemUpdateLevel).toLowerCase()), systemInfo.CanSelfRestart ? view.querySelector("#btnRestartServer").classList.remove("hide") : view.querySelector("#btnRestartServer").classList.add("hide"), view.querySelector("#appVersionNumber").innerHTML = localizedVersion, systemInfo.SupportsHttps ? view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPorts", systemInfo.HttpServerPortNumber, systemInfo.HttpsPortNumber) : view.querySelector("#ports").innerHTML = globalize.translate("LabelRunningOnPort", systemInfo.HttpServerPortNumber), DashboardPage.renderUrls(view, systemInfo), DashboardPage.renderPendingInstallations(view, systemInfo), systemInfo.CanSelfUpdate ? (view.querySelector("#btnUpdateApplicationContainer").classList.remove("hide"), view.querySelector("#btnManualUpdateContainer").classList.add("hide")) : (view.querySelector("#btnUpdateApplicationContainer").classList.add("hide"), view.querySelector("#btnManualUpdateContainer").classList.remove("hide")), "synology" == systemInfo.PackageName ? view.querySelector("#btnManualUpdateContainer").innerHTML = globalize.translate("SynologyUpdateInstructions") : view.querySelector("#btnManualUpdateContainer").innerHTML = '' + globalize.translate("PleaseUpdateManually") + "", DashboardPage.renderPaths(view, systemInfo), renderHasPendingRestart(view, apiClient, systemInfo.HasPendingRestart)
})
}
function renderInfo(view, sessions, forceUpdate) {
sessions = filterSessions(sessions), renderActiveConnections(view, sessions), DashboardPage.renderPluginUpdateInfo(view, forceUpdate), 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"),
cardElem = parentElement.querySelector(".card");
cardElem && cardElem.classList.add("deadSession");
for (var i = 0, length = sessions.length; i < length; i++) {
var session = sessions[i],
rowId = "session" + session.Id,
elem = view.querySelector("#" + rowId);
if (elem) DashboardPage.updateSession(elem, session);
else {
var nowPlayingItem = session.NowPlayingItem,
className = "scalableCard card activeSession backdropCard backdropCard-scalable";
session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage && (className += " transcodingSession"), html += '
", html += task.Name + "
", "Running" == task.State) {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '", html += "" + progress + "%", html += ''
} else "Cancelling" == task.State && (html += '' + globalize.translate("LabelStopping") + "");
html += "
" + globalize.translate("NewVersionOfSomethingAvailable").replace("{0}", update.name) + "
", html += '" } elem.innerHTML = html })) }, installPluginUpdate: function(button) { buttonEnabled(button, !1); var name = button.getAttribute("data-name"), guid = button.getAttribute("data-guid"), version = button.getAttribute("data-version"), classification = button.getAttribute("data-classification"); loading.show(), ApiClient.installPlugin(name, guid, classification, version).then(function() { loading.hide() }) }, updateApplication: function(btn) { var page = dom.parentWithClass(btn, "page"); buttonEnabled(page.querySelector("#btnUpdateApplication"), !1), loading.show(), ApiClient.getScheduledTasks().then(function(tasks) { var task = tasks.filter(function(t) { return t.Key == DashboardPage.systemUpdateTaskKey })[0]; ApiClient.startScheduledTask(task.Id).then(function() { pollForInfo(page, ApiClient), loading.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"), !1), buttonEnabled(page.querySelector("#btnShutdown"), !1), 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"), !1), buttonEnabled(page.querySelector("#btnShutdown"), !1), ApiClient.shutdownServer() }) }) } }, pageClassOn("pageshow", "type-interior", function() { var page = this; page.querySelector(".customSupporterPromotion") || getPluginSecurityInfo().then(function(pluginSecurityInfo) { var supporterPromotionElem = page.querySelector(".supporterPromotion"); if (supporterPromotionElem && supporterPromotionElem.parentNode.removeChild(supporterPromotionElem), !pluginSecurityInfo.IsMBSupporter) { var html = '", page.querySelector(".content-primary").insertAdjacentHTML("afterbegin", html) } }) }), function(view, params) { function onRestartRequired(e, apiClient) { apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) } function onServerShuttingDown(e, apiClient) { apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) } function onServerRestarting(e, apiClient) { apiClient.serverId() === serverId && renderHasPendingRestart(view, apiClient, !0) } function onPackageInstalling(e, apiClient) { apiClient.serverId() === serverId && (pollForInfo(view, apiClient, !0), reloadSystemInfo(view, apiClient)) } function onPackageInstallationCompleted(e, apiClient) { apiClient.serverId() === serverId && (pollForInfo(view, apiClient, !0), reloadSystemInfo(view, apiClient)) } function onSessionsUpdate(e, apiClient, info) { apiClient.serverId() === serverId && renderInfo(view, info) } function onScheduledTasksUpdate(e, apiClient, info) { 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, apiClient = ApiClient; if (apiClient) { DashboardPage.newsStartIndex = 0, loading.show(), pollForInfo(page, apiClient), DashboardPage.startInterval(apiClient), 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, DashboardPage.lastPluginUpdateCheck = null, getPluginSecurityInfo().then(function(pluginSecurityInfo) { DashboardPage.renderSupporterIcon(page, pluginSecurityInfo) }), reloadSystemInfo(page, ApiClient), DashboardPage.reloadNews(page), page.userActivityLog || (page.userActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), element: page.querySelector(".userActivityItems") })), ApiClient.isMinServerVersion("3.4.1.25") && (page.serverActivityLog || (page.serverActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), element: page.querySelector(".serverActivityItems") }))); var swaggerUrl = "http://swagger.emby.media?url=" + ApiClient.getUrl("openapi"); swaggerUrl = swaggerUrl + "&api_key=" + ApiClient.accessToken(), page.querySelector(".swaggerLink").setAttribute("href", swaggerUrl), refreshActiveRecordings(view, apiClient) } }), 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), apiClient && DashboardPage.stopInterval(apiClient) }), view.addEventListener("viewdestroy", function() { var page = this, userActivityLog = page.userActivityLog; userActivityLog && userActivityLog.destroy(); var serverActivityLog = page.serverActivityLog; serverActivityLog && serverActivityLog.destroy() }) } });