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

update recording scheduler

This commit is contained in:
Luke Pulverenti 2015-07-28 23:42:03 -04:00
parent 7790a5b573
commit 65f5de02c1
14 changed files with 130 additions and 271 deletions

View file

@ -8,29 +8,25 @@
<div data-role="content">
<form class="connectLoginForm" style="text-align: center; margin: 0 auto;display:none;">
<form class="connectLoginForm" style="margin: 0 auto;display:none;">
<h1 style="text-align: left;">${HeaderSignInWithConnect}</h1>
<br />
<div>
<label for="txtManualName" style="text-align: left;">${LabelEnterConnectUserName}</label>
<input type="text" id="txtManualName" required="required" />
<paper-input type="text" id="txtManualName" required="required" label="${LabelUser}" autocomplete="off"></paper-input>
<div class="fieldDescription" style="text-align:left;">${LabelEnterConnectUserNameHelp}</div>
</div>
<br /><br />
<div>
<label for="txtManualPassword" style="text-align: left;">${LabelPassword}</label>
<input type="password" id="txtManualPassword" required="required" />
<paper-input type="password" id="txtManualPassword" required="required" label="${LabelPassword}" autocomplete="off"></paper-input>
</div>
<br />
<button type="submit" data-role="none" class="clearButton">
<paper-button raised class="accent block"><iron-icon icon="check"></iron-icon><span>${ButtonSignIn}</span></paper-button>
</button>
<p class="forgotPassword">
<div class="forgotPassword">
<a href="http://emby.media/community/index.php?app=core&module=global&section=lostpass" target="_blank" class="clearLink">
<paper-button raised class="cancel block"><iron-icon icon="close"></iron-icon><span>${ButtonForgotPassword}</span></paper-button>
</a>
</p>
</div>
<div class="skip">
<paper-button raised class="cancel block btnSkipConnect"><iron-icon icon="close"></iron-icon><span>${ButtonSkip}</span></paper-button>
<div class="fieldDescription">${TextConnectToServerManually}</div>
@ -44,19 +40,16 @@
</div>
</form>
<form class="manualServerForm" style="text-align: center; margin: 0 auto;display:none;">
<form class="manualServerForm" style="margin: 0 auto;display:none;">
<h1 style="text-align: left;">${HeaderConnectToServer}</h1>
<br />
<div>
<label for="txtServerHost" style="text-align: left;">${LabelServerHost}</label>
<input type="text" id="txtServerHost" required="required" />
<paper-input type="text" id="txtServerHost" required="required" label="${LabelServerHost}"></paper-input>
<div class="fieldDescription" style="text-align:left;">${LabelServerHostHelp}</div>
</div>
<br />
<div>
<label for="txtServerPort" style="text-align: left;">${LabelServerPort}</label>
<input type="number" id="txtServerPort" step="1" min="0" value="8096" />
<paper-input type="number" id="txtServerPort" step="1" min="0" value="8096" label="${LabelServerPort}"></paper-input>
</div>
<br />
@ -66,27 +59,22 @@
<paper-button raised class="cancel block btnCancelManualServer"><iron-icon icon="close"></iron-icon><span>${ButtonCancel}</span></paper-button>
</form>
<form class="signupForm" style="text-align: center; margin: 0 auto;display:none;">
<form class="signupForm" style="margin: 0 auto;display:none;">
<h1 style="text-align: left;">${HeaderSignUp}</h1>
<br />
<div>
<label for="txtSignupEmail" style="text-align: left;">${LabelEmail}</label>
<input type="email" id="txtSignupEmail" required="required" />
<paper-input type="text" id="txtSignupEmail" required="required" label="${LabelEmail}"></paper-input>
</div>
<div>
<label for="txtSignupUsername" style="text-align: left;">${LabelUsername}</label>
<input type="text" id="txtSignupUsername" required="required" />
<paper-input type="text" id="txtSignupUsername" required="required" label="${LabelUsername}"></paper-input>
</div>
<div>
<label for="txtSignupPassword" style="text-align: left;">${LabelPassword}</label>
<input type="password" id="txtSignupPassword" required="required" autocomplete="off" />
<paper-input type="password" id="txtSignupPassword" required="required" label="${LabelPassword}" autocomplete="off"></paper-input>
</div>
<div>
<label for="txtSignupPasswordConfirm" style="text-align: left;">${LabelPasswordConfirm}</label>
<input type="password" id="txtSignupPasswordConfirm" required="required" autocomplete="off" />
<paper-input type="password" id="txtSignupPasswordConfirm" required="required" label="${LabelPasswordConfirm}" autocomplete="off"></paper-input>
</div>
<br />
<div class="g-recaptcha" id="recaptchaWidget" data-sitekey="6Le2LAgTAAAAAK06Wvttt_yUnbISTy6q3Azqp9po" data-theme="dark"></div>
<br />

