munin/templates/import.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

82 lines
3.4 KiB
HTML

{{template "kopf" .}}
<div class="seitenkopf">
<div class="seitenkopf-titel">
<h1>Import {{template "hilfelink" "weboberflaeche#import"}}</h1>
<span class="hilfe">Markdown-Dateien als ZIP-Archiv hochladen: einen Export aus Munin
oder vorhandene Dokumentation. Jede Datei wird ein Eintrag.</span>
</div>
</div>
<section class="abschnitt">
<div class="karte">
{{/* enctype="multipart/form-data" ist nötig, damit der Browser die Datei
selbst mitschickt und nicht nur ihren Namen. */}}
<form method="POST" action="/p/{{.Project.Slug}}/import" enctype="multipart/form-data" class="formular">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<div class="feld mittel">
<label for="archiv">ZIP-Archiv</label>
<span class="hilfe">Dateien auf <code>.md</code>, auch in Unterordnern, höchstens
{{.Data.MaxDateien}} Stück. Alles andere wird übergangen.</span>
<input type="file" id="archiv" name="archiv" accept=".zip,application/zip" required>
</div>
<div class="feld kurz">
<label for="modus">Wenn es den Bezeichner schon gibt</label>
<select id="modus" name="modus">
<option value="skip" {{if eq .Data.Modus "skip"}}selected{{end}}>überspringen — Vorhandenes bleibt, wie es ist</option>
<option value="overwrite" {{if eq .Data.Modus "overwrite"}}selected{{end}}>überschreiben — alter Stand wandert in den Verlauf</option>
</select>
</div>
<div class="feld ankreuz">
{{/* Beim ersten Aufruf ist die Vorschau angehakt. Wer eine
Vorschau gesehen hat, bekommt das Formular ohne Haken
zurück: Der nächste Schritt ist dann das Übernehmen. */}}
<input type="checkbox" id="vorschau" name="vorschau" value="1" {{if not .Data.Bericht}}checked{{end}}>
<label for="vorschau">
Nur Vorschau
<span class="hilfe">Zeigt, was passieren würde, ohne etwas zu schreiben.</span>
</label>
</div>
<div class="formular-aktionen">
<button type="submit">Hochladen</button>
</div>
</form>
</div>
</section>
{{with .Data.Bericht}}
<section class="abschnitt">
<h2>{{if $.Data.Vorschau}}Vorschau{{else}}Ergebnis{{end}}</h2>
<div class="tabelle-huelle">
<table class="tabelle">
<thead>
<tr>
<th>Datei</th>
<th>Bezeichner</th>
<th>Titel</th>
<th>Ergebnis</th>
</tr>
</thead>
<tbody>
{{range .Zeilen}}
<tr>
<td><code>{{.Pfad}}</code></td>
<td>{{if .Slug}}<code>{{.Slug}}</code>{{end}}</td>
<td>{{.Title}}</td>
<td>
<span class="marke{{if eq .Aktion "Fehler"}} warnung{{else if eq .Aktion "neu"}} betont{{end}}">{{.Aktion}}</span>
{{if .Grund}}<span class="hilfe">{{.Grund}}</span>{{end}}
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</section>
{{end}}
{{template "fuss" .}}