Umsetzung der Ausbaustufen 2.1, 3.6, 3.8, 3.9, 4.1, 4.2, 4.4, 4.6, 5.1–5.4 (Details in AUSBAUSTUFEN.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
4 KiB
HTML
82 lines
4 KiB
HTML
{{template "kopf" .}}
|
|
|
|
<div class="seitenkopf">
|
|
<div class="seitenkopf-titel">
|
|
<h1>{{if .Data.IsNew}}Neuer Eintrag{{else}}Eintrag bearbeiten{{end}}</h1>
|
|
{{if not .Data.IsNew}}<span class="hilfe"><code>{{.Data.Entry.Slug}}</code> · Fassung {{.Data.Entry.Version}}</span>{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="karte">
|
|
<form method="POST" class="formular"
|
|
action="{{if .Data.IsNew}}/p/{{.Project.Slug}}/save{{else}}/p/{{.Project.Slug}}/e/{{.Data.Entry.Slug}}/save{{end}}"
|
|
data-preview-url="/p/{{.Project.Slug}}/preview">
|
|
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
|
|
|
|
{{/* Die Fassung wandert unverändert durchs Formular und zurück. Hat jemand
|
|
anderes den Eintrag zwischenzeitlich geändert, erkennt der Server das
|
|
und meldet einen Konflikt, statt die fremde Änderung zu überschreiben. */}}
|
|
<input type="hidden" name="version" value="{{.Data.Entry.Version}}">
|
|
|
|
<div class="feld lang">
|
|
<label for="title">Titel</label>
|
|
<input type="text" id="title" name="title" value="{{.Data.Entry.Title}}" required autofocus>
|
|
</div>
|
|
|
|
{{if .Data.IsNew}}
|
|
<div class="feld kurz">
|
|
<label for="slug">Bezeichner</label>
|
|
<span class="hilfe">Leer lassen, um ihn aus dem Titel abzuleiten.</span>
|
|
<input type="text" id="slug" name="slug" pattern="[a-z0-9][a-z0-9_-]*"
|
|
value="{{.Data.Entry.Slug}}" placeholder="wird-abgeleitet" autocomplete="off">
|
|
</div>
|
|
{{else}}
|
|
<input type="hidden" name="slug" value="{{.Data.Entry.Slug}}">
|
|
{{end}}
|
|
|
|
<div class="feld mittel">
|
|
<label for="tags">Schlagworte</label>
|
|
<span class="hilfe">Durch Komma getrennt.</span>
|
|
<input type="text" id="tags" name="tags" value="{{.Data.TagsIn}}" placeholder="ops, deployment">
|
|
</div>
|
|
|
|
<div class="feld" data-editor>
|
|
<label for="content">Inhalt {{template "hilfelink" "weboberflaeche#markdown-im-inhalt"}}</label>
|
|
<span class="hilfe">Markdown. <code>[[bezeichner]]</code> verweist auf einen anderen Eintrag.</span>
|
|
|
|
{{/* Ohne JavaScript bleibt einfach der erste Reiter aktiv — das
|
|
Formular funktioniert dann genau wie vorher, nur ohne
|
|
Vorschau-Knopf-Wirkung. Kein <noscript>-Sonderfall nötig. */}}
|
|
<div class="editor-reiter" role="tablist">
|
|
<button type="button" class="editor-reiter-knopf aktiv"
|
|
data-editor-tab="schreiben" role="tab" aria-selected="true">Schreiben</button>
|
|
<button type="button" class="editor-reiter-knopf"
|
|
data-editor-tab="vorschau" role="tab" aria-selected="false">Vorschau</button>
|
|
</div>
|
|
|
|
<textarea id="content" name="content" rows="24" spellcheck="true"
|
|
data-editor-panel="schreiben"
|
|
data-suggest-url="/p/{{.Project.Slug}}/entries/suggest">{{.Data.Entry.Content}}</textarea>
|
|
{{/* Erscheint nur, während "[[" getippt und noch nicht mit "]]"
|
|
geschlossen wurde — siehe static/autocomplete.js. */}}
|
|
<ul class="autovervollstaendigung" data-autovervollstaendigung hidden></ul>
|
|
<div class="eintrag-text vorschau-flaeche" data-editor-panel="vorschau" hidden></div>
|
|
</div>
|
|
|
|
<div class="feld ankreuz">
|
|
<input type="checkbox" id="curated" name="curated" value="1" {{if .Data.Entry.Curated}}checked{{end}}>
|
|
<label for="curated">
|
|
Kuratiert
|
|
<span class="hilfe">Geprüftes Wissen, keine Beobachtung eines Agenten.</span>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="formular-aktionen">
|
|
<button type="submit">Speichern</button>
|
|
<a class="knopf zweitrangig"
|
|
href="{{if .Data.IsNew}}/p/{{.Project.Slug}}/{{else}}/p/{{.Project.Slug}}/e/{{.Data.Entry.Slug}}{{end}}">Abbrechen</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
{{template "fuss" .}}
|