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

update recording dialogs

This commit is contained in:
Luke Pulverenti 2016-09-14 12:20:03 -04:00
parent 315868b6d6
commit 66b4ed053b
20 changed files with 165 additions and 191 deletions

View file

@ -148,7 +148,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
if (options.shape == 'auto' || options.shape == 'autohome' || options.shape == 'autooverflow' || options.shape == 'autoVertical') { if (options.shape == 'auto' || options.shape == 'autohome' || options.shape == 'autooverflow' || options.shape == 'autoVertical') {
if (options.preferThumb || isThumbAspectRatio) { if (options.preferThumb === true || isThumbAspectRatio) {
options.shape = options.shape == 'autooverflow' ? 'overflowBackdrop' : 'backdrop'; options.shape = options.shape == 'autooverflow' ? 'overflowBackdrop' : 'backdrop';
} else if (isSquareAspectRatio) { } else if (isSquareAspectRatio) {
options.coverImage = true; options.coverImage = true;
@ -163,6 +163,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
} }
} }
if (options.preferThumb == 'auto') {
options.preferThumb = options.shape == 'backdrop' || options.shape == 'overflowBackdrop';
}
options.uiAspect = getDesiredAspect(options.shape); options.uiAspect = getDesiredAspect(options.shape);
options.primaryImageAspectRatio = primaryImageAspectRatio; options.primaryImageAspectRatio = primaryImageAspectRatio;
@ -454,34 +458,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var imgUrl = null; var imgUrl = null;
var coverImage = false; var coverImage = false;
if (options.autoThumb && item.ImageTags && item.ImageTags.Primary && item.PrimaryImageAspectRatio && item.PrimaryImageAspectRatio >= 1.34) { if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) {
height = primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null;
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Primary",
maxHeight: height,
maxWidth: width,
tag: item.ImageTags.Primary
});
if (primaryImageAspectRatio) {
if (uiAspect) {
if (Math.abs(primaryImageAspectRatio - uiAspect) <= .2) {
coverImage = true;
}
}
}
} else if (options.autoThumb && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
maxWidth: width,
tag: item.ImageTags.Thumb
});
} else if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = apiClient.getScaledImageUrl(item.Id, { imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: "Thumb", type: "Thumb",

View file

@ -92,5 +92,5 @@
} }
.dialogBackdropOpened { .dialogBackdropOpened {
opacity: .7; opacity: .8;
} }

View file

