feat: Enhance entity tabs with global loading spinner and status text for improved user feedback

This commit is contained in:
JB
2025-11-30 11:55:32 -08:00
parent 040bce1bc1
commit 07c78255e8
4 changed files with 36 additions and 0 deletions
+8
View File
@@ -367,6 +367,14 @@ def load_integration_settings() -> Dict[str, Dict[str, Any]]:
def stored_integration_config(name: str) -> Dict[str, Any]: def stored_integration_config(name: str) -> Dict[str, Any]:
cfg = load_config() or {} cfg = load_config() or {}
# Check under "integrations" first (new structure)
integrations = cfg.get("integrations")
if isinstance(integrations, Mapping):
entry = integrations.get(name)
if isinstance(entry, Mapping):
return dict(entry)
# Fallback to top-level (legacy structure)
entry = cfg.get(name) entry = cfg.get(name)
if isinstance(entry, Mapping): if isinstance(entry, Mapping):
return dict(entry) return dict(entry)
+4
View File
@@ -1159,6 +1159,7 @@ const initPrepare = (root = document) => {
const entityRowTemplate = entityTabs.querySelector('template[data-role="entity-row-template"]'); const entityRowTemplate = entityTabs.querySelector('template[data-role="entity-row-template"]');
const entitiesRefreshButton = entitySummaryContainer?.querySelector('[data-role="entities-refresh"]'); const entitiesRefreshButton = entitySummaryContainer?.querySelector('[data-role="entities-refresh"]');
const entitySpinner = entitySummaryContainer?.querySelector('[data-role="entities-spinner"]'); const entitySpinner = entitySummaryContainer?.querySelector('[data-role="entities-spinner"]');
const globalEntitySpinner = entityTabs.querySelector('[data-role="global-entity-spinner"]');
const manualOverridesRoot = entityTabs.querySelector('[data-role="manual-overrides"]'); const manualOverridesRoot = entityTabs.querySelector('[data-role="manual-overrides"]');
const manualOverrideList = manualOverridesRoot?.querySelector('[data-role="manual-override-list"]'); const manualOverrideList = manualOverridesRoot?.querySelector('[data-role="manual-override-list"]');
@@ -1331,6 +1332,9 @@ const initPrepare = (root = document) => {
}; };
const setEntitiesLoading = (isLoading) => { const setEntitiesLoading = (isLoading) => {
if (globalEntitySpinner) {
globalEntitySpinner.hidden = !isLoading;
}
if (!entitySummaryContainer) { if (!entitySummaryContainer) {
return; return;
} }
+20
View File
@@ -4225,3 +4225,23 @@ input[data-state="locked"] {
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
.entity-tabs__status {
display: flex;
align-items: center;
gap: 0.5rem;
margin-left: auto;
color: var(--muted);
font-size: 0.875rem;
padding-right: 1rem;
}
.entity-tabs__status-text {
font-weight: 500;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
@@ -95,6 +95,10 @@
role="tab"> role="tab">
Manual Overrides Manual Overrides
</button> </button>
<div class="entity-tabs__status" data-role="global-entity-spinner" hidden>
<span class="spinner spinner--sm"></span>
<span class="entity-tabs__status-text">Scanning text...</span>
</div>
</div> </div>
<div class="entity-tabs__panels"> <div class="entity-tabs__panels">