diff --git a/atlas/templates/atlas/case_display_block.html b/atlas/templates/atlas/case_display_block.html
index 0669c27f..3c7b0367 100755
--- a/atlas/templates/atlas/case_display_block.html
+++ b/atlas/templates/atlas/case_display_block.html
@@ -91,6 +91,11 @@
pointer-events: auto;
}
.quick-edit-wrap .quick-edit-button:hover { opacity: 1; }
+
+ /* Normal group visual style */
+ .normal-group { border: 1px solid rgba(13,110,253,0.15); background: #f8fbff; padding: .75rem; border-radius: .375rem; margin-bottom: .75rem; }
+ .normal-group .normal-heading { font-weight: 600; color: #0d6efd; margin-bottom: .5rem; }
+ .normal-group .badge { margin-right: .25rem; }
diff --git a/atlas/templates/atlas/collection_detail.html b/atlas/templates/atlas/collection_detail.html
index 5ca9e1bb..b4ce7d6d 100644
--- a/atlas/templates/atlas/collection_detail.html
+++ b/atlas/templates/atlas/collection_detail.html
@@ -185,4 +185,38 @@
} catch (e) { console.warn('collection warning persistence error', e); }
});
+
{% endblock %}
diff --git a/atlas/templates/atlas/partials/case_search_widget.html b/atlas/templates/atlas/partials/case_search_widget.html
index 30a1d8ee..351cd8f7 100644
--- a/atlas/templates/atlas/partials/case_search_widget.html
+++ b/atlas/templates/atlas/partials/case_search_widget.html
@@ -46,3 +46,37 @@
})();
+
+
diff --git a/atlas/templates/atlas/user_uploads.html b/atlas/templates/atlas/user_uploads.html
index 75de7a0a..d854b0fe 100644
--- a/atlas/templates/atlas/user_uploads.html
+++ b/atlas/templates/atlas/user_uploads.html
@@ -322,84 +322,64 @@
const toImport = checkboxes.length
? checkboxes.filter(cb => !cb.disabled)
: selectableCheckboxes;
- if (toImport.length === 0) {
- alert("Please select at least one series to import (not already imported).");
- return;
- }
- const statusDiv = document.getElementById('import-status');
- statusDiv.innerHTML = '';
- const orderSeries = document.querySelector('input[name="order-series"]:checked').value;
- const csrfToken = '{{ csrf_token }}';
- {% if case %}
- const importUrl = "{% url 'api-1:import_dicoms_case' case.id %}";
- {% else %}
- const importUrl = "{% url 'api-1:import_dicoms' %}";
- {% endif %}
- for (let i = 0; i < toImport.length; i++) {
- const seriesId = toImport[i].value;
- statusDiv.innerHTML += `
Importing series ${seriesId}...
`;
- try {
- const response = await fetch(importUrl, {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- "X-CSRFToken": csrfToken,
- },
- body: `selection=${encodeURIComponent(seriesId)}&order-series=${encodeURIComponent(orderSeries)}`
- });
- const text = await response.text();
- document.getElementById(`import-status-${seriesId}`).innerHTML = `Series ${seriesId}: ${text}`;
- // Mark as imported in the UI and make unselectable
- const li = document.querySelector(`#series-list input[value="${seriesId}"]`)?.closest('li');
- if (li && !li.classList.contains('imported')) {
- li.classList.add('imported');
- // Add badge if not already present
- if (!li.querySelector('.badge.bg-success')) {
- const badge = document.createElement('span');
- badge.className = 'badge bg-success ms-2';
- badge.textContent = 'Imported';
- li.appendChild(badge);
+
-
if (!detail) return;
const inputs = detail.querySelectorAll('input[name="selection"]');
inputs.forEach(cb => {