mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-17 19:08:18 -07:00
3.0.5416.0
This commit is contained in:
parent
7884354722
commit
866379a702
@ -80,7 +80,7 @@
|
||||
|
||||
.sectionHeaderButton {
|
||||
vertical-align: middle;
|
||||
margin: 0 0 0 1.5em;
|
||||
margin: 0 0 .25em 1.5em;
|
||||
position: relative;
|
||||
top: 8px;
|
||||
}
|
||||
|
@ -18,6 +18,10 @@
|
||||
|
||||
<form class="deviceForm">
|
||||
|
||||
<p class="reportedName">
|
||||
|
||||
</p>
|
||||
<br/>
|
||||
<ul data-role="listview" class="ulForm">
|
||||
<li>
|
||||
<label for="txtCustomName">${LabelCustomDeviceDisplayName}</label>
|
||||
|
@ -34,15 +34,17 @@
|
||||
<input id="chkDisplayFolderView" type="checkbox" />
|
||||
</div>
|
||||
|
||||
<br /><br />
|
||||
<div style="margin: 0 1em;">
|
||||
<p>${LabelGroupChannelsIntoViews}</p>
|
||||
<div class="channelGroupList"></div>
|
||||
<div class="fieldDescription">${LabelGroupChannelsIntoViewsHelp}</div>
|
||||
<br />
|
||||
<br />
|
||||
<div data-role="collapsible" style="margin: 0 1em;">
|
||||
<h2>${HeaderChannels}</h2>
|
||||
<div>
|
||||
<p>${LabelGroupChannelsIntoViews}</p>
|
||||
<div class="channelGroupList"></div>
|
||||
<div class="fieldDescription">${LabelGroupChannelsIntoViewsHelp}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br /><br />
|
||||
|
||||
<div class="detailSectionHeader" style="margin: 0 .5em;">
|
||||
${HeaderViewOrder}
|
||||
@ -57,6 +59,19 @@
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<div class="detailSectionHeader" style="margin: 0 .5em;">
|
||||
${HeaderLatestItems}
|
||||
</div>
|
||||
<div style="margin: 0 1em;">
|
||||
<p>${LabelSelectLastestItemsFolders}</p>
|
||||
<div class="latestItemsList">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<div class="detailSectionHeader" style="margin: 0 .5em;">
|
||||
${HeaderOtherDisplaySettings}
|
||||
</div>
|
||||
|
@ -3,12 +3,13 @@
|
||||
function load(page, device, capabilities) {
|
||||
|
||||
if (capabilities.SupportsContentUploading) {
|
||||
$('.fldCameraUploadPath', page).show();
|
||||
$('#fldCameraUploadPath', page).show();
|
||||
} else {
|
||||
$('.fldCameraUploadPath', page).hide();
|
||||
$('#fldCameraUploadPath', page).hide();
|
||||
}
|
||||
|
||||
$('#txtCustomName', page).val(device.CustomName || '');
|
||||
$('.reportedName', page).html(device.ReportedName || '');
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
@ -75,7 +76,6 @@
|
||||
var page = this;
|
||||
|
||||
loadData(page);
|
||||
|
||||
});
|
||||
|
||||
window.DevicePage = {
|
||||
|
@ -123,11 +123,9 @@
|
||||
|
||||
function loadRecentlyAdded(elem, userId, context) {
|
||||
|
||||
var screenWidth = $(window).width();
|
||||
|
||||
var options = {
|
||||
|
||||
Limit: screenWidth >= 2400 ? 24 : (screenWidth >= 1600 ? 20 : (screenWidth >= 1440 ? 12 : (screenWidth >= 800 ? 9 : 8))),
|
||||
Limit: 24,
|
||||
Fields: "PrimaryImageAspectRatio",
|
||||
IsPlayed: false
|
||||
};
|
||||
@ -137,7 +135,10 @@
|
||||
var html = '';
|
||||
|
||||
if (items.length) {
|
||||
html += '<h1 class="listHeader">' + Globalize.translate('HeaderLatestMedia') + '</h1>';
|
||||
html += '<div>';
|
||||
html += '<h1 style="display:inline-block; vertical-align:middle;" class="listHeader">' + Globalize.translate('HeaderLatestMedia') + '</h1>';
|
||||
html += '<a href="mypreferencesdisplay.html" data-role="button" data-icon="edit" data-mini="true" data-inline="true" data-iconpos="notext" class="sectionHeaderButton">d</a>';
|
||||
html += '</div>';
|
||||
html += '<div>';
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
|
@ -908,12 +908,9 @@
|
||||
$(apiClient).off('websocketmessage.librarylist', onWebSocketMessage).on('websocketmessage.librarylist', onWebSocketMessage);
|
||||
}
|
||||
|
||||
$(function () {
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
|
||||
})(jQuery, document, window);
|
@ -431,19 +431,21 @@
|
||||
});
|
||||
|
||||
function initializeApiClient(apiClient) {
|
||||
|
||||
$(apiClient).off('websocketmessage.librarymenu', onWebSocketMessage).on('websocketmessage.librarymenu', onWebSocketMessage);
|
||||
}
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
|
||||
$(function () {
|
||||
|
||||
$(MediaController).on('playerchange', function () {
|
||||
updateCastIcon();
|
||||
});
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
});
|
||||
|
||||
})(window, document, jQuery);
|
||||
|
@ -443,12 +443,9 @@
|
||||
$(apiClient).on("websocketmessage", onWebSocketMessageReceived);
|
||||
}
|
||||
|
||||
$(function () {
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
|
||||
function getTargetsHtml(targets) {
|
||||
|
@ -27,6 +27,33 @@
|
||||
$('.folderGroupList', page).html(folderHtml).trigger('create');
|
||||
}
|
||||
|
||||
function renderLatestItems(page, user, result) {
|
||||
|
||||
var folderHtml = '';
|
||||
|
||||
folderHtml += '<div data-role="controlgroup">';
|
||||
folderHtml += result.Items.map(function (i) {
|
||||
|
||||
var currentHtml = '';
|
||||
|
||||
var id = 'chkIncludeInLatest' + i.Id;
|
||||
|
||||
currentHtml += '<label for="' + id + '">' + i.Name + '</label>';
|
||||
|
||||
var isChecked = user.Configuration.LatestItemsExcludes.indexOf(i.Id) == -1;
|
||||
var checkedHtml = isChecked ? ' checked="checked"' : '';
|
||||
|
||||
currentHtml += '<input class="chkIncludeInLatest" data-folderid="' + i.Id + '" type="checkbox" id="' + id + '"' + checkedHtml + ' />';
|
||||
|
||||
return currentHtml;
|
||||
|
||||
}).join('');
|
||||
|
||||
folderHtml += '</div>';
|
||||
|
||||
$('.latestItemsList', page).html(folderHtml).trigger('create');
|
||||
}
|
||||
|
||||
function renderChannels(page, user, result) {
|
||||
|
||||
var folderHtml = '';
|
||||
@ -117,6 +144,7 @@
|
||||
$.when(promise1, promise2, promise3).done(function (r1, r2, r3) {
|
||||
|
||||
renderViews(page, user, r1[0]);
|
||||
renderLatestItems(page, user, r1[0]);
|
||||
renderChannels(page, user, r2[0]);
|
||||
renderViewOrder(page, user, r3[0]);
|
||||
|
||||
@ -137,6 +165,11 @@
|
||||
|
||||
user.Configuration.IncludeTrailersInSuggestions = $('#chkDisplayTrailersWithinMovieSuggestions', page).checked();
|
||||
|
||||
user.Configuration.LatestItemsExcludes = $(".chkIncludeInLatest:not(:checked)", page).get().map(function (i) {
|
||||
|
||||
return i.getAttribute('data-folderid');
|
||||
});
|
||||
|
||||
user.Configuration.ExcludeFoldersFromGrouping = $(".chkGroupFolder:not(:checked)", page).get().map(function (i) {
|
||||
|
||||
return i.getAttribute('data-folderid');
|
||||
|
@ -1,6 +1,6 @@
|
||||
(function ($, document, Notifications) {
|
||||
|
||||
$(document).on("pageinit", ".page", function () {
|
||||
$(document).on("pageinit", "#notificationsPage", function () {
|
||||
|
||||
// If there is no user logged in there can be no notifications
|
||||
if (!Dashboard.getCurrentUserId()) return;
|
||||
|
@ -238,12 +238,9 @@
|
||||
});
|
||||
}
|
||||
|
||||
$(function () {
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
|
||||
})(jQuery, document, Dashboard, LibraryBrowser);
|
@ -349,12 +349,9 @@
|
||||
$(apiClient).on("websocketmessage", onWebSocketMessageReceived).on("websocketopen", onWebSocketConnectionChange);
|
||||
}
|
||||
|
||||
$(function () {
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
$(ConnectionManager).on('apiclientcreated', function (e, apiClient) {
|
||||
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
initializeApiClient(apiClient);
|
||||
});
|
||||
|
||||
})(window, document, jQuery);
|
@ -1,5 +1,33 @@
|
||||
(function (document, window, $) {
|
||||
|
||||
function renderLibrarySharingList(page, result) {
|
||||
|
||||
var folderHtml = '';
|
||||
|
||||
folderHtml += '<div data-role="controlgroup">';
|
||||
|
||||
folderHtml += result.Items.map(function (i) {
|
||||
|
||||
var currentHtml = '';
|
||||
|
||||
var id = 'chkShareFolder' + i.Id;
|
||||
|
||||
currentHtml += '<label for="' + id + '">' + i.Name + '</label>';
|
||||
|
||||
var isChecked = true;
|
||||
var checkedHtml = isChecked ? ' checked="checked"' : '';
|
||||
|
||||
currentHtml += '<input data-mini="true" class="chkShareFolder" data-folderid="' + i.Id + '" type="checkbox" id="' + id + '"' + checkedHtml + ' />';
|
||||
|
||||
return currentHtml;
|
||||
|
||||
}).join('');
|
||||
|
||||
folderHtml += '</div>';
|
||||
|
||||
$('.librarySharingList', page).html(folderHtml).trigger('create');
|
||||
}
|
||||
|
||||
function deleteUser(page, id) {
|
||||
|
||||
$('.userMenu', page).on("popupafterclose.deleteuser", function () {
|
||||
@ -301,34 +329,49 @@
|
||||
|
||||
renderPendingGuests(page, pending);
|
||||
});
|
||||
|
||||
ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { IsHidden: false })).done(function (result) {
|
||||
|
||||
renderLibrarySharingList(page, result);
|
||||
});
|
||||
}
|
||||
|
||||
function inviteUser(page) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
// Add/Update connect info
|
||||
ApiClient.ajax({
|
||||
ApiClient.getJSON(ApiClient.getUrl("Channels", {})).done(function (channelsResult) {
|
||||
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl('Connect/Invite', {
|
||||
var shareExcludes = $(".chkShareFolder:not(:checked)", page).get().map(function (i) {
|
||||
|
||||
ConnectUsername: $('#txtConnectUsername', page).val(),
|
||||
SendingUserId: Dashboard.getCurrentUserId()
|
||||
return i.getAttribute('data-folderid');
|
||||
});
|
||||
|
||||
}),
|
||||
dataType: 'json'
|
||||
// Add/Update connect info
|
||||
ApiClient.ajax({
|
||||
|
||||
}).done(function (result) {
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl('Connect/Invite'),
|
||||
dataType: 'json',
|
||||
data: {
|
||||
|
||||
$('#popupInvite').popup('close');
|
||||
ConnectUsername: $('#txtConnectUsername', page).val(),
|
||||
ExcludedLibraries: shareExcludes.join(','),
|
||||
ExcludedChannels: channelsResult.Items.map(function (c) { return c.Id; }).join(','),
|
||||
SendingUserId: Dashboard.getCurrentUserId(),
|
||||
EnableLiveTv: false
|
||||
}
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}).done(function (result) {
|
||||
|
||||
showNewUserInviteMessage(page, result);
|
||||
$('#popupInvite').popup('close');
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
showNewUserInviteMessage(page, result);
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function showNewUserInviteMessage(page, result) {
|
||||
|
@ -105,7 +105,7 @@
|
||||
updateServerInfo(server, systemInfo);
|
||||
|
||||
apiClient.serverInfo(server);
|
||||
$(this).trigger('apiclientcreated', [apiClient]);
|
||||
$(self).trigger('apiclientcreated', [apiClient]);
|
||||
|
||||
if (enableAutomaticNetworking) {
|
||||
self.connectToServer(server);
|
||||
@ -138,7 +138,7 @@
|
||||
onLocalAuthenticated(this, result, true);
|
||||
});
|
||||
|
||||
$(this).trigger('apiclientcreated', [apiClient]);
|
||||
$(self).trigger('apiclientcreated', [apiClient]);
|
||||
|
||||
}
|
||||
|
||||
@ -199,7 +199,14 @@
|
||||
|
||||
var deferred = $.Deferred();
|
||||
|
||||
if (self.isLoggedIntoConnect() && !connectUser) {
|
||||
if (connectUser != null && connectUser.Id == credentials.ConnectUserId) {
|
||||
deferred.resolveWith(null, [[]]);
|
||||
}
|
||||
|
||||
else if (self.connectToken() && self.connectUserId()) {
|
||||
|
||||
connectUser = null;
|
||||
|
||||
getConnectUser(credentials.ConnectUserId, credentials.ConnectAccessToken).done(function (user) {
|
||||
|
||||
onConnectAuthenticated(user);
|
||||
@ -352,7 +359,6 @@
|
||||
|
||||
deferred.resolveWith(null, [
|
||||
{
|
||||
connectUser: connectUser,
|
||||
localUser: localUser,
|
||||
name: connectUser ? connectUser.Name : localUser.Name,
|
||||
canManageServer: localUser && localUser.Configuration.IsAdministrator,
|
||||
@ -375,14 +381,13 @@
|
||||
|
||||
var credentials = credentialProvider.credentials();
|
||||
|
||||
if (credentials.ConnectUserId && credentials.ConnectAccessToken) {
|
||||
if (credentials.ConnectUserId && credentials.ConnectAccessToken && !(self.currentApiClient() && self.currentApiClient().getCurrentUserId())) {
|
||||
ensureConnectUser(credentials).always(onEnsureConnectUserDone);
|
||||
} else {
|
||||
onEnsureConnectUserDone();
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
|
||||
};
|
||||
|
||||
self.isLoggedIntoConnect = function () {
|
||||
@ -608,7 +613,7 @@
|
||||
|
||||
deferred.resolveWith(null, [result]);
|
||||
|
||||
$(this).trigger('connected', [result]);
|
||||
$(self).trigger('connected', [result]);
|
||||
}
|
||||
|
||||
function onExchangeTokenDone() {
|
||||
@ -720,7 +725,7 @@
|
||||
|
||||
self.loginToConnect = function (username, password) {
|
||||
|
||||
var md5 = CryptoJS.MD5(password).toString();
|
||||
var md5 = self.getConnectPasswordHash(password);
|
||||
|
||||
return $.ajax({
|
||||
type: "POST",
|
||||
@ -746,6 +751,23 @@
|
||||
});
|
||||
};
|
||||
|
||||
self.getConnectPasswordHash = function (password) {
|
||||
|
||||
password = password || '';
|
||||
|
||||
password = password
|
||||
.replace("&", "&")
|
||||
.replace("/", "\")
|
||||
.replace("!", "!")
|
||||
.replace("$", "$")
|
||||
.replace("\"", """)
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace("'", "'");
|
||||
|
||||
return CryptoJS.MD5(password).toString();
|
||||
};
|
||||
|
||||
self.getApiClient = function (item) {
|
||||
|
||||
// Accept string + object
|
||||
@ -755,7 +777,10 @@
|
||||
|
||||
return apiClients.filter(function (a) {
|
||||
|
||||
return a.serverInfo().Id = item;
|
||||
var serverInfo = a.serverInfo();
|
||||
|
||||
// We have to keep this hack in here because of the addApiClient method
|
||||
return !serverInfo || serverInfo.Id == item;
|
||||
|
||||
})[0];
|
||||
};
|
||||
|
@ -41,6 +41,8 @@
|
||||
|
||||
<div data-role="popup" id="popupInvite" data-theme="a">
|
||||
|
||||
<a href="#" data-rel="back" class="ui-btn ui-corner-all ui-shadow ui-btn-b ui-icon-delete ui-btn-icon-notext ui-btn-right">${ButtonClose}</a>
|
||||
|
||||
<div class="ui-bar-a" style="text-align: center; padding: 5px 20px;">
|
||||
<h3 style="margin: .5em;">${HeaderInviteUser}</h3>
|
||||
</div>
|
||||
@ -58,8 +60,20 @@
|
||||
</div>
|
||||
|
||||
<br />
|
||||
<button type="submit" data-icon="mail" data-theme="b">${ButtonSendInvitation}</button>
|
||||
<a href="#" data-rel="back" data-icon="delete" data-role="button">${ButtonCancel}</a>
|
||||
|
||||
<div data-role="collapsible" data-mini="true">
|
||||
<h2>${HeaderShareMediaFolders}</h2>
|
||||
<div>
|
||||
<div class="librarySharingList" style="margin-top:1em;">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin:1.25em 0;" class="fieldDescription">${MessageGuestSharingPermissionsHelp}</div>
|
||||
<div>
|
||||
<button type="submit" data-icon="mail" data-theme="b" data-mini="true">${ButtonSendInvitation}</button>
|
||||
<a href="#" data-rel="back" data-icon="delete" data-role="button" data-mini="true">${ButtonCancel}</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user