munin/templates/partials.html
Thomas Adamek cf35c3f5db Verwandte Einträge, Aktualität, Importer (Ausbaustufen 3.7, 3.5, 3.2)
- 3.7: MCP-Werkzeug "related" liefert Nachbarn im Verweisgraphen in beide
  Richtungen, bis zur zweiten Reihe (store.RelatedEntries).
- 3.5: Einträge, die seit über einem Jahr unverändert sind, tragen in
  recall/get/list/related "stale": true; get und recall geben einen
  Hinweis, die Eintragsseite eine Marke. instructions erklären das Feld.
- 3.2: Import von Markdown-Dateien als ZIP unter /p/{projekt}/import
  (Rolle admin), mit Vorschau, überspringen/überschreiben, Erkennung von
  Unverändertem und Papierkorb. Neue Einträge behalten Autor, Herkunft,
  Prüfvermerk und Zeitstempel aus dem Export.

Nebenbei behoben: Das 1-MB-Body-Limit für Formulare lag über dem ganzen
Mux und begrenzte damit auch /mcp auf 1 MB statt MAX_API_BODY_BYTES.
LimitBodies wählt die Grenze jetzt einmal außen je Route.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 08:18:47 +02:00

165 lines
7.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{{/*
Gemeinsame Bausteine aller Seiten.
Statt eines verschachtelten Layout-Templates gibt es hier Blöcke, die jede
Seite einbindet. Das ist etwas mehr Tipparbeit je Seite, dafür braucht es
keine Template-Vererbung — und man sieht jeder Seitendatei an, wie sie
aufgebaut ist.
html-anfang / html-ende Dokumentrahmen (auch von der Anmeldeseite genutzt)
kopf / fuss Rahmen, Kopfleiste und Seitenleiste
*/}}
{{define "html-anfang"}}<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{.Title}} – Munin</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
{{end}}
{{define "html-ende"}}
<script src="/static/confirm.js"></script>
<script src="/static/preview.js"></script>
<script src="/static/autocomplete.js"></script>
<script src="/static/graph.js"></script>
</body>
</html>
{{end}}
{{define "kopf"}}{{template "html-anfang" .}}
{{/* Schmale Kopfleiste über die ganze Breite: Marke, Workspace-Umschalter und
Abmelden. Alles Weitere steht in der Seitenleiste.
Der Umschalter steht bewusst hier statt in der Seitenleiste — ein
Plattform-Admin mit mehreren Abteilungen muss auf jeder Seite sehen,
WELCHEN Workspace er gerade bearbeitet, nicht nur auf der Auswahlseite
selbst. Für einen Projekt-Zugang (immer genau ein Workspace) bleibt der
Umschalter weg — WorkspaceName ist dann leer. */}}
<header class="kopfleiste">
<div class="kopfleiste-innen">
<div class="reihe">
<a class="marke-wort" href="/">Munin</a>
{{if .Session.WorkspaceName}}
<a class="arbeitsbereich" href="/admin/workspaces">
<span class="arbeitsbereich-trenner" aria-hidden="true">/</span>
<span class="arbeitsbereich-name">{{.Session.WorkspaceName}}</span>
<span class="arbeitsbereich-pfeil" aria-hidden="true">⌄</span>
</a>
{{end}}
</div>
<form method="POST" action="/logout" class="reihe">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<button type="submit" class="wie-link">Abmelden</button>
</form>
</div>
</header>
<div class="gerüst">
{{/* ── Seitenleiste ──────────────────────────────────────────────────────
Enthält drei Gruppen: die Projekte, die Bereiche des aktuellen Projekts
und dessen Schlagworte. Die Schlagworte stehen hier statt als Filterzeile
über der Liste — sie sind Navigation, und die Liste bekommt so mehr Platz. */}}
<aside class="seitenleiste">
{{if .Session.IsPlatformAdmin}}
<nav class="nav-gruppe">
<h2 class="nav-titel">Projekte</h2>
<ul class="nav-liste">
{{$aktuell := .Project.Slug}}
{{range .Nav.Projects}}
<li><a href="/p/{{.Slug}}/" {{if eq $aktuell .Slug}}class="aktiv"{{end}}>{{.Name}}</a></li>
{{end}}
</ul>
<ul class="nav-liste leise">
<li><a href="/admin/projects" {{if eq .Bereich "projekte"}}class="aktiv"{{end}}>Verwalten…</a></li>
</ul>
</nav>
{{end}}
{{/* Die Bereiche des aktuellen Projekts. Die Überschrift ist der
Projektname — für einen Projekt-Key ist das zugleich die einzige
Ortsangabe, denn eine Projektliste bekommt er nicht zu sehen. */}}
{{if .Project.Slug}}
<nav class="nav-gruppe">
<h2 class="nav-titel">{{.Project.Name}}</h2>
<ul class="nav-liste">
<li><a href="/p/{{.Project.Slug}}/" {{if eq .Bereich "eintraege"}}class="aktiv"{{end}}>Einträge</a></li>
<li><a href="/p/{{.Project.Slug}}/graph" {{if eq .Bereich "graph"}}class="aktiv"{{end}}>Graph</a></li>
{{if .Session.CanManageKeys}}
<li><a href="/p/{{.Project.Slug}}/keys" {{if eq .Bereich "zugaenge"}}class="aktiv"{{end}}>Zugänge</a></li>
<li><a href="/p/{{.Project.Slug}}/import" {{if eq .Bereich "import"}}class="aktiv"{{end}}>Import</a></li>
{{end}}
<li><a href="/p/{{.Project.Slug}}/usage" {{if eq .Bereich "nutzung"}}class="aktiv"{{end}}>Nutzung</a></li>
<li><a href="/p/{{.Project.Slug}}/audit" {{if eq .Bereich "protokoll"}}class="aktiv"{{end}}>Protokoll</a></li>
{{if .Session.CanWrite}}
<li><a href="/p/{{.Project.Slug}}/trash" {{if eq .Bereich "papierkorb"}}class="aktiv"{{end}}>Papierkorb</a></li>
{{end}}
</ul>
</nav>
{{if .Nav.Tags}}
<nav class="nav-gruppe schlagworte">
<h2 class="nav-titel">Schlagworte</h2>
<ul class="nav-liste">
{{$slug := .Project.Slug}}{{$tag := .AktivesTag}}
{{range .Nav.Tags}}
<li>
<a href="/p/{{$slug}}/?tag={{.Tag}}" {{if eq $tag .Tag}}class="aktiv"{{end}}>
<span class="nav-text">{{.Tag}}</span>
<span class="nav-zahl">{{.Count}}</span>
</a>
</li>
{{end}}
</ul>
</nav>
{{end}}
{{end}}
{{if .Session.IsPlatformAdmin}}
<nav class="nav-gruppe">
<h2 class="nav-titel">Plattform</h2>
<ul class="nav-liste">
<li><a href="/admin/audit">Protokoll (alle)</a></li>
<li><a href="/admin/workspaces" {{if eq .Bereich "workspaces"}}class="aktiv"{{end}}>Workspaces</a></li>
</ul>
</nav>
{{end}}
{{/* Die Hilfe steht für alle ganz unten — gleich, mit welcher Rolle
man angemeldet ist. */}}
<nav class="nav-gruppe">
<ul class="nav-liste">
<li><a href="/hilfe" {{if eq .Bereich "hilfe"}}class="aktiv"{{end}}>Hilfe &amp; Einstieg</a></li>
</ul>
</nav>
</aside>
<main class="inhalt">
{{if .Error}}<div class="meldung fehler">{{.Error}}</div>{{end}}
{{if .Flash}}<div class="meldung hinweis">{{.Flash}}</div>{{end}}
{{end}}
{{/* hilfelink setzt ein kleines "?" neben eine Überschrift oder ein Feld, das
zur passenden Stelle der eingebauten Hilfe führt (AUSBAUSTUFEN.md 5.4).
Aufruf mit dem Ziel unterhalb von /hilfe/, auf Wunsch mit Abschnitt:
{{template "hilfelink" "weboberflaeche#markdown-im-inhalt"}}
Die Abschnittsnamen entstehen aus den Überschriften der Hilfeseiten
(internal/markdown, ankerIDs). Ein Test in web_test.go prüft, dass jedes
Ziel in den Templates wirklich existiert — wer eine Überschrift umbenennt,
merkt es also.
Die Hilfe öffnet in einem neuen Tab: Wer mitten im Bearbeiten nachschlägt,
soll dabei nicht seinen ungespeicherten Text verlieren. rel="noopener"
verhindert, dass der neue Tab auf das Fenster dieser Seite zugreifen kann. */}}
{{define "hilfelink"}}<a class="hilfe-link" href="/hilfe/{{.}}" target="_blank" rel="noopener" title="Hilfe zu diesem Thema (neuer Tab)" aria-label="Hilfe zu diesem Thema (öffnet in neuem Tab)">?</a>{{end}}
{{define "fuss"}}
</main>
</div>
{{template "html-ende" .}}
{{end}}