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 += '
', html += "
") : html += 'file_download'; 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 += '
'; for (var i = 0, length = textLines.length; i < length; i++) 0 === i ? (html += '

', html += textLines[i], html += "

") : (html += '
', html += textLines[i], html += "
"); return html += '
', html += getProgressText(job), html += "
", html += "
", layoutManager.tv || (html += canEdit ? '' : ''), html += "" } 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 += "", html += "
", hasOpenSection = !1), lastTargetName = targetName, html += '
', html += '
', html += '

' + targetName + "

", html += "
", html += '
', hasOpenSection = !0) } html += getSyncJobHtml(listInstance, job, apiClient) } hasOpenSection && (html += "
", html += "
"); var elem = listInstance.options.element.querySelector(".syncJobListContent"); html || (html = "download" === mode ? '
' + globalize.translate("sharedcomponents#MessageNoDownloadsFound") + "
" : '
' + globalize.translate("sharedcomponents#MessageNoSyncJobsFound") + "
"), 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 = '
', fetchData(this), initSupporterInfo(options.element, getApiClient(this)) } function showSupporterInfo(context) { var html = '