jellyfish-web/src/controllers/medialibrarypage.js

384 lines
14 KiB
JavaScript
Raw Normal View History

2019-09-08 01:11:27 +03:00
define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "globalize", "dom", "indicators", "scripts/imagehelper", "cardStyle", "emby-itemrefreshindicator"], function ($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) {
2018-10-23 01:05:09 +03:00
"use strict";
function addVirtualFolder(page) {
2019-09-08 01:11:27 +03:00
require(["medialibrarycreator"], function (medialibrarycreator) {
new medialibrarycreator().show({
collectionTypeOptions: getCollectionTypeOptions().filter(function (f) {
2019-05-06 17:26:18 -07:00
return !f.hidden;
2018-10-23 01:05:09 +03:00
}),
refresh: shouldRefreshLibraryAfterChanges(page)
2019-09-08 01:11:27 +03:00
}).then(function (hasChanges) {
if (hasChanges) {
reloadLibrary(page);
}
});
});
2018-10-23 01:05:09 +03:00
}
function editVirtualFolder(page, virtualFolder) {
2019-09-08 01:11:27 +03:00
require(["medialibraryeditor"], function (medialibraryeditor) {
new medialibraryeditor().show({
2018-10-23 01:05:09 +03:00
refresh: shouldRefreshLibraryAfterChanges(page),
library: virtualFolder
2019-09-08 01:11:27 +03:00
}).then(function (hasChanges) {
if (hasChanges) {
reloadLibrary(page);
}
});
});
2018-10-23 01:05:09 +03:00
}
function deleteVirtualFolder(page, virtualFolder) {
var msg = globalize.translate("MessageAreYouSureYouWishToRemoveMediaFolder");
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
if (virtualFolder.Locations.length) {
msg += "<br/><br/>" + globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "<br/><br/>";
msg += virtualFolder.Locations.join("<br/>");
}
2019-09-08 01:11:27 +03:00
require(["confirm"], function (confirm) {
confirm(msg, globalize.translate("HeaderRemoveMediaFolder")).then(function () {
2018-10-23 01:05:09 +03:00
var refreshAfterChange = shouldRefreshLibraryAfterChanges(page);
2019-09-08 01:11:27 +03:00
ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function () {
2019-05-06 17:26:18 -07:00
reloadLibrary(page);
2019-09-08 01:11:27 +03:00
});
});
});
2018-10-23 01:05:09 +03:00
}
function refreshVirtualFolder(page, virtualFolder) {
2019-09-08 01:11:27 +03:00
require(["refreshDialog"], function (refreshDialog) {
2018-10-23 01:05:09 +03:00
new refreshDialog({
itemIds: [virtualFolder.ItemId],
serverId: ApiClient.serverId(),
mode: "scan"
2019-05-06 17:26:18 -07:00
}).show();
});
2018-10-23 01:05:09 +03:00
}
function renameVirtualFolder(page, virtualFolder) {
2019-09-08 01:11:27 +03:00
require(["prompt"], function (prompt) {
2018-10-23 01:05:09 +03:00
prompt({
label: globalize.translate("LabelNewName"),
confirmText: globalize.translate("ButtonRename")
2019-09-08 01:11:27 +03:00
}).then(function (newName) {
2018-10-23 01:05:09 +03:00
if (newName && newName != virtualFolder.Name) {
var refreshAfterChange = shouldRefreshLibraryAfterChanges(page);
2019-09-08 01:11:27 +03:00
ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function () {
2019-05-06 17:26:18 -07:00
reloadLibrary(page);
});
2018-10-23 01:05:09 +03:00
}
2019-05-06 17:26:18 -07:00
});
});
2018-10-23 01:05:09 +03:00
}
function showCardMenu(page, elem, virtualFolders) {
2019-05-06 17:26:18 -07:00
var card = dom.parentWithClass(elem, "card");
var index = parseInt(card.getAttribute("data-index"));
var virtualFolder = virtualFolders[index];
var menuItems = [];
menuItems.push({
2018-10-23 01:05:09 +03:00
name: globalize.translate("ButtonEditImages"),
id: "editimages",
ironIcon: "photo"
2019-05-06 17:26:18 -07:00
});
menuItems.push({
2018-10-23 01:05:09 +03:00
name: globalize.translate("ManageLibrary"),
id: "edit",
ironIcon: "folder_open"
2019-05-06 17:26:18 -07:00
});
menuItems.push({
2018-10-23 01:05:09 +03:00
name: globalize.translate("ButtonRemove"),
id: "delete",
ironIcon: "remove"
2019-05-06 17:26:18 -07:00
});
menuItems.push({
2018-10-23 01:05:09 +03:00
name: globalize.translate("ButtonRename"),
id: "rename",
ironIcon: "mode_edit"
2019-05-06 17:26:18 -07:00
});
menuItems.push({
2018-10-23 01:05:09 +03:00
name: globalize.translate("ScanLibrary"),
id: "refresh",
ironIcon: "refresh"
2019-05-06 17:26:18 -07:00
});
2019-09-08 01:11:27 +03:00
require(["actionsheet"], function (actionsheet) {
2018-10-23 01:05:09 +03:00
actionsheet.show({
items: menuItems,
positionTo: elem,
2019-09-08 01:11:27 +03:00
callback: function (resultId) {
2018-10-23 01:05:09 +03:00
switch (resultId) {
case "edit":
editVirtualFolder(page, virtualFolder);
break;
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
case "editimages":
editImages(page, virtualFolder);
break;
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
case "rename":
renameVirtualFolder(page, virtualFolder);
break;
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
case "delete":
deleteVirtualFolder(page, virtualFolder);
break;
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
case "refresh":
2019-05-06 17:26:18 -07:00
refreshVirtualFolder(page, virtualFolder);
2018-10-23 01:05:09 +03:00
}
}
2019-05-06 17:26:18 -07:00
});
});
2018-10-23 01:05:09 +03:00
}
function reloadLibrary(page) {
2019-05-06 17:26:18 -07:00
loading.show();
2019-09-08 01:11:27 +03:00
ApiClient.getVirtualFolders().then(function (result) {
2019-05-06 17:26:18 -07:00
reloadVirtualFolders(page, result);
});
2018-10-23 01:05:09 +03:00
}
function shouldRefreshLibraryAfterChanges(page) {
2019-05-06 17:26:18 -07:00
return "mediaLibraryPage" === page.id;
2018-10-23 01:05:09 +03:00
}
function reloadVirtualFolders(page, virtualFolders) {
var html = "";
virtualFolders.push({
Name: globalize.translate("ButtonAddMediaLibrary"),
icon: "add_circle",
Locations: [],
2019-05-06 19:47:02 -07:00
showType: false,
showLocations: false,
showMenu: false,
showNameWithIcon: true
2018-10-23 01:05:09 +03:00
});
2019-05-06 19:47:02 -07:00
for (var i = 0; i < virtualFolders.length; i++) {
2018-10-23 01:05:09 +03:00
var virtualFolder = virtualFolders[i];
2019-09-08 01:11:27 +03:00
html += getVirtualFolderHtml(page, virtualFolder, i);
2018-10-23 01:05:09 +03:00
}
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
var divVirtualFolders = page.querySelector("#divVirtualFolders");
2019-05-06 17:26:18 -07:00
divVirtualFolders.innerHTML = html;
divVirtualFolders.classList.add("itemsContainer");
divVirtualFolders.classList.add("vertical-wrap");
2019-09-08 01:11:27 +03:00
$(".btnCardMenu", divVirtualFolders).on("click", function () {
2019-05-06 17:26:18 -07:00
showCardMenu(page, this, virtualFolders);
});
2019-09-08 01:11:27 +03:00
divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function () {
2019-05-06 17:26:18 -07:00
addVirtualFolder(page);
});
2019-09-08 01:11:27 +03:00
$(".editLibrary", divVirtualFolders).on("click", function () {
2019-05-06 17:26:18 -07:00
var card = $(this).parents(".card")[0];
var index = parseInt(card.getAttribute("data-index"));
var virtualFolder = virtualFolders[index];
2019-09-08 01:11:27 +03:00
if (virtualFolder.ItemId) {
editVirtualFolder(page, virtualFolder);
}
2019-05-06 17:26:18 -07:00
});
loading.hide();
2018-10-23 01:05:09 +03:00
}
function editImages(page, virtualFolder) {
2019-09-08 01:11:27 +03:00
require(["imageEditor"], function (imageEditor) {
2018-10-23 01:05:09 +03:00
imageEditor.show({
itemId: virtualFolder.ItemId,
serverId: ApiClient.serverId()
2019-09-08 01:11:27 +03:00
}).then(function () {
2019-05-06 17:26:18 -07:00
reloadLibrary(page);
});
2019-09-08 01:11:27 +03:00
});
2018-10-23 01:05:09 +03:00
}
function getLink(text, url) {
2019-05-06 17:26:18 -07:00
return globalize.translate(text, '<a is="emby-linkbutton" class="button-link" href="' + url + '" target="_blank" data-autohide="true">', "</a>");
2018-10-23 01:05:09 +03:00
}
function getCollectionTypeOptions() {
return [{
name: "",
value: ""
}, {
name: globalize.translate("FolderTypeMovies"),
value: "movies",
2019-04-22 09:29:06 -07:00
message: getLink("MovieLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/movies/")
2018-10-23 01:05:09 +03:00
}, {
name: globalize.translate("FolderTypeMusic"),
2019-04-22 09:29:06 -07:00
value: "music",
message: getLink("MovieLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/music/")
2018-10-23 01:05:09 +03:00
}, {
name: globalize.translate("FolderTypeTvShows"),
value: "tvshows",
2019-04-22 09:29:06 -07:00
message: getLink("TvLibraryHelp", "https://jellyfin.readthedocs.io/en/latest/media/shows/")
2018-10-23 01:05:09 +03:00
}, {
name: globalize.translate("FolderTypeBooks"),
value: "books",
message: getLink("BookLibraryHelp", "https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Book-naming")
2018-10-23 01:05:09 +03:00
}, {
name: globalize.translate("OptionHomeVideos"),
value: "homevideos"
}, {
name: globalize.translate("FolderTypeMusicVideos"),
value: "musicvideos"
}, {
name: globalize.translate("FolderTypeUnset"),
value: "mixed",
message: globalize.translate("MessageUnsetContentHelp")
2019-09-08 01:11:27 +03:00
}];
2018-10-23 01:05:09 +03:00
}
function getVirtualFolderHtml(page, virtualFolder, index) {
2019-05-06 17:26:18 -07:00
var html = "";
var style = "";
2019-09-08 01:11:27 +03:00
if (page.classList.contains("wizardPage")) {
style += "min-width:33.3%;";
}
2019-05-06 17:26:18 -07:00
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">';
2018-10-23 01:05:09 +03:00
var imgUrl = "";
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
if (virtualFolder.PrimaryImageItemId) {
imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, {
type: "Primary"
});
}
2019-09-08 01:11:27 +03:00
2018-10-23 01:05:09 +03:00
var hasCardImageContainer;
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
if (imgUrl) {
html += '<div class="cardImageContainer editLibrary" style="cursor:pointer;background-image:url(\'' + imgUrl + "');\">";
hasCardImageContainer = true;
} else if (!virtualFolder.showNameWithIcon) {
html += '<div class="cardImageContainer editLibrary" style="cursor:pointer;">';
html += '<i class="cardImageIcon-small md-icon">' + (virtualFolder.icon || imageHelper.getLibraryIcon(virtualFolder.CollectionType)) + "</i>";
2019-05-06 17:26:18 -07:00
hasCardImageContainer = true;
}
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
if (hasCardImageContainer) {
2018-10-23 01:05:09 +03:00
html += '<div class="cardIndicators backdropCardIndicators">';
2019-05-06 17:26:18 -07:00
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>";
2018-10-23 01:05:09 +03:00
}
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
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>";
2019-09-08 01:11:27 +03:00
if (virtualFolder.showNameWithIcon) {
html += '<div style="margin:1em 0;position:width:100%;">';
html += virtualFolder.Name;
html += "</div>";
}
2019-05-06 17:26:18 -07:00
html += "</h3>";
2018-10-23 01:05:09 +03:00
}
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
html += "</div>";
html += "</div>";
2019-09-08 01:11:27 +03:00
html += '<div class="cardFooter visualCardBox-cardFooter">'; // always show menu unless explicitly hidden
if (virtualFolder.showMenu !== false) {
2019-05-06 17:26:18 -07:00
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>";
}
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
html += "<div class='cardText'>";
2019-09-08 01:11:27 +03:00
if (virtualFolder.showNameWithIcon) {
html += "&nbsp;";
} else {
html += virtualFolder.Name;
}
2019-05-06 17:26:18 -07:00
html += "</div>";
2019-09-08 01:11:27 +03:00
var typeName = getCollectionTypeOptions().filter(function (t) {
return t.value == virtualFolder.CollectionType;
2018-10-23 01:05:09 +03:00
})[0];
2019-05-06 17:26:18 -07:00
typeName = typeName ? typeName.name : globalize.translate("FolderTypeUnset");
html += "<div class='cardText cardText-secondary'>";
2019-09-08 01:11:27 +03:00
if (virtualFolder.showType === false) {
html += "&nbsp;";
} else {
html += typeName;
}
2019-05-06 17:26:18 -07:00
html += "</div>";
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
if (virtualFolder.showLocations === false) {
html += "<div class='cardText cardText-secondary'>";
html += "&nbsp;";
html += "</div>";
} else if (virtualFolder.Locations.length && virtualFolder.Locations.length === 1) {
2019-05-16 01:54:01 +03:00
html += "<div class='cardText cardText-secondary'>";
html += virtualFolder.Locations[0];
html += "</div>";
2019-05-06 17:26:18 -07:00
} else {
html += "<div class='cardText cardText-secondary'>";
html += globalize.translate("NumLocationsValue", virtualFolder.Locations.length);
html += "</div>";
}
2019-09-08 01:11:27 +03:00
2019-05-06 17:26:18 -07:00
html += "</div>";
html += "</div>";
html += "</div>";
return html;
2018-10-23 01:05:09 +03:00
}
function getTabs() {
return [{
href: "library.html",
name: globalize.translate("HeaderLibraries")
}, {
href: "librarydisplay.html",
name: globalize.translate("TabDisplay")
}, {
href: "metadataimages.html",
name: globalize.translate("TabMetadata")
}, {
href: "metadatanfo.html",
name: globalize.translate("TabNfoSettings")
2019-09-08 01:11:27 +03:00
}];
2018-10-23 01:05:09 +03:00
}
2019-06-10 14:44:52 -07:00
2018-10-23 01:05:09 +03:00
window.WizardLibraryPage = {
2019-09-08 01:11:27 +03:00
next: function () {
Dashboard.navigate("wizardsettings.html");
2018-10-23 01:05:09 +03:00
}
2019-05-06 17:26:18 -07:00
};
2019-09-08 01:11:27 +03:00
pageClassOn("pageshow", "mediaLibraryPage", function () {
2019-05-06 17:26:18 -07:00
reloadLibrary(this);
});
2019-09-08 01:11:27 +03:00
pageIdOn("pageshow", "mediaLibraryPage", function () {
2018-10-23 01:05:09 +03:00
libraryMenu.setTabs("librarysetup", 0, getTabs);
var page = this;
taskButton({
mode: "on",
progressElem: page.querySelector(".refreshProgress"),
taskKey: "RefreshLibrary",
button: page.querySelector(".btnRefresh")
2019-05-06 17:26:18 -07:00
});
});
2019-09-08 01:11:27 +03:00
pageIdOn("pagebeforehide", "mediaLibraryPage", function () {
2018-10-23 01:05:09 +03:00
var page = this;
taskButton({
mode: "off",
progressElem: page.querySelector(".refreshProgress"),
taskKey: "RefreshLibrary",
button: page.querySelector(".btnRefresh")
2019-05-06 17:26:18 -07:00
});
});
2019-01-27 22:10:07 +01:00
});