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

Merge branch 'master' into remove-wan-ddns

This commit is contained in:
sparky8251 2019-09-19 20:39:02 +00:00 committed by GitHub
commit a272a6fcd5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
78 changed files with 1810 additions and 9978 deletions

View file

@ -3,10 +3,11 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb
function loadPage(page, config, languageOptions, systemInfo) {
page.querySelector("#txtServerName").value = systemInfo.ServerName;
$("#chkAutoRunWebApp", page).checked(config.AutoRunWebApp);
if (systemInfo.CanLaunchWebBrowser) {
page.querySelector("#fldRunWebAppAtStartup").classList.remove("hide");
page.querySelector("#fldAutoRunWebApp").classList.remove("hide");
} else {
page.querySelector("#fldRunWebAppAtStartup").classList.add("hide");
page.querySelector("#fldAutoRunWebApp").classList.add("hide");
}
page.querySelector("#txtCachePath").value = systemInfo.CachePath || "";
$("#txtMetadataPath", page).val(systemInfo.InternalMetadataPath || "");
@ -46,6 +47,7 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb
config.MetadataPath = $("#txtMetadataPath", form).val();
config.MetadataNetworkPath = $("#txtMetadataNetworkPath", form).val();
var requiresReload = (config.UICulture !== currentLanguage);
config.AutoRunWebApp = $("#chkAutoRunWebApp", form).checked();
config.EnableAutomaticRestart = $("#chkEnableAutomaticRestart", form).checked();
config.EnableAutoUpdate = $("#chkEnableAutomaticServerUpdates", form).checked();
ApiClient.updateServerConfiguration(config).then(function() {

View file

@ -1,4 +1,4 @@
define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "humanedate", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper) {
define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "humanedate", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) {
"use strict";
function buttonEnabled(elem, enabled) {
@ -12,27 +12,23 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
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) {
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
if (displayPlayMethod === "DirectStream") {
title = globalize.translate("DirectStreaming");
text.push(globalize.translate("DirectStreamHelp1"));
text.push("<br/>");
text.push(globalize.translate("DirectStreamHelp2"));
} else if (isTranscode) {
} else if (displayPlayMethod === "Transcode") {
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));
text.push(globalize.translate(transcodeReason));
});
}
}
@ -240,29 +236,24 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
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);
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 + "');\"";
html += ' data-src="' + imgUrl + '" style="display:inline-block;background-image:url(\'' + imgUrl + "');\"></div>";
} else {
html += '<div class="sessionNowPlayingContent"';
html += '<div class="sessionNowPlayingContent"></div>';
}
html += "></div>";
html += '<div class="sessionNowPlayingInnerContent">';
html += '<div class="sessionAppInfo">';
var clientImage = DashboardPage.getClientImage(session);
var clientImage = DashboardPage.getClientImage(session);
if (clientImage) {
html += clientImage;
}
@ -272,7 +263,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
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>";
@ -280,20 +270,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
html += '<div class="sessionTranscodingFramerate"></div>';
}
html += '<div class="sessionNowPlayingDetails">'
var nowPlayingName = DashboardPage.getNowPlayingName(session);
html += '<div class="sessionNowPlayingInfo" data-imgsrc="' + nowPlayingName.image + '">';
html += nowPlayingName.html;
html += "</div>";
html += '<div class="sessionNowPlayingTime">' + DashboardPage.getSessionNowPlayingTime(session) + "</div>";
html += '</div>'
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
html += '<progress class="playbackProgress" min="0" max="100" value="' + 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks + '"></progress>';
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
} else {
html += '<progress class="playbackProgress hide" min="0" max="100"></progress>';
// need to leave the element in just in case the device starts playback
html += indicators.getProgressHtml(0, { containerClass: "playbackProgress hide" });
}
if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) {
html += '<progress class="transcodingProgress" min="0" max="100" value="' + session.TranscodingInfo.CompletionPercentage.toFixed(1) + '"></progress>';
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
} else {
html += '<progress class="transcodingProgress hide" min="0" max="100"></progress>';
// same issue as playbackProgress element above
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
}
html += "</div>";
@ -316,8 +314,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
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) || "&nbsp;";
html += '<div class="sessionUserName">';
html += DashboardPage.getUsersHtml(session);
html += "</div>";
html += "</div>";
html += "</div>";
@ -328,7 +326,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
parentElement.insertAdjacentHTML("beforeend", html);
var deadSessionElem = parentElement.querySelector(".deadSession");
if (deadSessionElem) {
deadSessionElem.parentNode.removeChild(deadSessionElem);
}
@ -398,13 +395,12 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
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");
line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " Kbps");
}
}
@ -426,7 +422,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
}
return html || "&nbsp;";
return html;
},
getSessionNowPlayingTime: function (session) {
var nowPlayingItem = session.NowPlayingItem;
@ -436,7 +432,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (session.PlayState.PositionTicks) {
html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks);
} else {
html += "--:--:--";
html += "0:00";
}
html += " / ";
@ -444,10 +440,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks);
} else {
html += "--:--:--";
html += "0:00";
}
return html;
}
return html;
@ -488,15 +482,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
maxWidth: 130,
type: "Logo"
});
} else {
if (nowPlayingItem.ParentLogoImageTag) {
imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, {
tag: nowPlayingItem.ParentLogoImageTag,
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) {
@ -510,7 +502,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
},
getUsersHtml: function (session) {
var html = [];
if (session.UserId) {
html.push(session.UserName);
}
@ -534,8 +525,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
},
updateSession: function (row, session) {
row.classList.remove("deadSession");
var nowPlayingItem = session.NowPlayingItem;
var nowPlayingItem = session.NowPlayingItem;
if (nowPlayingItem) {
row.classList.add("playingSession");
} else {
@ -555,7 +546,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
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");
@ -572,7 +562,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session);
row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session);
row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session) || "&nbsp;";
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);
@ -584,27 +574,19 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
}
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");
}
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks;
html += indicators.getProgressHtml(percent, { containerClass: "playbackProgress" });
} else {
html += indicators.getProgressHtml(0, { containerClass: "playbackProgress 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");
var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1);
html += indicators.getProgressHtml(percent, { containerClass: "transcodingProgress" });
} else {
transcodingProgress.classList.add("hide");
row.classList.remove("transcodingSession");
html += indicators.getProgressHtml(0, { containerClass: "transcodingProgress hide" });
}
var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || "";
@ -692,6 +674,14 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
});
}
if (item && item.AlbumPrimaryImageTag) {
return ApiClient.getScaledImageUrl(item.AlbumId, {
type: "Primary",
width: 275,
tag: item.AlbumPrimaryImageTag
});
}
return null;
},
systemUpdateTaskKey: "SystemUpdateTask",
@ -707,7 +697,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
title: globalize.translate("HeaderRestart"),
text: globalize.translate("MessageConfirmRestart"),
confirmText: globalize.translate("ButtonRestart"),
primary: "cancel"
primary: "delete"
}).then(function () {
var page = dom.parentWithClass(btn, "page");
buttonEnabled(page.querySelector("#btnRestartServer"), false);
@ -722,7 +712,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
title: globalize.translate("HeaderShutdown"),
text: globalize.translate("MessageConfirmShutdown"),
confirmText: globalize.translate("ButtonShutdown"),
primary: "cancel"
primary: "delete"
}).then(function () {
var page = dom.parentWithClass(btn, "page");
buttonEnabled(page.querySelector("#btnRestartServer"), false);
@ -787,7 +777,6 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa
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);

View file

@ -12,7 +12,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
text: msg,
title: globalize.translate("HeaderDeleteDevice"),
confirmText: globalize.translate("ButtonDelete"),
primary: "cancel"
primary: "delete"
}).then(function() {
loading.show(), ApiClient.ajax({
type: "DELETE",
@ -112,4 +112,4 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu
loadData(this)
})
}
});
});

