From 769fb4715f7d75733e76d966eb651539a81d2a0c Mon Sep 17 00:00:00 2001 From: OpenClaw Assistant Date: Fri, 27 Mar 2026 09:46:24 +0100 Subject: [PATCH] feat(ui): latest VoiceLog UI update set --- __pycache__/app.cpython-312.pyc | Bin 0 -> 66188 bytes app.py | 708 ++++++++++++++++++-------------- 2 files changed, 399 insertions(+), 309 deletions(-) create mode 100644 __pycache__/app.cpython-312.pyc diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5453e3321771d2d499f5b72116d8fc12d4c8e2ef GIT binary patch literal 66188 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
    r+b~SOUDefW_{h4?ia#GacjEa2Q-`(7 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

    F|8UtK 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 str: + + {title} -

    +
    - +

    {title}

    -
    {body}
    +
    {body}
    + """ @@ -455,18 +462,28 @@ def upload_page(msg: str = ""): projects = get_projects() opts = "".join([f"" for p in projects]) body = f""" -

    Audio Upload

    -

    Audio wird transkribiert + mit Sprechern angereichert und als Dokument gespeichert.

    -{f"

    {msg}

    " if msg else ""} +
    +

    Audio Upload

    +
    +

    Audio wird transkribiert + mit Sprechern angereichert und als Dokument gespeichert.

    +{f"
    {msg}
    " if msg else ""}
    -
    - - - +
    +
    + + +
    +
    + + +
    +
    + + +
    -
    - - +
    +
    """ @@ -561,66 +578,54 @@ def library(project_id: Optional[str] = None, q_title: str = "", q_content: str rows = "".join( [ f"" - f"" f"#{d['id']}" f"{d['title']}" f"{d['kind']}" f"{d['project']}" f"{d['created_at']}" - f"" - f"👁️" - f"⬇️" - f"✏️" - f"📁" - f"🗑️" - f"" + f"
    " + f"👁️" + f"⬇️" + f"✏️" + f"📁" + f"🗑️" + f"
    " f"" for d in docs ] ) project_js = json.dumps([{"value": p["id"], "label": p["name"]} for p in projects], ensure_ascii=False) body = f""" - -

    Projekte · Dokumente

    -
    Ansicht im Projektlisten-Stil mit Schnellaktionen.
    -
    - - - - - -
    - {len(docs)} Treffer +
    +

    Projekte · Dokumente

    + {len(docs)} Treffer +
    +
    Ansicht im Projektlisten-Stil mit Schnellaktionen.
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    -
    - 0 ausgewählt - - -
    -
    - - - - - - {rows or ""} -
    IDTitelTypProjektErstelltAktionen
    Keine Einträge.
    -
    -
    - - +
    +
    + + + {rows or ""} +
    IDTitelTypProjektErstelltAktionen
    Keine Einträge.
    +
    """ return layout("Library", body) @@ -726,15 +674,18 @@ def view_document(doc_id: int): projects = get_projects() body = f""" -

    Dokument #{d['id']} – {d['title']}

    -

    - Projekt: {d['project']} · Typ: {d['kind']} · {d['created_at']} -    - ⬇️ - ✏️ - 📁 - 🗑️ -

    +
    +
    +

    Dokument #{d['id']} – {d['title']}

    +
    Projekt: {d['project']} · Typ: {d['kind']} · {d['created_at']}
    +
    + +
    {rendered}
    +""" + return layout("Prompts & Projekte", body) + + +@app.get("/prompts/{prompt_id}/preview") +def prompt_preview(prompt_id: int): + with db() as c: + p = c.execute("SELECT id,name,prompt FROM prompts WHERE id=?", (prompt_id,)).fetchone() + if not p: + raise HTTPException(404, "Prompt nicht gefunden") + html = md.markdown(p["prompt"] or "", extensions=["fenced_code", "tables", "nl2br"]) + return {"id": p["id"], "name": p["name"], "html": html} @app.post("/prompts/add", response_class=HTMLResponse) def prompt_add(name: str = Form(...), prompt: str = Form(...)): @@ -977,45 +1041,68 @@ def jobs_delete_form(job_id: int): @app.get("/jobs", response_class=HTMLResponse) def jobs_page(queued: Optional[int] = None): items = _jobs_payload(200) - pre = "".join([ - ( - f"
    Job #{it['id']} [{it['kind']}] · {it['status']} · läuft: {_fmt_elapsed(it.get('started_at') or it.get('created_at'), it.get('finished_at'))}
    " - f"{it['created_at']}
    " - f"
    " - + ( - "" - if it["status"] in ("done", "error", "cancelled") - else ( - f"
    " - f"
    " - ) - ) - + ( - f"
    " - f"
    " - ) - + ( - f"Ergebnis öffnen" - if it.get("result_document_id") - else "" - ) - + "
    " - ) - for it in items - ]) or "

    Keine Jobs.

    " - notice = f"

    Job #{queued} wurde eingereiht.

    " if queued else "" + def _badge(status: str) -> str: + s = (status or "").lower() + if s == "done": + return "success" + if s in ("running", "queued"): + return "primary" + if s == "cancelled": + return "warning" + return "danger" + + cards = [] + for it in items: + start_ts = it.get("started_at") or it.get("created_at") or "" + end_ts = it.get("finished_at") or "" + actions = "" + if it["status"] not in ("done", "error", "cancelled"): + actions += f" " + actions += f" " + if it.get("result_document_id"): + actions += f" Ergebnis" + + err = f"
    {str(it['error']).replace('<','<')}
    " if it.get("error") else "" + cards.append( + f"
    " + f"
    " + f"
    Job #{it['id']} · {it['kind']}
    " + f"
    erstellt: {it['created_at']} · läuft: {_fmt_elapsed(start_ts, end_ts)}
    " + f"{it['status']}
    " + f"
    " + f"{('Projekt: '+it['project_name']) if it.get('project_name') else ''}" + f"{('
    Dokument: '+it['document_title']) if it.get('document_title') else ''}" + f"{('
    Prompt: '+it['prompt_name']) if it.get('prompt_name') else ''}" + f"
    " + f"
    {actions}
    " + f"{err}" + f"
    " + ) + + pre = "".join(cards) or "

    Keine Jobs.

    " + + notice = f"
    Job #{queued} wurde eingereiht.
    " if queued else "" body = f""" -

    Hintergrundverarbeitung

    -

    Maximal 2 Jobs gleichzeitig. Seite aktualisiert automatisch.

    +

    Hintergrundverarbeitung

    +

    Maximal 2 Jobs gleichzeitig. Seite aktualisiert automatisch.

    {notice} -
    Live-Update aktiv …
    +
    +
    + + + + + 0 ausgewählt +
    +
    +
    Live-Update aktiv …
    {pre}
    """ return layout("Jobs", body) @@ -1087,13 +1173,17 @@ def run_page(): p_opts = "".join([f"" for p in prompts]) body = f""" -

    Prompt ausführen

    +

    Prompt ausführen

    -
    -

    -
    -

    - +
    + + +
    +
    + + +
    +
    """ return layout("Run", body)