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

move people page into main editor

This commit is contained in:
Luke Pulverenti 2014-05-16 15:16:29 -04:00
parent bb9c7990b5
commit 04e69d03e9
7 changed files with 81 additions and 352 deletions

View file

@ -18,7 +18,6 @@
<br />
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="#" data-role="button" id="btnEditMetadata">${TabMetadata}</a>
<a id="btnEditPeople" style="display: none;" href="#" data-role="button">${TabPeople}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabCollectionTitles}</a>
<a id="btnEditImages" href="#" data-role="button">${TabImages}</a>
</div>

View file

@ -18,7 +18,6 @@
<br />
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="#" data-role="button" id="btnEditMetadata">${TabMetadata}</a>
<a href="#" data-role="button" id="btnEditPeople" style="display: none;">${TabPeople}</a>
<a id="btnEditCollectionTitles" style="display: none;" href="#" data-role="button">${TabCollectionTitles}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabImages}</a>
</div>

View file

@ -17,7 +17,6 @@
<br />
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="#" data-role="button" class="ui-btn-active">${TabMetadata}</a>
<a id="btnEditPeople" style="display: none;" href="#" data-role="button">${TabPeople}</a>
<a id="btnEditCollectionTitles" style="display: none;" href="editcollectionitems.html" data-role="button">${TabCollectionTitles}</a>
<a href="#" data-role="button" id="btnEditImages">${TabImages}</a>
</div>
@ -269,6 +268,18 @@
</div>
</div>
</div>
<div data-role="collapsible" data-mini="true" id="countriesCollapsible" style="display: none; margin-top: 1em;">
<h3>Countries</h3>
<div data-role="editableListviewContainer">
<div data-role="fieldcontain">
<div style="display: inline-block; width: 80%;">
<input type="text" data-mini="true" />
</div>
<a data-role="button" data-theme="b" data-inline="true" data-mini="true" data-icon="plus" data-iconpos="notext" onclick="EditItemMetadataPage.addElementToEditableListview(this)" style="vertical-align: top;">Add</a>
</div>
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="listCountries"></ul>
</div>
</div>
<div data-role="collapsible" data-mini="true" id="genresCollapsible" style="display: none; margin-top: 1em;">
<h3>Genres</h3>
<div data-role="editableListviewContainer">
@ -281,6 +292,24 @@
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="listGenres"></ul>
</div>
</div>
<div data-mini="true" data-role="collapsible" id="peopleCollapsible" style="display: none; margin-top: 1em;">
<h3>People</h3>
<div>
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="peopleList"></ul>
</div>
</div>
<div data-mini="true" data-role="collapsible" id="keywordsCollapsible" style="display: none; margin-top: 1em;">
<h3>Plot Keywords</h3>
<div data-role="editableListviewContainer">
<div data-role="fieldcontain">
<div style="display: inline-block; width: 80%;">
<input type="text" data-mini="true" />
</div>
<a data-role="button" data-theme="b" data-inline="true" data-mini="true" data-icon="plus" data-iconpos="notext" onclick="EditItemMetadataPage.addElementToEditableListview(this)" style="vertical-align: top;">Add</a>
</div>
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="listKeywords"></ul>
</div>
</div>
<div data-role="collapsible" data-mini="true" id="studiosCollapsible" style="display: none; margin-top: 1em;">
<h3>Studios</h3>
<div data-role="editableListviewContainer">
@ -305,18 +334,6 @@
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="listTags"></ul>
</div>
</div>
<div data-mini="true" data-role="collapsible" id="keywordsCollapsible" style="display: none; margin-top: 1em;">
<h3>Plot Keywords</h3>
<div data-role="editableListviewContainer">
<div data-role="fieldcontain">
<div style="display: inline-block; width: 80%;">
<input type="text" data-mini="true" />
</div>
<a data-role="button" data-theme="b" data-inline="true" data-mini="true" data-icon="plus" data-iconpos="notext" onclick="EditItemMetadataPage.addElementToEditableListview(this)" style="vertical-align: top;">Add</a>
</div>
<ul data-role="listview" data-inset="true" data-split-icon="delete" id="listKeywords"></ul>
</div>
</div>
<div data-role="collapsible" data-mini="true" id="metadataSettingsCollapsible" style="display: none; margin-top: 1em;">
<h3>Metadata Settings</h3>
<div>

