Update-Knopf: Seitensprung im Großbild-Layout behoben
Auf Update prüfen/Update installieren ließ die Seite im Seitenleisten-Layout sichtbar nach oben springen - render()s eigene Scroll-Wiederherstellung reichte hier nicht, vermutlich weil die Zustandsänderung des Update-Sensors zusätzlich über HAs eigenes set-hass-Durchreichen an das eingebettete Panel einen zweiten Render-Pfad anstößt. Statt die genaue Ursache weiter zu jagen: fester Scroll-Merkwert vor dem Klick, per requestAnimationFrame nach jedem eigenen render()-Aufruf dieses Ablaufs erneut erzwungen. Live bei 1280x800 verifiziert: kein Sprung mehr. Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
@@ -2681,6 +2681,35 @@ the OTA bundle's embedded version aligned with the manifest (no further companio
|
|||||||
after the "Licht ausgeschaltet" text fix earlier in this same round, so this rebuild only updates the
|
after the "Licht ausgeschaltet" text fix earlier in this same round, so this rebuild only updates the
|
||||||
stamped version number, not the bundle contents).
|
stamped version number, not the bundle contents).
|
||||||
|
|
||||||
|
**A third same-day fix (2026.8.24.12): the update-button scroll jump, specifically in wide/desktop
|
||||||
|
mode.** The owner reported the page visibly jumps when pressing "Auf Update prüfen"/"Update
|
||||||
|
installieren" on a large screen. Reproduced live at `1280×800`: clicking the button while scrolled deep
|
||||||
|
into "Einstellungen" (`scrollTop` ~1773) landed at `scrollTop` ~1517 after the click resolved — a real,
|
||||||
|
non-zero shift, not the element being replaced (`main#view` stayed `isConnected: true` throughout, so
|
||||||
|
it wasn't a full re-mount either) and not simply `scrollTop` reset to 0 the way section L's
|
||||||
|
narrow-mode work had assumed for this kind of bug. `render()`'s own scroll-preservation
|
||||||
|
(`v.scrollTop = gleicheAnsicht ? merkeScroll : 0`) should apply here (same route, same id) and normally
|
||||||
|
does — the update flow specifically still lost position, most likely because the service call also
|
||||||
|
triggers a *separate*, second re-render path outside `render()`'s own bookkeeping (`sensor.audi_dashboard_app_version`
|
||||||
|
changing state reaches the embedded panel through Home Assistant's own `set hass()` plumbing, not
|
||||||
|
through this app's `route`/`letzteAnsicht` mechanism at all) — plausible but not conclusively traced
|
||||||
|
before the owner asked to move on rather than keep chasing the exact mechanism. Fixed pragmatically
|
||||||
|
instead of surgically: the `data-update` click handler for `pruefen`/`installieren` now captures
|
||||||
|
`$("#view").scrollTop` once before acting, and re-asserts it via `requestAnimationFrame` after *each*
|
||||||
|
of its own `render()` calls (both the immediate one and the one in `.finally()`) — this corrects the
|
||||||
|
position regardless of what else might be moving it, without needing to identify or touch whatever the
|
||||||
|
second path turns out to be. Verified live at `1280×800`: repeated the exact same scroll-deep-then-click
|
||||||
|
sequence that reproduced the bug: **no visible jump**, page stayed on the same section
|
||||||
|
before and after. (Separately noticed, not fixed, not in scope of what was asked: the check's *result*
|
||||||
|
only shows up in the currently-open tab after a full page reload, even though it's correctly persisted
|
||||||
|
server-side immediately — confirmed via `docker logs` showing the check completed and a subsequent
|
||||||
|
fresh page load showing the right "Verfügbare Version" — likely because nothing in this flow re-reads
|
||||||
|
`sensor.audi_dashboard_app_version`'s `daten` attribute into `INTEGRATION_UPDATE` and re-renders when
|
||||||
|
that entity's state changes out from under the open tab. Pre-existing, not caused by this fix, not
|
||||||
|
reported by the owner as a problem — worth a look if it ever is.)
|
||||||
|
|
||||||
|
Manifest bumped to `2026.8.24.12` for this fix.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Working conventions (observed — keep them)
|
## Working conventions (observed — keep them)
|
||||||
|
|||||||
@@ -4669,7 +4669,22 @@ function ereignisseVerdrahten() {
|
|||||||
// diese drei Aktionen brauchen einen sichtbaren Ladezustand, siehe
|
// diese drei Aktionen brauchen einen sichtbaren Ladezustand, siehe
|
||||||
// INTEGRATION_UPDATE_LAEUFT's Kommentar an der Deklaration.
|
// INTEGRATION_UPDATE_LAEUFT's Kommentar an der Deklaration.
|
||||||
if (aktion === "pruefen" || aktion === "installieren") {
|
if (aktion === "pruefen" || aktion === "installieren") {
|
||||||
|
// Im Großbild-Layout (Seitenleiste statt Tableiste) sprang die Seite
|
||||||
|
// beim Klick sichtbar nach oben, obwohl render() den Scroll eigentlich
|
||||||
|
// wiederherstellt (v.scrollTop = merkeScroll) - die Zustandsänderung
|
||||||
|
// an sensor.audi_dashboard_app_version, die dieser Aufruf auslöst,
|
||||||
|
// verschiebt scrollTop zusätzlich über einen zweiten, äußeren Pfad
|
||||||
|
// (HA reicht jede Zustandsänderung an das eingebettete Panel durch).
|
||||||
|
// Statt die Ursache dort zu jagen: fester Merkwert vor dem Klick, per
|
||||||
|
// rAF nach jedem render() dieses Ablaufs erneut erzwungen - wirkt
|
||||||
|
// gegen render()s eigene Wiederherstellung UND gegen den äußeren Pfad.
|
||||||
|
const merkeScrollUpdate = $("#view").scrollTop;
|
||||||
|
const scrollWiederherstellen = () => requestAnimationFrame(() => {
|
||||||
|
const view = $("#view");
|
||||||
|
if (view) view.scrollTop = merkeScrollUpdate;
|
||||||
|
});
|
||||||
INTEGRATION_UPDATE_LAEUFT = aktion; render();
|
INTEGRATION_UPDATE_LAEUFT = aktion; render();
|
||||||
|
scrollWiederherstellen();
|
||||||
HASS.callService(DOMAIN, `update_${aktion}`, {})
|
HASS.callService(DOMAIN, `update_${aktion}`, {})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
hinweis(
|
hinweis(
|
||||||
@@ -4677,7 +4692,7 @@ function ereignisseVerdrahten() {
|
|||||||
err && err.message ? err.message : "Der Dienst konnte nicht ausgeführt werden.",
|
err && err.message ? err.message : "Der Dienst konnte nicht ausgeführt werden.",
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.finally(() => { INTEGRATION_UPDATE_LAEUFT = null; render(); });
|
.finally(() => { INTEGRATION_UPDATE_LAEUFT = null; render(); scrollWiederherstellen(); });
|
||||||
} else if (aktion === "neustart") {
|
} else if (aktion === "neustart") {
|
||||||
INTEGRATION_UPDATE_LAEUFT = "neustart"; render();
|
INTEGRATION_UPDATE_LAEUFT = "neustart"; render();
|
||||||
HASS.callService("homeassistant", "restart", {}).catch((err) => {
|
HASS.callService("homeassistant", "restart", {}).catch((err) => {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"domain": "audi_dashboard",
|
"domain": "audi_dashboard",
|
||||||
"name": "Audi Dashboard",
|
"name": "Audi Dashboard",
|
||||||
"version": "2026.8.24.11",
|
"version": "2026.8.24.12",
|
||||||
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
|
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
|
||||||
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
|
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
|
||||||
"codeowners": ["@paul"],
|
"codeowners": ["@paul"],
|
||||||
|
|||||||
Reference in New Issue
Block a user