View file

@ -9,14 +9,11 @@
// If any items have an icon, give them all an icon just to make sure they're all lined up evenly
var renderIcon = options.items.filter(function (o) {
return o.ironIcon;
return o.ironIcon == 'check';
}).length;
if (renderIcon) {
// iOS supports unicode icons
if ($.browser.safari) {
for (var i = 0, length = options.items.length; i < length; i++) {
var option = options.items[i];
@ -24,15 +21,14 @@
switch (option.ironIcon) {
case 'check':
option.name = '\\u2713 ' + option.name;
option.name = ' ' + option.name;
break;
default:
option.name = '\\u2001 ' + option.name;
option.name = ' ' + option.name;
break;
}
}
}
}
var innerOptions = {
'title': options.title,

View file

@ -4,7 +4,7 @@
<title></title>
</head>
<body>
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage lightBackdropPage" data-theme="b" data-require="scripts/itemdetailpage,paperbuttonstyle,tileitemcss,jqmicons">
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage lightBackdropPage" data-theme="b" data-require="scripts/itemdetailpage,paperbuttonstyle,tileitemcss,jqmicons,scripts/livetvcomponents">
<div class="itemTabs homeTabs" style="display: none;">
<div class="libraryViewNav scopedLibraryViewNav">
@ -128,6 +128,8 @@
<paper-button raised class="secondary btnPlay hide"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlay}</span></paper-button>
<paper-button raised class="alt btnPlayTrailer hide"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlayTrailer}</span></paper-button>
<a class="btnPlayExternalTrailer hide clearLink" href="#" target="_blank"><paper-button raised class="alt btnPlayExternalTrailer"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlayTrailer}</span></paper-button></a>
<paper-button raised class="subdued btnRecord hide"><iron-icon icon="videocam"></iron-icon><span>${ButtonRecord}</span></paper-button>
<paper-button raised class="subdued hide btnCancelRecording"><iron-icon icon="delete"></iron-icon><span>${ButtonCancelRecording}</span></paper-button>
<paper-button raised class="submit btnSync hide"><iron-icon icon="refresh"></iron-icon><span>${ButtonSync}</span></paper-button>
<paper-button raised class="subdued btnShare notext hide" style="background-color:#673AB7"><iron-icon icon="share"></iron-icon></paper-button>
<paper-button raised class="subdued btnMoreCommands hide notext"><iron-icon icon="more-vert"></iron-icon></paper-button>
@ -155,6 +157,8 @@
<paper-button raised class="secondary btnPlay hide"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlay}</span></paper-button>
<paper-button raised class="alt btnPlayTrailer hide"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlayTrailer}</span></paper-button>
<a class="btnPlayExternalTrailer hide clearLink" href="#" target="_blank"><paper-button raised class="alt btnPlayExternalTrailer"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlayTrailer}</span></paper-button></a>
<paper-button raised class="subdued btnRecord hide"><iron-icon icon="videocam"></iron-icon><span>${ButtonRecord}</span></paper-button>
<paper-button raised class="subdued hide btnCancelRecording"><iron-icon icon="delete"></iron-icon><span>${ButtonCancelRecording}</span></paper-button>
<paper-button raised class="submit btnSync hide"><iron-icon icon="refresh"></iron-icon><span>${ButtonSync}</span></paper-button>
<paper-button raised class="subdued btnShare notext hide" style="background-color:#673AB7"><iron-icon icon="share"></iron-icon></paper-button>
<paper-button raised class="subdued btnMoreCommands forceHide notext"><iron-icon icon="more-vert"></iron-icon></paper-button>
@ -163,6 +167,7 @@
<p class="itemGenres"></p>
<p class="itemOverview smoothScrollY"></p>
<p id="seriesAirTime"></p>
<p class="airDate"></p>
</div>
</div>
<div class="collectionItems"></div>