View file

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>${TitleMediaBrowser}</title>
</head>
<body>
<div id="editItemPeoplePage" data-role="page" data-theme="b" class="page libraryPage metadataEditorPage">
<div data-role="content editPageContent">
<div class="editPageSidebar">
<div class="libraryTree">
<ul>
</ul>
</div>
</div>
<div class="editPageInnerContent">
<h1 class="itemName editPageName">&nbsp;</h1>
<br />
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="#" data-role="button" id="btnEditMetadata">${TabMetadata}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabPeople}</a>
<a id="btnEditCollectionTitles" style="display: none;" href="#" data-role="button">${TabCollectionTitles}</a>
<a href="#" data-role="button" id="btnEditImages">${TabImages}</a>
</div>
<div id="divAddPerson" style="display: none;">
<button type="button" data-icon="plus" data-inline="true" data-mini="true" onclick="EditItemPeoplePage.addPerson();">${ButtonAdd}</button>
</div>
<div class="itemsContainer" id="peopleContainer" style="text-align: left;"></div>
</div>
</div>
</div>
</body>
</html>

View file

@ -12,7 +12,6 @@
var query = MetadataEditor.getEditQueryString(item);
$('#btnEditPeople', page).attr('href', 'edititempeople.html?' + query);
$('#btnEditMetadata', page).attr('href', 'edititemmetadata.html?' + query);
$('#btnEditCollectionTitles', page).attr('href', 'editcollectionitems.html?' + query);
}
@ -269,12 +268,6 @@
updateTabs(page, item);
if (item.Type == "Person" || item.Type == "Studio" || item.Type == "MusicGenre" || item.Type == "Genre" || item.Type == "MusicArtist" || item.Type == "GameGenre" || item.Type == "TvChannel" || item.Type == "BoxSet") {
$('#btnEditPeople', page).hide();
} else {
$('#btnEditPeople', page).show();
}
if (item.Type == "BoxSet") {
$('#btnEditCollectionTitles', page).show();
} else {

View file

@ -14,7 +14,6 @@
var query = MetadataEditor.getEditQueryString(item);
$('#btnEditPeople', page).attr('href', 'edititempeople.html?' + query);
$('#btnEditImages', page).attr('href', 'edititemimages.html?' + query);
$('#btnEditCollectionTitles', page).attr('href', 'editcollectionitems.html?' + query);
}
@ -70,20 +69,14 @@
setFieldVisibilities(page, item);
fillItemInfo(page, item);
if (item.Type == "Person" || item.Type == "Studio" || item.Type == "MusicGenre" || item.Type == "Genre" || item.Type == "MusicArtist" || item.Type == "GameGenre" || item.Type == "TvChannel" || item.Type == "BoxSet") {
$('#btnEditPeople', page).hide();
} else {
$('#btnEditPeople', page).show();
}
if (item.Type == "BoxSet") {
$('#btnEditCollectionTitles', page).show();
} else {
$('#btnEditCollectionTitles', page).hide();
}
Dashboard.getCurrentUser().done(function(user) {
Dashboard.getCurrentUser().done(function (user) {
if (user.Configuration.EnableContentDeletion &&
item.Type != "TvChannel" &&
item.Type != "Genre" &&
@ -259,6 +252,8 @@
$('#fldCommunityRating', page).hide();
$('#fldCommunityVoteCount', page).hide();
$('#genresCollapsible', page).hide();
$('#countriesCollapsible', page).hide();
$('#peopleCollapsible', page).hide();
$('#studiosCollapsible', page).hide();
if (item.Type == "TvChannel") {
@ -271,6 +266,8 @@
$('#fldCommunityRating', page).show();
$('#fldCommunityVoteCount', page).show();
$('#genresCollapsible', page).show();
$('#peopleCollapsible', page).show();
$('#countriesCollapsible', page).show();
$('#studiosCollapsible', page).show();
$('#fldOfficialRating', page).show();
$('#fldCustomRating', page).show();
@ -302,7 +299,7 @@
item.Type == "Book" ||
item.Type == "MusicAlbum" ||
item.Type == "MusicArtist") {
$('#btnIdentify', page).show();
} else {
$('#btnIdentify', page).hide();
@ -424,7 +421,9 @@
}).checkboxradio('refresh');
populateListView($('#listCountries', page), item.ProductionLocations || []);
populateListView($('#listGenres', page), item.Genres);
populatePeople($('#peopleList', page), item.People || []);
populateListView($('#listStudios', page), (item.Studios || []).map(function (element) { return element.Name || ''; }));
@ -538,6 +537,47 @@
}
}
function populatePeople(elem, people) {
var lastType = '';
var html = '';
for (var i = 0, length = people.length; i < length; i++) {
var person = people[i];
var type = person.Type || 'Person';
if (type != lastType) {
html += '<li data-role="list-divider">' + type + '</li>';
lastType = type;
}
html += '<li><a href="#">';
html += '<h3>' + (person.Name || 'Unknown name') + '</h3>';
if (person.Role && person.Role != lastType) {
html += '<p>' + (person.Role) + '</p>';
}
html += '</a>';
html += '<a class="btnDeletePerson" href="#" data-icon="delete" data-index="' + i + '">Delete</a>';
html += '</li>';
}
elem.html(html).listview('refresh');
$('.btnDeletePerson', elem).on('click', function () {
var index = parseInt(this.getAttribute('data-index'));
currentItem.People.splice(index, 1);
populatePeople(elem, currentItem.People);
});
}
function convertTo24HourFormat(time) {
if (time == "")
return time;
@ -760,6 +800,7 @@
AirDays: getSelectedAirDays(form),
AirTime: convertTo12HourFormat($('#txtAirTime', form).val()),
Genres: editableListViewValues($("#listGenres", form)),
ProductionLocations: editableListViewValues($("#listCountries", form)),
Tags: editableListViewValues($("#listTags", form)),
Keywords: editableListViewValues($("#listKeywords", form)),
Studios: editableListViewValues($("#listStudios", form)).map(function (element) { return { Name: element }; }),

View file

@ -1,288 +0,0 @@
(function ($, document, window) {
var currentItem;
function updateTabs(page, item) {
var query = MetadataEditor.getEditQueryString(item);
$('#btnEditMetadata', page).attr('href', 'edititemmetadata.html?' + query);
$('#btnEditImages', page).attr('href', 'edititemimages.html?' + query);
$('#btnEditCollectionTitles', page).attr('href', 'editcollectionitems.html?' + query);
}
function reload(page) {
Dashboard.showLoadingMsg();
MetadataEditor.getItemPromise().done(function (item) {
$('#btnRefresh', page).buttonEnabled(true);
if (item.LocationType == "Offline") {
$('#divAddPerson', page).hide();
} else {
$('#divAddPerson', page).show();
}
$('#refreshLoading', page).hide();
currentItem = item;
LibraryBrowser.renderName(item, $('.itemName', page), true);
updateTabs(page, item);
fillPeopleContainer(item, item.People, $('#peopleContainer', page));
Dashboard.hideLoadingMsg();
});
}
function fillPeopleContainer(item, people, container) {
people = people || new Array();
var html = '';
for (var i = 0; i < people.length; i++) {
html += constructPerson(item, people[i]);
}
container.html(html).trigger('create');
}
function constructPerson(item, person) {
var html = '<div class="tileItem posterTileItem editorTile">';
var imgUrl;
var name = person.Name || "";
var role = person.Role || "";
var type = person.Type || "";
if (person.PrimaryImageTag) {
imgUrl = ApiClient.getPersonImageUrl(person.Name, {
width: 150,
tag: person.PrimaryImageTag,
type: "primary"
});
} else {
imgUrl = "css/images/items/list/person.png";
}
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 + '">';
// The floats are to prevent jquery mobile from floating it
html += '<label for="txtName" style="float:none;">Name:</label>';
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" style="float:none;">Role:</label>';
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" style="float:none;">Type:</label>';
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>';
html += '</div>';
html += '<p>';
if (item.LocationType !== "Offline") {
html += '<span class="read">';
html += '<button type="button" class="edit" data-mini="true" data-inline="true" data-icon="edit" onclick="EditItemPeoplePage.displayEdit(this)">Edit</button>';
html += '</span>';
}
html += '<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" onclick="EditItemPeoplePage.removePerson(this)">Delete</button>';
html += '</span>';
html += '</p>';
html += '</div>';
html += '</div>';
return html;
}
function generateTypes(type) {
var types = new Array("", "Actor", "Director", "Composer", "Writer", "GuestStar", "Producer");
var html = "";
for (var i = 0; i < types.length; i++) {
html += '<option val="' + types[i] + '" ' + (types[i] == type ? 'selected="selected"' : '') + '>' + types[i] + '</option>';
}
return html;
}
function editItemPeoplePage() {
var self = this;
self.displayEdit = function (source) {
$(source).parents('.tileItem').find('span.edit').show();
$(source).parents('.tileItem').find('span.read').hide();
};
self.hideEdit = function (source) {
var item = $(source).parents('.tileItem');
item.find('span.edit').hide();
item.find('span.read').show();
item.find('input[name="txtName"]').val(item.find('input[name="originalName"]').val());
item.find('input[name="txtRole"]').val(item.find('input[name="originalRole"]').val());
item.find('select[name="selectType"]').val(item.find('input[name="originalType"]').val()).selectmenu('refresh');
};
self.removePerson = function (source) {
var page = $.mobile.activePage;
Dashboard.confirm("Are you sure you wish to delete this person?", "Delete Person", function (result) {
if (result) {
var item = $(source).parents('.tileItem');
var originalName = item.find('input[name="originalName"]').val();
var originalRole = item.find('input[name="originalRole"]').val();
var originalType = item.find('input[name="originalType"]').val();
for (var i = 0; i < currentItem.People.length; i++) {
var name = currentItem.People[i].Name || "";
var role = currentItem.People[i].Role || "";
var type = currentItem.People[i].Type || "";
if ((name + role + type) == (originalName + originalRole + originalType)) {
currentItem.People.splice(i, 1);
ApiClient.updateItem(currentItem).done(function () {
reload(page);
});
}
}
}
});
};
self.savePerson = function (source) {
var page = $.mobile.activePage;
var item = $(source).parents('.tileItem');
var originalName = item.find('input[name="originalName"]').val();
var originalRole = item.find('input[name="originalRole"]').val();
var originalType = item.find('input[name="originalType"]').val();
for (var i = 0; i < currentItem.People.length; i++) {
var name = currentItem.People[i].Name || "";
var role = currentItem.People[i].Role || "";
var type = currentItem.People[i].Type || "";
if ((name + role + type) == (originalName + originalRole + originalType)) {
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 () {
reload(page);
});
break;
}
}
};
self.addPerson = function () {
var page = $.mobile.activePage;
var html = '<div data-role="popup" id="popupCreatePerson" class="popup" data-theme="a" style=" width: 270px;" >';
html += '<div class="ui-bar-b" style="text-align: center; padding: 0 20px;">';
html += '<h3>Add Person</h3>';
html += '</div>';
html += '<div style="padding:1em;">';
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" />';
html += '<label for="selectPersonType">Type:</label>';
html += '<select id="selectPersonType" name="selectPersonType">';
html += generateTypes('');
html += '</select>';
html += '<p>';
html += '<button type="submit" data-theme="b" data-icon="check">OK</button>';
html += '<button type="button" data-icon="delete" onclick="$(this).parents(\'.popup\').popup(\'close\');">Cancel</button>';
html += '</p>';
html += '</form>';
html += '</div>';
html += '</div>';
$(page).append(html);
var popup = $('#popupCreatePerson').popup().trigger('create').on("popupafteropen", function () {
$('#popupCreatePerson input:first', this).focus();
}).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();
if (name != '') {
var role = $('#txtPersonRole', form).val();
var type = $('#selectPersonType', form).val();
currentItem.People.push({ Name: name, Role: role, Type: type });
ApiClient.updateItem(currentItem).done(function () {
reload(page);
});
popup.popup("close");
}
return false;
});
};
}
window.EditItemPeoplePage = new editItemPeoplePage();
$(document).on('pageinit', "#editItemPeoplePage", function () {
var page = this;
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.itemType == "livetvservice") {
return;
}
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('pagebeforeshow', "#editItemPeoplePage", function () {
var page = this;
reload(page);
}).on('pagehide', "#editItemPeoplePage", function () {
var page = this;
currentItem = null;
});
})(jQuery, document, window);