@ -27,7 +27,7 @@
} }
.dialogContentInner { .dialogContentInner {
padding: .5em 1.5em 20em 1.5em; padding: .5em 1em 20em 1em;
} }
.dialogContentInner-mini { .dialogContentInner-mini {
@ -49,7 +49,7 @@
left: 0; left: 0;
right: 0; right: 0;
display: flex; display: flex;
padding: 1.5em; padding: 1.25em;
/* Without this emby-checkbox is able to appear on top */ /* Without this emby-checkbox is able to appear on top */
z-index: 1; z-index: 1;
align-items: center; align-items: center;
@ -70,6 +70,11 @@
.formDialogFooterItem { .formDialogFooterItem {
max-width: 80%; max-width: 80%;
} }
.dialogContentInner {
padding-left: 1.5em;
padding-right: 1.5em;
}
} }
@media all and (min-width: 1280px) { @media all and (min-width: 1280px) {

View file

@ -367,7 +367,7 @@
if (program.SeriesTimerId) { if (program.SeriesTimerId) {
timerAttributes += ' data-seriestimerid="' + program.SeriesTimerId + '"'; timerAttributes += ' data-seriestimerid="' + program.SeriesTimerId + '"';
} }
html += '<button data-action="link"' + timerAttributes + ' data-isfolder="' + program.IsFolder + '" data-id="' + program.Id + '" data-serverid="' + program.ServerId + '" data-type="' + program.Type + '" class="' + cssClass + '" style="left:' + startPercent + '%;width:' + endPercent + '%;">'; html += '<button data-action="programdialog"' + timerAttributes + ' data-isfolder="' + program.IsFolder + '" data-id="' + program.Id + '" data-serverid="' + program.ServerId + '" data-type="' + program.Type + '" class="' + cssClass + '" style="left:' + startPercent + '%;width:' + endPercent + '%;">';
var guideProgramNameClass = "guideProgramName"; var guideProgramNameClass = "guideProgramName";

View file

@ -77,7 +77,7 @@
var isPortrait = className.indexOf('portrait') != -1; var isPortrait = className.indexOf('portrait') != -1;
var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName; var parentName = isSmallItem || isMiniItem || isPortrait ? null : item.SeriesName;
var name = itemHelper.getDisplayName(item); var name = item.EpisodeTitle ? item.Name : itemHelper.getDisplayName(item);
html += '<div>'; html += '<div>';
var logoHeight = 26; var logoHeight = 26;

View file

@ -6,15 +6,6 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', '
var miscInfo = []; var miscInfo = [];
var text, date; var text, date;
if (item.ChannelName) {
if (options.interactive && item.ChannelId) {
miscInfo.push('<a class="lnkChannel" data-id="' + item.ChannelId + '" data-serverid="' + item.ServerId + '" href="#">' + item.ChannelName + '</a>');
} else {
miscInfo.push(item.ChannelName);
}
}
if (item.StartDate) { if (item.StartDate) {
try { try {
@ -22,7 +13,7 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', '
text = datetime.toLocaleDateString(date); text = datetime.toLocaleDateString(date);
text += ', ' + datetime.getDisplayTime(date); text += ' ' + datetime.getDisplayTime(date);
if (item.EndDate) { if (item.EndDate) {
date = datetime.parseISO8601Date(item.EndDate); date = datetime.parseISO8601Date(item.EndDate);
@ -40,6 +31,15 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', '
miscInfo.push('CH ' + item.ChannelNumber); miscInfo.push('CH ' + item.ChannelNumber);
} }
if (item.ChannelName) {
if (options.interactive && item.ChannelId) {
miscInfo.push('<a class="lnkChannel" data-id="' + item.ChannelId + '" data-serverid="' + item.ServerId + '" href="#">' + item.ChannelName + '</a>');
} else {
miscInfo.push(item.ChannelName);
}
}
if (item.SeriesTimerId) { if (item.SeriesTimerId) {
miscInfo.push({ miscInfo.push({
html: '<i class="md-icon mediaInfoItem mediaInfoTimerIcon mediaInfoIconItem">&#xE062;</i>' html: '<i class="md-icon mediaInfoItem mediaInfoTimerIcon mediaInfoIconItem">&#xE062;</i>'

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

View file

@ -9,17 +9,28 @@
.recordingDialog-imageContainer { .recordingDialog-imageContainer {
flex-shrink: 0; flex-shrink: 0;
padding: 1em 1em 1em 0; padding: 1em 1em 1em 0;
max-width: 30%; max-width: 25%;
} }
.recordingDialog-img { .recordingDialog-img {
max-width: 100%; max-width: 100%;
} }
.btnPlay-notplayable {
display: none !important;
}
.recordingDialog-itemName { .recordingDialog-itemName {
margin-top: .5em; margin-top: .5em;
} }
@media all and (max-width: 800px) {
.programDialog-itemName {
display: none;
}
}
@media all and (max-height: 1400px) { @media all and (max-height: 1400px) {
.layout-tv .recordingDialog .itemOverview { .layout-tv .recordingDialog .itemOverview {

View file

@ -1,46 +1,14 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'shell', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, shell) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'shell', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, shell) {
var currentProgramId; var currentProgramId;
var currentServerId; var currentServerId;
var currentDialog; var currentDialog;
var recordingCreated = false; var recordingCreated = false;
var closeAction;
function getDaysOfWeek() {
return [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
];
}
function getDays(context) {
var daysOfWeek = getDaysOfWeek();
var days = [];
for (var i = 0, length = daysOfWeek.length; i < length; i++) {
var day = daysOfWeek[i];
if (context.querySelector('#chk' + day).checked) {
days.push(day);
}
}
return days;
}
function hideSeriesRecordingFields(context) { function hideSeriesRecordingFields(context) {
slideUpToHide(context.querySelector('.seriesFields')); slideUpToHide(context.querySelector('.seriesFields'));
slideUpToHide(context.querySelector('.seriesDays'));
context.querySelector('.btnSubmit').classList.remove('hide'); context.querySelector('.btnSubmit').classList.remove('hide');
context.querySelector('.supporterContainer').classList.add('hide'); context.querySelector('.supporterContainer').classList.add('hide');
} }
@ -68,15 +36,10 @@
apiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) { apiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) {
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
item.RecordNewOnly = form.querySelector('#chkNewOnly').checked; item.RecordNewOnly = form.querySelector('#chkNewOnly').checked;
item.RecordAnyChannel = form.querySelector('#chkAllChannels').checked; item.RecordAnyChannel = form.querySelector('#chkAllChannels').checked;
item.RecordAnyTime = form.querySelector('#chkAnyTime').checked; item.RecordAnyTime = form.querySelector('#chkAnyTime').checked;
item.Days = getDays(form);
if (form.querySelector('#chkRecordSeries').checked) { if (form.querySelector('#chkRecordSeries').checked) {
apiClient.createLiveTvSeriesTimer(item).then(function () { apiClient.createLiveTvSeriesTimer(item).then(function () {
@ -125,25 +88,26 @@
}); });
} }
function showSeriesDays(context) { function setPlayButtonVisible(context, visible) {
if (context.querySelector('#chkAnyTime').checked) { var btnPlay = context.querySelector('.btnPlay');
slideUpToHide(context.querySelector('.seriesDays'));
if (!visible) {
btnPlay.classList.add('hide');
} else { } else {
slideDownToShow(context.querySelector('.seriesDays')); btnPlay.classList.remove('hide');
} }
} }
function showSeriesRecordingFields(context, apiClient) { function showSeriesRecordingFields(context, apiClient) {
slideDownToShow(context.querySelector('.seriesFields')); slideDownToShow(context.querySelector('.seriesFields'));
showSeriesDays(context);
context.querySelector('.btnSubmit').classList.remove('hide');
getRegistration(apiClient, currentProgramId, 'seriesrecordings').then(function (regInfo) { getRegistration(apiClient, currentProgramId, 'seriesrecordings').then(function (regInfo) {
if (regInfo.IsRegistered) { if (regInfo.IsRegistered) {
context.querySelector('.btnSubmit').classList.remove('hide'); context.querySelector('.btnSubmit').classList.remove('hide');
setPlayButtonVisible(context, true);
context.querySelector('.supporterContainer').classList.add('hide'); context.querySelector('.supporterContainer').classList.add('hide');
} else { } else {
@ -151,18 +115,18 @@
context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings'); context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings');
context.querySelector('.supporterContainer').classList.remove('hide'); context.querySelector('.supporterContainer').classList.remove('hide');
context.querySelector('.btnSubmit').classList.add('hide'); context.querySelector('.btnSubmit').classList.add('hide');
setPlayButtonVisible(context, false);
} }
}); });
} }
function showSingleRecordingFields(context, apiClient) { function showSingleRecordingFields(context, apiClient) {
context.querySelector('.btnSubmit').classList.remove('hide');
getRegistration(apiClient, currentProgramId, 'dvr').then(function (regInfo) { getRegistration(apiClient, currentProgramId, 'dvr').then(function (regInfo) {
if (regInfo.IsRegistered) { if (regInfo.IsRegistered) {
context.querySelector('.btnSubmit').classList.remove('hide'); context.querySelector('.btnSubmit').classList.remove('hide');
setPlayButtonVisible(context, true);
context.querySelector('.supporterContainer').classList.add('hide'); context.querySelector('.supporterContainer').classList.add('hide');
} else { } else {
@ -170,6 +134,7 @@
context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired'); context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired');
context.querySelector('.supporterContainer').classList.remove('hide'); context.querySelector('.supporterContainer').classList.remove('hide');
context.querySelector('.btnSubmit').classList.add('hide'); context.querySelector('.btnSubmit').classList.add('hide');
setPlayButtonVisible(context, false);
} }
}); });
} }
@ -231,14 +196,16 @@
} }
}); });
context.querySelector('.btnCancel').addEventListener('click', function () { context.querySelector('.btnPlay').addEventListener('click', function () {
closeAction = 'play';
closeDialog(false); closeDialog(false);
}); });
context.querySelector('#chkAnyTime').addEventListener('change', function () { context.querySelector('.btnCancel').addEventListener('click', function () {
showSeriesDays(context); closeAction = null;
closeDialog(false);
}); });
context.querySelector('form', context).addEventListener('submit', onSubmit); context.querySelector('form', context).addEventListener('submit', onSubmit);
@ -256,24 +223,6 @@
context.querySelector('#chkConvertRecordings').checked = config.EnableRecordingEncoding; context.querySelector('#chkConvertRecordings').checked = config.EnableRecordingEncoding;
}); });
if (layoutManager.tv) {
context.querySelector('.advanced').classList.add('hide');
} else {
context.querySelector('.advanced').classList.remove('hide');
}
}
function selectDays(page, days) {
var daysOfWeek = getDaysOfWeek();
for (var i = 0, length = daysOfWeek.length; i < length; i++) {
var day = daysOfWeek[i];
page.querySelector('#chk' + day).checked = days.indexOf(day) != -1;
}
} }
function getImageUrl(item, apiClient, imageHeight) { function getImageUrl(item, apiClient, imageHeight) {
@ -310,16 +259,27 @@
var imageContainer = context.querySelector('.recordingDialog-imageContainer'); var imageContainer = context.querySelector('.recordingDialog-imageContainer');
if (imgUrl) { if (imgUrl) {
imageContainer.innerHTML = '<img src="' + imgUrl + '" class="recordingDialog-img" />'; imageContainer.innerHTML = '<img src="' + require.toUrl('.').split('?')[0] + '/empty.png" data-src="' + imgUrl + '" class="recordingDialog-img lazy" />';
imageContainer.classList.remove('hide'); imageContainer.classList.remove('hide');
imageLoader.lazyChildren(imageContainer);
} else { } else {
imageContainer.innerHTML = ''; imageContainer.innerHTML = '';
imageContainer.classList.add('hide'); imageContainer.classList.add('hide');
} }
context.querySelector('.recordingDialog-itemName').innerHTML = program.Name; context.querySelector('.recordingDialog-itemName').innerHTML = program.Name;
context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name;
context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / ');
var btnPlay = context.querySelector('.btnPlay');
var now = new Date();
if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) {
btnPlay.classList.remove('btnPlay-notplayable');
} else {
btnPlay.classList.add('btnPlay-notplayable');
}
context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program);
context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program); context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program);
@ -327,17 +287,12 @@
context.querySelector('#chkAllChannels').checked = defaultTimer.RecordAnyChannel; context.querySelector('#chkAllChannels').checked = defaultTimer.RecordAnyChannel;
context.querySelector('#chkAnyTime').checked = defaultTimer.RecordAnyTime; context.querySelector('#chkAnyTime').checked = defaultTimer.RecordAnyTime;
context.querySelector('#txtPrePaddingMinutes').value = defaultTimer.PrePaddingSeconds / 60;
context.querySelector('#txtPostPaddingMinutes').value = defaultTimer.PostPaddingSeconds / 60;
if (program.IsSeries) { if (program.IsSeries) {
context.querySelector('#eligibleForSeriesFields').classList.remove('hide'); context.querySelector('#eligibleForSeriesFields').classList.remove('hide');
} else { } else {
context.querySelector('#eligibleForSeriesFields').classList.add('hide'); context.querySelector('#eligibleForSeriesFields').classList.add('hide');
} }
selectDays(context, defaultTimer.Days);
context.querySelector('.convertRecordingsContainer').classList.remove('hide'); context.querySelector('.convertRecordingsContainer').classList.remove('hide');
showConvertRecordingsUnlockMessage(context, apiClient); showConvertRecordingsUnlockMessage(context, apiClient);
@ -386,6 +341,23 @@
}); });
} }
function executeCloseAction(action, programId, serverId) {
if (action == 'play') {
require(['playbackManager'], function (playbackManager) {
var apiClient = connectionManager.getApiClient(serverId);
apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
playbackManager.play(item.ChannelId, serverId);
});
});
return;
}
}
function showEditor(itemId, serverId) { function showEditor(itemId, serverId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
@ -423,6 +395,8 @@
dlg.addEventListener('close', function () { dlg.addEventListener('close', function () {
executeCloseAction(closeAction, currentProgramId, currentServerId);
if (recordingCreated) { if (recordingCreated) {
require(['toast'], function (toast) { require(['toast'], function (toast) {
toast(globalize.translate('sharedcomponents#RecordingScheduled')); toast(globalize.translate('sharedcomponents#RecordingScheduled'));

View file

@ -1,8 +1,6 @@
<div class="formDialogHeader"> <div class="formDialogHeader">
<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon">&#xE5C4;</i></button> <button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon">&#xE5C4;</i></button>
<h3 class="formDialogHeaderTitle"> <h3 class="formDialogHeaderTitle"></h3>
${HeaderNewRecording}
</h3>
</div> </div>
<div class="formDialogContent smoothScrollY"> <div class="formDialogContent smoothScrollY">
<form class="dialogContentInner dialog-content-centered"> <form class="dialogContentInner dialog-content-centered">
@ -12,7 +10,7 @@
</div> </div>
<div style="flex-grow:1;"> <div style="flex-grow:1;">
<h1 class="recordingDialog-itemName dialogContentTitle"></h1> <h1 class="programDialog-itemName recordingDialog-itemName dialogContentTitle"></h1>
<p class="itemMiscInfoPrimary" style="display: flex; align-items: center; flex-wrap: wrap;"></p> <p class="itemMiscInfoPrimary" style="display: flex; align-items: center; flex-wrap: wrap;"></p>
<p class="itemMiscInfoSecondary" style="display: flex; align-items: center; flex-wrap: wrap;"></p> <p class="itemMiscInfoSecondary" style="display: flex; align-items: center; flex-wrap: wrap;"></p>
<p class="itemGenres"></p> <p class="itemGenres"></p>
@ -21,7 +19,7 @@
<div id="eligibleForSeriesFields" class="hide"> <div id="eligibleForSeriesFields" class="hide">
<br /> <br />
<label class="checkboxContainer"> <label>
<input type="checkbox" is="emby-checkbox" id="chkRecordSeries" /> <input type="checkbox" is="emby-checkbox" id="chkRecordSeries" />
<span>${RecordSeries}</span> <span>${RecordSeries}</span>
</label> </label>
@ -44,6 +42,7 @@
<br /> <br />
</div> </div>
</div> </div>
<br />
<div class="convertRecordingsContainer hide checkboxContainer checkboxContainer-withDescription"> <div class="convertRecordingsContainer hide checkboxContainer checkboxContainer-withDescription">
<label> <label>
<input type="checkbox" is="emby-checkbox" id="chkConvertRecordings" /> <input type="checkbox" is="emby-checkbox" id="chkConvertRecordings" />
@ -54,56 +53,6 @@
<a href="#" class="accent lnkPremiere">${FeatureRequiresEmbyPremiere}</a> <a href="#" class="accent lnkPremiere">${FeatureRequiresEmbyPremiere}</a>
</div> </div>
</div> </div>
<div class="advanced hide">
<div is="emby-collapse" title="${Advanced}">
<div class="collapseContent">
<div class="seriesDays hide">
<div>
<h1>${Days}</h1>
</div>
<div class="checkboxList">
<label>
<input type="checkbox" is="emby-checkbox" id="chkSunday" />
<span>${Sunday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkMonday" />
<span>${Monday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkTuesday" />
<span>${Tuesday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkWednesday" />
<span>${Wednesday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkThursday" />
<span>${Thursday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkFriday" />
<span>${Friday}</span>
</label>
<label>
<input type="checkbox" is="emby-checkbox" id="chkSaturday" />
<span>${Saturday}</span>
</label>
</div>
<br />
</div>
<br />
<div class="inputContainer">
<input is="emby-input" type="number" id="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPrePaddingMinutes}" />
</div>
<div class="inputContainer">
<input is="emby-input" type="number" id="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPostPaddingMinutes}" />
</div>
</div>
</div>
<br />
</div>
<br /> <br />
<div class="formDialogFooter"> <div class="formDialogFooter">
<div class="supporterContainer hide formDialogFooterItem"> <div class="supporterContainer hide formDialogFooterItem">
@ -113,8 +62,10 @@
<span>${HeaderBecomeProjectSupporter}</span> <span>${HeaderBecomeProjectSupporter}</span>
</button> </button>
</div> </div>
<button is="emby-button" type="submit" class="raised btnSubmit block formDialogFooterItem button-submit"> <button is="emby-button" type="button" class="raised btnPlay btnPlay-notplayable hide block formDialogFooterItem button-submit">
<i class="md-icon recordingDialogSubmitIcon">fiber_manual_record</i> <span>${Play}</span>
</button>
<button is="emby-button" type="submit" class="raised btnSubmit block formDialogFooterItem button-submit" style="background:#cc3333;">
<span>${Record}</span> <span>${Record}</span>
</button> </button>
</div> </div>

View file

@ -1,4 +1,4 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper) { define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
var currentDialog; var currentDialog;
var recordingUpdated = false; var recordingUpdated = false;
@ -66,8 +66,10 @@
var imageContainer = context.querySelector('.recordingDialog-imageContainer'); var imageContainer = context.querySelector('.recordingDialog-imageContainer');
if (imgUrl) { if (imgUrl) {
imageContainer.innerHTML = '<img src="' + imgUrl + '" class="recordingDialog-img" />'; imageContainer.innerHTML = '<img src="' + require.toUrl('.').split('?')[0] + '/empty.png" data-src="' + imgUrl + '" class="recordingDialog-img lazy" />';
imageContainer.classList.remove('hide'); imageContainer.classList.remove('hide');
imageLoader.lazyChildren(imageContainer);
} else { } else {
imageContainer.innerHTML = ''; imageContainer.innerHTML = '';
imageContainer.classList.add('hide'); imageContainer.classList.add('hide');

View file

@ -16,10 +16,10 @@
<h1 class="recordingDialog-itemName dialogContentTitle"></h1> <h1 class="recordingDialog-itemName dialogContentTitle"></h1>
<p class="itemMiscInfoPrimary" style="display: flex; align-items: center; flex-wrap: wrap;"></p> <p class="itemMiscInfoPrimary" style="display: flex; align-items: center; flex-wrap: wrap;"></p>
<p class="itemMiscInfoSecondary" style="display: flex; align-items: center; flex-wrap: wrap;"></p> <p class="itemMiscInfoSecondary" style="display: flex; align-items: center; flex-wrap: wrap;"></p>
<p class="itemGenres"></p>
</div> </div>
</div> </div>
<p class="itemGenres"></p>
<p class="itemOverview"></p> <p class="itemOverview"></p>
<p style="margin-top: 2em;" class="timerStatus hide"> <p style="margin-top: 2em;" class="timerStatus hide">

View file

@ -91,6 +91,19 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g
embyRouter.showItem(item, options); embyRouter.showItem(item, options);
} }
function showProgramDialog(item) {
if (item.TimerId) {
showItem(item);
return;
}
require(['recordingCreator'], function (recordingCreator) {
recordingCreator.show(item.Id, item.ServerId);
});
}
function getItem(button) { function getItem(button) {
button = dom.parentWithAttribute(button, 'data-id'); button = dom.parentWithAttribute(button, 'data-id');
@ -168,6 +181,7 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g
return { return {
Type: card.getAttribute('data-type'), Type: card.getAttribute('data-type'),
Id: card.getAttribute('data-id'), Id: card.getAttribute('data-id'),
TimerId: card.getAttribute('data-timerid'),
CollectionType: card.getAttribute('data-collectiontype'), CollectionType: card.getAttribute('data-collectiontype'),
ChannelId: card.getAttribute('data-channelid'), ChannelId: card.getAttribute('data-channelid'),
SeriesId: card.getAttribute('data-seriesid'), SeriesId: card.getAttribute('data-seriesid'),
@ -217,6 +231,11 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g
}); });
} }
else if (action == 'programdialog') {
showProgramDialog(item);
}
else if (action == 'instantmix') { else if (action == 'instantmix') {
playbackManager.instantMix(id, serverId); playbackManager.instantMix(id, serverId);
} }

View file

@ -10,7 +10,13 @@
type: 'MusicArtist' type: 'MusicArtist'
}); });
} }
if (item.ProgramCount) {
sections.push({
name: Globalize.translate('HeaderUpcomingOnTV'),
type: 'Program'
});
}
if (item.MovieCount) { if (item.MovieCount) {
sections.push({ sections.push({
@ -108,6 +114,24 @@
switch (type) { switch (type) {
case 'Program':
loadItems(element, item, type, {
MediaTypes: "",
IncludeItemTypes: "Program",
PersonTypes: "",
ArtistIds: "",
Limit: 10
}, {
shape: "backdrop",
showTitle: true,
centerText: true,
overlayMoreButton: true,
preferThumb: true,
overlayText: false,
showProgramAirInfo: true
});
break;
case 'Movie': case 'Movie':
loadItems(element, item, type, { loadItems(element, item, type, {
MediaTypes: "", MediaTypes: "",
@ -119,7 +143,8 @@
shape: "portrait", shape: "portrait",
showTitle: true, showTitle: true,
centerText: true, centerText: true,
overlayMoreButton: true overlayMoreButton: true,
overlayText: false
}); });
break; break;

View file

@ -565,7 +565,8 @@
var itemMiscInfo = page.querySelectorAll('.itemMiscInfo'); var itemMiscInfo = page.querySelectorAll('.itemMiscInfo');
for (i = 0, length = itemMiscInfo.length; i < length; i++) { for (i = 0, length = itemMiscInfo.length; i < length; i++) {
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, { mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
interactive: true interactive: true,
episodeTitle: false
}); });
} }
var itemGenres = page.querySelectorAll('.itemGenres'); var itemGenres = page.querySelectorAll('.itemGenres');

View file

@ -89,7 +89,8 @@
showChannelName: true, showChannelName: true,
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
action: 'edit' action: 'edit',
cardFooterAside: 'none'
}); });
html += '</div>'; html += '</div>';

View file

@ -84,7 +84,9 @@
coverImage: true, coverImage: true,
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
allowBottomPadding: !enableScrollX() allowBottomPadding: !enableScrollX(),
preferThumb: 'auto'
}, cardOptions || {})); }, cardOptions || {}));
ImageLoader.lazyChildren(recordingItems); ImageLoader.lazyChildren(recordingItems);
@ -117,7 +119,8 @@
Limit: enableScrollX() ? 12 : 8, Limit: enableScrollX() ? 12 : 8,
IsInProgress: false, IsInProgress: false,
Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo',
EnableTotalRecordCount: false EnableTotalRecordCount: false,
EnableImageTypes: "Primary,Thumb"
}).then(function (result) { }).then(function (result) {

View file

@ -28,7 +28,7 @@
IsAiring: true, IsAiring: true,
limit: limit, limit: limit,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary", EnableImageTypes: "Primary,Thumb",
Fields: "ChannelInfo" Fields: "ChannelInfo"
}).then(function (result) { }).then(function (result) {
@ -53,7 +53,8 @@
IsKids: false, IsKids: false,
IsSeries: true, IsSeries: true,
EnableTotalRecordCount: false, EnableTotalRecordCount: false,
Fields: "ChannelInfo" Fields: "ChannelInfo",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) { }).then(function (result) {
@ -68,7 +69,8 @@
limit: getLimit(), limit: getLimit(),
IsMovie: true, IsMovie: true,
EnableTotalRecordCount: false, EnableTotalRecordCount: false,
Fields: "ChannelInfo" Fields: "ChannelInfo",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) { }).then(function (result) {
@ -83,7 +85,8 @@
limit: getLimit(), limit: getLimit(),
IsSports: true, IsSports: true,
EnableTotalRecordCount: false, EnableTotalRecordCount: false,
Fields: "ChannelInfo" Fields: "ChannelInfo",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) { }).then(function (result) {
@ -98,7 +101,8 @@
limit: getLimit(), limit: getLimit(),
IsKids: true, IsKids: true,
EnableTotalRecordCount: false, EnableTotalRecordCount: false,
Fields: "ChannelInfo" Fields: "ChannelInfo",
EnableImageTypes: "Primary,Thumb"
}).then(function (result) { }).then(function (result) {

View file

@ -457,8 +457,8 @@
centerText: true, centerText: true,
overlayText: false, overlayText: false,
lazy: true, lazy: true,
autoThumb: true,
transition: false, transition: false,
preferThumb: true,
allowBottomPadding: !enableScrollX() allowBottomPadding: !enableScrollX()
}); });
html += '</div>'; html += '</div>';

View file

@ -2136,5 +2136,6 @@
"Sports": "Sports", "Sports": "Sports",
"HeaderForKids": "For Kids", "HeaderForKids": "For Kids",
"HeaderRecordingGroups": "Recording Groups", "HeaderRecordingGroups": "Recording Groups",
"LabelConvertRecordingsTo": "Convert recordings to:" "LabelConvertRecordingsTo": "Convert recordings to:",
"HeaderUpcomingOnTV": "Upcoming On TV"
} }