View file

@ -1,67 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Emby</title>
</head>
<body>
<div id="liveTvProgramPage" data-role="page" class="page libraryPage liveTvPage" data-contextname="${HeaderLiveTv}" data-require="scripts/livetvcomponents,scripts/livetvprogram,livetvcss">
<div class="libraryViewNav">
<a href="livetvsuggested.html"><iron-icon icon="info"></iron-icon>${TabSuggestions}</a>
<a href="livetvguide.html"><iron-icon icon="grid-on"></iron-icon>${TabGuide}</a>
<a href="livetvchannels.html" class="ui-btn-active"><iron-icon icon="live-tv"></iron-icon>${TabChannels}</a>
<a href="livetvrecordings.html"><iron-icon icon="slideshow"></iron-icon>${TabRecordings}</a>
<a href="livetvtimers.html"><iron-icon icon="schedule"></iron-icon>${TabScheduled}</a>
<a href="livetvseriestimers.html"><iron-icon icon="refresh"></iron-icon>${TabSeries}</a>
</div>
<div style="padding: 1em 0;">
<div>
<table class="detailPageContent primaryDetailPageContent">
<tr>
<td style="vertical-align: top; padding: 0 1em 0 0;">
<div id="itemImage" class="itemImageContainer smallDetailImageContainer"></div>
</td>
<td style="vertical-align: top; padding: 0;">
<p><span class="itemName inlineItemName"></span><span class="itemMiscInfo" style="display: inline;"></span></p>
<p class="itemEpisodeName"></p>
<p class="itemMiscInfo miscTvProgramInfo"></p>
<p>
<span class="itemCommunityRating"></span>
<span class="userDataIcons"></span>
</p>
<p class="itemGenres desktopGenres"></p>
<p class="itemOverview desktopOverview smoothScrollY"></p>
</td>
</tr>
</table>
</div>
<p class="itemGenres mobileGenres"></p>
<p class="itemOverview mobileOverview smoothScrollY"></p>
</div>
<div class="detailButtonsContainer">
<span id="playButtonContainer" style="display: none;">
<paper-button raised class="secondary btnPlay"><iron-icon icon="play-arrow"></iron-icon><span>${ButtonPlay}</span></paper-button>
</span>
<span id="cancelRecordingButtonContainer" style="display: none;">
<paper-button raised class="subdued btnCancelRecording"><iron-icon icon="delete"></iron-icon><span>${ButtonCancelRecording}</span></paper-button>
</span>
<span id="recordButtonContainer" style="display: none;">
<paper-button raised class="subdued btnRecord"><iron-icon icon="videocam"></iron-icon><span>${ButtonRecord}</span></paper-button>
</span>
</div>
<div data-role="content">
<div class="detailPageContent">
<div id="detailsSection" class="detailSection">
<div class="detailSectionHeader" style="margin-top: 0;">
${HeaderDetails}
</div>
<div class="detailSectionContent" style="padding: 0 1em;">
<p class="airDate"></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -8,15 +8,15 @@
<div data-role="content">
<form class="manualLoginForm" style="display: none; text-align: center; margin: 0 auto;">
<form class="manualLoginForm" style="display: none; margin: 0 auto;">
<h1 style="text-align: left;">${HeaderPleaseSignIn}</h1>
<label for="txtManualName" style="text-align: left;">${LabelUser}</label>
<input type="text" name="txtManualName" id="txtManualName" required="required" />
<paper-input type="text" id="txtManualName" required="required" label="${LabelUser}" autocomplete="off"></paper-input>
<label for="txtManualPassword" style="text-align: left;">${LabelPassword}</label>
<input type="password" name="txtManualPassword" id="txtManualPassword" placeholder="password" />
<paper-input id="txtManualPassword" type="password" label="${LabelPassword}" autocomplete="off"></paper-input>
<br />
<button type="submit" data-role="none" class="clearButton">
<paper-button raised class="accent block"><iron-icon icon="check"></iron-icon><span>${ButtonSignIn}</span></paper-button>
</button>

View file

@ -24,6 +24,7 @@
LibraryBrowser.renderName(item, $('.itemName', page), false, context);
LibraryBrowser.renderParentName(item, $('.parentName', page), context);
LibraryMenu.setTitle(item.Name);
Dashboard.getCurrentUser().done(function (user) {
@ -39,7 +40,17 @@
LibraryBrowser.renderDetailPageBackdrop(page, item);
}
if (MediaController.canPlay(item)) {
if (item.Type == 'Program') {
var now = new Date();
if (now >= parseISO8601Date(item.StartDate, { toLocal: true }) && now < parseISO8601Date(item.EndDate, { toLocal: true })) {
$('.btnPlay', page).removeClass('hide');
} else {
$('.btnPlay', page).addClass('hide');
}
}
else if (MediaController.canPlay(item)) {
$('.btnPlay', page).removeClass('hide');
}
else {
@ -64,6 +75,18 @@
$('.btnShare', page).addClass('hide');
}
if (item.Type == 'Program' && item.TimerId) {
$('.btnCancelRecording', page).removeClass('hide');
} else {
$('.btnCancelRecording', page).addClass('hide');
}
if (item.Type == 'Program' && (!item.TimerId && !item.SeriesTimerId)) {
$('.btnRecord', page).removeClass('hide');
} else {
$('.btnRecord', page).addClass('hide');
}
if (!item.LocalTrailerCount && item.RemoteTrailers.length && item.PlayAccess == 'Full') {
$('.btnPlayExternalTrailer', page).removeClass('hide').attr('href', item.RemoteTrailers[0].Url);
@ -90,6 +113,8 @@
} else {
$('.chapterSettingsButton', page).hide();
}
LiveTvHelpers.renderOriginalAirDate($('.airDate', page), item);
});
if (item.LocationType == "Offline") {
@ -1548,11 +1573,18 @@
}
}
$(document).on('pageinitdepends', "#itemDetailPage", function () {
function playCurrentItem(button) {
var page = this;
if (currentItem.Type == 'Program') {
ApiClient.getLiveTvChannel(currentItem.ChannelId, Dashboard.getCurrentUserId()).done(function (channel) {
LibraryBrowser.showPlayMenu(null, channel.Id, channel.Type, false, channel.MediaType, (channel.UserData || {}).PlaybackPositionTicks);
});
return;
}
$('.btnPlay', page).on('click', function () {
var userdata = currentItem.UserData || {};
var mediaType = currentItem.MediaType;
@ -1561,7 +1593,34 @@
mediaType = "Audio";
}
LibraryBrowser.showPlayMenu(this, currentItem.Id, currentItem.Type, currentItem.IsFolder, mediaType, userdata.PlaybackPositionTicks);
LibraryBrowser.showPlayMenu(button, currentItem.Id, currentItem.Type, currentItem.IsFolder, mediaType, userdata.PlaybackPositionTicks);
}
function deleteTimer(page, id) {
Dashboard.confirm(Globalize.translate('MessageConfirmRecordingCancellation'), Globalize.translate('HeaderConfirmRecordingCancellation'), function (result) {
if (result) {
Dashboard.showLoadingMsg();
ApiClient.cancelLiveTvTimer(id).done(function () {
Dashboard.alert(Globalize.translate('MessageRecordingCancelled'));
reload(page);
});
}
});
}
$(document).on('pageinitdepends', "#itemDetailPage", function () {
var page = this;
$('.btnPlay', page).on('click', function () {
playCurrentItem(this);
});
$('.btnPlayTrailer', page).on('click', function () {
@ -1580,6 +1639,19 @@
});
});
$('.btnRecord', page).on('click', function () {
var id = getParameterByName('id');
Dashboard.navigate('livetvnewrecording.html?programid=' + id);
});
$('.btnCancelRecording', page).on('click', function () {
deleteTimer(page, currentItem.TimerId);
});
$('.btnShare', page).on('click', function () {
require(['sharingmanager'], function () {

View file

@ -197,7 +197,6 @@
tabs.alignBottom = true;
tabs.classList.add('bottomTabs');
}
tabs.noink = true;
if (LibraryBrowser.enableFullPaperTabs()) {
@ -207,8 +206,8 @@
// Not very iOS-like I suppose
tabs.noSlide = true;
tabs.noink = true;
tabs.noBar = true;
tabs.noink = true;
}
else {
LibraryBrowser.configureSwipeTabs(ownerpage, tabs, pages);
@ -219,7 +218,6 @@
} else {
tabs.noSlide = true;
tabs.noink = true;
tabs.noBar = true;
tabs.scrollable = true;
@ -801,7 +799,7 @@
return "channelitems.html?id=" + item.ChannelId + '&folderId=' + item.Id;
}
if (item.Type == "Program") {
return "livetvprogram.html?id=" + id;
return "itemdetails.html?id=" + id;
}
if (item.Type == "Series") {
return "itemdetails.html?id=" + id + contextSuffix;
@ -2302,6 +2300,8 @@
} else if (item.Album) {
html.push(item.Album);
} else if (item.Type == 'Program' && item.EpisodeTitle) {
html.push(item.Name);
}
if (html.length) {

View file

@ -32,7 +32,7 @@
html += '<paper-icon-button icon="person" class="headerButton headerButtonRight headerUserButton" onclick="return Dashboard.showUserFlyout(this);"></paper-icon-button>';
}
if (!$.browser.mobile && !AppInfo.isNativeApp) {
if (!$.browser.mobile && !Dashboard.isConnectMode()) {
html += '<paper-icon-button icon="settings" class="headerButton headerButtonRight dashboardEntryHeaderButton hide" onclick="return LibraryMenu.onSettingsClicked(event);"></paper-icon-button>';
}
@ -469,7 +469,7 @@
}
function showUserAtTop() {
return AppInfo.isNativeApp;
return Dashboard.isConnectMode();
}
var requiresLibraryMenuRefresh = false;
@ -797,7 +797,7 @@
document.body.classList.add('hideMainDrawer');
}
if (!AppInfo.isNativeApp) {
if (!Dashboard.isConnectMode()) {
darkDrawer = true;
}

View file

@ -26,7 +26,7 @@
currentIndexValue = startDateText;
}
html += '<a href="livetvprogram.html?id=' + program.Id + '" class="tvProgram">';
html += '<a href="itemdetails.html?id=' + program.Id + '" class="tvProgram">';
var cssClass = "tvProgramTimeSlot";

View file

@ -214,7 +214,7 @@
cssClass += " plainProgramInfo";
}
html += '<a href="livetvprogram.html?id=' + program.Id + '" class="' + cssClass + '" data-programid="' + program.Id + '">';
html += '<a href="itemdetails.html?id=' + program.Id + '" class="' + cssClass + '" data-programid="' + program.Id + '">';
html += '<div class="guideProgramName">';
html += program.Name;

View file

@ -163,7 +163,7 @@
var programId = getParameterByName('programid');
Dashboard.navigate('livetvprogram.html?id=' + programId);
Dashboard.navigate('itemdetails.html?id=' + programId);
});

View file

@ -1,135 +0,0 @@
(function ($, document) {
var currentItem;
function deleteTimer(page, id) {
Dashboard.confirm(Globalize.translate('MessageConfirmRecordingCancellation'), Globalize.translate('HeaderConfirmRecordingCancellation'), function (result) {
if (result) {
Dashboard.showLoadingMsg();
ApiClient.cancelLiveTvTimer(id).done(function () {
Dashboard.alert(Globalize.translate('MessageRecordingCancelled'));
reload(page);
});
}
});
}
function reload(page) {
Dashboard.showLoadingMsg();
ApiClient.getLiveTvProgram(getParameterByName('id'), Dashboard.getCurrentUserId()).done(function (item) {
var context = 'livetv';
currentItem = item;
var name = item.Name;
$('#itemImage', page).html(LibraryBrowser.getDetailImageHtml(item));
Dashboard.setPageTitle(name);
$('.itemName', page).html(name);
$('.itemEpisodeName', page).html(item.EpisodeTitle || '');
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item));
$('.userDataIcons', page).html(LibraryBrowser.getUserDataIconsHtml(item));
LibraryBrowser.renderGenres($('.itemGenres', page), item, context);
LibraryBrowser.renderOverview(page.querySelectorAll('.itemOverview'), item);
$('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item));
LiveTvHelpers.renderMiscProgramInfo($('.miscTvProgramInfo', page), item);
Events.trigger(page, 'displayingitem', [{
item: item,
context: 'livetv'
}]);
if (item.TimerId) {
$('#cancelRecordingButtonContainer', page).show();
} else {
$('#cancelRecordingButtonContainer', page).hide();
}
if (!item.TimerId && !item.SeriesTimerId) {
$('#recordButtonContainer', page).show();
} else {
$('#recordButtonContainer', page).hide();
}
var startDateLocal = parseISO8601Date(item.StartDate, { toLocal: true });
var endDateLocal = parseISO8601Date(item.EndDate, { toLocal: true });
var now = new Date();
if (now >= startDateLocal && now < endDateLocal) {
$('#playButtonContainer', page).show();
} else {
$('#playButtonContainer', page).hide();
}
Dashboard.getCurrentUser().done(function (user) {
if (user.Policy.IsAdministrator && item.LocationType !== "Offline") {
$('#editButtonContainer', page).show();
} else {
$('#editButtonContainer', page).hide();
}
});
LiveTvHelpers.renderOriginalAirDate($('.airDate', page), item);
Dashboard.hideLoadingMsg();
});
}
$(document).on('pageinitdepends', "#liveTvProgramPage", function () {
var page = this;
$('.btnRecord', page).on('click', function() {
var id = getParameterByName('id');
Dashboard.navigate('livetvnewrecording.html?programid=' + id);
});
$('.btnPlay', page).on('click', function () {
ApiClient.getLiveTvChannel(currentItem.ChannelId, Dashboard.getCurrentUserId()).done(function (channel) {
var userdata = channel.UserData || {};
LibraryBrowser.showPlayMenu(null, channel.Id, channel.Type, false, channel.MediaType, userdata.PlaybackPositionTicks);
});
});
$('.btnCancelRecording', page).on('click', function () {
deleteTimer(page, currentItem.TimerId);
});
}).on('pagebeforeshowready', "#liveTvProgramPage", function () {
var page = this;
reload(page);
}).on('pagebeforehide', "#liveTvProgramPage", function () {
currentItem = null;
});
})(jQuery, document);

View file

@ -387,7 +387,7 @@
var menuItems = [];
menuItems.push({
name: 'Schedules Direct (USA / Canada)',
name: 'Schedules Direct',
id: 'SchedulesDirect'
});

View file

@ -63,9 +63,9 @@
$('.manualLoginForm', page).show();
if (focusPassword) {
$('#txtManualPassword', page).focus();
$('#txtManualPassword input', page).focus();
} else {
$('#txtManualName', page).focus();
$('#txtManualName input', page).focus();
}
if (showCancel) {