diff --git a/abogen/web/routes/utils/settings.py b/abogen/web/routes/utils/settings.py index d95635d..d16d238 100644 --- a/abogen/web/routes/utils/settings.py +++ b/abogen/web/routes/utils/settings.py @@ -367,6 +367,14 @@ def load_integration_settings() -> Dict[str, Dict[str, Any]]: def stored_integration_config(name: str) -> Dict[str, Any]: 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) if isinstance(entry, Mapping): return dict(entry) diff --git a/abogen/web/static/prepare.js b/abogen/web/static/prepare.js index 97c59f3..2de22a0 100644 --- a/abogen/web/static/prepare.js +++ b/abogen/web/static/prepare.js @@ -1159,6 +1159,7 @@ const initPrepare = (root = document) => { const entityRowTemplate = entityTabs.querySelector('template[data-role="entity-row-template"]'); const entitiesRefreshButton = entitySummaryContainer?.querySelector('[data-role="entities-refresh"]'); 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 manualOverrideList = manualOverridesRoot?.querySelector('[data-role="manual-override-list"]'); @@ -1331,6 +1332,9 @@ const initPrepare = (root = document) => { }; const setEntitiesLoading = (isLoading) => { + if (globalEntitySpinner) { + globalEntitySpinner.hidden = !isLoading; + } if (!entitySummaryContainer) { return; } diff --git a/abogen/web/static/styles.css b/abogen/web/static/styles.css index 1676941..51aec01 100644 --- a/abogen/web/static/styles.css +++ b/abogen/web/static/styles.css @@ -4225,3 +4225,23 @@ input[data-state="locked"] { 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; } +} diff --git a/abogen/web/templates/partials/new_job_step_entities.html b/abogen/web/templates/partials/new_job_step_entities.html index 9a78d73..a4c10b0 100644 --- a/abogen/web/templates/partials/new_job_step_entities.html +++ b/abogen/web/templates/partials/new_job_step_entities.html @@ -95,6 +95,10 @@ role="tab"> Manual Overrides +