feat(diagnostics): the issue composer — draft, review, screenshots, zip export (E16 S3)

After Stop (or at the cap, or from Settings → Diagnosztika's past sessions)
one dialog drafts the issue: title, description, the steps drafted from the
session's markers and page changes (a marker without a label is named by its
time), the environment (version, browser, system, window, language). Beside
it, what goes with it: the browser and server logs — each reviewable line by
line, an unticked line is not sent — and the screenshots, removable, with
paste / drop / pick to add more.

- it saves as it goes (debug_sessions.draft, migration 0090): the rendered
  markdown in the user's language, the excluded rows, and its own fields to
  reopen as it was; a sent session is read-only
- the zip export (issue.md, client.log, server.log, screenshots) is built
  from the saved draft by app/issues/bundle.py — the one definition the Gitea
  delivery (S4) will share; .log, not .jsonl, which Gitea refuses
- the log line's level tags and clock move to components/logLineParts so the
  review list draws a level the way both log viewers do
This commit is contained in:
2026-09-19 22:26:49 +02:00
parent 9f177557d2
commit 8d0083d4e4
23 changed files with 1620 additions and 35 deletions
@@ -43,5 +43,77 @@
"start": "Start a debug recording",
"step": "Mark a step in the recording",
"stop": "Stop the debug recording"
},
"composer": {
"title": "Bug report",
"meta": "{{start}} · {{minutes}} min · {{level}}",
"fieldTitle": "Title",
"titlePlaceholder": "What went wrong?",
"description": "Description",
"descriptionPlaceholder": "What did you expect, and what happened instead?",
"steps": "Steps — from your markers and page changes, editable",
"stepKind": {
"marker": "marker",
"nav": "page",
"manual": "added"
},
"stepLabel": "Step {{n}}",
"stepPlaceholder": "What did you do?",
"withShot": "image",
"addStep": "Add a step",
"removeStep": "Remove step {{n}}",
"environment": "Environment — automatic",
"attachments": "Attachments — what is sent, each one removable",
"clientLog": "Browser log",
"serverLog": "Server log",
"lines_one": "{{count}} line",
"lines_other": "{{count}} lines",
"linesKept": "{{kept}} of {{total}} lines",
"review": "Review",
"reviewTitle": "{{name}} — review",
"reviewHint": "An unticked line is not sent.",
"reviewDone": "Done",
"keepRow": "Keep line: {{event}} {{msg}}",
"screenshot": "Screenshot {{n}}",
"removeShot": "Remove screenshot {{n}}",
"drop": "Paste an image with Ctrl+V, drop it here, or",
"pick": "choose a file",
"close": "Close",
"export": "Download as zip",
"saving": "Saving…",
"saved": "Draft saved",
"saveFailed": "Couldn't save the draft",
"loadFailed": "Couldn't load the session",
"truncated": "The logs carry the first {{kept}} of {{total}} lines.",
"sent": "Sent as an issue.",
"openIssue": "Open the issue",
"env": {
"version": "Version",
"browser": "Browser",
"os": "System",
"window": "Window",
"language": "Language"
}
},
"issue": {
"steps": "Steps",
"environment": "Environment",
"screenshot": "screenshot",
"attachments": "Attachments",
"clientLog_one": "{{count}} line from the browser",
"clientLog_other": "{{count}} lines from the browser",
"serverLog_one": "{{count}} line from the server",
"serverLog_other": "{{count}} lines from the server",
"screenshots_one": "{{count}} screenshot",
"screenshots_other": "{{count}} screenshots"
},
"history": {
"title": "Past sessions",
"empty": "No session recorded yet.",
"open": "Open",
"sent": "Sent",
"draft": "Draft",
"unwritten": "Not written yet",
"failed": "Couldn't load the sessions"
}
}
@@ -43,5 +43,77 @@
"start": "Hibakereső rögzítés indítása",
"step": "Lépés megjelölése a rögzítésben",
"stop": "Hibakereső rögzítés leállítása"
},
"composer": {
"title": "Hibajegy",
"meta": "{{start}} · {{minutes}} perc · {{level}}",
"fieldTitle": "Cím",
"titlePlaceholder": "Mi romlott el?",
"description": "Leírás",
"descriptionPlaceholder": "Mit vártál, és mi történt helyette?",
"steps": "Lépések — a jelölőidből és az oldalváltásokból, szerkeszthető",
"stepKind": {
"marker": "jelölő",
"nav": "oldalváltás",
"manual": "saját"
},
"stepLabel": "{{n}}. lépés",
"stepPlaceholder": "Mit csináltál?",
"withShot": "kép",
"addStep": "Lépés hozzáadása",
"removeStep": "{{n}}. lépés törlése",
"environment": "Környezet — automatikus",
"attachments": "Csatolmányok — ami elmegy, egyenként kivehető",
"clientLog": "Böngészőnapló",
"serverLog": "Szervernapló",
"lines_one": "{{count}} sor",
"lines_other": "{{count}} sor",
"linesKept": "{{kept}} / {{total}} sor",
"review": "Átnézés",
"reviewTitle": "{{name}} — átnézés",
"reviewHint": "Pipa nélküli sor nem megy el.",
"reviewDone": "Kész",
"keepRow": "Sor megtartása: {{event}} {{msg}}",
"screenshot": "{{n}}. képernyőkép",
"removeShot": "{{n}}. képernyőkép kivétele",
"drop": "Kép beillesztése: Ctrl+V, vagy húzd ide, vagy",
"pick": "válassz fájlt",
"close": "Bezárás",
"export": "Letöltés zipként",
"saving": "Mentés…",
"saved": "Vázlat mentve",
"saveFailed": "Nem sikerült menteni a vázlatot",
"loadFailed": "Nem sikerült betölteni a munkamenetet",
"truncated": "A napló az első {{kept}} sort tartalmazza, összesen {{total}} volt.",
"sent": "Elküldve hibajegyként.",
"openIssue": "Hibajegy megnyitása",
"env": {
"version": "Verzió",
"browser": "Böngésző",
"os": "Rendszer",
"window": "Ablak",
"language": "Nyelv"
}
},
"issue": {
"steps": "Lépések",
"environment": "Környezet",
"screenshot": "képernyőkép",
"attachments": "Csatolmányok",
"clientLog_one": "{{count}} sor a böngészőből",
"clientLog_other": "{{count}} sor a böngészőből",
"serverLog_one": "{{count}} sor a szerverről",
"serverLog_other": "{{count}} sor a szerverről",
"screenshots_one": "{{count}} képernyőkép",
"screenshots_other": "{{count}} képernyőkép"
},
"history": {
"title": "Korábbi munkamenetek",
"empty": "Még nincs rögzített munkamenet.",
"open": "Megnyitás",
"sent": "Elküldve",
"draft": "Vázlat",
"unwritten": "Megírásra vár",
"failed": "Nem sikerült betölteni a munkameneteket"
}
}