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');