mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update to jstree 3.0.8
This commit is contained in:
parent
db0f911a4d
commit
8a641ab831
253 changed files with 9495 additions and 8128 deletions
|
@ -1,14 +1,38 @@
|
|||
(function ($, document, window) {
|
||||
|
||||
function getNode(item, folderState) {
|
||||
|
||||
var state = item.IsFolder ? folderState : '';
|
||||
function getNode(item, folderState, selected) {
|
||||
|
||||
var htmlName = getNodeInnerHtml(item);
|
||||
|
||||
var rel = item.IsFolder ? 'folder' : 'default';
|
||||
var node = {
|
||||
id: item.Id,
|
||||
text: htmlName,
|
||||
|
||||
return { attr: { id: item.Id, rel: rel, itemtype: item.Type }, data: htmlName, state: state };
|
||||
state: {
|
||||
opened: item.IsFolder && folderState == 'open',
|
||||
selected: selected
|
||||
},
|
||||
|
||||
li_attr: {}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
function getNodeInnerHtml(item) {
|
||||
|
@ -74,7 +98,7 @@
|
|||
return htmlName;
|
||||
}
|
||||
|
||||
function loadChildrenOfRootNode(page, callback, openItems, selectedId) {
|
||||
function loadChildrenOfRootNode(page, scope, callback) {
|
||||
|
||||
var promise2 = ApiClient.getLiveTvChannels({ limit: 0 });
|
||||
|
||||
|
@ -84,22 +108,51 @@
|
|||
|
||||
var nodes = [];
|
||||
|
||||
nodes.push({ attr: { id: 'MediaFolders', rel: 'folder', itemtype: 'mediafolders' }, data: Globalize.translate('HeaderMediaFolders'), state: 'open' });
|
||||
nodes.push({
|
||||
|
||||
id: 'MediaFolders',
|
||||
text: Globalize.translate('HeaderMediaFolders'),
|
||||
state: {
|
||||
opened: true
|
||||
},
|
||||
li_attr: {
|
||||
itemtype: 'mediafolders',
|
||||
loadedFromServer: true
|
||||
},
|
||||
children: [
|
||||
{
|
||||
text: 'Loading...',
|
||||
icon: false
|
||||
}],
|
||||
icon: false
|
||||
});
|
||||
|
||||
if (result.TotalRecordCount) {
|
||||
nodes.push({ attr: { id: 'livetv', rel: 'folder', itemtype: 'livetv' }, data: Globalize.translate('HeaderLiveTV'), state: 'closed' });
|
||||
|
||||
nodes.push({
|
||||
|
||||
id: 'livetv',
|
||||
text: Globalize.translate('HeaderLiveTV'),
|
||||
state: {
|
||||
opened: false
|
||||
},
|
||||
li_attr: {
|
||||
itemtype: 'livetv'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
text: 'Loading...',
|
||||
icon: false
|
||||
}],
|
||||
icon: false
|
||||
});
|
||||
}
|
||||
|
||||
callback(nodes);
|
||||
callback.call(scope, nodes);
|
||||
|
||||
if (selectedId && nodes.filter(function (f) {
|
||||
|
||||
return f.attr.id == selectedId;
|
||||
|
||||
}).length) {
|
||||
|
||||
selectNode(page, selectedId);
|
||||
}
|
||||
setTimeout(function () {
|
||||
$.jstree.reference(".libraryTree", page).load_node('MediaFolders');
|
||||
}, 300);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -111,7 +164,7 @@
|
|||
|
||||
var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open';
|
||||
|
||||
return getNode(i, state);
|
||||
return getNode(i, state, false);
|
||||
|
||||
});
|
||||
|
||||
|
@ -121,45 +174,60 @@
|
|||
|
||||
}
|
||||
|
||||
function loadMediaFolders(service, openItems, callback) {
|
||||
function loadMediaFolders(page, openItems, callback) {
|
||||
|
||||
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).done(function (result) {
|
||||
|
||||
var nodes = result.Items.map(function (i) {
|
||||
var nodes = result.Items.map(function (n) {
|
||||
|
||||
var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open';
|
||||
var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open';
|
||||
|
||||
return getNode(i, state);
|
||||
return getNode(n, state, false);
|
||||
|
||||
});
|
||||
|
||||
callback(nodes);
|
||||
|
||||
for (var i = 0, length = nodes.length; i < length; i++) {
|
||||
if (nodes[i].state.opened) {
|
||||
|
||||
var nodeId = nodes[i].id;
|
||||
setTimeout(function () {
|
||||
$.jstree.reference(".libraryTree", page).load_node(nodeId);
|
||||
}, 300);
|
||||
}
|
||||
|
||||
if (nodes[i].state.selected) {
|
||||
var scrollNodeId = nodes[i].id;
|
||||
setTimeout(function () {
|
||||
scrollToNode(page, scrollNodeId);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function loadNode(page, node, openItems, selectedId, currentUser, callback) {
|
||||
function loadNode(page, scope, node, openItems, selectedId, currentUser, callback) {
|
||||
|
||||
if (node == '-1') {
|
||||
var id = node.id;
|
||||
|
||||
loadChildrenOfRootNode(page, callback, openItems, selectedId);
|
||||
if (id == '#') {
|
||||
|
||||
loadChildrenOfRootNode(page, scope, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
var id = node.attr("id");
|
||||
|
||||
var itemtype = node.attr("itemtype");
|
||||
|
||||
if (itemtype == 'livetv') {
|
||||
if (id == 'livetv') {
|
||||
|
||||
loadLiveTvChannels(id, openItems, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
if (itemtype == 'mediafolders') {
|
||||
if (id == 'MediaFolders') {
|
||||
|
||||
loadMediaFolders(id, openItems, callback);
|
||||
loadMediaFolders(page, openItems, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -168,41 +236,49 @@
|
|||
Fields: 'Settings'
|
||||
};
|
||||
|
||||
var itemtype = node.li_attr.itemtype;
|
||||
|
||||
if (itemtype != "Season" && itemtype != "Series") {
|
||||
query.SortBy = "SortName";
|
||||
}
|
||||
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).done(function (result) {
|
||||
|
||||
var nodes = result.Items.map(function (i) {
|
||||
var nodes = result.Items.map(function (n) {
|
||||
|
||||
var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open';
|
||||
var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open';
|
||||
|
||||
return getNode(i, state);
|
||||
return getNode(n, state, n.Id == selectedId);
|
||||
|
||||
});
|
||||
|
||||
callback(nodes);
|
||||
callback.call(scope, nodes);
|
||||
|
||||
if (selectedId && result.Items.filter(function (f) {
|
||||
for (var i = 0, length = nodes.length; i < length; i++) {
|
||||
if (nodes[i].state.opened) {
|
||||
|
||||
return f.Id == selectedId;
|
||||
var nodeId = nodes[i].id;
|
||||
setTimeout(function () {
|
||||
$.jstree.reference(".libraryTree", page).load_node(nodeId);
|
||||
}, 300);
|
||||
}
|
||||
|
||||
}).length) {
|
||||
|
||||
selectNode(page, selectedId);
|
||||
if (nodes[i].state.selected) {
|
||||
var scrollNodeId = nodes[i].id;
|
||||
setTimeout(function () {
|
||||
scrollToNode(page, scrollNodeId);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function selectNode(page, id) {
|
||||
function scrollToNode(page, id) {
|
||||
|
||||
var elem = $('#' + id, page)[0];
|
||||
|
||||
$.jstree._reference(".libraryTree", page).select_node(elem);
|
||||
|
||||
if (elem) {
|
||||
elem.scrollIntoView();
|
||||
}
|
||||
|
@ -214,39 +290,47 @@
|
|||
|
||||
$('.libraryTree', page).jstree({
|
||||
|
||||
"plugins": ["themes", "ui", "json_data"],
|
||||
"plugins": ["wholerow"],
|
||||
|
||||
data: function (node, callback) {
|
||||
loadNode(page, node, openItems, selectedId, currentUser, callback);
|
||||
},
|
||||
|
||||
json_data: {
|
||||
core: {
|
||||
|
||||
check_callback: true,
|
||||
data: function (node, callback) {
|
||||
loadNode(page, node, openItems, selectedId, currentUser, callback);
|
||||
|
||||
loadNode(page, this, node, openItems, selectedId, currentUser, callback);
|
||||
},
|
||||
|
||||
themes: {
|
||||
variant: 'large'
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
core: { initially_open: [], load_open: true, html_titles: true },
|
||||
ui: { initially_select: [] },
|
||||
|
||||
themes: {
|
||||
theme: 'mb3',
|
||||
url: 'thirdparty/jstree1.0/themes/mb3/style.css?v=' + Dashboard.initialServerVersion
|
||||
}
|
||||
|
||||
}).off('select_node.jstree').on('select_node.jstree', function (event, data) {
|
||||
|
||||
var node = data.node;
|
||||
|
||||
var eventData = {
|
||||
id: data.rslt.obj.attr("id"),
|
||||
itemType: data.rslt.obj.attr("itemtype")
|
||||
id: node.id,
|
||||
itemType: node.li_attr.itemtype
|
||||
};
|
||||
|
||||
if (eventData.itemType != 'livetv' && eventData.itemType != 'mediafolders') {
|
||||
$(this).trigger('itemclicked', [eventData]);
|
||||
}
|
||||
|
||||
}).off('open_node.jstree').on('open_node.jstree', function (event, data) {
|
||||
|
||||
var node = data.node;
|
||||
|
||||
if (!node.li_attr.loadedFromServer) {
|
||||
|
||||
node.li_attr.loadedFromServer = true;
|
||||
|
||||
setTimeout(function () {
|
||||
$.jstree.reference(".libraryTree", page).load_node(node.id);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue