function DetailsWindow(viewer) { this.viewer = viewer this.visible = false this.file = null this.graphsInitialized = false this.graphViews = 0 this.graphDownloads = 0 this.modal = new Modal( document.getElementById("file_viewer"), () => { this.toggle() }, "File Details", "1200px", "1000px", ) let clone = document.getElementById("tpl_details_popup").content.cloneNode(true) this.divFileDetails = clone.querySelector(".info_file_details") this.modal.setBody(clone) this.btnDetails = document.getElementById("btn_details") this.btnDetails.addEventListener("click", () => { this.toggle() }) } DetailsWindow.prototype.toggle = function () { if (this.visible) { this.modal.close() this.btnDetails.classList.remove("button_highlight") this.visible = false } else { this.modal.open() this.btnDetails.classList.add("button_highlight") this.visible = true if (!this.graphsInitialized) { this.renderGraphs() this.graphsInitialized = true } this.updateGraph(this.file) } } DetailsWindow.prototype.setFile = function (file) { this.file = file let desc = "" if (this.viewer.isList) { desc = file.description } this.divFileDetails.innerHTML = `Name${escapeHTML(file.name)} URL${file.link} Mime Type${escapeHTML(file.mime_type)} ID${file.id} Size${formatDataVolume(file.size, 4)} ( ${formatThousands(file.size)} B ) Bandwidth${formatDataVolume(file.bandwidth_used, 4)} Upload Date${printDate(file.date_created, true, true, true)} Description${escapeHTML(desc)}` if (this.visible && file.timeseries_href !== "") { this.updateGraph(file) } } DetailsWindow.prototype.renderGraphs = function () { console.log("rendering graphs") this.graphDownloads = drawGraph( document.getElementById("downloads_chart"), "Downloads", "number", ); this.graphViews = drawGraph( document.getElementById("views_chart"), "Views", "number", ); } DetailsWindow.prototype.updateGraph = function (file) { console.log("updating graph") let today = new Date() let start = new Date() start.setDate(start.getDate() - 90) fetch( file.timeseries_href + "?start=" + start.toISOString() + "&end=" + today.toISOString() + "&interval=" + 60 ).then(resp => { if (!resp.ok) { return null } return resp.json() }).then(resp => { resp.views.timestamps.forEach((val, idx) => { let date = new Date(val); let dateStr = ("00" + (date.getMonth() + 1)).slice(-2); dateStr += "-" + ("00" + date.getDate()).slice(-2); dateStr += " " + ("00" + date.getHours()).slice(-2) + "h"; resp.views.timestamps[idx] = " " + dateStr + " "; // Poor man's padding }); resp.bandwidth.amounts.forEach((val, idx) => { resp.bandwidth.amounts[idx] = Math.round(val / file.size); }); this.graphDownloads.data.labels = resp.views.timestamps this.graphViews.data.labels = resp.views.timestamps this.graphDownloads.data.datasets[0].data = resp.bandwidth.amounts this.graphViews.data.datasets[0].data = resp.views.amounts this.graphDownloads.update() this.graphViews.update() }) }