81531bc887a5dababf08582f3408d3c50b44c126 chmalee Sun Mar 10 18:09:12 2024 -0700 Add a link to view the uploaded files in the gb, it is a hack relying on udc.localDir and is not sustainable diff --git src/hg/js/hgMyData.js src/hg/js/hgMyData.js index 9b47a96..b8a7ca0 100644 --- src/hg/js/hgMyData.js +++ src/hg/js/hgMyData.js @@ -291,112 +291,136 @@ // finally add it for us uiState.toUpload[file.name] = file; } togglePickStateMessage(false); addClearSubmitButtons(); } // always clear the input element uiState.input = createInput(); } function dataTablePrintSize(data, type, row, meta) { return prettyFileSize(data); } + function deleteFileFromTable(rowIx, fname) { + // req is an object with properties of an uploaded file, make a new row + // for it in the filesTable + let table = $("#filesTable").DataTable(); + let row = table.row((idx, data) => data.name === fname); + row.remove().draw(); + } + let pendingDeletes = {}; function deleteFile(rowIx, fname) { // Send an async request to hgHubConnect to delete the file // Note that repeated requests, like from a bot, will return 404 as a correct response console.log(`sending delete req for ${fname}`); const endpoint = "../cgi-bin/hgHubConnect?deleteFile=" + fname; if (!(endpoint in pendingDeletes)) { const xhr = new XMLHttpRequest(); pendingDeletes[endpoint] = xhr; this.xhr = xhr; this.xhr.open("DELETE", endpoint, true); this.xhr.send(); deleteFileFromTable(rowIx, fname); delete pendingDeletes[endpoint]; } } - function deleteFileFromTable(rowIx, fname) { - // req is an object with properties of an uploaded file, make a new row - // for it in the filesTable - let table = $("#filesTable").DataTable(); - let row = table.row((idx, data) => data.name === fname); - row.remove().draw(); + function viewInGenomeBrowser(rowIx, fname) { + // redirect to hgTracks with this track as a custom track + bigBedExts = [".bb", ".bigBed"]; + let i; + for (i = 0; i < bigBedExts.length; i++) { + if (fname.toLowerCase().endsWith(bigBedExts[i])) { + // TODO: tusd should return this location in it's response after + // uploading a file and then we can look it up somehow, the cgi can + // write the links directly into the html directly for prev uploaded files maybe? + window.location.assign("../cgi-bin/hgTracks?db=hg38&hgt.customText=" + "/hive/users/chmalee/tmp/userDataDir/4f/chmalee/" + fname); + return false; + } + } } function addNewUploadedFileToTable(req) { // req is an object with properties of an uploaded file, make a new row // for it in the filesTable let table = null; if ($.fn.dataTable.isDataTable("#filesTable")) { table = $("#filesTable").DataTable(); let newRow = table.row.add(req).draw(); } else { showExistingFiles([req]); } } let tableInitOptions = { //columnDefs: [{orderable: false, targets: [0,1]}], columnDefs: [ { orderable: false, targets: 0, title: "<input type=\"checkbox\"></input>", render: function(data, type, row) { return "<input type=\"checkbox\"></input>"; } }, { orderable: false, targets: 1, data: "action", title: "Action", render: function(data, type, row) { // TODO: add event handler on delete button // click to call hgHubDelete file - return "<button class='deleteFileBtn'>Delete</button"; + return "<button class='deleteFileBtn'>Delete</button><button class='viewInBtn'>View In GB</button>"; } }, { targets: 3, render: function(data, type, row) { return dataTablePrintSize(data); } } ], columns: [ {data: "", }, {data: "", }, {data: "name", title: "File name"}, {data: "size", title: "File size", render: dataTablePrintSize}, {data: "createTime", title: "Creation Time"}, ], order: [[4, 'desc']], drawCallback: function(settings) { let btns = document.querySelectorAll('.deleteFileBtn'); let i; for (i = 0; i < btns.length; i++) { let fnameNode = btns[i].parentNode.nextElementSibling.childNodes[0]; if (fnameNode.nodeName !== "#text") {continue;} let fname = fnameNode.nodeValue; btns[i].addEventListener("click", (e) => { deleteFile(i, fname); }); } + btns = document.querySelectorAll('.viewInBtn'); + for (i = 0; i < btns.length; i++) { + let fnameNode = btns[i].parentNode.nextElementSibling.childNodes[0]; + if (fnameNode.nodeName !== "#text") {continue;} + let fname = fnameNode.nodeValue; + btns[i].addEventListener("click", (e) => { + viewInGenomeBrowser(i, fname); + }); + } }, }; function showExistingFiles(d) { // Make the DataTable for each file //$(document).on("draw.dt", function() {alert("table redrawn");}); tableInitOptions.data = d; let table = $("#filesTable").DataTable(tableInitOptions); } function checkJsonData(jsonData, callerName) { // Return true if jsonData isn't empty and doesn't contain an error; // otherwise complain on behalf of caller. if (! jsonData) { alert(callerName + ': empty response from server');