var myCheckedData = []; var mySavedData = []; function deleteDownload(data){ var xhr = new XMLHttpRequest(); xhr.open("DELETE", "/delete"); xhr.setRequestHeader("Content-Type", "application/javascript"); xhr.send(JSON.stringify(data)); } function setDownload(data){ var xhr = new XMLHttpRequest(); xhr.open("POST", "/set"); xhr.setRequestHeader("Content-Type", "application/javascript"); xhr.send(JSON.stringify(data)); } function addDownload(data) { var xhr = new XMLHttpRequest(); xhr.open("POST", "/add"); xhr.setRequestHeader("Content-Type", "application/javascript"); xhr.send(JSON.stringify(data)); } function filename(value,download) { const path = (download.subdir + '/' + download.filename).replace(/^\//, ""); ret = $("").text(path).attr("title", download.filepath); if (download.status == "Complete") { ret = $('').attr("href", 'get/' + path).text(path).attr("title", download.filepath); } return ret.prop("outerHTML"); } function status(value,download) { return $('').addClass(value).text(value).prop('outerHTML') + $("").addClass(value).text(download.error).prop('outerHTML'); } function actions(value,download) { var action = $("
").addClass("dropdown"); var button = $("").addClass("btn btn-secondary dropdown-toggle").attr("type", "button").attr("data-toggle", "dropdown"); var menu = $("
").addClass("dropdown-menu"); var del = $('Delete').addClass("dropdown-item action-delete"); var resume = $('Resume').addClass("dropdown-item action-resume"); var stop = $('Stop').addClass("dropdown-item action-stop"); var retrieve = ""; if (download.status == "Complete") { retrieve = $('retrieve').addClass("dropdown-item action-retrieve").attr("href", 'get/' + (download.subdir + '/' + download.filename).replace(/^\//, "")).attr("title", download.filepath); } menu.append(del, resume, stop, retrieve); action.append(button, menu); return action.prop('outerHTML'); } function progress(value,download) { if (download.status == "Complete") { download.progress = 100; } var progress = $("
").addClass("progress"); var bar = $("
").addClass("progress-bar text-dark").css("width", (download.progress ?? "0") + '%') .text((download.progress ?? "0") + '%'); progress.append(bar) return progress.prop('outerHTML'); } function actionsbulk() { var action = $("
").addClass("dropdown").attr("title", "Actions"); var button = $("").addClass("btn btn-secondary dropdown-toggle").attr("type", "button").attr("data-toggle", "dropdown"); var menu = $("
").addClass("dropdown-menu"); var del = $('Delete').addClass("dropdown-item action-delete").attr("onclick", "bulkDelete();"); var resume = $('Resume').addClass("dropdown-item action-resume").attr("onclick", "bulkResume();"); var stop = $('Stop').addClass("dropdown-item action-stop").attr("onclick", "bulkStop();"); var retrieve = $('retrieve').addClass("dropdown-item action-retrieve").attr("onclick", "bulkRetrieve();"); menu.append(del, resume, stop, retrieve); action.append(button, menu); return action.prop('outerHTML'); } var actionEvents = { 'click .action-delete': function (e, value, download, index) { if (confirm("confirm deletion of " + download.filename)) { deleteDownload({ requests: [{ url: download.url }], history: IsHistory, }); } }, 'click .action-resume': function(e, value, download, index) { setDownload([{ url: download.url, status: "Queue", priority: download.priority }]); }, 'click .action-stop': function(e, value, download, index) { setDownload([{ url: download.url, status: "Stop", priority: download.priority }]); }, } function buttons () { return { actions: { html:actionsbulk, }, checkAll: { icon: "fa-check-square", text: "Check All", attributes: {title: "Check All"}, event:{ 'click': function() { var table = $("#table"); var downloads = table.bootstrapTable('getData', {useCurrentPage: false, includeHiddenRows: true, unfiltered: false}); for (var d of downloads){ d.checked = true; } table.bootstrapTable('prepend', {}); table.bootstrapTable('remove', { field: '$index', values: [0]}); } } }, refresh: { event: function() {$('#table').bootstrapTable('refresh',{silent:true});}, }, }; } function bulkResume() { var selectedDownloads = $("#table").bootstrapTable('getSelections'); for (var d of selectedDownloads){ d.status = "Queue"; } setDownload(selectedDownloads); } function bulkStop() { var selectedDownloads = $("#table").bootstrapTable('getSelections'); for (var d of selectedDownloads){ d.status = "Stop"; } setDownload(selectedDownloads); } function bulkDelete() { var selectedDownloads = $("#table").bootstrapTable('getSelections'); if (confirm("confirm deletion of:\n" + selectedDownloads.map(d => d.filename).join('\n'))) { deleteDownload({ requests: selectedDownloads, history: IsHistory, }); } } function bulkRetrieve(){ var selectedDownloads = $("#table").bootstrapTable('getSelections'); formPostJSON(selectedDownloads, "/get/", "discard") } // o must be an object or an array of objects // discardFieldName must be a valid json field name // endpoint must accept Content-Type: text/plain // awesome hack taken from https://systemoverlord.com/2016/08/24/posting-json-with-an-html-form.html function formPostJSON(o, url, discardFieldName='discard') { var form = $("
").attr("method", "POST").attr("enctype", "text/plain").attr("action", url); var json; if (Array.isArray(o)) { var name = JSON.stringify(o).slice(0,-2) +',"' + discardFieldName + '":"'; var value = '"}]'; } else { var name = JSON.stringify(o).slice(0,-1) +',"'+ discardFieldName + '":"'; var value = '"}'; } var input = $("").attr("name", name).attr("value", value).attr("type", "hidden"); form.append(input); $(document.body).append(form); form.submit(); form.remove(); } function SaveChecked() { myCheckedData = $("#table").bootstrapTable('getSelections').map( d => d.url ); mySavedData = $("#table").bootstrapTable('getData', {useCurrentPage: false, includeHiddenRows: true, unfiltered: true}); } function LoadChecked(downloads) { // console.log("data loaded"); var loaded = []; for (var i = downloads.length - 1; i >= 0; i--) { if (myCheckedData.includes(downloads[i].url)) { downloads[i].checked = true; loaded.push(downloads[i]); } } mySavedData = $("#table").bootstrapTable('getData', {useCurrentPage: false, includeHiddenRows: true, unfiltered: true}); $('#table').bootstrapTable('prepend', {}); $('#table').bootstrapTable('remove', { field: '$index', values: [0]}); // console.log(loaded); } function LoadSaved() { $('#table').bootstrapTable('load', mySavedData); } document.addEventListener("DOMContentLoaded", function(event) { $('#table').bootstrapTable({ onCheck: SaveChecked, onCheckAll: SaveChecked, onCheckSome: SaveChecked, onUncheck: SaveChecked, onUncheckAll: SaveChecked, onUncheckSome: SaveChecked, onLoadSuccess: LoadChecked, onLoadError: LoadSaved, }); });