View file

@ -10,7 +10,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function($, loa
$("#selectThreadCount", page).val(config.EncodingThreadCount);
$("#txtDownMixAudioBoost", page).val(config.DownMixAudioBoost);
page.querySelector(".txtEncoderPath").value = config.EncoderAppPathDisplay || "";
$("#txtTranscodingTempPath", page).val(config.TranscodingTempPath || "");
$("#txtTranscodingTempPath", page).val(systemInfo.TranscodingTempPath || "");
$("#txtVaapiDevice", page).val(config.VaapiDevice || "");
page.querySelector("#selectH264Preset").value = config.H264Preset || "";
page.querySelector("#txtH264Crf").value = config.H264Crf || "";

View file

@ -108,6 +108,15 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap
overlayMoreButton: !0,
action: "instantmix",
coverImage: !0
}, {
name: "HeaderFavoriteBooks",
types: "Book",
shape: getPosterShape(),
showTitle: true,
showYear: true,
overlayPlayButton: true,
overlayText: false,
centerText: true
}]
}

View file

@ -7,7 +7,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"
confirm({
title: globalize.translate("UninstallPluginHeader"),
text: msg,
primary: "cancel",
primary: "delete",
confirmText: globalize.translate("UninstallPluginHeader")
}).then(function() {
loading.show();

View file

@ -235,7 +235,20 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild
var name = itemHelper.getDisplayName(item, {
includeParentInfo: !1
});
html && !parentNameLast ? html += '<h3 class="itemName" style="margin: .25em 0 .5em;">' + name + "</h3>" : html = parentNameLast ? '<h1 class="itemName" style="margin: .1em 0 .25em;">' + name + "</h1>" + html : '<h1 class="itemName" style="margin: .1em 0 .5em;">' + name + "</h1>" + html, container.innerHTML = html, html.length ? container.classList.remove("hide") : container.classList.add("hide")
var offset = parentNameLast ? ".25em" : ".5em";
if (html && !parentNameLast) {
html += '<h3 class="itemName" style="margin: .25em 0 .5em;">' + name + '</h3>';
} else {
html = '<h1 class="itemName" style="margin: .1em 0 ' + offset + ';">' + name + "</h1>" + html;
}
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
html += '<h4 class="itemName" style="margin: -' + offset + ' 0 0">' + item.OriginalTitle + '</h4>';
}
container.innerHTML = html;
html.length ? container.classList.remove("hide") : container.classList.add("hide")
}
function setTrailerButtonVisibility(page, item) {
@ -361,7 +374,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild
function renderLogo(page, item, apiClient) {
var url = logoImageUrl(item, apiClient, {
maxWidth: 300
maxWidth: 400
}),
detailLogo = page.querySelector(".detailLogo");
url ? (detailLogo.classList.remove("hide"), detailLogo.classList.add("lazy"), detailLogo.setAttribute("data-src", url), imageLoader.lazyImage(detailLogo)) : detailLogo.classList.add("hide")
@ -380,6 +393,18 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild
}
}
function renderUserInfo(page, item) {
var lastPlayedElement = page.querySelector(".itemLastPlayed");
if (item.UserData && item.UserData.LastPlayedDate) {
lastPlayedElement.classList.remove("hide");
var datePlayed = datetime.parseISO8601Date(item.UserData.LastPlayedDate);
lastPlayedElement.innerHTML = globalize.translate("DatePlayed") + " " + datetime.toLocaleDateString(datePlayed) + " " + datetime.getDisplayTime(datePlayed);
} else {
lastPlayedElement.classList.add("hide");
}
}
function renderLinks(linksElem, item) {
var html = [];
if (item.DateCreated && itemHelper.enableDateAddedDisplay(item)) {
@ -404,7 +429,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild
detectRatio = !1;
imageTags.Primary ? (url = apiClient.getScaledImageUrl(item.Id, {
type: "Primary",
maxHeight: 360,
maxHeight: 460,
tag: item.ImageTags.Primary
}), detectRatio = !0) : item.BackdropImageTags && item.BackdropImageTags.length ? (url = apiClient.getScaledImageUrl(item.Id, {
type: "Backdrop",
@ -531,22 +556,64 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild
}
function renderDetails(page, item, apiClient, context, isStatic) {
renderSimilarItems(page, item, context), renderMoreFromSeason(page, item, apiClient), renderMoreFromArtist(page, item, apiClient), renderDirector(page, item, apiClient, context, isStatic), renderGenres(page, item, apiClient, context, isStatic), renderChannelGuide(page, apiClient, item);
renderSimilarItems(page, item, context);
renderMoreFromSeason(page, item, apiClient);
renderMoreFromArtist(page, item, apiClient);
renderDirector(page, item, apiClient, context, isStatic);
renderGenres(page, item, apiClient, context, isStatic);
renderChannelGuide(page, apiClient, item);
var taglineElement = page.querySelector(".tagline");
item.Taglines && item.Taglines.length ? (taglineElement.classList.remove("hide"), taglineElement.innerHTML = item.Taglines[0]) : taglineElement.classList.add("hide");
var overview = page.querySelector(".overview"),
externalLinksElem = page.querySelector(".itemExternalLinks");
"Season" !== item.Type && "MusicAlbum" !== item.Type && "MusicArtist" !== item.Type || (overview.classList.add("detailsHiddenOnMobile"), externalLinksElem.classList.add("detailsHiddenOnMobile")), renderOverview([overview], item);
var i, length, itemMiscInfo = page.querySelectorAll(".itemMiscInfo-primary");
for (i = 0, length = itemMiscInfo.length; i < length; i++) mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
interactive: !0,
episodeTitle: !1,
subtitles: !1
}), itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type ? itemMiscInfo[i].classList.remove("hide") : itemMiscInfo[i].classList.add("hide");
for (itemMiscInfo = page.querySelectorAll(".itemMiscInfo-secondary"), i = 0, length = itemMiscInfo.length; i < length; i++) mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
interactive: !0
}), itemMiscInfo[i].innerHTML ? itemMiscInfo[i].classList.remove("hide") : itemMiscInfo[i].classList.add("hide");
reloadUserDataButtons(page, item), renderLinks(externalLinksElem, item), renderTags(page, item), renderSeriesAirTime(page, item, isStatic)
if (item.Taglines && item.Taglines.length) {
taglineElement.classList.remove("hide");
taglineElement.innerHTML = item.Taglines[0];
} else {
taglineElement.classList.add("hide");
}
var overview = page.querySelector(".overview");
var externalLinksElem = page.querySelector(".itemExternalLinks");
if ("Season" !== item.Type && "MusicAlbum" !== item.Type && "MusicArtist" !== item.Type) {
overview.classList.add("detailsHiddenOnMobile");
externalLinksElem.classList.add("detailsHiddenOnMobile");
}
renderOverview([overview], item);
var i, itemMiscInfo;
itemMiscInfo = page.querySelectorAll(".itemMiscInfo-primary");
for (i = 0; i < itemMiscInfo.length; i++) {
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
interactive: !0,
episodeTitle: !1,
subtitles: !1
});
if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) {
itemMiscInfo[i].classList.remove("hide");
} else {
itemMiscInfo[i].classList.add("hide");
}
}
itemMiscInfo = page.querySelectorAll(".itemMiscInfo-secondary")
for (i = 0; i < itemMiscInfo.length; i++) {
mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
interactive: !0
})
if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) {
itemMiscInfo[i].classList.remove("hide");
} else {
itemMiscInfo[i].classList.add("hide");
}
}
reloadUserDataButtons(page, item);
renderLinks(externalLinksElem, item);
renderUserInfo(page, item);
renderTags(page, item);
renderSeriesAirTime(page, item, isStatic)
}
function enableScrollX() {

View file

@ -1,48 +1,61 @@
define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "globalize", "dom", "indicators", "scripts/imagehelper", "cardStyle", "emby-itemrefreshindicator"], function($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) {
define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "globalize", "dom", "indicators", "scripts/imagehelper", "cardStyle", "emby-itemrefreshindicator"], function ($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) {
"use strict";
function addVirtualFolder(page) {
require(["medialibrarycreator"], function(medialibrarycreator) {
(new medialibrarycreator).show({
collectionTypeOptions: getCollectionTypeOptions().filter(function(f) {
require(["medialibrarycreator"], function (medialibrarycreator) {
new medialibrarycreator().show({
collectionTypeOptions: getCollectionTypeOptions().filter(function (f) {
return !f.hidden;
}),
refresh: shouldRefreshLibraryAfterChanges(page)
}).then(function(hasChanges) {
hasChanges && reloadLibrary(page);
})
})
}).then(function (hasChanges) {
if (hasChanges) {
reloadLibrary(page);
}
});
});
}
function editVirtualFolder(page, virtualFolder) {
require(["medialibraryeditor"], function(medialibraryeditor) {
(new medialibraryeditor).show({
require(["medialibraryeditor"], function (medialibraryeditor) {
new medialibraryeditor().show({
refresh: shouldRefreshLibraryAfterChanges(page),
library: virtualFolder
}).then(function(hasChanges) {
hasChanges && reloadLibrary(page);
})
})
}).then(function (hasChanges) {
if (hasChanges) {
reloadLibrary(page);
}
});
});
}
function deleteVirtualFolder(page, virtualFolder) {
var msg = globalize.translate("MessageAreYouSureYouWishToRemoveMediaFolder");
if (virtualFolder.Locations.length) {
msg += "<br/><br/>" + globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "<br/><br/>";
msg += virtualFolder.Locations.join("<br/>");
}
require(["confirm"], function(confirm) {
confirm(msg, globalize.translate("HeaderRemoveMediaFolder")).then(function() {
require(["confirm"], function (confirm) {
confirm({
text: msg,
title: globalize.translate('HeaderRemoveMediaFolder'),
confirmText: globalize.translate('Delete'),
primary: 'delete'
}).then(function () {
var refreshAfterChange = shouldRefreshLibraryAfterChanges(page);
ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function() {
ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function () {
reloadLibrary(page);
})
})
})
});
});
});
}
function refreshVirtualFolder(page, virtualFolder) {
require(["refreshDialog"], function(refreshDialog) {
require(["refreshDialog"], function (refreshDialog) {
new refreshDialog({
itemIds: [virtualFolder.ItemId],
serverId: ApiClient.serverId(),
@ -52,14 +65,14 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
}
function renameVirtualFolder(page, virtualFolder) {
require(["prompt"], function(prompt) {
require(["prompt"], function (prompt) {
prompt({
label: globalize.translate("LabelNewName"),
confirmText: globalize.translate("ButtonRename")
}).then(function(newName) {
}).then(function (newName) {
if (newName && newName != virtualFolder.Name) {
var refreshAfterChange = shouldRefreshLibraryAfterChanges(page);
ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function() {
ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function () {
reloadLibrary(page);
});
}
@ -97,24 +110,29 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
id: "refresh",
ironIcon: "refresh"
});
require(["actionsheet"], function(actionsheet) {
require(["actionsheet"], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: elem,
callback: function(resultId) {
callback: function (resultId) {
switch (resultId) {
case "edit":
editVirtualFolder(page, virtualFolder);
break;
case "editimages":
editImages(page, virtualFolder);
break;
case "rename":
renameVirtualFolder(page, virtualFolder);
break;
case "delete":
deleteVirtualFolder(page, virtualFolder);
break;
case "refresh":
refreshVirtualFolder(page, virtualFolder);
}
@ -125,7 +143,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
function reloadLibrary(page) {
loading.show();
ApiClient.getVirtualFolders().then(function(result) {
ApiClient.getVirtualFolders().then(function (result) {
reloadVirtualFolders(page, result);
});
}
@ -148,36 +166,40 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
for (var i = 0; i < virtualFolders.length; i++) {
var virtualFolder = virtualFolders[i];
html += getVirtualFolderHtml(page, virtualFolder, i)
html += getVirtualFolderHtml(page, virtualFolder, i);
}
var divVirtualFolders = page.querySelector("#divVirtualFolders");
divVirtualFolders.innerHTML = html;
divVirtualFolders.classList.add("itemsContainer");
divVirtualFolders.classList.add("vertical-wrap");
$(".btnCardMenu", divVirtualFolders).on("click", function() {
$(".btnCardMenu", divVirtualFolders).on("click", function () {
showCardMenu(page, this, virtualFolders);
});
divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function() {
divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function () {
addVirtualFolder(page);
});
$(".editLibrary", divVirtualFolders).on("click", function() {
$(".editLibrary", divVirtualFolders).on("click", function () {
var card = $(this).parents(".card")[0];
var index = parseInt(card.getAttribute("data-index"));
var virtualFolder = virtualFolders[index];
virtualFolder.ItemId && editVirtualFolder(page, virtualFolder);
if (virtualFolder.ItemId) {
editVirtualFolder(page, virtualFolder);
}
});
loading.hide();
}
function editImages(page, virtualFolder) {
require(["imageEditor"], function(imageEditor) {
require(["imageEditor"], function (imageEditor) {
imageEditor.show({
itemId: virtualFolder.ItemId,
serverId: ApiClient.serverId()
}).then(function() {
}).then(function () {
reloadLibrary(page);
});
})
});
}
function getLink(text, url) {
@ -214,25 +236,32 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
name: globalize.translate("FolderTypeUnset"),
value: "mixed",
message: globalize.translate("MessageUnsetContentHelp")
}]
}];
}
function getVirtualFolderHtml(page, virtualFolder, index) {
var html = "";
var style = "";
page.classList.contains("wizardPage") && (style += "min-width:33.3%;");
if (page.classList.contains("wizardPage")) {
style += "min-width:33.3%;";
}
html += '<div class="card backdropCard scalableCard backdropCard-scalable" style="' + style + '" data-index="' + index + '" data-id="' + virtualFolder.ItemId + '">';
html += '<div class="cardBox visualCardBox">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="cardPadder cardPadder-backdrop"></div>';
html += '<div class="cardContent">';
var imgUrl = "";
if (virtualFolder.PrimaryImageItemId) {
imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, {
type: "Primary"
});
}
var hasCardImageContainer;
if (imgUrl) {
html += '<div class="cardImageContainer editLibrary" style="cursor:pointer;background-image:url(\'' + imgUrl + "');\">";
hasCardImageContainer = true;
@ -241,38 +270,60 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
html += '<i class="cardImageIcon-small md-icon">' + (virtualFolder.icon || imageHelper.getLibraryIcon(virtualFolder.CollectionType)) + "</i>";
hasCardImageContainer = true;
}
if (hasCardImageContainer) {
html += '<div class="cardIndicators backdropCardIndicators">';
html += '<div is="emby-itemrefreshindicator"' + (virtualFolder.RefreshProgress || virtualFolder.RefreshStatus && "Idle" !== virtualFolder.RefreshStatus ? "" : ' class="hide"') + ' data-progress="' + (virtualFolder.RefreshProgress || 0) + '" data-status="' + virtualFolder.RefreshStatus + '"></div>';
html += "</div>";
html += "</div>";
}
if (!imgUrl && virtualFolder.showNameWithIcon) {
html += '<h3 class="cardImageContainer addLibrary" style="position:absolute;top:0;left:0;right:0;bottom:0;cursor:pointer;flex-direction:column;">';
html += '<i class="cardImageIcon-small md-icon">' + (virtualFolder.icon || imageHelper.getLibraryIcon(virtualFolder.CollectionType)) + "</i>";
virtualFolder.showNameWithIcon && (html += '<div style="margin:1em 0;position:width:100%;">', html += virtualFolder.Name, html += "</div>");
if (virtualFolder.showNameWithIcon) {
html += '<div style="margin:1em 0;position:width:100%;">';
html += virtualFolder.Name;
html += "</div>";
}
html += "</h3>";
}
html += "</div>";
html += "</div>";
html += '<div class="cardFooter visualCardBox-cardFooter">';
// always show menu unless explicitly hidden
html += "</div>";
html += "</div>";
html += '<div class="cardFooter visualCardBox-cardFooter">'; // always show menu unless explicitly hidden
if (virtualFolder.showMenu !== false) {
html += '<div style="text-align:right; float:right;padding-top:5px;">';
html += '<button type="button" is="paper-icon-button-light" class="btnCardMenu autoSize"><i class="md-icon">&#xE5D3;</i></button>';
html += "</div>";
}
html += "<div class='cardText'>";
virtualFolder.showNameWithIcon ? html += "&nbsp;" : html += virtualFolder.Name;
if (virtualFolder.showNameWithIcon) {
html += "&nbsp;";
} else {
html += virtualFolder.Name;
}
html += "</div>";
var typeName = getCollectionTypeOptions().filter(function(t) {
return t.value == virtualFolder.CollectionType
var typeName = getCollectionTypeOptions().filter(function (t) {
return t.value == virtualFolder.CollectionType;
})[0];
typeName = typeName ? typeName.name : globalize.translate("FolderTypeUnset");
html += "<div class='cardText cardText-secondary'>";
virtualFolder.showType === false ? html += "&nbsp;" : html += typeName;
if (virtualFolder.showType === false) {
html += "&nbsp;";
} else {
html += typeName;
}
html += "</div>";
if (virtualFolder.showLocations === false) {
html += "<div class='cardText cardText-secondary'>";
html += "&nbsp;";
@ -286,6 +337,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
html += globalize.translate("NumLocationsValue", virtualFolder.Locations.length);
html += "</div>";
}
html += "</div>";
html += "</div>";
html += "</div>";
@ -305,18 +357,18 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
}, {
href: "metadatanfo.html",
name: globalize.translate("TabNfoSettings")
}]
}];
}
window.WizardLibraryPage = {
next: function() {
Dashboard.navigate("wizardsettings.html")
next: function () {
Dashboard.navigate("wizardsettings.html");
}
};
pageClassOn("pageshow", "mediaLibraryPage", function() {
pageClassOn("pageshow", "mediaLibraryPage", function () {
reloadLibrary(this);
});
pageIdOn("pageshow", "mediaLibraryPage", function() {
pageIdOn("pageshow", "mediaLibraryPage", function () {
libraryMenu.setTabs("librarysetup", 0, getTabs);
var page = this;
taskButton({
@ -326,7 +378,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl
button: page.querySelector(".btnRefresh")
});
});
pageIdOn("pagebeforehide", "mediaLibraryPage", function() {
pageIdOn("pagebeforehide", "mediaLibraryPage", function () {
var page = this;
taskButton({
mode: "off",

View file

@ -140,31 +140,31 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
libraryBrowser.showSortMenu({
items: [{
name: Globalize.translate("OptionNameSort"),
id: "SortName"
id: "SortName,ProductionYear"
}, {
name: Globalize.translate("OptionImdbRating"),
id: "CommunityRating,SortName"
id: "CommunityRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionCriticRating"),
id: "CriticRating,SortName"
id: "CriticRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDateAdded"),
id: "DateCreated,SortName"
id: "DateCreated,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionDatePlayed"),
id: "DatePlayed,SortName"
id: "DatePlayed,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionParentalRating"),
id: "OfficialRating,SortName"
id: "OfficialRating,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionPlayCount"),
id: "PlayCount,SortName"
id: "PlayCount,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionReleaseDate"),
id: "PremiereDate,SortName"
id: "PremiereDate,SortName,ProductionYear"
}, {
name: Globalize.translate("OptionRuntime"),
id: "Runtime,SortName"
id: "Runtime,SortName,ProductionYear"
}],
callback: function() {
query.StartIndex = 0, userSettings.saveQuerySettings(savedQueryKey, query), itemsContainer.refreshItems()
@ -189,7 +189,7 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
savedQueryKey = params.topParentId + "-" + options.mode,
savedViewKey = savedQueryKey + "-view",
query = {
SortBy: "SortName",
SortBy: "SortName,ProductionYear",
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: !0,

View file

@ -13,7 +13,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
}
function loadAuthProviders(page, user, providers) {
providers.length > 1 && !user.Policy.IsAdministrator ? page.querySelector(".fldSelectLoginProvider").classList.remove("hide") : page.querySelector(".fldSelectLoginProvider").classList.add("hide");
providers.length > 1 ? page.querySelector(".fldSelectLoginProvider").classList.remove("hide") : page.querySelector(".fldSelectLoginProvider").classList.add("hide");
var currentProviderId = user.Policy.AuthenticationProviderId;
page.querySelector(".selectLoginProvider").innerHTML = providers.map(function(provider) {
var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : "";
@ -22,11 +22,7 @@ define(["jQuery", "loading", "libraryMenu", "fnchecked"], function($, loading, l
}
function loadPasswordResetProviders(page, user, providers) {
if (providers.length > 1 && !user.Policy.IsAdministrator) {
page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide");
} else {
page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
}
providers.length > 1 ? page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide") : page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide");
var currentProviderId = user.Policy.PasswordResetProviderId;
page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function(provider) {
var selected = (provider.Id === currentProviderId || providers.length < 2) ? " selected" : "";

View file

@ -9,7 +9,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light",
title: globalize.translate("DeleteUser"),
text: msg,
confirmText: globalize.translate("ButtonDelete"),
primary: "cancel"
primary: "delete"
}).then(function () {
loading.show();
ApiClient.deleteUser(id).then(function () {
@ -207,7 +207,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light",
page.querySelector(".pending").innerHTML = users.map(getPendingUserHtml).join("");
}
// TODO cvium: maybe reuse for invitation system
function cancelAuthorization(page, id) {
loading.show();
@ -230,7 +230,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light",
// TODO cvium
renderPendingGuests(page, []);
// ApiClient.getJSON(ApiClient.getUrl("Connect/Pending")).then(function (pending) {
//
//
// });
}