From e25b909d18b25871bd0b30a2e06ce4479b1bb18a Mon Sep 17 00:00:00 2001 From: Eduard Wisch Date: Sun, 16 Aug 2026 17:48:53 +0200 Subject: [PATCH] Protokollseite: Kopfdaten einklappbar, Netzbereich-Vorschlag Phase 6 (Bedienung unter Arbeitsbedingungen). Standort/Netzbereich/Notiz standen bisher immer offen und schoben die Werkzeuge unter die Bildkante - beim Kunden braucht man aber zuerst die Werkzeuge, die Kopfdaten meist nur einmal. - Abschnitt einklappbar, mit Zusammenfassung in der Kopfzeile. Offen genau dann, wenn noch nichts eingetragen ist - dann ist Ausfuellen der naechste sinnvolle Schritt. - Erkanntes Subnetz als Chip zum Uebernehmen ("10.0.2.0/24 uebernehmen") statt Abtippen von der Statusseite. - inputmode="decimal" auf dem Netzbereich - Zifferntastatur statt Buchstaben. Im Emulator geprueft. --- src/routes/protokoll/[id]/+page.svelte | 130 +++++++++++++++++++------ 1 file changed, 102 insertions(+), 28 deletions(-) diff --git a/src/routes/protokoll/[id]/+page.svelte b/src/routes/protokoll/[id]/+page.svelte index 9125d67..2a8653e 100644 --- a/src/routes/protokoll/[id]/+page.svelte +++ b/src/routes/protokoll/[id]/+page.svelte @@ -20,6 +20,7 @@ saveScan, deleteScan, } from '$lib/protocols'; + import { scanner } from '$lib/scanner'; import { resumeFinishedStressSessions } from '$lib/stresstest'; import { sync } from '$lib/sync.svelte'; import { toast } from '$lib/toast.svelte'; @@ -39,6 +40,20 @@ let saveScanOpen = $state(false); let expandedScan = $state(null); let deleteScanId = $state(null); + /** Kopfdaten sind zugeklappt, solange nichts eingetragen ist (siehe Kommentar im Markup) */ + let kopfdatenOffen = $state(false); + /** vom Adapter erkanntes Subnetz — als antippbarer Vorschlag im Eingabefeld */ + let erkanntesSubnetz = $state(''); + /** Menü hinter den drei Punkten (selten gebrauchte, gefährliche Aktionen) */ + let ueberlaufOffen = $state(false); + + /** Kompakte Zusammenfassung für die zugeklappte Kopfzeile */ + const kopfZusammenfassung = $derived( + [protocol?.location, protocol?.subnet, protocol?.note?.split('\n')[0]] + .map((t) => (t ?? '').trim()) + .filter(Boolean) + .join(' · '), + ); let appStateListener: PluginListenerHandle | null = null; @@ -102,6 +117,19 @@ await persist(); } + // Kopfdaten offen lassen, solange noch nichts eingetragen ist — dann ist + // das Ausfüllen der nächste sinnvolle Schritt. Sind sie gefüllt, bleibt + // der Platz für die Werkzeuge frei. + kopfdatenOffen = !(p.location || p.subnet || p.note); + + // Erkanntes Subnetz als Eingabevorschlag bereitstellen (best effort) + try { + const local = await scanner.getLocalSubnet(); + erkanntesSubnetz = String(local.subnet ?? '').trim(); + } catch { + /* kein Adapter aktiv — dann gibt es eben keinen Vorschlag */ + } + // App wechselt in den Hintergrund (anderer App-Wechsel, Display aus) → // sofort sichern, bevor Android den Prozess evtl. beendet. appStateListener = await App.addListener('appStateChange', ({ isActive }) => { @@ -284,35 +312,81 @@ />
- -
-