` styling for plain text display. Added loading spinner modal shown between user creation and credentials display. Improved Makefile version output format to show "Current version" and "New version" lines
diff --git a/services/jupyterhub/templates_enhanced/admin.html b/services/jupyterhub/templates_enhanced/admin.html
index da53b60..89a54b3 100644
--- a/services/jupyterhub/templates_enhanced/admin.html
+++ b/services/jupyterhub/templates_enhanced/admin.html
@@ -51,6 +51,20 @@
+
+
+
{% endblock main %}
{% block footer %}
@@ -131,6 +145,9 @@
console.log('[Admin] Users created:', createdUsers);
pendingUsernames.push(...createdUsers);
+ // Show loading spinner
+ showLoadingSpinner();
+
// Debounce - wait for batch completion then fetch credentials
clearTimeout(window._credentialsFetchTimeout);
window._credentialsFetchTimeout = setTimeout(() => {
@@ -172,14 +189,32 @@
}
} else {
console.error('[Admin] Failed to fetch credentials:', response.status);
+ hideLoadingSpinner();
}
} catch (e) {
console.error('[Admin] Error fetching credentials:', e);
+ hideLoadingSpinner();
+ }
+ }
+
+ // Loading spinner functions
+ let loadingModal = null;
+ function showLoadingSpinner() {
+ const modalEl = document.getElementById('loading-modal');
+ if (!loadingModal) {
+ loadingModal = new bootstrap.Modal(modalEl);
+ }
+ loadingModal.show();
+ }
+ function hideLoadingSpinner() {
+ if (loadingModal) {
+ loadingModal.hide();
}
}
// Show modal with credentials
function showCredentialsModal(credentials) {
+ hideLoadingSpinner();
const tbody = document.getElementById('credentials-body');
tbody.innerHTML = '';