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

added metadata editor sidebar

This commit is contained in:
Luke Pulverenti 2013-08-02 16:36:44 -04:00
parent 3945e0e9f4
commit 0dc7a2177e
34 changed files with 5572 additions and 342 deletions

View file

@ -3,65 +3,30 @@
var currentItem;
var currentFile;
function getPromise() {
function updateTabs(page, item) {
var name = getParameterByName('person');
var query = MetadataEditor.getEditQueryString(item);
if (name) {
return ApiClient.getPerson(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('studio');
if (name) {
return ApiClient.getStudio(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('genre');
if (name) {
return ApiClient.getGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('musicgenre');
if (name) {
return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('gamegenre');
if (name) {
return ApiClient.getGameGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('artist');
if (name) {
return ApiClient.getArtist(name, Dashboard.getCurrentUserId());
}
else {
return ApiClient.getItem(Dashboard.getCurrentUserId(), getParameterByName('id'));
}
$('#btnEditPeople', page).attr('href', 'edititempeople.html?' + query);
$('#btnEditMetadata', page).attr('href', 'edititemmetadata.html?' + query);
}
function reload(page) {
Dashboard.showLoadingMsg();
getPromise().done(function (item) {
MetadataEditor.getItemPromise().done(function (item) {
currentItem = item;
LibraryBrowser.renderName(item, $('.itemName', page), true);
LibraryBrowser.renderParentName(item, $('.parentName', page));
updateTabs(page, item);
if (item.Type == "Person" || item.Type == "Studio" || item.Type == "MusicGenre" || item.Type == "Genre" || item.Type == "Artist" || item.Type == "GameGenre") {
$('#peopleTab', page).hide();
$('#btnEditPeople', page).hide();
} else {
$('#peopleTab', page).show();
$('#btnEditPeople', page).show();
}
ApiClient.getItemImageInfos(currentItem.Id).done(function (imageInfos) {
@ -305,6 +270,22 @@
var page = this;
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.id != currentItem.Id) {
MetadataEditor.currentItemId = data.id;
MetadataEditor.currentItemName = data.itemName;
MetadataEditor.currentItemType = data.itemType;
//Dashboard.navigate('edititemmetadata.html?id=' + data.id);
$.mobile.urlHistory.ignoreNextHashChange = true;
window.location.hash = 'editItemImagesPage?id=' + data.id;
reload(page);
}
});
}).on('pageshow', "#editItemImagesPage", function () {
var page = this;

View file

@ -1,62 +1,303 @@
(function ($, document, window) {
function getNode(item, folderState) {
var state = item.IsFolder ? folderState : '';
var name = item.Name;
if (item.IndexNumber != null && item.Type != "Season") {
name = item.IndexNumber + " - " + name;
}
var rel = item.IsFolder ? 'folder' : 'default';
return { attr: { id: item.Id, rel: rel, itemtype: item.Type }, data: name, state: state };
}
function loadNode(page, node, openItems, selectedId, callback) {
if (node == '-1') {
ApiClient.getRootFolder(Dashboard.getCurrentUserId()).done(function (folder) {
callback(getNode(folder, 'open'));
});
return;
}
ApiClient.getItems(Dashboard.getCurrentUserId(), {
ParentId: node.attr("id"),
SortBy: 'SortName'
}).done(function (result) {
var nodes = result.Items.map(function (i) {
var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open';
return getNode(i, state);
});
callback(nodes);
if (selectedId && result.Items.filter(function (f) {
return f.Id == selectedId;
}).length) {
selectNode(page, selectedId);
}
});
}
function selectNode(page, id) {
var elem = $('#' + id, page)[0];
$.jstree._reference(".libraryTree", page).select_node(elem);
if (elem) {
elem.scrollIntoView();
var sidebar = $('.editPageSidebar', page);
sidebar.scrollTop(sidebar.scrollTop() - sidebar.height() / 3);
}
$(document).scrollTop(0);
}
function initializeTree(page, openItems, selectedId) {
$('.libraryTree', page).jstree({
"plugins": ["themes", "ui", "json_data"],
data: function (node, callback) {
loadNode(page, node, openItems, selectedId, callback);
},
json_data: {
data: function (node, callback) {
loadNode(page, node, openItems, selectedId, callback);
}
},
core: { initially_open: [], load_open: true },
ui: { initially_select: [] },
themes: {
theme: 'mb3',
url: 'thirdparty/jstree1.0fix2/themes/mb3/style.css?v=' + Dashboard.initialServerVersion
}
}).off('select_node.jstree').on('select_node.jstree', function (event, data) {
var eventData = {
id: data.rslt.obj.attr("id"),
itemType: data.rslt.obj.attr("itemtype")
};
$(this).trigger('itemclicked', [eventData]);
});
}
$(document).on('pagebeforeshow', ".metadataEditorPage", function () {
window.MetadataEditor = new metadataEditor();
var page = this;
var id = MetadataEditor.currentItemId;
if (id) {
$.getJSON(ApiClient.getUrl("Items/" + id + "/Ancestors", {
userId: Dashboard.getCurrentUserId()
})).done(function (ancestors) {
var ids = ancestors.map(function (i) {
return i.Id;
});
initializeTree(page, ids, id);
});
} else {
initializeTree(page, []);
}
}).on('pagebeforehide', ".metadataEditorPage", function () {
var page = this;
$('.libraryTree', page).off('select_node.jstree');
});
function metadataEditor() {
var self = this;
function ensureInitialValues() {
if (self.currentItemType || self.currentItemName || self.currentItemId) {
return;
}
var url = window.location.hash || window.location.toString();
var name = getParameterByName('person', url);
if (name) {
self.currentItemType = "Person";
self.currentItemName = name;
return;
}
name = getParameterByName('studio', url);
if (name) {
self.currentItemType = "Studio";
self.currentItemName = name;
return;
}
name = getParameterByName('genre', url);
if (name) {
self.currentItemType = "Genre";
self.currentItemName = name;
return;
}
name = getParameterByName('musicgenre', url);
if (name) {
self.currentItemType = "MusicGenre";
self.currentItemName = name;
return;
}
name = getParameterByName('gamegenre', url);
if (name) {
self.currentItemType = "GameGenre";
self.currentItemName = name;
return;
}
name = getParameterByName('artist', url);
if (name) {
self.currentItemType = "Artist";
self.currentItemName = name;
return;
}
var id = getParameterByName('id', url);
if (id) {
self.currentItemId = id;
self.currentItemType = null;
}
};
self.getItemPromise = function () {
var currentItemType = self.currentItemType;
var currentItemName = self.currentItemName;
var currentItemId = self.currentItemId;
if (currentItemType == "Person") {
return ApiClient.getPerson(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemType == "Studio") {
return ApiClient.getStudio(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemType == "Genre") {
return ApiClient.getGenre(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemType == "MusicGenre") {
return ApiClient.getMusicGenre(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemType == "GameGenre") {
return ApiClient.getGameGenre(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemType == "Artist") {
return ApiClient.getArtist(currentItemName, Dashboard.getCurrentUserId());
}
if (currentItemId) {
return ApiClient.getItem(Dashboard.getCurrentUserId(), currentItemId);
}
return ApiClient.getRootFolder(Dashboard.getCurrentUserId());
};
self.getEditQueryString = function (item) {
var query;
if (item.Type == "Person" ||
item.Type == "Studio" ||
item.Type == "Genre" ||
item.Type == "MusicGenre" ||
item.Type == "GameGenre" ||
item.Type == "Artist") {
query = item.Type + "=" + ApiClient.encodeName(item.Name);
} else {
query = "id=" + item.Id;
}
var context = getParameterByName('context');
if (context) {
query += "&context=" + context;
}
return query;
};
ensureInitialValues();
}
})(jQuery, document, window);
(function ($, document, window) {
var currentItem;
function getPromise() {
function updateTabs(page, item) {
var name = getParameterByName('person');
var query = MetadataEditor.getEditQueryString(item);
if (name) {
return ApiClient.getPerson(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('studio');
if (name) {
return ApiClient.getStudio(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('genre');
if (name) {
return ApiClient.getGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('musicgenre');
if (name) {
return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('gamegenre');
if (name) {
return ApiClient.getGameGenre(name, Dashboard.getCurrentUserId());
}
name = getParameterByName('artist');
if (name) {
return ApiClient.getArtist(name, Dashboard.getCurrentUserId());
}
else {
return ApiClient.getItem(Dashboard.getCurrentUserId(), getParameterByName('id'));
}
$('#btnEditPeople', page).attr('href', 'edititempeople.html?' + query);
$('#btnEditImages', page).attr('href', 'edititemimages.html?' + query);
}
function reload(page) {
Dashboard.showLoadingMsg();
getPromise().done(function (item) {
if (item.IsFolder) {
$('#fldRecursive', page).show();
} else {
$('#fldRecursive', page).hide();
}
MetadataEditor.getItemPromise().done(function (item) {
$('#btnRefresh', page).button('enable');
@ -65,15 +306,16 @@
currentItem = item;
LibraryBrowser.renderName(item, $('.itemName', page), true);
LibraryBrowser.renderParentName(item, $('.parentName', page));
updateTabs(page, item);
setFieldVisibilities(page, item);
fillItemInfo(page, item);
if (item.Type == "Person" || item.Type == "Studio" || item.Type == "MusicGenre" || item.Type == "Genre" || item.Type == "Artist") {
$('#peopleTab', page).hide();
$('#btnEditPeople', page).hide();
} else {
$('#peopleTab', page).show();
$('#btnEditPeople', page).show();
}
Dashboard.hideLoadingMsg();
@ -523,7 +765,7 @@
var form = this;
var item = {
Id: getParameterByName('id'),
Id: currentItem.Id,
Name: $('#txtName', form).val(),
SortName: $('#txtSortName', form).val(),
DisplayMediaType: $('#txtDisplayMediaType', form).val(),
@ -548,7 +790,7 @@
Studios: editableListViewValues($("#listStudios", form)).map(function (element) { return { Name: element }; }),
PremiereDate: $('#txtPremiereDate', form).val() || null,
EndDate: $('#txtEndDate', form).val() || null ,
EndDate: $('#txtEndDate', form).val() || null,
ProductionYear: $('#txtProductionYear', form).val(),
AspectRatio: $('#txtOriginalAspectRatio', form).val(),
Video3DFormat: $('#select3dFormat', form).val(),
@ -654,7 +896,6 @@
var page = this;
$('#btnRefresh', this).on('click', function () {
$(this).button('disable');
@ -684,7 +925,7 @@
refreshPromise = ApiClient.refreshStudio(currentItem.Name, force);
}
else {
refreshPromise = ApiClient.refreshItem(currentItem.Id, force, $('#chkRecursive', page).checked());
refreshPromise = ApiClient.refreshItem(currentItem.Id, force, false);
}
refreshPromise.done(function () {
@ -694,17 +935,29 @@
});
});
}).on('pageshow', "#editItemMetadataPage", function () {
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.id != currentItem.Id) {
MetadataEditor.currentItemId = data.id;
MetadataEditor.currentItemName = data.itemName;
MetadataEditor.currentItemType = data.itemType;
//Dashboard.navigate('edititemmetadata.html?id=' + data.id);
$.mobile.urlHistory.ignoreNextHashChange = true;
window.location.hash = 'editItemMetadataPage?id=' + data.id;
reload(page);
}
});
}).on('pagebeforeshow', "#editItemMetadataPage", function () {
var page = this;
reload(page);
}).on('pagehide', "#editItemMetadataPage", function () {
var page = this;
currentItem = null;
});
})(jQuery, document, window);
})(jQuery, document, window);

View file

@ -2,28 +2,30 @@
var currentItem;
function reload(page) {
function updateTabs(page, item) {
var id = getParameterByName('id');
var query = MetadataEditor.getEditQueryString(item);
$('#btnEditMetadata', page).attr('href', 'edititemmetadata.html?' + query);
$('#btnEditImages', page).attr('href', 'edititemimages.html?' + query);
}
function reload(page) {
Dashboard.showLoadingMsg();
ApiClient.getItem(Dashboard.getCurrentUserId(), id).done(function (item) {
if (item.IsFolder) {
$('#fldRecursive', page).show();
} else {
$('#fldRecursive', page).hide();
}
MetadataEditor.getItemPromise().done(function (item) {
$('#btnRefresh', page).button('enable');
$('#refreshLoading', page).hide();
currentItem = item;
LibraryBrowser.renderName(item, $('.itemName', page), true);
LibraryBrowser.renderParentName(item, $('.parentName', page));
fillPeopleContainer(item.People,$('#peopleContainer',page));
updateTabs(page, item);
fillPeopleContainer(item.People, $('#peopleContainer', page));
Dashboard.hideLoadingMsg();
});
}
@ -44,7 +46,7 @@
var name = person.Name || "";
var role = person.Role || "";
var type = person.Type || "";
if (person.PrimaryImageTag) {
imgUrl = ApiClient.getPersonImageUrl(person.Name, {
@ -57,27 +59,27 @@
imgUrl = "css/images/items/list/person.png";
}
html += '<div class="tileImage" style="background-image: url(\''+imgUrl+'\');"></div>';
html += '<div class="tileImage" style="background-image: url(\'' + imgUrl + '\');"></div>';
html += '<div class="tileContent">';
html += '<div data-role="fieldcontain">';
html += '<input type="hidden" name="originalName" value="' + name + '">';
html += '<input type="hidden" name="originalRole" value="' + role + '">';
html += '<input type="hidden" name="originalType" value="' + type + '">';
html += '<label for="txtName">Name:</label>';
html += '<span class="read" style="font-size: 16px;line-height: 1.4;"> ' + (name) + '</span><span style="display:none;" class="edit">';
html += '<span class="read"> ' + (name) + '</span><span style="display:none;" class="edit">';
html += '<input type="text" name="txtName" required="required" data-mini="true" value="' + (name) + '"/>';
html += '</span>';
html += '</div>';
html += '<div data-role="fieldcontain">';
html += '<label for="txtRole">Role:</label>';
html += '<span class="read" style="font-size: 16px;line-height: 1.4;"> ' + (role) + '</span><span style="display:none;" class="edit">';
html += '<span class="read"> ' + (role) + '</span><span style="display:none;" class="edit">';
html += '<input type="text" name="txtRole" required="required" data-mini="true" value="' + (role) + '"/>';
html += '</span>';
html += '</div>';
html += '<div data-role="fieldcontain">';
html += '<label for="selectType">Type:</label>';
html += '<span class="read" style="font-size: 16px;line-height: 1.4;"> ' + (type) + '</span><span style="display:none;" class="edit">';
html += '<select name="selectType">';
html += '<span class="read"> ' + (type) + '</span><span style="display:none;" class="edit">';
html += '<select name="selectType" data-inline="true" data-mini="true">';
html += generateTypes(type);
html += '</select>';
html += '</span>';
@ -88,7 +90,7 @@
html += '</span><span style="display:none;" class="edit">';
html += '<button type="button" data-mini="true" data-inline="true" onclick="EditItemPeoplePage.hideEdit(this)">Cancel</button>';
html += '<button type="button" data-icon="check" data-mini="true" data-inline="true" data-theme="b" onclick="EditItemPeoplePage.savePerson(this)">Save</button>';
html += '<button type="button" data-icon="delete" data-mini="true" data-inline="true" data-iconpos="notext" onclick="EditItemPeoplePage.removePerson(this)">Delete</button>';
html += '<button type="button" data-icon="delete" data-mini="true" data-inline="true" onclick="EditItemPeoplePage.removePerson(this)">Delete</button>';
html += '</span>';
html += '</p>';
html += '</div>';
@ -147,7 +149,7 @@
}
});
};
self.savePerson = function(source) {
self.savePerson = function (source) {
var page = $.mobile.activePage;
@ -163,7 +165,7 @@
currentItem.People[i].Name = item.find('input[name="txtName"]').val();
currentItem.People[i].Role = item.find('input[name="txtRole"]').val();
currentItem.People[i].Type = item.find('select[name="selectType"]').val();
ApiClient.updateItem(currentItem).done(function() {
ApiClient.updateItem(currentItem).done(function () {
reload(page);
});
break;
@ -171,7 +173,7 @@
}
};
self.addPerson = function() {
self.addPerson = function () {
var page = $.mobile.activePage;
var html = '<div data-role="popup" id="popupCreatePerson" class="ui-corner-all popup" style=" width: 270px;" >';
@ -184,10 +186,10 @@
html += '<form>';
html += '<label for="txtPersonName">Name:</label>';
html += '<input type="text" id="txtPersonName" name="txtPersonName" required="required"/>';
html += '<label for="txtPersonRole">Role:</label>';
html += '<input type="text" id="txtPersonRole" name="txtPersonRole" style="font-weight:bold;" />';
html += '<input type="text" id="txtPersonRole" name="txtPersonRole" />';
html += '<label for="selectPersonType">Type:</label>';
html += '<select id="selectPersonType" name="selectPersonType">';
html += generateTypes('');
@ -203,20 +205,20 @@
$(page).append(html);
var popup = $('#popupCreatePerson').popup().trigger('create').on("popupafteropen", function() {
var popup = $('#popupCreatePerson').popup().trigger('create').on("popupafteropen", function () {
$('#popupCreatePerson input:first', this).focus();
}).popup("open").on("popupafterclose", function() {
}).popup("open").on("popupafterclose", function () {
$('form', this).off("submit");
$(this).off("click").off("popupafterclose").remove();
});
$('form', popup).on('submit', function () {
var form = $(this);
var name = $('#txtPersonName',form).val();
var name = $('#txtPersonName', form).val();
if (name != '') {
var role = $('#txtPersonRole', form).val();
var type = $('#selectPersonType', form).val();
@ -237,6 +239,21 @@
var page = this;
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.id != currentItem.Id) {
MetadataEditor.currentItemId = data.id;
MetadataEditor.currentItemName = data.itemName;
MetadataEditor.currentItemType = data.itemType;
//Dashboard.navigate('edititemmetadata.html?id=' + data.id);
$.mobile.urlHistory.ignoreNextHashChange = true;
window.location.hash = 'editItemPeoplePage?id=' + data.id;
reload(page);
}
});
}).on('pageshow', "#editItemPeoplePage", function () {
var page = this;

View file

@ -1522,10 +1522,6 @@
miscInfo.push(item.OfficialRating);
}
if (item.MediaType && item.DisplayMediaType && item.DisplayMediaType != item.Type) {
miscInfo.push(item.DisplayMediaType);
}
if (item.Video3DFormat) {
miscInfo.push("3D");
}