--- title: "1.15.7 — The whole portal shows its work" description: "A patch release completing the admin-portal responsiveness sweep. Every click that goes and does work now shows that it is doing it, across all the remaining surfaces — the WebApps list and app page, the onboarding wizard, Domains and DNS, settings, SMS, email, activity, the dashboard inspectors, th…" date: "2026-08-20" tags: ["release"] canonical: "https://django-mojo.sitesmojo.com/changelog/1-15-7/" --- A patch release completing the admin-portal responsiveness sweep. Every click that goes and does work now shows that it is doing it, across all the remaining surfaces — the WebApps list and app page, the onboarding wizard, Domains and DNS, settings, SMS, email, activity, the dashboard inspectors, the platform panels and people. Failures render in place with a retry instead of leaving the previous screen sitting there as though nothing was clicked. Two bugs where a click silently ran nothing are fixed, one of which left a live purchase button under a message saying the quote had expired. ### Changed - Every awaiting control in the portal now shows a pending state. Where a control is destroyed by its own reload — confirm-then-destroy flows, inspector actions that close before they await — the whole view goes busy instead, because there is no surviving element to pin a pending state to. - An action whose first wait is a person answering a dialog shows nothing until they have answered. - A panel that fails to load renders an error with a retry, instead of appending a message under stale content. - The two local action wrappers are retired in favour of the shared one. The platform panels keep only scrim ownership, because their progress reporting needs it. ### Fixed - Clicking Users and then Groups in People left the Users content on screen while the address bar and page state said groups, and nothing ever repainted. - The domain purchase button stayed clickable after its quote was spent, leaving a live money button under a message saying the quote was gone. - Two unrelated screens both used the name `framework-update` for their in-flight work and could return each other's. ### Upgrade notes - The contract test enforcing this now walks every JavaScript file in the portal rather than a hand-maintained list, so a new feature file is covered the day it is added. It also asserts that no pending state is pinned to a container its own handler closes, and that no module calls the shared helpers without importing them. - The metrics controls are deliberately exempt from the re-entry guard: they supersede rather than queue, and guarding them would leave the chart on the previous selection while the control showed the new one — the exact disagreement this work exists to remove.