diff --git a/src/css/metadataeditor.css b/src/css/metadataeditor.css index abc5668b24..542c7c8f2b 100644 --- a/src/css/metadataeditor.css +++ b/src/css/metadataeditor.css @@ -47,6 +47,10 @@ background: #00a4dc !important } +.metadataSidebarIcon { + margin-right: .4em +} + @media all and (min-width:50em) { .editPageSidebar { position: fixed; @@ -72,4 +76,4 @@ .editPageInnerContent { width: 73.5% } -} \ No newline at end of file +} diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index e39fc23a21..0477dedcfc 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -1,4 +1,4 @@ -define(["datetime", "jQuery", "material-icons"], function(datetime, $) { +define(["datetime", "jQuery", "material-icons"], function (datetime, $) { "use strict"; function getNode(item, folderState, selected) { @@ -7,7 +7,7 @@ define(["datetime", "jQuery", "material-icons"], function(datetime, $) { id: item.Id, text: htmlName, state: { - opened: item.IsFolder && "open" == folderState, + opened: item.IsFolder && folderState == "open", selected: selected }, li_attr: { @@ -15,211 +15,324 @@ define(["datetime", "jQuery", "material-icons"], function(datetime, $) { collectiontype: item.CollectionType } }; - return item.IsFolder ? (node.children = [{ - text: "Loading...", - icon: !1 - }], node.icon = !1) : node.icon = !1, node.state.opened && (node.li_attr.loadedFromServer = !0), selected && (selectedNodeId = item.Id), node + if (item.IsFolder) { + node.children = [{ + text: "Loading...", + icon: false + }]; + node.icon = false; + } else { + node.icon = false; + } + if (node.state.opened) { + node.li_attr.loadedFromServer = true; + } + if (selected) { + selectedNodeId = item.Id; + } + return node; } function getNodeInnerHtml(item) { var name = item.Name; - item.Number && (name = item.Number + " - " + name), null != item.IndexNumber && "Season" != item.Type && (name = item.IndexNumber + " - " + name); + if (item.Number) { + name = item.Number + " - " + name; + } + if (item.IndexNumber != null && item.Type != "Season") { + name = item.IndexNumber + " - " + name; + } var htmlName = "
"; - return item.LockData && (htmlName += 'lock'), htmlName += name, htmlName += "
" + if (item.IsFolder) { + htmlName += 'folder'; + } + else if (item.MediaType === "Video") { + htmlName += 'movie'; + } + else if (item.MediaType === "Audio") { + htmlName += 'audiotrack'; + } + else if (item.Type === "TvChannel") { + htmlName += 'live_tv'; + } + else if (item.MediaType === "Photo") { + htmlName += 'photo'; + } + else if (item.MediaType === "Book") { + htmlName += 'book'; + } + if (item.LockData) { + htmlName += 'lock'; + } + htmlName += name; + htmlName += ""; + return htmlName; } function loadChildrenOfRootNode(page, scope, callback) { ApiClient.getLiveTvChannels({ limit: 0 - }).then(function(result) { + }).then(function (result) { var nodes = []; nodes.push({ id: "MediaFolders", text: Globalize.translate("HeaderMediaFolders"), state: { - opened: !0 + opened: true }, li_attr: { itemtype: "mediafolders", - loadedFromServer: !0 + loadedFromServer: true }, - icon: !1 - }), result.TotalRecordCount && nodes.push({ - id: "livetv", - text: Globalize.translate("HeaderLiveTV"), - state: { - opened: !1 - }, - li_attr: { - itemtype: "livetv" - }, - children: [{ - text: "Loading...", - icon: !1 - }], - icon: !1 - }), callback.call(scope, nodes), nodesToLoad.push("MediaFolders") - }) + icon: false + }); + if (result.TotalRecordCount) { + nodes.push({ + id: "livetv", + text: Globalize.translate("HeaderLiveTV"), + state: { + opened: false + }, + li_attr: { + itemtype: "livetv" + }, + children: [{ + text: "Loading...", + icon: false + }], + icon: false + }); + } + callback.call(scope, nodes); + nodesToLoad.push("MediaFolders"); + }); } function loadLiveTvChannels(openItems, callback) { ApiClient.getLiveTvChannels({ - AddCurrentProgram: !1 - }).then(function(result) { - var nodes = result.Items.map(function(i) { - return getNode(i, -1 == openItems.indexOf(i.Id) ? "closed" : "open", !1) + AddCurrentProgram: false + }).then(function (result) { + var nodes = result.Items.map(function (i) { + var state = openItems.indexOf(i.Id) == -1 ? "closed" : "open"; + return getNode(i, state, false); }); - callback(nodes) - }) + callback(nodes); + }); } function loadMediaFolders(page, scope, openItems, callback) { - ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function(result) { - var nodes = result.Items.map(function(n) { - return getNode(n, -1 == openItems.indexOf(n.Id) ? "closed" : "open", !1) + ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function (result) { + var nodes = result.Items.map(function (n) { + var state = openItems.indexOf(n.Id) == -1 ? "closed" : "open"; + return getNode(n, state, false); }); callback.call(scope, nodes); - for (var i = 0, length = nodes.length; i < length; i++) nodes[i].state.opened && nodesToLoad.push(nodes[i].id) - }) + for (var i = 0, length = nodes.length; i < length; i++) { + if (nodes[i].state.opened) { + nodesToLoad.push(nodes[i].id); + } + } + }); } function loadNode(page, scope, node, openItems, selectedId, currentUser, callback) { var id = node.id; - if ("#" == id) return void loadChildrenOfRootNode(page, scope, callback); - if ("livetv" == id) return void loadLiveTvChannels(openItems, callback); - if ("MediaFolders" == id) return void loadMediaFolders(page, scope, openItems, callback); + if (id == "#") { + loadChildrenOfRootNode(page, scope, callback); + return; + } + if (id == "livetv") { + loadLiveTvChannels(id, openItems, callback); + return; + } + if (id == "MediaFolders") { + loadMediaFolders(page, scope, openItems, callback); + return; + } var query = { - ParentId: id, - Fields: "Settings", - IsVirtualUnaired: !1, - IsMissing: !1, - EnableTotalRecordCount: !1, - EnableImages: !1, - EnableUserData: !1 - }, - itemtype = node.li_attr.itemtype; - "Season" != itemtype && "Series" != itemtype && (query.SortBy = "SortName"), ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) { - var nodes = result.Items.map(function(n) { - return getNode(n, -1 == openItems.indexOf(n.Id) ? "closed" : "open", n.Id == selectedId) + ParentId: id, + Fields: "Settings", + IsVirtualUnaired: false, + IsMissing: false, + EnableTotalRecordCount: false, + EnableImages: false, + EnableUserData: false + }; + var itemtype = node.li_attr.itemtype; + if (itemtype != "Season" && itemtype != "Series") { + query.SortBy = "SortName"; + } + ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { + var nodes = result.Items.map(function (n) { + var state = openItems.indexOf(n.Id) == -1 ? "closed" : "open"; + return getNode(n, state, n.Id == selectedId); }); callback.call(scope, nodes); - for (var i = 0, length = nodes.length; i < length; i++) nodes[i].state.opened && nodesToLoad.push(nodes[i].id) - }) + for (var i = 0, length = nodes.length; i < length; i++) { + if (nodes[i].state.opened) { + nodesToLoad.push(nodes[i].id); + } + } + }); } function scrollToNode(id) { var elem = $("#" + id)[0]; - elem && elem.scrollIntoView() + if (elem) { + elem.scrollIntoView(); + } } function initializeTree(page, currentUser, openItems, selectedId) { - require(["jstree"], function() { - initializeTreeInternal(page, currentUser, openItems, selectedId) - }) + require(["jstree"], function () { + initializeTreeInternal(page, currentUser, openItems, selectedId); + }); } function onNodeSelect(event, data) { - var node = data.node, - eventData = { - id: node.id, - itemType: node.li_attr.itemtype, - serverItemType: node.li_attr.serveritemtype, - collectionType: node.li_attr.collectiontype - }; - "livetv" != eventData.itemType && "mediafolders" != eventData.itemType ? (this.dispatchEvent(new CustomEvent("itemclicked", { - detail: eventData, - bubbles: !0, - cancelable: !1 - })), document.querySelector(".editPageSidebar").classList.add("editPageSidebar-withcontent")) : document.querySelector(".editPageSidebar").classList.remove("editPageSidebar-withcontent") + var node = data.node; + var eventData = { + id: node.id, + itemType: node.li_attr.itemtype, + serverItemType: node.li_attr.serveritemtype, + collectionType: node.li_attr.collectiontype + }; + if (eventData.itemType != "livetv" && eventData.itemType != "mediafolders") { + { + this.dispatchEvent(new CustomEvent("itemclicked", { + detail: eventData, + bubbles: true, + cancelable: false + })); + } + document.querySelector(".editPageSidebar").classList.add("editPageSidebar-withcontent"); + } else { + document.querySelector(".editPageSidebar").classList.remove("editPageSidebar-withcontent"); + } } function onNodeOpen(event, data) { - var page = $(this).parents(".page")[0], - node = data.node; - node.children && node.children && loadNodesToLoad(page, node), node.li_attr && "#" != node.id && !node.li_attr.loadedFromServer && (node.li_attr.loadedFromServer = !0, $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback)) + var page = $(this).parents(".page")[0]; + var node = data.node; + if (node.children && node.children) { + loadNodesToLoad(page, node); + } + if (node.li_attr && node.id != "#" && !node.li_attr.loadedFromServer) { + node.li_attr.loadedFromServer = true; + $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); + } } function onNodeLoad(event, data) { - var page = $(this).parents(".page")[0], - node = data.node; - node.children && node.children && loadNodesToLoad(page, node), node.li_attr && "#" != node.id && !node.li_attr.loadedFromServer && (node.li_attr.loadedFromServer = !0, $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback)) + var page = $(this).parents(".page")[0]; + var node = data.node; + if (node.children && node.children) { + loadNodesToLoad(page, node); + } + if (node.li_attr && node.id != "#" && !node.li_attr.loadedFromServer) { + node.li_attr.loadedFromServer = true; + $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); + } } function initializeTreeInternal(page, currentUser, openItems, selectedId) { - nodesToLoad = [], selectedNodeId = null, $.jstree.destroy(), $(".libraryTree", page).jstree({ - plugins: ["wholerow"], + nodesToLoad = []; + selectedNodeId = null; + $.jstree.destroy(); + $(".libraryTree", page).jstree({ + "plugins": ["wholerow"], core: { - // Disable animations because jQuery slim does not support them - animation: false, check_callback: true, - data: function(node, callback) { - loadNode(page, this, node, openItems, selectedId, currentUser, callback) + data: function (node, callback) { + loadNode(page, this, node, openItems, selectedId, currentUser, callback); }, themes: { variant: "large" } } - }).off("select_node.jstree", onNodeSelect).on("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).on("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad).on("load_node.jstree", onNodeLoad) + }).off("select_node.jstree", onNodeSelect).on("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).on("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad).on("load_node.jstree", onNodeLoad); } function loadNodesToLoad(page, node) { - for (var children = node.children, i = 0, length = children.length; i < length; i++) { - var child = children[i]; - 1 != nodesToLoad.indexOf(child) && (nodesToLoad = nodesToLoad.filter(function(n) { - return n != child - }), $.jstree.reference(".libraryTree", page).load_node(child, loadNodeCallback)) + var children = node.children; + for (var i = 0, length = children.length; i < length; i++) { + var child = children[i]; + if (nodesToLoad.indexOf(child) != -1) { + nodesToLoad = nodesToLoad.filter(function (n) { + return n != child; + }); + $.jstree.reference(".libraryTree", page).load_node(child, loadNodeCallback); + } } } function loadNodeCallback(node) { - selectedNodeId && node.children && -1 != node.children.indexOf(selectedNodeId) && setTimeout(function() { - scrollToNode(selectedNodeId) - }, 500) + if (selectedNodeId && node.children && node.children.indexOf(selectedNodeId) != -1) { + setTimeout(function () { + scrollToNode(selectedNodeId); + }, 500); + } } function updateEditorNode(page, item) { var elem = $("#" + item.Id + ">a", page)[0]; - if (null != elem && ($(".editorNode", elem).remove(), $(elem).append(getNodeInnerHtml(item)), item.IsFolder)) { - var tree = jQuery.jstree._reference(".libraryTree"), - currentNode = tree._get_node(null, !1); - tree.refresh(currentNode) + if (elem == null) { + return; + } + $(".editorNode", elem).remove(); + $(elem).append(getNodeInnerHtml(item)); + if (item.IsFolder) { + var tree = jQuery.jstree._reference(".libraryTree"); + var currentNode = tree._get_node(null, false); + tree.refresh(currentNode); } } function setCurrentItemId(id) { - itemId = id + itemId = id; } function getCurrentItemId() { - if (itemId) return itemId; + if (itemId) { + return itemId; + } var url = window.location.hash || window.location.href; - return getParameterByName("id", url) + return getParameterByName("id", url); } - var selectedNodeId, nodesToLoad = []; - $(document).on("itemsaved", ".metadataEditorPage", function(e, item) { - updateEditorNode(this, item) - }).on("pagebeforeshow", ".metadataEditorPage", function() { - require(["css!css/metadataeditor.css"]) - }).on("pagebeforeshow", ".metadataEditorPage", function() { + var nodesToLoad = []; + var selectedNodeId; + $(document).on("itemsaved", ".metadataEditorPage", function (e, item) { + updateEditorNode(this, item); + }).on("pagebeforeshow", ".metadataEditorPage", function () { + require(["css!css/metadataeditor.css"]); + }).on("pagebeforeshow", ".metadataEditorPage", function () { var page = this; - Dashboard.getCurrentUser().then(function(user) { + Dashboard.getCurrentUser().then(function (user) { var id = getCurrentItemId(); - id ? ApiClient.getAncestorItems(id, user.Id).then(function(ancestors) { - var ids = ancestors.map(function(i) { - return i.Id + if (id) { + ApiClient.getAncestorItems(id, user.Id).then(function (ancestors) { + var ids = ancestors.map(function (i) { + return i.Id; + }); + initializeTree(page, user, ids, id); }); - initializeTree(page, user, ids, id) - }) : initializeTree(page, user, []) - }) - }).on("pagebeforehide", ".metadataEditorPage", function() { - $(".libraryTree", this).off("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad) + } else { + initializeTree(page, user, []); + } + }); + }).on("pagebeforehide", ".metadataEditorPage", function () { + var page = this; + $(".libraryTree", page).off("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad); }); var itemId; window.MetadataEditor = { - getItemPromise: function() { + getItemPromise: function () { var currentItemId = getCurrentItemId(); - return currentItemId ? ApiClient.getItem(Dashboard.getCurrentUserId(), currentItemId) : ApiClient.getRootFolder(Dashboard.getCurrentUserId()) + if (currentItemId) { + return ApiClient.getItem(Dashboard.getCurrentUserId(), currentItemId); + } + return ApiClient.getRootFolder(Dashboard.getCurrentUserId()); }, getCurrentItemId: getCurrentItemId, setCurrentItemId: setCurrentItemId - } + }; });