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

Merge pull request #1730 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-05-13 14:31:53 -04:00
commit 52d4f4fe4f
75 changed files with 942 additions and 2506 deletions

View file

@ -54,6 +54,7 @@ See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for
<g id="refresh"><path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z" /></g>
<g id="person"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" /></g>
<g id="play-arrow"><path d="M8 5v14l11-7z" /></g>
<g id="star"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" /></g>
<g id="folder-open"><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z" /></g>
<g id="mode-edit"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" /></g>
<g id="more-vert"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" /></g>

View file

@ -16,12 +16,12 @@
},
"devDependencies": {},
"ignore": [],
"version": "1.2.87",
"_release": "1.2.87",
"version": "1.3.18",
"_release": "1.3.18",
"_resolution": {
"type": "version",
"tag": "1.2.87",
"commit": "21a6cacb0ec2cf301045a5fb35192753efd71025"
"tag": "1.3.18",
"commit": "127ca5da89083c44351fd0664355f3f521313d5d"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.0",

View file

@ -1,4 +1,4 @@
define(['dialogHelper', 'layoutManager', 'dialogText', 'paper-button', 'css!./actionsheet', 'html!./../icons/nav.html'], function (dialogHelper, layoutManager, dialogText) {
define(['dialogHelper', 'layoutManager', 'globalize', 'paper-button', 'css!./actionsheet', 'html!./../icons/nav.html'], function (dialogHelper, layoutManager, globalize) {
function parentWithClass(elem, className) {
@ -88,7 +88,8 @@
// title
var dialogOptions = {
removeOnClose: true,
enableHistory: options.enableHistory
enableHistory: options.enableHistory,
scrollY: false
};
var backButton = false;
@ -179,7 +180,7 @@
if (options.showCancel) {
html += '<div class="buttons">';
html += '<paper-button class="btnCancel">' + dialogText.get('Cancel') + '</paper-button>';
html += '<paper-button class="btnCancel">' + globalize.translate('sharedcomponents#ButtonCancel') + '</paper-button>';
html += '</div>';
}
html += '</div>';

View file

@ -1,4 +1,4 @@
define(['dialogHelper', 'layoutManager', 'dialogText', 'html!./../icons/nav.html', 'css!./../prompt/style.css', 'paper-button', 'paper-icon-button-light', 'paper-input'], function (dialogHelper, layoutManager, dialogText) {
define(['dialogHelper', 'layoutManager', 'globalize', 'html!./../icons/nav.html', 'css!./../prompt/style.css', 'paper-button', 'paper-icon-button-light', 'paper-input'], function (dialogHelper, layoutManager, globalize) {
function getIcon(icon, cssClass, canFocus, autoFocus) {
@ -70,12 +70,12 @@ define(['dialogHelper', 'layoutManager', 'dialogText', 'html!./../icons/nav.html
html += '</p>';
}
var buttonText = options.type == 'error' ? 'Ok' : 'GotIt';
var buttonText = options.type == 'error' ? 'sharedcomponents#ButtonOk' : 'sharedcomponents#ButtonGotIt';
if (raisedButtons) {
html += '<paper-button raised class="btnSubmit"><iron-icon icon="nav:check"></iron-icon><span>' + dialogText.get(buttonText) + '</span></paper-button>';
html += '<paper-button raised class="btnSubmit"><iron-icon icon="nav:check"></iron-icon><span>' + globalize.translate(buttonText) + '</span></paper-button>';
} else {
html += '<div class="buttons" style="text-align:right;">';
html += '<paper-button class="btnSubmit">' + dialogText.get(buttonText) + '</paper-button>';
html += '<paper-button class="btnSubmit">' + globalize.translate(buttonText) + '</paper-button>';
html += '</div>';
}

View file

@ -1,4 +1,4 @@
define(['layoutManager', 'dialogText'], function (layoutManager, dialogText) {
define(['layoutManager', 'globalize'], function (layoutManager, globalize) {
function showTvConfirm(options) {
return new Promise(function (resolve, reject) {
@ -8,12 +8,12 @@ define(['layoutManager', 'dialogText'], function (layoutManager, dialogText) {
var items = [];
items.push({
name: dialogText.get('Ok'),
name: globalize.translate('sharedcomponents#ButtonOk'),
id: 'ok'
});
items.push({
name: dialogText.get('Cancel'),
name: globalize.translate('sharedcomponents#ButtonCancel'),
id: 'cancel'
});
@ -74,9 +74,9 @@ define(['layoutManager', 'dialogText'], function (layoutManager, dialogText) {
html += '<div class="buttons">';
html += '<paper-button class="btnConfirm" autofocus>' + dialogText.get('Ok') + '</paper-button>';
html += '<paper-button class="btnConfirm" autofocus>' + globalize.translate('sharedcomponents#ButtonOk') + '</paper-button>';
html += '<paper-button class="btnCancel">' + dialogText.get('Cancel') + '</paper-button>';
html += '<paper-button class="btnCancel">' + globalize.translate('sharedcomponents#ButtonCancel') + '</paper-button>';
html += '</div>';

View file

@ -4,7 +4,6 @@
z-index: 999999 !important;
position: fixed;
margin: 24px 40px;
-webkit-overflow-scrolling: touch;
-webkit-font-smoothing: antialiased;
box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4);
height: auto;
@ -32,21 +31,6 @@
max-width: 70%;
}
.dialog.scrollY {
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overflow-x: hidden;
}
.dialog.hiddenScroll::-webkit-scrollbar {
display: none;
}
.dialog.hiddenScroll {
-ms-overflow-style: none;
overflow: -moz-scrollbars-none;
}
@media all and (min-width: 1280px) and (min-height: 720px) {
.dialog.medium {
@ -80,14 +64,9 @@
}
.dialog > * {
margin-top: 20px;
padding: 0 24px;
}
.dialog > *:first-child {
margin-top: 24px;
}
.dialog .buttons {
position: relative;
padding: 8px 8px 8px 24px;

View file

@ -1,4 +1,6 @@
define(['historyManager', 'focusManager', 'browser', 'layoutManager', 'inputManager', 'css!./dialoghelper.css'], function (historyManager, focusManager, browser, layoutManager, inputManager) {
define(['historyManager', 'focusManager', 'browser', 'layoutManager', 'inputManager', 'scrollHelper', 'css!./dialoghelper.css', 'scrollStyles'], function (historyManager, focusManager, browser, layoutManager, inputManager, scrollHelper) {
var globalOnOpenCallback;
function dialogHashHandler(dlg, hash, resolve) {
@ -184,6 +186,10 @@
function open(dlg) {
if (globalOnOpenCallback) {
globalOnOpenCallback(dlg);
}
return new Promise(function (resolve, reject) {
new dialogHashHandler(dlg, 'dlg' + new Date().getTime(), resolve);
@ -380,11 +386,12 @@
dlg.classList.add('dialog');
dlg.classList.add('scrollY');
if (options.scrollY !== false) {
dlg.classList.add('smoothScrollY');
if (layoutManager.tv || layoutManager.mobile) {
// Need scrollbars for mouse use
dlg.classList.add('hiddenScroll');
if (layoutManager.tv) {
scrollHelper.centerFocus.on(dlg, false);
}
}
if (options.removeOnClose) {
@ -402,6 +409,9 @@
return {
open: open,
close: close,
createDialog: createDialog
createDialog: createDialog,
setOnOpen: function (val) {
globalOnOpenCallback = val;
}
};
});

View file

@ -0,0 +1,41 @@
.formDialog {
display: flex;
flex-direction: column;
}
.formDialog .dialogHeader {
padding: .35em .5em;
display: flex;
align-items: center;
background-color: #101010;
flex-shrink: 0;
}
.formDialog .dialogHeaderTitle {
margin-left: .75em;
}
.formDialog form {
margin: 0 auto;
}
.formDialog .dialogContent {
flex-grow: 1;
}
.formDialog .dialogContentInner {
padding-bottom: 50vh;
padding-top: 1em;
}
@media all and (min-width: 1000px) {
.formDialog form {
max-width: 70vw;
}
}
.layout-tv .formDialog .dialogHeader {
padding-top: 1.5em;
padding-bottom: 1.5em;
}

View file

@ -1,6 +1,4 @@
define(['globalize', 'connectionManager', 'loading', 'scrollHelper', 'datetime', 'focusManager', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'clearButtonStyle', 'css!./guide.css', 'html!./../icons/mediainfo.html', 'html!./../icons/nav.html', 'scrollStyles'], function (globalize, connectionManager, loading, scrollHelper, datetime, focusManager, imageLoader, events, layoutManager, itemShortcuts, registrationServices) {
var baseUrl;
define(['require', 'globalize', 'connectionManager', 'loading', 'scrollHelper', 'datetime', 'focusManager', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'clearButtonStyle', 'css!./guide.css', 'html!./../icons/mediainfo.html', 'html!./../icons/nav.html', 'scrollStyles'], function (require, globalize, connectionManager, loading, scrollHelper, datetime, focusManager, imageLoader, events, layoutManager, itemShortcuts, registrationServices) {
function Guide(options) {
@ -72,7 +70,7 @@
var limit = 5;
context.querySelector('.guideRequiresUnlock').classList.remove('hide');
context.querySelector('.unlockText').innerHTML = globalize.translate('MessageLiveTvGuideRequiresUnlock', limit);
context.querySelector('.unlockText').innerHTML = globalize.translate('LiveTvGuideRequiresUnlock', limit);
return limit;
});
@ -258,13 +256,13 @@
html += '<div class="' + guideProgramNameClass + '">';
if (program.IsLive) {
html += '<span class="liveTvProgram">' + globalize.translate('core#AttributeLive') + '&nbsp;</span>';
html += '<span class="liveTvProgram">' + globalize.translate('sharedcomponents#AttributeLive') + '&nbsp;</span>';
}
else if (program.IsPremiere) {
html += '<span class="premiereTvProgram">' + globalize.translate('core#AttributePremiere') + '&nbsp;</span>';
html += '<span class="premiereTvProgram">' + globalize.translate('sharedcomponents#AttributePremiere') + '&nbsp;</span>';
}
else if (program.IsSeries && !program.IsRepeat) {
html += '<span class="newTvProgram">' + globalize.translate('core#AttributeNew') + '&nbsp;</span>';
html += '<span class="newTvProgram">' + globalize.translate('sharedcomponents#AttributeNew') + '&nbsp;</span>';
}
html += program.Name;
@ -441,13 +439,13 @@
function getFutureDateText(date) {
var weekday = [];
weekday[0] = globalize.translate('core#OptionSundayShort');
weekday[1] = globalize.translate('core#OptionMondayShort');
weekday[2] = globalize.translate('core#OptionTuesdayShort');
weekday[3] = globalize.translate('core#OptionWednesdayShort');
weekday[4] = globalize.translate('core#OptionThursdayShort');
weekday[5] = globalize.translate('core#OptionFridayShort');
weekday[6] = globalize.translate('core#OptionSaturdayShort');
weekday[0] = globalize.translate('sharedcomponents#OptionSundayShort');
weekday[1] = globalize.translate('sharedcomponents#OptionMondayShort');
weekday[2] = globalize.translate('sharedcomponents#OptionTuesdayShort');
weekday[3] = globalize.translate('sharedcomponents#OptionWednesdayShort');
weekday[4] = globalize.translate('sharedcomponents#OptionThursdayShort');
weekday[5] = globalize.translate('sharedcomponents#OptionFridayShort');
weekday[6] = globalize.translate('sharedcomponents#OptionSaturdayShort');
var day = weekday[date.getDay()];
date = datetime.toLocaleDateString(date);
@ -530,7 +528,7 @@
actionsheet.show({
items: dateOptions,
title: globalize.translate('core#HeaderSelectDate'),
title: globalize.translate('sharedcomponents#HeaderSelectDate'),
callback: function (id) {
var date = new Date();
@ -598,9 +596,6 @@
}
}
var xhr = new XMLHttpRequest();
xhr.open('GET', baseUrl + '/tvguide.template.html', true);
var supportsCaptureOption = false;
try {
var opts = Object.defineProperty({}, 'capture', {
@ -619,9 +614,7 @@
target.addEventListener(type, handler, optionsOrCapture);
}
xhr.onload = function (e) {
var template = this.response;
require(['text!./tvguide.template.html'], function (template) {
var context = options.element;
context.innerHTML = globalize.translateDocument(template, 'core');
@ -658,13 +651,7 @@
events.trigger(self, 'load');
self.refresh();
}
xhr.send();
};
Guide.setBaseUrl = function (url) {
baseUrl = url;
});
};
return Guide;

View file

@ -0,0 +1,101 @@
define(['apphost', 'globalize', 'connectionManager'], function (appHost, globalize, connectionManager) {
function getCommands(options) {
var item = options.item;
var serverId = item.ServerId;
var apiClient = connectionManager.getApiClient(serverId);
return apiClient.getCurrentUser().then(function (user) {
var commands = [];
if (item.CanDownload && user.Policy.EnableContentDownloading && appHost.supports('filedownload')) {
commands.push({
name: globalize.translate('sharedcomponents#Download'),
id: 'download'
});
}
if (item.Type != 'Timer' && user.Policy.EnablePublicSharing && appHost.supports('sharing')) {
commands.push({
name: globalize.translate('Share'),
id: 'share'
});
}
return commands;
});
}
function executeCommand(item, id) {
var itemId = item.Id;
var serverId = item.ServerId;
var apiClient = connectionManager.getApiClient(serverId);
return new Promise(function (resolve, reject) {
switch (id) {
case 'download':
{
require(['fileDownloader'], function (fileDownloader) {
var downloadHref = apiClient.getUrl("Items/" + itemId + "/Download", {
api_key: apiClient.accessToken()
});
fileDownloader.download([
{
url: downloadHref,
itemId: itemId,
serverId: serverId
}]);
reject();
});
break;
}
case 'share':
{
require(['sharingmanager'], function (sharingManager) {
sharingManager.showMenu({
serverId: serverId,
itemId: itemId
}).then(reject);
});
break;
}
default:
break;
}
});
}
function show(options) {
return getCommands(options).then(function (commands) {
return new Promise(function (resolve, reject) {
require(['actionsheet'], function (actionSheet) {
actionSheet.show({
items: commands
}).then(function (id) {
executeCommand(options.item, id).then(resolve);
}, reject);
});
});
});
}
return {
getCommands: getCommands,
show: show
};
});

View file

@ -19,7 +19,7 @@ define([], function () {
}
if (/*options.isInlineSpecial &&*/ item.Type == "Episode" && item.ParentIndexNumber == 0) {
name = Globalize.translate('core#ValueSpecialEpisodeName', name);
name = Globalize.translate('sharedcomponents#ValueSpecialEpisodeName', name);
} else if ((item.Type == "Episode" || item.Type == 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null) {

View file

@ -71,7 +71,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
if (count) {
miscInfo.push(globalize.translate('core#TrackCount', count));
miscInfo.push(globalize.translate('sharedcomponents#TrackCount', count));
}
if (item.CumulativeRunTimeTicks) {
@ -86,7 +86,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
if (count) {
miscInfo.push(globalize.translate('core#ItemCount', count));
miscInfo.push(globalize.translate('sharedcomponents#ItemCount', count));
}
}
@ -127,7 +127,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
if (item.ProductionYear && item.Type == "Series") {
if (item.Status == "Continuing") {
miscInfo.push(globalize.translate('core#ValueSeriesYearToPresent', item.ProductionYear));
miscInfo.push(globalize.translate('sharedcomponents#ValueSeriesYearToPresent', item.ProductionYear));
}
else if (item.ProductionYear) {
@ -158,17 +158,17 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
if (item.IsLive) {
miscInfo.push({
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('core#AttributeLive') + '</div>'
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('sharedcomponents#AttributeLive') + '</div>'
});
}
else if (item.IsPremiere) {
miscInfo.push({
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('core#AttributePremiere') + '</div>'
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('sharedcomponents#AttributePremiere') + '</div>'
});
}
else if (item.IsSeries && !item.IsRepeat) {
miscInfo.push({
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('core#AttributeNew') + '</div>'
html: '<div class="mediaInfoProgramAttribute mediaInfoItem">' + globalize.translate('sharedcomponents#AttributeNew') + '</div>'
});
}
@ -176,14 +176,14 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
try {
date = datetime.parseISO8601Date(item.PremiereDate);
text = globalize.translate('core#OriginalAirDateValue', date.toLocaleDateString());
text = globalize.translate('sharedcomponents#OriginalAirDateValue', date.toLocaleDateString());
miscInfo.push(text);
}
catch (e) {
console.log("Error parsing date: " + item.PremiereDate);
}
} else if (item.ProductionYear) {
text = globalize.translate('core#ReleaseYearValue', item.ProductionYear);
text = globalize.translate('sharedcomponents#ReleaseYearValue', item.ProductionYear);
miscInfo.push(text);
}
}
@ -275,7 +275,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
endDate = new Date(endDate);
var displayTime = datetime.getDisplayTime(endDate);
return globalize.translate('core#EndsAtValue', displayTime);
return globalize.translate('sharedcomponents#EndsAtValue', displayTime);
}
}
@ -292,7 +292,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
if (includeText === false) {
return displayTime;
}
return globalize.translate('core#EndsAtValue', displayTime);
return globalize.translate('sharedcomponents#EndsAtValue', displayTime);
}
function getMediaInfoItem(m, cssClass) {
@ -400,7 +400,7 @@ define(['datetime', 'globalize', 'embyRouter', 'html!./../icons/mediainfo.html',
}
if (options.isInlineSpecial && item.Type == "Episode" && item.ParentIndexNumber == 0) {
name = globalize.translate('core#ValueSpecialEpisodeName', name);
name = globalize.translate('sharedcomponents#ValueSpecialEpisodeName', name);
} else if (item.Type == "Episode" && item.IndexNumber != null && item.ParentIndexNumber != null) {

View file

@ -1,4 +1,4 @@
define(['dialogHelper', 'layoutManager', 'dialogText', 'html!./../icons/nav.html', 'css!./style.css', 'paper-button', 'paper-icon-button-light', 'paper-input'], function (dialogHelper, layoutManager, dialogText) {
define(['dialogHelper', 'layoutManager', 'globalize', 'html!./../icons/nav.html', 'css!./style.css', 'paper-button', 'paper-icon-button-light', 'paper-input'], function (dialogHelper, layoutManager, globalize) {
function getIcon(icon, cssClass, canFocus, autoFocus) {
@ -64,11 +64,11 @@ define(['dialogHelper', 'layoutManager', 'dialogText', 'html!./../icons/nav.html
html += '<br/>';
if (raisedButtons) {
html += '<paper-button raised class="btnSubmit"><iron-icon icon="nav:check"></iron-icon><span>' + dialogText.get('Ok') + '</span></paper-button>';
html += '<paper-button raised class="btnSubmit"><iron-icon icon="nav:check"></iron-icon><span>' + globalize.translate('sharedcomponents#ButtonOk') + '</span></paper-button>';
} else {
html += '<div class="buttons">';
html += '<paper-button class="btnSubmit">' + dialogText.get('Ok') + '</paper-button>';
html += '<paper-button class="btnPromptExit">' + dialogText.get('Cancel') + '</paper-button>';
html += '<paper-button class="btnSubmit">' + globalize.translate('sharedcomponents#ButtonOk') + '</paper-button>';
html += '<paper-button class="btnPromptExit">' + globalize.translate('sharedcomponents#ButtonCancel') + '</paper-button>';
html += '</div>';
}
html += '</form>';

View file

@ -0,0 +1,3 @@
.recordingDialog .btnSubmit {
background-color: #cc3333;
}

View file

@ -0,0 +1,416 @@
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'scrollStyles', 'paper-checkbox', 'emby-collapsible', 'paper-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'html!./../icons/mediainfo.html', 'html!./../icons/nav.html'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper) {
var currentProgramId;
var currentServerId;
var currentDialog;
var recordingCreated = false;
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) {
slideUpToHide(context.querySelector('#seriesFields'));
context.querySelector('.btnSubmit').classList.remove('hide');
context.querySelector('.supporterContainer').classList.add('hide');
}
function closeDialog(isSubmitted) {
recordingCreated = isSubmitted;
dialogHelper.close(currentDialog);
}
function onSubmit(e) {
loading.show();
var form = this;
var apiClient = connectionManager.getApiClient(currentServerId);
apiClient.getNamedConfiguration("livetv").then(function (config) {
config.EnableRecordingEncoding = form.querySelector('#chkConvertRecordings').checked;
apiClient.updateNamedConfiguration("livetv", config);
});
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.RecordAnyChannel = form.querySelector('#chkAllChannels').checked;
item.RecordAnyTime = form.querySelector('#chkAnyTime').checked;
item.Days = getDays(form);
if (form.querySelector('#chkRecordSeries').checked) {
apiClient.createLiveTvSeriesTimer(item).then(function () {
loading.hide();
closeDialog(true);
});
} else {
apiClient.createLiveTvTimer(item).then(function () {
loading.hide();
closeDialog(true);
});
}
});
// Disable default form submission
e.preventDefault();
return false;
}
function getRegistration(programId, apiClient) {
loading.show();
return apiClient.getJSON(apiClient.getUrl('LiveTv/Registration', {
ProgramId: programId,
Feature: 'seriesrecordings'
})).then(function (result) {
loading.hide();
return result;
}, function () {
loading.hide();
return {
TrialVersion: true,
IsValid: true,
IsRegistered: false
};
});
}
function showSeriesRecordingFields(context, apiClient) {
slideDownToShow(context.querySelector('#seriesFields'));
context.querySelector('.btnSubmit').classList.remove('hide');
getRegistration(currentProgramId, apiClient).then(function (regInfo) {
if (regInfo.IsValid) {
context.querySelector('.btnSubmit').classList.remove('hide');
} else {
context.querySelector('.btnSubmit').classList.add('hide');
}
if (regInfo.IsRegistered) {
context.querySelector('.supporterContainer').classList.add('hide');
} else {
context.querySelector('.supporterContainer').classList.remove('hide');
if (regInfo.TrialVersion) {
context.querySelector('.supporterTrial').classList.remove('hide');
} else {
context.querySelector('.supporterTrial').classList.add('hide');
}
}
});
}
function slideDownToShow(elem) {
if (!elem.classList.contains('hide')) {
return;
}
elem.classList.remove('hide');
elem.style.overflowY = 'hidden';
requestAnimationFrame(function () {
elem.animate([{
height: 0
}, {
height: elem.offsetHeight + 'px'
}], { duration: 400, easing: 'ease' }).onfinish = function () {
elem.classList.remove('hide');
};
});
}
function slideUpToHide(elem) {
if (elem.classList.contains('hide')) {
return;
}
elem.style.overflowY = 'hidden';
requestAnimationFrame(function () {
elem.animate([{
height: elem.offsetHeight + 'px'
}, {
height: 0
}], { duration: 400, easing: 'ease' }).onfinish = function () {
elem.classList.add('hide');
};
});
}
function onPremiereLinkClicked(e) {
require(['shell'], function (shell) {
shell.openUrl('https://emby.media/premiere');
});
e.preventDefault();
return false;
}
function init(context) {
var apiClient = connectionManager.getApiClient(currentServerId);
context.querySelector('.lnkPremiere').addEventListener('click', onPremiereLinkClicked);
context.querySelector('#chkRecordSeries').addEventListener('change', function () {
if (this.checked) {
showSeriesRecordingFields(context, apiClient);
} else {
hideSeriesRecordingFields(context);
}
});
context.querySelector('.btnSubmit').addEventListener('click', function () {
// Do a fake form submit this the button isn't a real submit button
var fakeSubmit = document.createElement('input');
fakeSubmit.setAttribute('type', 'submit');
fakeSubmit.style.display = 'none';
var form = context.querySelector('form');
form.appendChild(fakeSubmit);
fakeSubmit.click();
// Seeing issues in smart tv browsers where the form does not get submitted if the button is removed prior to the submission actually happening
setTimeout(function () {
form.removeChild(fakeSubmit);
}, 500);
});
context.querySelector('.btnCancel').addEventListener('click', function () {
closeDialog(false);
});
context.querySelector('form', context).addEventListener('submit', onSubmit);
var supporterButtons = context.querySelectorAll('.btnSupporter');
for (var i = 0, length = supporterButtons.length; i < length; i++) {
if (appHost.supports('externalpremium')) {
supporterButtons[i].classList.remove('hide');
} else {
supporterButtons[i].classList.add('hide');
}
}
if (appHost.supports('externalpremium')) {
context.querySelector('.btnSupporterForConverting a').href = 'https://emby.media/premiere';
} else {
context.querySelector('.btnSupporterForConverting a').href = '#';
}
apiClient.getNamedConfiguration("livetv").then(function (config) {
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 renderRecording(context, defaultTimer, program, apiClient) {
context.querySelector('.itemName').innerHTML = program.Name;
context.querySelector('.itemEpisodeName').innerHTML = program.EpisodeTitle || '';
context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program);
context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program);
context.querySelector('#chkNewOnly').checked = defaultTimer.RecordNewOnly;
context.querySelector('#chkAllChannels').checked = defaultTimer.RecordAnyChannel;
context.querySelector('#chkAnyTime').checked = defaultTimer.RecordAnyTime;
context.querySelector('#txtPrePaddingMinutes').value = defaultTimer.PrePaddingSeconds / 60;
context.querySelector('#txtPostPaddingMinutes').value = defaultTimer.PostPaddingSeconds / 60;
if (program.IsSeries) {
context.querySelector('#eligibleForSeriesFields').classList.remove('hide');
} else {
context.querySelector('#eligibleForSeriesFields').classList.add('hide');
}
selectDays(context, defaultTimer.Days);
if (program.ServiceName == 'Emby') {
context.querySelector('.convertRecordingsContainer').classList.remove('hide');
showConvertRecordingsUnlockMessage(context, apiClient);
} else {
context.querySelector('.convertRecordingsContainer').classList.add('hide');
}
loading.hide();
}
function showConvertRecordingsUnlockMessage(context, apiClient) {
apiClient.getPluginSecurityInfo().then(function (regInfo) {
if (regInfo.IsMBSupporter) {
context.querySelector('.btnSupporterForConverting').classList.add('hide');
} else {
context.querySelector('.btnSupporterForConverting').classList.remove('hide');
}
}, function () {
context.querySelector('.btnSupporterForConverting').classList.remove('hide');
});
}
function reload(context, programId) {
loading.show();
var apiClient = connectionManager.getApiClient(currentServerId);
var promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId });
var promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId());
Promise.all([promise1, promise2]).then(function (responses) {
var defaults = responses[0];
var program = responses[1];
renderRecording(context, defaults, program, apiClient);
});
}
function showEditor(itemId, serverId) {
return new Promise(function (resolve, reject) {
recordingCreated = false;
currentProgramId = itemId;
currentServerId = serverId;
loading.show();
require(['text!./recordingcreator.template.html'], function (template) {
var dialogOptions = {
removeOnClose: true,
scrollY: false
};
if (layoutManager.tv) {
dialogOptions.size = 'fullscreen';
} else {
dialogOptions.size = 'small';
}
var dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog');
dlg.classList.add('recordingDialog');
var html = '';
html += globalize.translateDocument(template, 'sharedcomponents');
dlg.innerHTML = html;
document.body.appendChild(dlg);
currentDialog = dlg;
dlg.addEventListener('close', function () {
if (recordingCreated) {
require(['toast'], function (toast) {
toast(globalize.translate('RecordingScheduled'));
});
resolve();
} else {
reject();
}
});
if (layoutManager.tv) {
scrollHelper.centerFocus.on(dlg.querySelector('.dialogContent'), false);
}
hideSeriesRecordingFields(dlg);
init(dlg);
reload(dlg, itemId);
dialogHelper.open(dlg);
});
});
}
return {
show: showEditor
};
});

View file

@ -0,0 +1,77 @@
<div class="dialogHeader">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="nav:arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${HeaderNewRecording}
</div>
</div>
<div class="dialogContent smoothScrollY">
<form class="dialogContentInner">
<h1 class="itemName"></h1>
<p class="itemEpisodeName"></p>
<p class="itemMiscInfoPrimary" style="display: flex; align-items: center;"></p>
<p class="itemMiscInfoSecondary" style="display: flex; align-items: center;"></p>
<div id="eligibleForSeriesFields" class="hide">
<br />
<div>
<paper-checkbox id="chkRecordSeries">${RecordSeries}</paper-checkbox>
</div>
<div id="seriesFields" class="hide">
<div>
<h1>${Days}</h1>
</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkSunday">${Sunday}</paper-checkbox>
<paper-checkbox id="chkMonday">${Monday}</paper-checkbox>
<paper-checkbox id="chkTuesday">${Tuesday}</paper-checkbox>
<paper-checkbox id="chkWednesday">${Wednesday}</paper-checkbox>
<paper-checkbox id="chkThursday">${Thursday}</paper-checkbox>
<paper-checkbox id="chkFriday">${Friday}</paper-checkbox>
<paper-checkbox id="chkSaturday">${Saturday}</paper-checkbox>
</div>
<br />
<div class="paperCheckboxList">
<paper-checkbox id="chkNewOnly">${RecordOnlyNewEpisodes}</paper-checkbox>
<paper-checkbox id="chkAnyTime">${RecordAnytime}</paper-checkbox>
<paper-checkbox id="chkAllChannels">${RecordOnAllChannels}</paper-checkbox>
</div>
</div>
</div>
<div class="convertRecordingsContainer hide">
<br />
<paper-checkbox id="chkConvertRecordings">${OptionConvertRecordingsToStreamingFormat}</paper-checkbox>
<div class="fieldDescription paperCheckboxFieldDescription">${OptionConvertRecordingsToStreamingFormatHelp}</div>
<div class="fieldDescription paperCheckboxFieldDescription btnSupporterForConverting hide">
<a href="#" class="accent lnkPremiere">${FeatureRequiresEmbyPremiere}</a>
</div>
</div>
<div class="advanced hide">
<br />
<br />
<emby-collapsible title="${Advanced}">
<div>
<paper-input type="number" id="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${PrePaddingMinutes}"></paper-input>
</div>
<br />
<div>
<paper-input type="number" id="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${PostPaddingMinutes}"></paper-input>
</div>
</emby-collapsible>
<br />
</div>
<br />
<div>
<div class="supporterContainer hide">
<p>${MessageActiveSubscriptionRequiredSeriesRecordings}</p>
<p class="supporterTrial hide">${HeaderEnjoyDayTrial}</p>
<a class="clearLink btnSupporter hide" href="http://emby.media/premiere" target="_blank"><paper-button raised class="accent block"><iron-icon icon="nav:check"></iron-icon><span>${HeaderBecomeProjectSupporter}</span></paper-button></a>
</div>
<paper-button raised class="btnSubmit block"><iron-icon icon="mediainfo:fiber-manual-record"></iron-icon><span>${Record}</span></paper-button>
</div>
<br />
<br />
<br />
</form>
</div>

View file

@ -26,7 +26,7 @@ define(function () {
requireCss.load = function (cssId, req, load, config) {
// Somehow if the url starts with /css, require will get all screwed up since this extension is also called css
var srch = '/emby-webcomponents/requirecss';
var srch = '/emby-webcomponents/require/requirecss';
var index = cssId.indexOf(srch);
if (index != -1) {

View file

@ -0,0 +1,29 @@
define(function () {
return {
load: function (url, req, load, config) {
if (url.indexOf('http') != 0 && url.indexOf('file:') != 0) {
url = config.baseUrl + url;
}
if (config.urlArgs) {
url += config.urlArgs(url, url);
}
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function (e) {
load(this.response);
};
xhr.send();
},
normalize: function (name, normalize) {
return normalize(name);
}
};
});

View file

@ -71,8 +71,8 @@ define(['loading', 'viewManager', 'skinManager', 'pluginManager', 'backdrop', 'b
require(['alert'], function (alert) {
alert({
text: Globalize.translate('core#ServerUpdateNeeded', 'https://emby.media'),
html: Globalize.translate('core#ServerUpdateNeeded', '<a href="https://emby.media">https://emby.media</a>')
text: Globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://emby.media'),
html: Globalize.translate('sharedcomponents#ServerUpdateNeeded', '<a href="https://emby.media">https://emby.media</a>')
}).then(function () {
embyRouter.showSelectServer();

View file

@ -8,10 +8,8 @@
// Delete the share since it was cancelled
apiClient.ajax({
type: 'DELETE',
url: apiClient.getUrl('Social/Shares/' + shareId)
});
}
@ -41,7 +39,7 @@
loading.hide();
sharingMenu.showMenu(options).then(function() {
return sharingMenu.showMenu(options).then(function () {
console.log('share success. shareId: ' + options.share.Id);
}, function () {
onSharingCancel(options, apiClient);

View file

@ -1,4 +1,4 @@
define(['dialogHelper', 'layoutManager', 'dialogText', './social-share-kit-1.0.4/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.4/dist/css/social-share-kit.css'], function (dialogHelper, layoutManager, dialogText) {
define(['dialogHelper', 'layoutManager', 'globalize', './social-share-kit-1.0.4/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.4/dist/css/social-share-kit.css'], function (dialogHelper, layoutManager, globalize) {
function showMenu(options) {
@ -22,7 +22,7 @@
html += '</div>';
html += '<div class="buttons">';
html += '<paper-button class="btnCancel">' + dialogText.get('Cancel') + '</paper-button>';
html += '<paper-button class="btnCancel">' + globalize.translate('sharedcomponents#ButtonCancel') + '</paper-button>';
html += '</div>';
dlg.innerHTML = html;

View file

@ -0,0 +1,14 @@
define([], function () {
return {
openUrl: function (url) {
window.open(url, '_blank');
},
canExec: false,
exec: function (options) {
// options.path
// options.arguments
return Promise.reject();
}
};
});

View file

@ -118,7 +118,8 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
dlg = dialogHelper.createDialog({
exitAnimationDuration: options.interactive ? 400 : 800,
size: 'fullscreen',
autoFocus: false
autoFocus: false,
scrollY: false
});
dlg.classList.add('slideshowDialog');

View file

@ -0,0 +1,51 @@
{
"ValueSpecialEpisodeName": "Special - {0}",
"Share": "Share",
"ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}",
"LiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"TrackCount": "{0} tracks",
"ItemCount": "{0} items",
"ValueSeriesYearToPresent": "{0}-Present",
"ReleaseYearValue": "Release year: {0}",
"OriginalAirDateValue": "Original air date: {0}",
"EndsAtValue": "Ends at {0}",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"HeaderSelectDate": "Select Date",
"ButtonOk": "Ok",
"ButtonCancel": "Cancel",
"ButtonGotIt": "Got It",
"RecordingScheduled": "Recording scheduled.",
"HeaderNewRecording": "New Recording",
"Sunday": "Sunday",
"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Days": "Days",
"RecordSeries": "Record series",
"PrePaddingMinutes": "Pre-padding minutes:",
"PostPaddingMinutes": "Post-padding minutes:",
"RecordOnAllChannels": "Record on all channels",
"RecordAnytime": "Record at any time",
"RecordOnlyNewEpisodes": "Record only new episodes",
"HeaderBecomeProjectSupporter": "Get Emby Premiere",
"HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial",
"MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.",
"OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format",
"OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 for easy playback on your devices.",
"FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.",
"Record": "Record",
"Download": "Download",
"Advanced": "Advanced"
}

View file

@ -36,7 +36,7 @@
"tag": "v1.5.1",
"commit": "e3e34408fad8f7cde59c4255cf3fe90f7dcf91d8"
},
"_source": "git://github.com/polymerelements/iron-selector.git",
"_source": "git://github.com/PolymerElements/iron-selector.git",
"_target": "^1.0.0",
"_originalSource": "polymerelements/iron-selector"
"_originalSource": "PolymerElements/iron-selector"
}

View file

@ -45,7 +45,7 @@
"tag": "v1.0.11",
"commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5"
},
"_source": "git://github.com/PolymerElements/paper-behaviors.git",
"_source": "git://github.com/polymerelements/paper-behaviors.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/paper-behaviors"
"_originalSource": "polymerelements/paper-behaviors"
}

View file

@ -32,14 +32,14 @@
"iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
},
"ignore": [],
"homepage": "https://github.com/PolymerElements/paper-ripple",
"homepage": "https://github.com/polymerelements/paper-ripple",
"_release": "1.0.5",
"_resolution": {
"type": "version",
"tag": "v1.0.5",
"commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5"
},
"_source": "git://github.com/PolymerElements/paper-ripple.git",
"_source": "git://github.com/polymerelements/paper-ripple.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/paper-ripple"
"_originalSource": "polymerelements/paper-ripple"
}

View file

@ -34,6 +34,6 @@
"commit": "11c987b2eb3c73b388a79fc8aaea8ca01624f514"
},
"_source": "git://github.com/Polymer/polymer.git",
"_target": "^1.1.0",
"_target": "^1.0.0",
"_originalSource": "Polymer/polymer"
}

View file

@ -91,7 +91,8 @@ define(['appStorage', 'browser'], function (appStorage, browser) {
supports: function (command) {
var features = [
'filedownload'
'filedownload',
'externalpremium'
];
features.push('sharing');

View file

@ -201,7 +201,7 @@
var html = '';
var title = items.length ? Globalize.translate('HeaderAddToCollection') : Globalize.translate('HeaderNewCollection');
html += '<div class="dialogHeader">';
html += '<div class="dialogHeader" style="margin:0 0 2em;">';
html += '<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>';
html += '<div class="dialogHeaderTitle">';
html += title;

View file

@ -161,8 +161,6 @@
Promise.all(promises).then(function () {
Dashboard.hideLoadingMsg();
libraryBrowser.setLastRefreshed(page);
});
}

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
</div>

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${HeaderInviteUser}

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
</div>

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${ButtonAddMediaLibrary}

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${ButtonEdit}

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${ButtonEdit}

View file

@ -207,7 +207,7 @@
var title = Globalize.translate('HeaderAddToPlaylist');
html += '<div class="dialogHeader">';
html += '<div class="dialogHeader" style="margin:0 0 2em;">';
html += '<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>';
html += '<div class="dialogHeaderTitle">';
html += title;

View file

@ -1,370 +0,0 @@
define(['dialogHelper', 'jQuery', 'mediaInfo', 'scripts/livetvcomponents', 'livetvcss', 'paper-checkbox', 'paper-input', 'paper-icon-button-light'], function (dialogHelper, $, mediaInfo) {
var currentProgramId;
var currentDialog;
var recordingCreated = false;
function getDaysOfWeek() {
// Do not localize. These are used as values, not text.
return LiveTvHelpers.getDaysOfWeek().map(function (d) {
return d.value;
});
}
function getDays(context) {
var daysOfWeek = getDaysOfWeek();
var days = [];
for (var i = 0, length = daysOfWeek.length; i < length; i++) {
var day = daysOfWeek[i];
if ($('#chk' + day, context).checked()) {
days.push(day);
}
}
return days;
}
function hideSeriesRecordingFields(context) {
slideUpToHide(context.querySelector('#seriesFields'));
context.querySelector('.btnSubmitContainer').classList.remove('hide');
context.querySelector('.supporterContainer').classList.add('hide');
}
function closeDialog(isSubmitted) {
recordingCreated = isSubmitted;
dialogHelper.close(currentDialog);
}
function onSubmit() {
Dashboard.showLoadingMsg();
var form = this;
ApiClient.getNamedConfiguration("livetv").then(function (config) {
config.EnableRecordingEncoding = $('#chkConvertRecordings', form).checked();
ApiClient.updateNamedConfiguration("livetv", config).then(Dashboard.processServerConfigurationUpdateResult);
});
ApiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) {
item.PrePaddingSeconds = $('#txtPrePaddingMinutes', form).val() * 60;
item.PostPaddingSeconds = $('#txtPostPaddingMinutes', form).val() * 60;
item.RecordNewOnly = $('#chkNewOnly', form).checked();
item.RecordAnyChannel = $('#chkAllChannels', form).checked();
item.RecordAnyTime = $('#chkAnyTime', form).checked();
item.Days = getDays(form);
if ($('#chkRecordSeries', form).checked()) {
ApiClient.createLiveTvSeriesTimer(item).then(function () {
Dashboard.hideLoadingMsg();
closeDialog(true);
});
} else {
ApiClient.createLiveTvTimer(item).then(function () {
Dashboard.hideLoadingMsg();
closeDialog(true);
});
}
});
// Disable default form submission
return false;
}
function getRegistration(programId) {
Dashboard.showLoadingMsg();
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Registration', {
ProgramId: programId,
Feature: 'seriesrecordings'
})).then(function (result) {
Dashboard.hideLoadingMsg();
return result;
}, function () {
Dashboard.hideLoadingMsg();
return {
TrialVersion: true,
IsValid: true,
IsRegistered: false
};
});
}
function showSeriesRecordingFields(context) {
slideDownToShow(context.querySelector('#seriesFields'));
context.querySelector('.btnSubmitContainer').classList.remove('hide');
getRegistration(currentProgramId).then(function (regInfo) {
if (regInfo.IsValid) {
context.querySelector('.btnSubmitContainer').classList.remove('hide');
} else {
context.querySelector('.btnSubmitContainer').classList.add('hide');
}
if (regInfo.IsRegistered) {
context.querySelector('.supporterContainer').classList.add('hide');
} else {
context.querySelector('.supporterContainer').classList.remove('hide');
if (regInfo.TrialVersion) {
context.querySelector('.supporterTrial').classList.remove('hide');
} else {
context.querySelector('.supporterTrial').classList.add('hide');
}
}
});
}
function slideDownToShow(elem) {
if (!elem.classList.contains('hide')) {
return;
}
elem.classList.remove('hide');
elem.style.overflow = 'hidden';
requestAnimationFrame(function () {
elem.animate([{
height: 0
}, {
height: elem.offsetHeight + 'px'
}], { duration: 400, easing: 'ease' }).onfinish = function () {
elem.classList.remove('hide');
};
});
}
function slideUpToHide(elem) {
if (elem.classList.contains('hide')) {
return;
}
elem.style.overflow = 'hidden';
requestAnimationFrame(function () {
elem.animate([{
height: elem.offsetHeight + 'px'
}, {
height: 0
}], { duration: 400, easing: 'ease' }).onfinish = function () {
elem.classList.add('hide');
};
});
}
function init(context) {
$('#chkRecordSeries', context).on('change', function () {
if (this.checked) {
showSeriesRecordingFields(context);
} else {
hideSeriesRecordingFields(context);
}
});
$('.btnCancel', context).on('click', function () {
closeDialog(false);
});
$('form', context).off('submit', onSubmit).on('submit', onSubmit);
var supporterButtons = context.querySelectorAll('.btnSupporter');
for (var i = 0, length = supporterButtons.length; i < length; i++) {
if (AppInfo.enableSupporterMembership) {
supporterButtons[i].classList.remove('hide');
} else {
supporterButtons[i].classList.add('hide');
}
}
if (AppInfo.enableSupporterMembership) {
context.querySelector('.btnSupporterForConverting a').href = 'https://emby.media/premiere';
} else {
context.querySelector('.btnSupporterForConverting a').href = '#';
}
ApiClient.getNamedConfiguration("livetv").then(function (config) {
$('#chkConvertRecordings', context).checked(config.EnableRecordingEncoding);
});
}
function selectDays(page, days) {
var daysOfWeek = getDaysOfWeek();
for (var i = 0, length = daysOfWeek.length; i < length; i++) {
var day = daysOfWeek[i];
$('#chk' + day, page).checked(days.indexOf(day) != -1);
}
}
function renderRecording(context, defaultTimer, program) {
$('.itemName', context).html(program.Name);
$('.itemEpisodeName', context).html(program.EpisodeTitle || '');
$('.itemMiscInfoPrimary', context).html(mediaInfo.getPrimaryMediaInfoHtml(program));
$('.itemMiscInfoSecondary', context).html(mediaInfo.getSecondaryMediaInfoHtml(program));
$('.itemMiscInfo a').each(function () {
$(this).replaceWith(this.innerHTML);
});
$('#chkNewOnly', context).checked(defaultTimer.RecordNewOnly);
$('#chkAllChannels', context).checked(defaultTimer.RecordAnyChannel);
$('#chkAnyTime', context).checked(defaultTimer.RecordAnyTime);
$('#txtPrePaddingMinutes', context).val(defaultTimer.PrePaddingSeconds / 60);
$('#txtPostPaddingMinutes', context).val(defaultTimer.PostPaddingSeconds / 60);
if (program.IsSeries) {
$('#eligibleForSeriesFields', context).show();
} else {
$('#eligibleForSeriesFields', context).hide();
}
selectDays(context, defaultTimer.Days);
if (program.ServiceName == 'Emby') {
context.querySelector('.convertRecordingsContainer').classList.remove('hide');
showConvertRecordingsUnlockMessage(context);
} else {
context.querySelector('.convertRecordingsContainer').classList.add('hide');
}
Dashboard.hideLoadingMsg();
}
function showConvertRecordingsUnlockMessage(context) {
Dashboard.getPluginSecurityInfo().then(function(regInfo) {
if (regInfo.IsMBSupporter) {
context.querySelector('.btnSupporterForConverting').classList.add('hide');
} else {
context.querySelector('.btnSupporterForConverting').classList.remove('hide');
}
}, function() {
context.querySelector('.btnSupporterForConverting').classList.remove('hide');
});
}
function reload(context, programId) {
Dashboard.showLoadingMsg();
var promise1 = ApiClient.getNewLiveTvTimerDefaults({ programId: programId });
var promise2 = ApiClient.getLiveTvProgram(programId, Dashboard.getCurrentUserId());
Promise.all([promise1, promise2]).then(function (responses) {
var defaults = responses[0];
var program = responses[1];
renderRecording(context, defaults, program);
});
}
function showEditor(itemId) {
return new Promise(function (resolve, reject) {
recordingCreated = false;
currentProgramId = itemId;
Dashboard.showLoadingMsg();
var xhr = new XMLHttpRequest();
xhr.open('GET', 'components/recordingcreator/recordingcreator.template.html', true);
xhr.onload = function (e) {
var template = this.response;
var dlg = dialogHelper.createDialog({
removeOnClose: true,
size: 'small'
});
dlg.classList.add('ui-body-b');
dlg.classList.add('background-theme-b');
dlg.classList.add('formDialog');
var html = '';
html += Globalize.translateDocument(template);
dlg.innerHTML = html;
document.body.appendChild(dlg);
dialogHelper.open(dlg);
currentDialog = dlg;
dlg.addEventListener('close', function () {
if (recordingCreated) {
require(['toast'], function (toast) {
toast(Globalize.translate('MessageRecordingScheduled'));
});
resolve();
} else {
reject();
}
});
hideSeriesRecordingFields(dlg);
init(dlg);
reload(dlg, itemId);
}
xhr.send();
});
}
return {
show: showEditor
};
});

View file

@ -1,73 +0,0 @@
<div class="dialogHeader">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${HeaderNewRecording}
</div>
</div>
<form class="liveTvNewRecordingForm" style="margin: 0 auto;">
<h1 class="itemName" style="margin:0;"></h1>
<p class="itemEpisodeName"></p>
<p class="itemMiscInfo itemMiscInfoPrimary"></p>
<p class="itemMiscInfo itemMiscInfoSecondary"></p>
<div style="display: none;" id="eligibleForSeriesFields">
<br />
<div>
<paper-checkbox id="chkRecordSeries">${OptionRecordSeries}</paper-checkbox>
</div>
<br />
<div id="seriesFields" class="hide">
<div>
<h1>${HeaderDays}</h1>
</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkSunday">${OptionSunday}</paper-checkbox>
<paper-checkbox id="chkMonday">${OptionMonday}</paper-checkbox>
<paper-checkbox id="chkTuesday">${OptionTuesday}</paper-checkbox>
<paper-checkbox id="chkWednesday">${OptionWednesday}</paper-checkbox>
<paper-checkbox id="chkThursday">${OptionThursday}</paper-checkbox>
<paper-checkbox id="chkFriday">${OptionFriday}</paper-checkbox>
<paper-checkbox id="chkSaturday">${OptionSaturday}</paper-checkbox>
</div>
<div>
<h1>${HeaderRepeatingOptions}</h1>
</div>
<div class="paperCheckboxList">
<paper-checkbox id="chkNewOnly">${OptionRecordOnlyNewEpisodes}</paper-checkbox>
<paper-checkbox id="chkAnyTime">${OptionRecordAnytime}</paper-checkbox>
<paper-checkbox id="chkAllChannels">${OptionRecordOnAllChannels}</paper-checkbox>
</div>
</div>
</div>
<div class="convertRecordingsContainer hide">
<br />
<paper-checkbox id="chkConvertRecordings">${OptionConvertRecordingsToStreamingFormat}</paper-checkbox>
<div class="fieldDescription paperCheckboxFieldDescription">${OptionConvertRecordingsToStreamingFormatHelp}</div>
<div class="fieldDescription paperCheckboxFieldDescription btnSupporterForConverting hide"><a href="https://emby.media/premiere" target="_blank" class="accent">${FeatureRequiresEmbyPremiere}</a></div>
</div>
<br />
<div>
<paper-input type="number" id="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPrePaddingMinutes}"></paper-input>
</div>
<br />
<div>
<paper-input type="number" id="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPostPaddingMinutes}"></paper-input>
</div>
<br />
<div>
<div class="supporterContainer hide">
<p>${MessageActiveSubscriptionRequiredSeriesRecordings}</p>
<p class="supporterTrial hide">${HeaderEnjoyDayTrial}</p>
<a class="clearLink btnSupporter hide" href="http://emby.media/premiere" target="_blank"><paper-button raised class="accent block"><iron-icon icon="check"></iron-icon><span>${HeaderBecomeProjectSupporter}</span></paper-button></a>
</div>
<button type="submit" data-role="none" class="clearButton btnSubmitContainer">
<paper-button raised class="submit block" style="background:#cc3333;" autoFocus><iron-icon icon="videocam"></iron-icon><span>${ButtonRecord}</span></paper-button>
</button>
</div>
<br />
<br />
<br />
</form>

View file

@ -1,4 +1,4 @@
<div class="dialogHeader">
<div class="dialogHeader" style="margin:0 0 2em;">
<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>
<div class="dialogHeaderTitle">
${ButtonEdit}
@ -16,7 +16,7 @@
<div style="display: none; vertical-align: top; margin-right: 1em; padding-top: 1em;" class="timerPageImageContainer">
</div>
<div style="display: inline-block; vertical-align: middle;">
<h1 class="itemName" style="margin:0;"></h1>
<h1 class="itemName"></h1>
<p class="itemEpisodeName"></p>
<p class="itemMiscInfo itemMiscInfoPrimary"></p>
<p class="itemMiscInfo itemMiscInfoSecondary"></p>

View file

@ -362,7 +362,7 @@
dlg.classList.add('background-theme-b');
var html = '';
html += '<div class="dialogHeader">';
html += '<div class="dialogHeader" style="margin:0 0 2em;">';
html += '<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>';
html += '<div class="dialogHeaderTitle">';
html += item.Name;

View file

@ -258,13 +258,6 @@ iron-list .card {
padding-top: 7px;
}
@media all and (max-width: 600px) {
.packageReviewText {
display: none;
}
}
.cardImage {
background-size: contain;
background-repeat: no-repeat;

View file

@ -541,7 +541,7 @@ span.itemCommunityRating:not(:empty) + .userDataIcons {
.itemName {
font-weight: normal !important;
margin: 0;
margin: .5em 0;
}
.empty {
@ -818,6 +818,7 @@ span.itemCommunityRating:not(:empty) + .userDataIcons {
flex-wrap: wrap;
align-items: center;
}
.mediaInfoItem {
white-space: nowrap;
}

View file

@ -17,7 +17,7 @@
<div class="primaryDetailsContainer">
<div class="detailNameContainer">
<div class="parentName"></div>
<h1 class="itemName" style="margin:0;"></h1>
<h1 class="itemName"></h1>
<div class="desktopDetails itemMiscInfo" style="margin-top:.5em;">
</div>

View file

@ -3,7 +3,7 @@
<div data-role="content">
<div class="readOnlyContent" style="margin:auto; max-width: 720px;">
<h1 class="itemName" style="margin:0;"></h1>
<h1 class="itemName"></h1>
<p class="channel" style="margin-top: 2em;"></p>
<p class="time"></p>

View file

@ -75,7 +75,10 @@
html += "<div>";
html += "<span class='storeItemReviewText'>";
html += new Date(review.timestamp).toDateString();
html += " " + RatingHelpers.getStoreRatingHtml(review.rating, review.id, review.name, true);
if (review.rating) {
html += '<iron-icon icon="star" style="color:#666;height:20px;width:20px;min-height:20px;min-width:20px;margin-right:.25em;"></iron-icon>';
html += review.rating.toFixed(1);
}
html += " " + review.title;
html += "</span>";
if (review.review) {
@ -133,8 +136,12 @@
RegistrationServices.renderPluginInfo(page, pkg, pluginSecurityInfo);
//Ratings and Reviews
var ratingHtml = RatingHelpers.getStoreRatingHtml(pkg.avgRating, pkg.id, pkg.name);
ratingHtml += "<span class='storeReviewCount'>";
var ratingHtml = '';
if (pkg.avgRating) {
ratingHtml += '<iron-icon icon="star" style="color:#666;height:20px;width:20px;min-height:20px;min-width:20px;margin-right:.25em;"></iron-icon>';
ratingHtml += pkg.avgRating.toFixed(1);
}
ratingHtml += "<span>";
ratingHtml += " " + Globalize.translate('ValueReviewCount').replace('{0}', pkg.totalRatings);
ratingHtml += "</span>";

View file

@ -212,28 +212,24 @@
function loadHomeTab(page, tabContent) {
if (libraryBrowser.needsRefresh(tabContent)) {
if (window.ApiClient) {
var userId = Dashboard.getCurrentUserId();
Dashboard.showLoadingMsg();
if (window.ApiClient) {
var userId = Dashboard.getCurrentUserId();
Dashboard.showLoadingMsg();
getDisplayPreferences('home', userId).then(function (result) {
getDisplayPreferences('home', userId).then(function (result) {
Dashboard.getCurrentUser().then(function (user) {
Dashboard.getCurrentUser().then(function (user) {
loadSections(tabContent, user, result).then(function () {
if (!AppInfo.isNativeApp) {
showWelcomeIfNeeded(page, result);
}
Dashboard.hideLoadingMsg();
libraryBrowser.setLastRefreshed(tabContent);
});
loadSections(tabContent, user, result).then(function () {
if (!AppInfo.isNativeApp) {
showWelcomeIfNeeded(page, result);
}
Dashboard.hideLoadingMsg();
});
});
}
});
}
}

View file

@ -1319,7 +1319,7 @@
IncludeItemTypes: "MusicVideo",
Recursive: true,
Fields: "DateCreated,SyncInfo,CanDelete",
AlbumNames: item.Name
Albums: item.Name
}).then(function (result) {
if (result.Items.length) {
@ -2032,8 +2032,10 @@
$('.btnRecord,.btnFloatingRecord', page).on('click', function () {
var id = getParameterByName('id');
require(['components/recordingcreator/recordingcreator'], function (recordingcreator) {
recordingcreator.show(id).then(function () {
Dashboard.showLoadingMsg();
require(['recordingCreator'], function (recordingCreator) {
recordingCreator.show(id, currentItem.ServerId).then(function () {
reload(page);
});
});

View file

@ -217,7 +217,6 @@
bubbles: true
}));
libraryBrowser.setLastRefreshed(view);
Dashboard.hideLoadingMsg();
});
}

View file

@ -146,44 +146,6 @@
});
},
needsRefresh: function (elem) {
var last = parseInt(elem.getAttribute('data-lastrefresh') || '0');
if (!last) {
return true;
}
//if (NavHelper.isBack()) {
// console.log('Not refreshing data because IsBack=true');
// return false;
//}
var now = new Date().getTime();
var cacheDuration;
if (AppInfo.isNativeApp) {
cacheDuration = 300000;
} else if (browserInfo.ipad || browserInfo.iphone || browserInfo.android) {
cacheDuration = 10000;
} else {
cacheDuration = 30000;
}
if ((now - last) < cacheDuration) {
console.log('Not refreshing data due to age');
return false;
}
return true;
},
setLastRefreshed: function (elem) {
elem.setAttribute('data-lastrefresh', new Date().getTime());
elem.classList.add('hasrefreshtime');
},
allowSwipe: function (target) {
function allowSwipeOn(elem) {

View file

@ -563,8 +563,8 @@
Dashboard.navigate('itemdetails.html?id=' + albumid);
break;
case 'record':
require(['components/recordingcreator/recordingcreator'], function (recordingcreator) {
recordingcreator.show(itemId);
require(['recordingCreator'], function (recordingCreator) {
recordingCreator.show(itemId, serverId);
});
break;
case 'artist':

View file

@ -794,6 +794,10 @@
var btnCast = context.querySelector('.btnCast');
if (!btnCast) {
return;
}
var info = MediaController.getPlayerInfo();
if (info.isLocalPlayer) {

View file

@ -111,16 +111,12 @@
renderChannels(page, result);
Dashboard.hideLoadingMsg();
LibraryBrowser.setLastRefreshed(page);
});
}
window.LiveTvPage.renderChannelsTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -108,16 +108,12 @@
require(['paper-fab', 'paper-item-body', 'paper-icon-item'], function () {
renderTimers(page, result.Items);
});
LibraryBrowser.setLastRefreshed(page);
});
}
window.LiveTvPage.renderSeriesTimersTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reload(tabContent);
}
reload(tabContent);
};
});

View file

@ -37,7 +37,6 @@
}).then(function (result) {
renderItems(page, result.Items, 'activeProgramItems', 'play');
libraryBrowser.setLastRefreshed(page);
Dashboard.hideLoadingMsg();
});
}
@ -137,9 +136,7 @@
function renderSuggestedTab(page, tabContent) {
if (libraryBrowser.needsRefresh(tabContent)) {
reload(tabContent);
}
reload(tabContent);
}
function loadTab(page, index) {

View file

@ -245,8 +245,6 @@
LibraryBrowser.saveQueryValues(getSavedQueryKey(context), query);
LibraryBrowser.setLastRefreshed(context);
Dashboard.hideLoadingMsg();
});
}

View file

@ -127,7 +127,6 @@
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
LibraryBrowser.setLastRefreshed(page);
Dashboard.hideLoadingMsg();
});
}
@ -184,9 +183,7 @@
window.MusicPage.renderAlbumArtistsTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -180,7 +180,6 @@
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
LibraryBrowser.setLastRefreshed(page);
Dashboard.hideLoadingMsg();
});
}
@ -245,9 +244,7 @@
window.MusicPage.renderAlbumsTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -127,7 +127,6 @@
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
LibraryBrowser.setLastRefreshed(page);
Dashboard.hideLoadingMsg();
});
}
@ -184,9 +183,7 @@
window.MusicPage.renderArtistsTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -91,7 +91,6 @@
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(), query);
LibraryBrowser.setLastRefreshed(page);
Dashboard.hideLoadingMsg();
});
}
@ -102,9 +101,7 @@
window.MusicPage.renderFoldersTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -125,9 +125,7 @@
window.MusicPage.renderGenresTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -49,8 +49,6 @@
ImageLoader.lazyChildren(elem);
Dashboard.hideLoadingMsg();
libraryBrowser.setLastRefreshed(page);
});
}
@ -203,19 +201,17 @@
var parentId = LibraryMenu.getTopParentId();
if (libraryBrowser.needsRefresh(tabContent)) {
console.log('loadSuggestionsTab');
loadLatest(tabContent, parentId);
loadPlaylists(tabContent, parentId);
loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId);
console.log('loadSuggestionsTab');
loadLatest(tabContent, parentId);
loadPlaylists(tabContent, parentId);
loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId);
require(['components/favoriteitems'], function (favoriteItems) {
require(['components/favoriteitems'], function (favoriteItems) {
favoriteItems.render(tabContent, Dashboard.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']);
favoriteItems.render(tabContent, Dashboard.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']);
});
}
});
}
function loadTab(page, index) {

View file

@ -35,9 +35,7 @@
});
}
function populateList(options) {
requirejs(['scripts/ratingdialog'], function () {
populateListInternal(options);
});
populateListInternal(options);
}
function populateListInternal(options) {
@ -207,13 +205,18 @@
html += "</div>";
if (!plugin.isExternal) {
html += "<div class='cardText packageReviewText'>";
html += plugin.price > 0 ? "$" + plugin.price.toFixed(2) : Globalize.translate('LabelFree');
html += RatingHelpers.getStoreRatingHtml(plugin.avgRating, plugin.id, plugin.name, true);
html += "<div class='cardText' style='display:flex;align-items:center;'>";
html += "<span class='storeReviewCount'>";
html += " " + Globalize.translate('LabelNumberReviews').replace("{0}", plugin.totalRatings);
html += "</span>";
if (plugin.avgRating) {
html += '<iron-icon icon="star" style="color:#666;height:20px;width:20px;min-height:20px;min-width:20px;margin-right:.25em;"></iron-icon>';
html += plugin.avgRating.toFixed(1);
}
if (plugin.totalRatings) {
html += "<div style='margin-left:.5em;'>";
html += " " + Globalize.translate('LabelNumberReviews').replace("{0}", plugin.totalRatings);
}
html += "</div>";
html += "</div>";
}

View file

@ -109,30 +109,6 @@
});
}
});
},
getStoreRatingHtml: function (rating, id, name, noLinks) {
var html = "<div style='margin-left: 5px; margin-right: 5px; display: inline-block; vertical-align:middle;'>";
if (!rating) rating = 0;
for (var i = 1; i <= 5; i++) {
var title = noLinks ? rating + " stars" : "Rate " + i + (i > 1 ? " stars" : " star");
html += noLinks ? "" : "<a href='#' data-id=" + id + " data-name='" + name + "' data-rating=" + i + " onclick='RatingHelpers.ratePackage(this);return false;' >";
if (rating <= i - 1) {
html += "<div class='storeStarRating emptyStarRating' title='" + title + "'></div>";
} else if (rating < i) {
html += "<div class='storeStarRating halfStarRating' title='" + title + "'></div>";
} else {
html += "<div class='storeStarRating' title='" + title + "'></div>";
}
html += noLinks ? "" : "</a>";
}
html += "</div>";
return html;
}
};

View file

@ -161,8 +161,6 @@
query.StartIndex -= query.Limit;
reloadItems(parentItem);
});
libraryBrowser.setLastRefreshed(view);
Dashboard.hideLoadingMsg();
});
}
@ -174,13 +172,11 @@
ApiClient.getItem(Dashboard.getCurrentUserId(), params.parentId).then(function (parent) {
LibraryMenu.setTitle(parent.Name);
if (libraryBrowser.needsRefresh(view)) {
reloadItems(parent);
}
reloadItems(parent);
});
}
else if (libraryBrowser.needsRefresh(view)) {
else {
reloadItems();
}
});

View file

@ -1797,7 +1797,7 @@ var AppInfo = {};
if (navigator.webkitPersistentStorage) {
paths.imageFetcher = embyWebComponentsBowerPath + "/images/persistentimagefetcher";
//paths.imageFetcher = embyWebComponentsBowerPath + "/images/basicimagefetcher";
paths.imageFetcher = embyWebComponentsBowerPath + "/images/basicimagefetcher";
} else if (Dashboard.isRunningInCordova()) {
paths.imageFetcher = 'cordova/imagestore';
} else {
@ -1821,20 +1821,24 @@ var AppInfo = {};
define("libjass", [bowerPath + "/libjass/libjass", "css!" + bowerPath + "/libjass/libjass"], returnFirstDependency);
define("recordingCreator", [embyWebComponentsBowerPath + "/recordingcreator/recordingcreator"], returnFirstDependency);
define("mediaInfo", [embyWebComponentsBowerPath + "/mediainfo/mediainfo"], returnFirstDependency);
define("backdrop", [embyWebComponentsBowerPath + "/backdrop/backdrop"], returnFirstDependency);
define("fetchHelper", [embyWebComponentsBowerPath + "/fetchhelper"], returnFirstDependency);
define("tvguide", [embyWebComponentsBowerPath + "/guide/guide", 'embyRouter'], function (tvGuide, embyRouter) {
tvGuide.setBaseUrl(embyRouter.baseUrl() + '/bower_components/emby-webcomponents/guide');
return tvGuide;
});
define("tvguide", [embyWebComponentsBowerPath + "/guide/guide", 'embyRouter'], returnFirstDependency);
define("viewManager", [embyWebComponentsBowerPath + "/viewmanager"], function (viewManager) {
viewManager.dispatchPageEvents(true);
return viewManager;
});
if (Dashboard.isRunningInCordova() && browserInfo.android) {
define("shell", ["cordova/android/shell"], returnFirstDependency);
} else {
define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency);
}
define("sharingmanager", [embyWebComponentsBowerPath + "/sharing/sharingmanager"], returnFirstDependency);
if (Dashboard.isRunningInCordova()) {
@ -1869,8 +1873,9 @@ var AppInfo = {};
waitSeconds: 0,
map: {
'*': {
'css': bowerPath + '/emby-webcomponents/requirecss',
'html': bowerPath + '/emby-webcomponents/requirehtml'
'css': bowerPath + '/emby-webcomponents/require/requirecss',
'html': bowerPath + '/emby-webcomponents/require/requirehtml',
'text': bowerPath + '/emby-webcomponents/require/requiretext'
}
},
urlArgs: urlArgs,
@ -1926,8 +1931,6 @@ var AppInfo = {};
define("jstree", [bowerPath + "/jstree/dist/jstree", "css!thirdparty/jstree/themes/default/style.min.css"]);
define('jqm', ['thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.js']);
define("jqmbase", ['css!thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.theme.css']);
define("jqmicons", ['jqmbase', 'css!thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.icons.css']);
define("jqmtable", ['jqmbase', "thirdparty/jquerymobile-1.4.5/jqm.table", 'css!thirdparty/jquerymobile-1.4.5/jqm.table.css']);
@ -1982,7 +1985,6 @@ var AppInfo = {};
define("swiper", [bowerPath + "/Swiper/dist/js/swiper.min", "css!" + bowerPath + "/Swiper/dist/css/swiper.min"], returnFirstDependency);
define("dialogHelper", [embyWebComponentsBowerPath + "/dialoghelper/dialoghelper"], returnFirstDependency);
define("toast", [embyWebComponentsBowerPath + "/toast/toast"], returnFirstDependency);
define("scrollHelper", [embyWebComponentsBowerPath + "/scrollhelper"], returnFirstDependency);
@ -2012,6 +2014,12 @@ var AppInfo = {};
return jQuery;
});
define("dialogHelper", [embyWebComponentsBowerPath + "/dialoghelper/dialoghelper"], function (dialoghelper) {
dialoghelper.setOnOpen(onDialogOpen);
return dialoghelper;
});
// alias
define("historyManager", [], function () {
return Emby.Page;
@ -2060,8 +2068,6 @@ var AppInfo = {};
};
});
define('dialogText', ['globalize'], getDialogText());
define("embyRouter", [embyWebComponentsBowerPath + '/router'], function (embyRouter) {
embyRouter.showLocalLogin = function (apiClient, serverId, manualLogin) {
@ -2114,14 +2120,13 @@ var AppInfo = {};
return appSettings;
}
function getDialogText() {
return function (globalize) {
return {
get: function (text) {
return globalize.translate('Button' + text);
}
};
};
function onDialogOpen(dlg) {
if (dlg.classList.contains('formDialog')) {
if (!dlg.classList.contains('background-theme-a')) {
dlg.classList.add('background-theme-b');
dlg.classList.add('ui-body-b');
}
}
}
function initRequireWithBrowser(browser) {
@ -2266,12 +2271,31 @@ var AppInfo = {};
window.Globalize = globalize;
loadCoreDictionary(globalize).then(onGlobalizeInit);
Promise.all([loadCoreDictionary(globalize), loadSharedComponentsDictionary(globalize)]).then(onGlobalizeInit);
});
});
});
}
function loadSharedComponentsDictionary(globalize) {
var baseUrl = 'bower_components/emby-webcomponents/strings/';
var languages = ['en-US'];
var translations = languages.map(function (i) {
return {
lang: i,
path: baseUrl + i + '.json'
};
});
globalize.loadStrings({
name: 'sharedcomponents',
translations: translations
});
}
function loadCoreDictionary(globalize) {
var baseUrl = 'strings/';

View file

@ -160,9 +160,7 @@
window.MusicPage.renderSongsTab = function (page, tabContent) {
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
reloadItems(tabContent);
};
});

View file

@ -249,7 +249,7 @@
dlg.classList.add('popupEditor');
var html = '';
html += '<div class="dialogHeader">';
html += '<div class="dialogHeader" style="margin:0 0 2em;">';
html += '<button is="paper-icon-button-light" class="btnCancel" tabindex="-1"><iron-icon icon="arrow-back"></iron-icon></button>';
html += '<div class="dialogHeaderTitle">';
html += Globalize.translate('SyncMedia');

View file

@ -44,7 +44,7 @@
ApiClient.ajax({
type: 'GET',
url: 'components/tvproviders/' + type + '.template.html'
url: 'components/tvproviders/' + type.toLowerCase() + '.template.html'
}).then(function (html) {

View file

@ -28,7 +28,7 @@
<div class="primaryDetailsContainer">
<div class="detailNameContainer">
<div class="parentName"></div>
<h1 class="itemName" style="margin:0;"></h1>
<h1 class="itemName"></h1>
<div class="desktopDetails itemMiscInfo" style="margin-top:.5em;">
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -525,7 +525,6 @@ paper-radio-group > * {
}
div.dialogHeader {
margin: 0 0 2em !important;
padding: .35em .5em;
display: flex;
align-items: center;
@ -538,11 +537,6 @@ div.dialogHeader {
color: #fff;
}
.ui-body-a .pageContentPaperMaterial {
background-color: #fff;
padding: 1.5em;
}
.ui-body-b div.dialogHeader {
background-color: #101010;
}