fix(webui): Ansichtsrettung suchte am falschen Ort, Suche findet Nummern

#288 war mit dem Transport allein nicht behoben. Die Ansichtsrettung fragte
dokumentweit nach der offenen Unteransicht:

    document.querySelector('.subtab-content.active')

Im Markup tragen aber ACHT Unteransichten diese Klasse - jedes Modul hat seine
eigene Startansicht, und switchMainTab() raeumt nur innerhalb des Moduls auf,
das es oeffnet. Zurueck kam deshalb immer die erste in Dokumentreihenfolge
(sub-projects-list), voellig unabhaengig davon, was gerade sichtbar war. Wer im
Bugtracker filterte, waere also auf der Projektverwaltung gelandet.

Dass die Rettung fuer POST-Formulare zu funktionieren schien, lag an den
wenigen, die ihren Anker fest in der action stehen haben. Gesucht wird jetzt
erst das aktive Modul und darin die Unteransicht.

Zusaetzlich tragen die drei Filterformulare das Feld "view" fest im Markup.
Dort ist ohne Zweifel bekannt, wo sie stehen - das haengt an keiner DOM-Abfrage
mehr. Und restoreViewFromHash() faellt bei einer unbekannten Unteransicht auf
das Modul zurueck, statt wortlos im Dashboard zu landen.

Nachgewiesen an einer DOM-Probe, die die Modulstruktur aus index.php nachbaut
und die echten Funktionen darauf laufen laesst: alte Fassung -> tab-projects,
neue Fassung -> sub-bugtracker-items.

Ausserdem, aus derselben Sitzung gemeldet: Die Suche findet Eintraege jetzt
ueber ihre Nummer. Sie ist das, was ueberall zitiert wird, und stand in keiner
der durchsuchten Spalten - "288" lief ins Leere. "288" findet jetzt das Item
mit dieser Nummer und alles, was die Zahl im Text hat; "#288" ausschliesslich
dieses eine. Gilt fuer Bugtracker, Fehler-Stream und den Parameter search der
API, der bei der Gelegenheit auch in die OpenAPI-Beschreibung gekommen ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Deploymentcenter Bot
2026-08-30 22:03:08 +02:00
co-authored by Claude Opus 5
parent 0c1d269665
commit c9c821a44a
6 changed files with 140 additions and 12 deletions
+41
View File
@@ -184,6 +184,47 @@ def _(ctx):
erwarte(ctx['bug_id'] in ids, "Item #%s nicht in der Liste (%s)" % (ctx['bug_id'], ids[:10]))
@test('bugtracker', 'Suche nach der Nummer findet das Item')
def _(ctx):
"""
Die Nummer ist das, was ueberall zitiert wird - und war ausgerechnet
ueber die Suche nicht auffindbar: Sie steht in keiner der durchsuchten
Spalten. Wer sie eingab, bekam nichts.
"""
r = ctx.client.get('/api/bugtracker/v1/manage',
query={'action': 'list', 'project_slug': PROJEKT,
'search': str(ctx['bug_id']), 'limit': 50})
erwarte_erfolg(r)
ids = [i.get('id') for i in _liste(r, 'items', 'bugs', 'data') if isinstance(i, dict)]
erwarte(ctx['bug_id'] in ids,
"Suche nach %s findet das Item nicht (%s)" % (ctx['bug_id'], ids[:10]))
@test('bugtracker', 'Suche mit Raute liefert genau dieses Item')
def _(ctx):
"""
Mit Raute ist die Absicht eindeutig - dann darf kein Treffer dabei sein,
der die Zahl nur im Text stehen hat.
"""
r = ctx.client.get('/api/bugtracker/v1/manage',
query={'action': 'list', 'project_slug': PROJEKT,
'search': '#%s' % ctx['bug_id'], 'limit': 50})
erwarte_erfolg(r)
ids = [i.get('id') for i in _liste(r, 'items', 'bugs', 'data') if isinstance(i, dict)]
erwarte(ids == [ctx['bug_id']],
"Erwartet genau [%s], bekommen %s" % (ctx['bug_id'], ids))
@test('bugtracker', 'Suche nach einer fremden Nummer findet nichts')
def _(ctx):
r = ctx.client.get('/api/bugtracker/v1/manage',
query={'action': 'list', 'project_slug': PROJEKT,
'search': '#999999', 'limit': 50})
erwarte_erfolg(r)
ids = [i.get('id') for i in _liste(r, 'items', 'bugs', 'data') if isinstance(i, dict)]
erwarte(ids == [], "Unerwartete Treffer: %s" % ids[:10])
@test('bugtracker', 'Einzelabruf liefert das Item')
def _(ctx):
r = ctx.client.get('/api/bugtracker/v1/manage',