-
+
';
+ html += '
';
+ html += '
';
}
var hasOpenTag = false;
+ currentCategory = null;
if (options.showCategory === false) {
html += '
';
@@ -148,7 +151,6 @@
html += '
';
html += '
';
html += '
';
- html += '
';
}
html += '';
diff --git a/dashboard-ui/scripts/registrationservices.js b/dashboard-ui/scripts/registrationservices.js
index f1059f66e5..c4ebb5dab0 100644
--- a/dashboard-ui/scripts/registrationservices.js
+++ b/dashboard-ui/scripts/registrationservices.js
@@ -188,96 +188,7 @@
});
}
- window.RegistrationServices = {
- renderPluginInfo: function (page, pkg, pluginSecurityInfo) {
-
- require(['jQuery'], function ($) {
- if (pkg.isPremium) {
- $('.premiumPackage', page).show();
-
- // Fill in registration info
- var regStatus = "";
- if (pkg.isRegistered) {
-
- regStatus += "
";
-
- regStatus += Globalize.translate('MessageFeatureIncludedWithSupporter');
-
- } else {
-
- var expDateTime = new Date(pkg.expDate).getTime();
- var nowTime = new Date().getTime();
-
- if (expDateTime <= nowTime) {
- regStatus += "
";
- regStatus += Globalize.translate('MessageTrialExpired');
- } else if (expDateTime > new Date(1970, 1, 1).getTime()) {
-
- regStatus += "
";
- regStatus += Globalize.translate('MessageTrialWillExpireIn').replace('{0}', Math.round(expDateTime - nowTime) / (86400000));
- }
- }
-
- regStatus += "
";
- $('#regStatus', page).html(regStatus);
-
- if (pluginSecurityInfo.IsMBSupporter) {
- $('#regInfo', page).html(pkg.regInfo || "");
-
- $('.premiumDescription', page).hide();
- $('.supporterDescription', page).hide();
-
- if (pkg.price > 0) {
-
- $('.premiumHasPrice', page).show();
- $('#featureId', page).val(pkg.featureId);
- $('#featureName', page).val(pkg.name);
- $('#amount', page).val(pkg.price);
-
- $('#regPrice', page).html("
" + Globalize.translate('ValuePriceUSD').replace('{0}', "$" + pkg.price.toFixed(2)) + "
");
- $('#ppButton', page).hide();
-
- var url = "https://mb3admin.com/admin/service/user/getPayPalEmail?id=" + pkg.owner;
-
- fetch(url).then(function (response) {
-
- return response.json();
-
- }).then(function (dev) {
-
- if (dev.payPalEmail) {
- $('#payPalEmail', page).val(dev.payPalEmail);
- $('#ppButton', page).show();
-
- }
- });
-
- } else {
- // Supporter-only feature
- $('.premiumHasPrice', page).hide();
- }
- } else {
-
- if (pkg.price) {
- $('.premiumDescription', page).show();
- $('.supporterDescription', page).hide();
- $('#regInfo', page).html("");
-
- } else {
- $('.premiumDescription', page).hide();
- $('.supporterDescription', page).show();
- $('#regInfo', page).html("");
- }
-
- $('#ppButton', page).hide();
- }
-
- } else {
- $('.premiumPackage', page).hide();
- }
- });
- },
-
+ return {
validateFeature: function (name) {
return new Promise(function (resolve, reject) {
@@ -297,6 +208,4 @@
shell.openUrl('https://emby.media/premiere');
}
};
-
- return window.RegistrationServices;
});
\ No newline at end of file
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index 190e395501..400f1721e9 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -559,7 +559,7 @@ var Dashboard = {
pageIds: ['scheduledTasksPage', 'scheduledTaskPage'],
icon: 'schedule'
}, {
- name: Globalize.translate('ButtonMetadataManager'),
+ name: Globalize.translate('MetadataManager'),
href: "edititemmetadata.html",
pageIds: [],
icon: 'mode_edit'
@@ -1285,6 +1285,7 @@ var AppInfo = {};
define("libjass", [bowerPath + "/libjass/libjass.min", "css!" + bowerPath + "/libjass/libjass"], returnFirstDependency);
+ define("syncJobList", ["components/syncjoblist/syncjoblist"], returnFirstDependency);
define("appfooter", ["components/appfooter/appfooter"], returnFirstDependency);
define("dockedtabs", ["components/dockedtabs/dockedtabs"], returnFirstDependency);
define("directorybrowser", ["components/directorybrowser/directorybrowser"], returnFirstDependency);
@@ -2326,7 +2327,7 @@ var AppInfo = {};
defineRoute({
path: '/mysync.html',
- dependencies: ['scripts/syncactivity', 'scripts/taskbutton', 'emby-button'],
+ dependencies: [],
autoFocus: false,
transition: 'fade',
controller: 'scripts/mysync'
@@ -2492,7 +2493,8 @@ var AppInfo = {};
defineRoute({
path: '/syncactivity.html',
dependencies: [],
- autoFocus: false
+ autoFocus: false,
+ controller: 'scripts/syncactivity'
});
defineRoute({
diff --git a/dashboard-ui/scripts/sync.js b/dashboard-ui/scripts/sync.js
index 12b3db6128..5b64f95f95 100644
--- a/dashboard-ui/scripts/sync.js
+++ b/dashboard-ui/scripts/sync.js
@@ -195,7 +195,7 @@
//html += '
';
//html += '
';
- $(elem).html(html);
+ elem.innerHTML = html;
$('#selectSyncTarget', elem).on('change', function () {
@@ -303,7 +303,7 @@
var promise = dialogHelper.open(dlg);
renderForm({
- elem: $('.formFields', dlg),
+ elem: dlg.querySelector('.formFields'),
dialogOptions: dialogOptions,
dialogOptionsFn: getTargetDialogOptionsFn(dialogOptionsQuery)
});
diff --git a/dashboard-ui/scripts/syncactivity.js b/dashboard-ui/scripts/syncactivity.js
index 8d1ea3e983..d0f88a1fef 100644
--- a/dashboard-ui/scripts/syncactivity.js
+++ b/dashboard-ui/scripts/syncactivity.js
@@ -1,394 +1,4 @@
-define(['jQuery', 'paper-icon-button-light', 'cardStyle'], function ($) {
-
- function cancelJob(page, id) {
-
- var msg = Globalize.translate('CancelSyncJobConfirmation');
-
- require(['confirm'], function (confirm) {
-
- confirm(msg, Globalize.translate('HeaderCancelSyncJob')).then(function () {
-
- Dashboard.showLoadingMsg();
-
- ApiClient.ajax({
-
- url: ApiClient.getUrl('Sync/Jobs/' + id),
- type: 'DELETE'
-
- }).then(function () {
-
- reloadData(page);
- });
- });
- });
- }
-
- function getSyncStatusBanner(job) {
-
- var opacity = '.85';
- var background = 'rgba(204,51,51,' + opacity + ')';
- var text = Globalize.translate('SyncJobStatus' + job.Status);
-
- if (job.Status == 'Completed') {
- background = 'rgba(82, 181, 75, ' + opacity + ')';
- }
- else if (job.Status == 'CompletedWithError') {
-
- }
- else if (job.Status == 'Queued') {
- background = 'rgba(51, 136, 204, ' + opacity + ')';
- }
- else if (job.Status == 'ReadyToTransfer') {
- background = 'rgba(51, 136, 204, ' + opacity + ')';
- }
- else if (job.Status == 'Transferring') {
- background = 'rgba(72, 0, 255, ' + opacity + ')';
- }
- else if (job.Status == 'Converting') {
- background = 'rgba(255, 106, 0, ' + opacity + ')';
- }
-
- var html = '';
- html += '
';
- html += text;
- html += '
';
-
- return html;
- }
-
- function getSyncJobHtml(page, job, cardBoxCssClass, syncJobPage) {
-
- var html = '';
-
- html += "
";
-
- html += '
';
- html += '
";
-
- html += '";
-
- // cardBox
- html += "
";
-
- // card
- html += "
";
-
- return html;
- }
-
- var lastDataLoad = 0;
-
- function loadData(page, jobs) {
-
- if ((new Date().getTime() - lastDataLoad) < 60000) {
- refreshData(page, jobs);
- return;
- }
-
- lastDataLoad = new Date().getTime();
-
- var html = '';
- var lastTargetName = '';
-
- var cardBoxCssClass = 'cardBox visualCardBox';
-
- var syncJobPage = 'syncjob.html';
- var showTargetName = true;
-
- if ($(page).hasClass('mySyncPage')) {
- syncJobPage = 'mysyncjob.html';
-
- showTargetName = !hasLocalSync();
- }
-
- var hasOpenSection = false;
-
- for (var i = 0, length = jobs.length; i < length; i++) {
-
- var job = jobs[i];
- if (showTargetName) {
- var targetName = job.TargetName || 'Unknown';
-
- if (targetName != lastTargetName) {
-
- if (lastTargetName) {
- html += '
';
- html += '
';
- html += '
';
- html += '
';
- hasOpenSection = false;
- }
-
- lastTargetName = targetName;
-
- html += '';
- html += '
';
- hasOpenSection = true;
- }
- }
-
- html += getSyncJobHtml(page, job, cardBoxCssClass, syncJobPage);
- }
-
- if (hasOpenSection) {
- html += '
';
- }
-
- var elem = $('.syncActivity', page).html(html).lazyChildren();
-
- $('.btnJobMenu', elem).on('click', function () {
- showJobMenu(page, this);
- });
-
- if (!jobs.length) {
-
- elem.html('
' + Globalize.translate('MessageNoSyncJobsFound') + '
');
- }
- }
-
- $.fn.lazyChildren = function () {
-
- for (var i = 0, length = this.length; i < length; i++) {
- ImageLoader.lazyChildren(this[i]);
- }
- return this;
- };
-
- function refreshData(page, jobs) {
-
- for (var i = 0, length = jobs.length; i < length; i++) {
-
- var job = jobs[i];
- refreshJob(page, job);
- }
- }
-
- function refreshJob(page, job) {
-
- var card = page.querySelector('.card[data-id=\'' + job.Id + '\']');
-
- if (!card) {
- return;
- }
-
- var banner = card.querySelector('.syncStatusBanner');
-
- if (banner.getAttribute('data-status') == job.Status) {
- var elem = document.createElement('div');
- elem.innerHTML = getSyncStatusBanner(job);
- elem = elem.querySelector('.syncStatusBanner');
- elem.parentNode.removeChild(elem);
-
- banner.parentNode.replaceChild(elem, banner);
- }
-
- var progress = job.Progress || 0;
- var cardFooter = card.querySelector('.cardFooter');
-
- if (progress == 0 || progress >= 100) {
- cardFooter.classList.add('hide');
- }
- else {
- cardFooter.classList.remove('hide');
- cardFooter.querySelector('.itemProgressBar').value = progress;
- }
- }
-
- function showJobMenu(page, elem) {
-
- var card = $(elem).parents('.card');
- var jobId = card.attr('data-id');
- var status = card.attr('data-status');
-
- var menuItems = [];
-
- if (status == 'Cancelled') {
- menuItems.push({
- name: Globalize.translate('ButtonDelete'),
- id: 'delete'
- });
- } else {
- menuItems.push({
- name: Globalize.translate('ButtonCancelSyncJob'),
- id: 'cancel'
- });
- }
-
- require(['actionsheet'], function (actionsheet) {
-
- actionsheet.show({
- items: menuItems,
- positionTo: elem,
- callback: function (id) {
-
- switch (id) {
-
- case 'delete':
- cancelJob(page, jobId);
- break;
- case 'cancel':
- cancelJob(page, jobId);
- break;
- default:
- break;
- }
- }
- });
-
- });
- }
-
- function hasLocalSync() {
- return Dashboard.capabilities().SupportsSync;
- }
-
- function reloadData(page) {
-
- lastDataLoad = 0;
- Dashboard.showLoadingMsg();
-
- var options = {};
-
- Dashboard.getCurrentUser().then(function (user) {
-
- if ($(page).hasClass('mySyncPage')) {
- options.UserId = Dashboard.getCurrentUserId();
-
- if (hasLocalSync()) {
- options.TargetId = ApiClient.deviceId();
- }
- }
-
- ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs', options)).then(function (response) {
-
- loadData(page, response.Items);
- Dashboard.hideLoadingMsg();
-
- });
- });
- }
-
- function onWebSocketMessage(e, msg) {
-
- var page = $($.mobile.activePage)[0];
-
- if (msg.MessageType == "SyncJobs") {
-
- var data = msg.Data;
-
- if (hasLocalSync()) {
- var targetId = ApiClient.deviceId();
- data = data.filter(function (j) {
- return j.TargetId == targetId;
- });
- }
- loadData(page, data);
- }
- }
-
- function startListening(page) {
-
- var startParams = "0,1500";
-
- if ($(page).hasClass('mySyncPage')) {
- startParams += "," + Dashboard.getCurrentUserId();
- }
-
- if (ApiClient.isWebSocketOpen()) {
- ApiClient.sendWebSocketMessage("SyncJobsStart", startParams);
- }
-
- }
-
- function stopListening() {
-
- if (ApiClient.isWebSocketOpen()) {
- ApiClient.sendWebSocketMessage("SyncJobsStop", "");
- }
-
- }
+define(['loading', 'apphost', 'globalize', 'syncJobList', 'events', 'localsync', 'emby-button', 'paper-icon-button-light'], function (loading, appHost, globalize, syncJobList, events) {
function getTabs() {
return [
@@ -410,57 +20,49 @@
}];
}
- $(document).on('pageinit', ".syncActivityPage", function () {
+ function initSupporterInfo(view, params) {
- var page = this;
+ view.querySelector('.supporterPromotion .mainText').innerHTML = globalize.translate('HeaderSyncRequiresSupporterMembership');
- $('.btnSyncSupporter', page).on('click', function () {
+ var apiClient = ApiClient;
+ apiClient.getPluginSecurityInfo().then(function (regInfo) {
- requirejs(["registrationservices"], function () {
- RegistrationServices.validateFeature('sync');
- });
- });
- $('.supporterPromotion .mainText', page).html(Globalize.translate('HeaderSyncRequiresSupporterMembership'));
-
- }).on('pageshow', ".syncActivityPage", function () {
-
- if (this.id == 'syncActivityPage') {
- LibraryMenu.setTabs('syncadmin', 0, getTabs);
- }
- var page = this;
-
- Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) {
-
- if (pluginSecurityInfo.IsMBSupporter) {
- $('.supporterPromotionContainer', page).hide();
+ if (regInfo.IsMBSupporter) {
+ view.querySelector('.supporterPromotionContainer').classList.add('hide');
} else {
- $('.supporterPromotionContainer', page).show();
+ view.querySelector('.supporterPromotionContainer').classList.remove('hide');
}
+
+ }, function () {
+
+ view.querySelector('.supporterPromotionContainer').classList.remove('hide');
+ });
+ }
+
+ return function (view, params) {
+
+ initSupporterInfo(view, params);
+ var mySyncJobList = new syncJobList({
+ isLocalSync: params.mode === 'offline',
+ serverId: ApiClient.serverId(),
+ userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(),
+ element: view.querySelector('.syncActivity')
});
- reloadData(page);
+ events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) {
- // on here
- $('.btnSync', page).taskButton({
- mode: 'on',
- progressElem: page.querySelector('.syncProgress'),
- taskKey: 'SyncPrepare'
+ Dashboard.navigate('syncjob.html?id=' + jobId);
});
- startListening(page);
- Events.on(ApiClient, "websocketmessage", onWebSocketMessage);
+ view.addEventListener('viewshow', function () {
- }).on('pagebeforehide', ".syncActivityPage", function () {
-
- var page = this;
-
- // off here
- $('.btnSync', page).taskButton({
- mode: 'off'
+ LibraryMenu.setTabs('syncadmin', 0, getTabs);
});
- stopListening();
- Events.off(ApiClient, "websocketmessage", onWebSocketMessage);
- });
+ view.addEventListener('viewdestroy', function () {
+
+ mySyncJobList.destroy();
+ });
+ };
});
\ No newline at end of file
diff --git a/dashboard-ui/scripts/syncjob.js b/dashboard-ui/scripts/syncjob.js
index 8a714501f3..20d444e4e8 100644
--- a/dashboard-ui/scripts/syncjob.js
+++ b/dashboard-ui/scripts/syncjob.js
@@ -18,7 +18,7 @@
require(['syncDialog'], function (syncDialog) {
syncDialog.renderForm({
- elem: $('.formFields', page),
+ elem: page.querySelector('.formFields'),
dialogOptions: dialogOptions,
dialogOptionsFn: getTargetDialogOptionsFn(dialogOptions),
showName: true,
diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json
index 36715f32da..95902d3d85 100644
--- a/dashboard-ui/strings/en-US.json
+++ b/dashboard-ui/strings/en-US.json
@@ -880,7 +880,6 @@
"OptionNone": "None",
"HeaderLiveTv": "Live TV",
"HeaderReports": "Reports",
- "HeaderMetadataManager": "Metadata Manager",
"HeaderSettings": "Settings",
"OptionDefaultSort": "Default",
"OptionCommunityMostWatchedSort": "Most Watched",
@@ -1739,7 +1738,7 @@
"MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
"ButtonDashboard": "Dashboard",
"ButtonReports": "Reports",
- "ButtonMetadataManager": "Metadata Manager",
+ "MetadataManager": "Metadata Manager",
"HeaderTime": "Time",
"LabelAddedOnDate": "Added {0}",
"ButtonStart": "Start",
@@ -2314,5 +2313,7 @@
"EnablePhotos": "Enable photos",
"EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.",
"MakeAvailableOffline": "Make available offline",
- "ConfirmRemoveDownload": "Remove download?"
+ "ConfirmRemoveDownload": "Remove download?",
+ "SyncToOtherDevices": "Sync to other devices",
+ "ManageOfflineDownloads": "Manage offline downloads"
}
diff --git a/dashboard-ui/syncactivity.html b/dashboard-ui/syncactivity.html
index 5624f02c1b..aadb63fd2e 100644
--- a/dashboard-ui/syncactivity.html
+++ b/dashboard-ui/syncactivity.html
@@ -1,4 +1,4 @@
-