jellyfish-web/dashboard-ui/bower_components/emby-webcomponents/sync/syncjoblist.js
2018-10-23 01:05:09 +03:00

209 lines
No EOL
11 KiB
JavaScript

define(["serverNotifications", "events", "loading", "connectionManager", "imageLoader", "dom", "globalize", "registrationServices", "layoutManager", "listViewStyle"], function(serverNotifications, events, loading, connectionManager, imageLoader, dom, globalize, registrationServices, layoutManager) {
"use strict";
function onSyncJobCreated(e, apiClient, data) {
fetchData(this)
}
function onSyncJobUpdated(e, apiClient, data) {
refreshJob(this, data)
}
function onSyncJobCancelled(e, apiClient, data) {
fetchData(this)
}
function refreshList(listInstance, jobs) {
for (var i = 0, length = jobs.length; i < length; i++) {
refreshJob(listInstance, jobs[i])
}
}
function syncNow() {
require(["localsync"], function(localSync) {
localSync.sync()
})
}
function cancelJob(listInstance, id) {
require(["confirm"], function(confirm) {
confirm({
text: globalize.translate("sharedcomponents#ConfirmRemoveDownload"),
primary: "cancel"
}).then(function() {
loading.show();
var apiClient = getApiClient(listInstance);
apiClient.ajax({
url: apiClient.getUrl("Sync/Jobs/" + id),
type: "DELETE"
}).then(function() {
"download" === listInstance.options.mode && syncNow(), fetchData(listInstance)
})
})
})
}
function refreshJob(listInstance, job) {
var listItem = listInstance.options.element.querySelector(".listItem[data-id='" + job.Id + "']");
listItem && (listItem.querySelector(".jobStatus").innerHTML = getProgressText(job))
}
function getProgressText(job) {
var status = job.Status;
"Completed" === status && (status = "Synced");
var html = globalize.translate("sharedcomponents#SyncJobItemStatus" + status);
if ("Transferring" === job.Status || "Converting" === job.Status || "Completed" === job.Status) {
html += " ";
var progress = job.Progress || 0;
progress > 0 && progress < 100 && (progress = progress.toFixed(1)), html += progress + "%"
}
return html
}
function getSyncJobHtml(listInstance, job, apiClient) {
var html = "",
tagName = layoutManager.tv ? "button" : "div",
typeAttribute = "button" === tagName ? ' type="button"' : "",
listItemClass = "listItem listItem-border";
layoutManager.tv && (listItemClass += " listItem-button listItem-focusscale", listItemClass += " btnJobMenu");
var canEdit = (job.ItemCount || 1) > 1 || "Queued" === job.Status;
html += "<" + tagName + typeAttribute + ' class="' + listItemClass + '" data-canedit="' + canEdit + '" data-id="' + job.Id + '" data-status="' + job.Status + '">';
var imgUrl;
job.PrimaryImageItemId && (imgUrl = apiClient.getImageUrl(job.PrimaryImageItemId, {
type: "Primary",
width: 80,
tag: job.PrimaryImageTag,
minScale: 1.5
})), imgUrl ? (html += '<div class="listItemImage lazy" data-src="' + imgUrl + '" item-icon>', html += "</div>") : html += '<i class="md-icon listItemIcon">file_download</i>';
var textLines = [],
name = job.Name;
job.ParentName && (name += " - " + job.ParentName), textLines.push(name), 1 === job.ItemCount || textLines.push(globalize.translate("sharedcomponents#ItemCount", job.ItemCount)), html += '<div class="listItemBody three-line">';
for (var i = 0, length = textLines.length; i < length; i++) 0 === i ? (html += '<h3 class="listItemBodyText">', html += textLines[i], html += "</h3>") : (html += '<div class="listItemBodyText secondary">', html += textLines[i], html += "</div>");
return html += '<div class="secondary listItemBodyText jobStatus">', html += getProgressText(job), html += "</div>", html += "</div>", layoutManager.tv || (html += canEdit ? '<button type="button" is="paper-icon-button-light" class="btnJobMenu listItemButton"><i class="md-icon">more_horiz</i></button>' : '<button type="button" is="paper-icon-button-light" class="btnCancelJob listItemButton"><i class="md-icon">delete</i></button>'), html += "</" + tagName + ">"
}
function renderList(listInstance, jobs, apiClient) {
if ((new Date).getTime() - listInstance.lastDataLoad < 6e4) return void refreshList(listInstance, jobs);
listInstance.lastDataLoad = (new Date).getTime();
for (var html = "", lastTargetName = "", mode = listInstance.options.mode, showTargetName = "download" !== mode, hasOpenSection = !1, i = 0, length = jobs.length; i < length; i++) {
var job = jobs[i];
if (showTargetName) {
var targetName = job.TargetName || "Unknown";
targetName !== lastTargetName && (lastTargetName && (html += "</div>", html += "<br/>", hasOpenSection = !1), lastTargetName = targetName, html += '<div class="verticalSection">', html += '<div class="sectionTitleContainer">', html += '<h2 class="sectionTitle">' + targetName + "</h2>", html += "</div>", html += '<div class="itemsContainer vertical-list paperList">', hasOpenSection = !0)
}
html += getSyncJobHtml(listInstance, job, apiClient)
}
hasOpenSection && (html += "</div>", html += "</div>");
var elem = listInstance.options.element.querySelector(".syncJobListContent");
html || (html = "download" === mode ? '<div style="padding:1em .25em;">' + globalize.translate("sharedcomponents#MessageNoDownloadsFound") + "</div>" : '<div style="padding:1em .25em;">' + globalize.translate("sharedcomponents#MessageNoSyncJobsFound") + "</div>"), elem.innerHTML = html, imageLoader.lazyChildren(elem)
}
function fetchData(listInstance) {
listInstance.lastDataLoad = 0, loading.show();
var options = {},
apiClient = getApiClient(listInstance);
return listInstance.options.userId && (options.UserId = listInstance.options.userId), "download" === listInstance.options.mode && (options.TargetId = apiClient.deviceId()), apiClient.getJSON(apiClient.getUrl("Sync/Jobs", options)).then(function(response) {
renderList(listInstance, response.Items, apiClient), loading.hide()
})
}
function getApiClient(listInstance) {
return connectionManager.getApiClient(listInstance.options.serverId)
}
function showJobMenu(listInstance, elem) {
var item = dom.parentWithClass(elem, "listItem"),
jobId = item.getAttribute("data-id"),
menuItems = (item.getAttribute("data-status"), []);
"true" === item.getAttribute("data-canedit") && menuItems.push({
name: globalize.translate("sharedcomponents#Edit"),
id: "edit"
});
var txt = globalize.translate("sharedcomponents#RemoveDownload");
menuItems.push({
name: txt,
id: "cancel"
}), require(["actionsheet"], function(actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: elem,
callback: function(id) {
switch (id) {
case "delete":
case "cancel":
cancelJob(listInstance, jobId);
break;
case "edit":
showJobEditor(listInstance, elem)
}
}
})
})
}
function onElementClick(e) {
var listInstance = this,
btnJobMenu = dom.parentWithClass(e.target, "btnJobMenu");
if (btnJobMenu) return void showJobMenu(listInstance, btnJobMenu);
var btnCancelJob = dom.parentWithClass(e.target, "btnCancelJob");
if (btnCancelJob) {
var listItem = dom.parentWithClass(btnCancelJob, "listItem");
if (listItem) {
cancelJob(listInstance, listItem.getAttribute("data-id"))
}
} else showJobEditor(listInstance, e.target)
}
function showJobEditor(listInstance, elem) {
var listItem = dom.parentWithClass(elem, "listItem");
if (listItem && "true" === listItem.getAttribute("data-canedit")) {
var jobId = listItem.getAttribute("data-id");
require(["syncJobEditor"], function(syncJobEditor) {
syncJobEditor.show({
serverId: listInstance.options.serverId,
jobId: jobId,
mode: listInstance.options.mode
}).then(function() {
fetchData(listInstance)
})
})
}
}
function syncJobList(options) {
this.options = options;
var onSyncJobCreatedHandler = onSyncJobCreated.bind(this);
this.onSyncJobCreatedHandler = onSyncJobCreatedHandler, events.on(serverNotifications, "SyncJobCreated", onSyncJobCreatedHandler);
var onSyncJobCancelledHandler = onSyncJobCancelled.bind(this);
this.onSyncJobCancelledHandler = onSyncJobCancelledHandler, events.on(serverNotifications, "SyncJobCancelled", onSyncJobCancelledHandler);
var onSyncJobUpdatedHandler = onSyncJobUpdated.bind(this);
this.onSyncJobUpdatedHandler = onSyncJobUpdatedHandler, events.on(serverNotifications, "SyncJobUpdated", onSyncJobUpdatedHandler);
var onClickHandler = onElementClick.bind(this);
options.element.addEventListener("click", onClickHandler), this.onClickHandler = onClickHandler, options.element.innerHTML = '<div class="syncJobListContent"></div>', fetchData(this), initSupporterInfo(options.element, getApiClient(this))
}
function showSupporterInfo(context) {
var html = '<button is="emby-button" class="raised button-submit block btnSyncSupporter" style="margin:1em 0;">';
html += "<div>", html += globalize.translate("sharedcomponents#HeaderSyncRequiresSub"), html += "</div>", html += '<div style="margin-top:.5em;">', html += globalize.translate("sharedcomponents#LearnMore"), html += "</div>", html += "</button", context.insertAdjacentHTML("afterbegin", html), context.querySelector(".btnSyncSupporter").addEventListener("click", function() {
registrationServices.validateFeature("sync")
})
}
function initSupporterInfo(context, apiClient) {
registrationServices.validateFeature("sync", {
showDialog: !1
}).catch(function() {
showSupporterInfo(context, apiClient)
})
}
return syncJobList.prototype.destroy = function() {
var onSyncJobCreatedHandler = this.onSyncJobCreatedHandler;
this.onSyncJobCreatedHandler = null, events.off(serverNotifications, "SyncJobCreated", onSyncJobCreatedHandler);
var onSyncJobCancelledHandler = this.onSyncJobCancelledHandler;
this.onSyncJobCancelledHandler = null, events.off(serverNotifications, "SyncJobCancelled", onSyncJobCancelledHandler);
var onSyncJobUpdatedHandler = this.onSyncJobUpdatedHandler;
this.onSyncJobUpdatedHandler = null, events.off(serverNotifications, "SyncJobUpdated", onSyncJobUpdatedHandler);
var onClickHandler = this.onClickHandler;
this.onClickHandler = null, this.options.element.removeEventListener("click", onClickHandler), this.options = null
}, syncJobList
});