7ebf31ae4ac969f75b0adbce330572c3fa86cf60
chmalee
Fri Sep 26 11:18:44 2025 -0700
Keep track of hubspace UI initialization, and only do it on the first tab switch to the hub upload tab. After switching tabs we don't need to keep re-initting
diff --git src/hg/js/hgMyData.js src/hg/js/hgMyData.js
index 180e86039fa..26e3bfa5663 100644
--- src/hg/js/hgMyData.js
+++ src/hg/js/hgMyData.js
@@ -1303,30 +1303,34 @@
}
indentActionButton(row, data);
},
initComplete: function(settings, json) {
console.log("data loaded, only showing directories");
let table = new $.fn.dataTable.Api(settings);
dataTableShowTopLevel(table);
dataTableCustomOrder(table);
table.draw();
}
};
function showExistingFiles(d) {
// Make the DataTable for each file
// make buttons have the same style as other buttons
+ if ($.fn.dataTable.isDataTable("#filesTable")) {
+ return $("#filesTable").DataTable();
+ }
+
$.fn.dataTable.Buttons.defaults.dom.button.className = 'button';
tableInitOptions.data = d;
if (uiState.isLoggedIn) {
tableInitOptions.language = {emptyTable: "Uploaded files will appear here. Click \"Upload\" to get started"};
} else {
tableInitOptions.language = {emptyTable: "You are not logged in, please log in or create an account to begin uploading files"};
}
DataTable.feature.register('quota', function(settings, opts) {
let options = Object.assign({option1: false, option2: false}, opts);
let container = document.createElement("div");
container.id = "quotaDiv";
if (uiState.isLoggedIn) {
container.textContent = `Using ${prettyFileSize(uiState.userQuota)} of ${prettyFileSize(uiState.maxQuota)}`;
}
return container;
@@ -1376,30 +1380,31 @@
}
}
});
return table;
}
function handleGetFileList(jsonData, textStatus) {
_.assign(uiState, jsonData.userFiles);
if (uiState.fileList) {
parseFileListIntoHash(uiState.fileList);
}
// first add the top level directories/files
let table = showExistingFiles(uiState.fileList);
table.columns.adjust().draw();
+
uppy.use(Uppy.Dashboard, uppyOptions);
// define this in init so globals are available at runtime
let tusOptions = {
endpoint: getTusdEndpoint(),
withCredentials: true,
retryDelays: null,
};
uppy.use(Uppy.Tus, tusOptions);
uppy.use(BatchChangePlugin, {target: Uppy.Dashboard});
uppy.on('upload-success', (file, response) => {
const metadata = file.meta;
const d = new Date(metadata.lastModified);
const pad = (num) => String(num).padStart(2, '0');
@@ -1444,30 +1449,31 @@
"parentDir": "",
"fullPath": cgiEncode(metadata.parentDir),
};
// package the three objects together as one "hub" and display it
let hub = [parentDirObj, newReqObj];
if (hubTxtObj) {
hub.push(hubTxtObj);
}
addNewUploadedHubToTable(hub);
updateQuota(metadata.fileSize);
});
uppy.on('complete', (result) => {
history.replaceState(uiState, "", document.location.href);
console.log("replace history with uiState");
});
+ inited = true;
}
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');
} else if (jsonData.error) {
console.error(jsonData.error);
alert(callerName + ': error from server: ' + jsonData.error);
} else if (jsonData.warning) {
alert("Warning: " + jsonData.warning);
return true;
} else {
if (debugCartJson) {
@@ -1476,38 +1482,40 @@
return true;
}
return false;
}
function handleRefreshState(jsonData, textStatus) {
if (checkJsonData(jsonData, 'handleRefreshState')) {
handleGetFileList(jsonData, true);
}
}
function handleErrorState(jqXHR, textStatus) {
cart.defaultErrorCallback(jqXHR, textStatus);
}
+ let inited = false; // keep track of first init for tab switching purposes
function init() {
cart.setCgiAndUrl(fileListEndpoint);
cart.debug(debugCartJson);
// get the file list immediately upon page load
let activeTab = $("#tabs").tabs( "option", "active" );
if (activeTab === 3) {
let url = new URL(window.location.href);
if (url.protocol === "http:") {
warn(`The hub upload feature is only available over HTTPS. Please load the HTTPS version of ` +
`our site: https:${url.host}${url.pathname}${url.search}`);
- } else {
+ } else if (!inited) {
cart.send({ getHubSpaceUIState: {}}, handleRefreshState, handleErrorState);
cart.flush();
}
}
}
+
return { init: init,
uiState: uiState,
defaultDb: defaultDb,
makeGenomeSelectOptions: makeGenomeSelectOptions,
detectFileType: detectFileType,
};
}());