munin/templates/projects.html
2026-10-19 10:13:56 +02:00

125 lines
5.3 KiB
HTML

{{template "header" .}}
<div class="page-header">
<div class="page-header-title">
<h1>Projekte {{if .Session.IsPlatformAdmin}}{{template "helplink" "plattform-admin#projekte"}}{{else}}{{template "helplink" "zugaenge#workspace-admin"}}{{end}}</h1>
<span class="help">Jedes Projekt hat eigene Einträge, eigene Zugänge und einen
eigenen MCP-Endpunkt. Projekte sehen sich gegenseitig nicht.</span>
</div>
<div class="page-header-actions row">
{{/* Der Download geht an jeden, der diese Seite sieht (Plattform- und
Workspace-Admin), und braucht kein EXPORT_DIR. */}}
<a href="/admin/export.zip" class="button secondary" download>Alle als ZIP herunterladen</a>
{{/* Der Export auf die Platte des Servers ist Sache des
Plattform-Admins, nicht des Workspace-Admins. Er läuft ohnehin
täglich. Der Knopf ist für den Fall, dass man unmittelbar vor einer
Sicherung einen aktuellen Stand braucht. */}}
{{if and .ExportEnabled .Session.IsPlatformAdmin}}
<form method="POST" action="/admin/export" class="row">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<button type="submit" class="secondary">Jetzt exportieren</button>
</form>
{{end}}
</div>
</div>
{{if .Data.Projects}}
<div class="table-wrap">
<table class="styled-table">
<thead>
<tr>
<th>Projekt</th>
<th>Bezeichner</th>
<th class="num">Einträge</th>
<th class="num">Schreibvorgänge<div class="help">letzte 30 Tage</div></th>
<th>Zuletzt geändert</th>
<th class="num">Schreibbudget</th>
<th class="narrow right">Verwaltung</th>
</tr>
</thead>
<tbody>
{{range .Data.Projects}}
<tr>
<td>
<a href="/p/{{.Project.Slug}}/">{{.Project.Name}}</a>
{{if .Project.Description}}<div class="help">{{.Project.Description}}</div>{{end}}
</td>
<td><code>{{.Project.Slug}}</code></td>
<td class="num">
{{.Entries}}
{{if .Entries}}<div class="help">{{.Usage.CuratedPercent}} % kuratiert</div>{{end}}
</td>
{{/* Schreibvorgänge der letzten 30 Tage: Gesamtzahl, darunter die
Aufteilung. "keine" ist das Signal, auf das es hier ankommt —
dieses Team benutzt Munin gerade nicht. */}}
{{$t := .Usage.Total}}
<td class="num">
{{if $t.Writes}}
{{$t.Writes}}
<div class="help">{{$t.Created}} neu · {{$t.Updated}} akt. · Agenten {{.Usage.Agent.Writes}}</div>
{{else}}
<span class="badge">keine</span>
{{end}}
</td>
<td class="help">{{if .Usage.LastUpdatedAt.IsZero}}—{{else}}{{datetime .Usage.LastUpdatedAt}}{{end}}</td>
<td class="num">
{{if .Limit}}
{{.Free}} / {{.Limit}}
<div class="help">
{{if .OwnLimit}}eigene Grenze{{else}}Standard{{end}} · je Stunde
</div>
{{else}}
<span class="help">unbegrenzt</span>
{{end}}
</td>
<td class="narrow right">
<a href="/admin/projects/{{.Project.Slug}}/edit">Bearbeiten</a> ·
<a href="/p/{{.Project.Slug}}/usage">Nutzung</a> ·
<a href="/p/{{.Project.Slug}}/keys">Zugänge</a>
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{else}}
<div class="empty">
<p>Noch kein Projekt angelegt.</p>
<p class="help">Ein Projekt ist die Einheit der Abschottung — meist eines je Team.</p>
</div>
{{end}}
<section class="section">
<h2>Neues Projekt</h2>
<span class="help">Der Bezeichner erscheint in der URL und in der MCP-Konfiguration
und lässt sich später nicht mehr ändern.</span>
<div class="card">
<form method="POST" action="/admin/projects/create" class="form">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<div class="field medium">
<label for="name">Name</label>
<input type="text" id="name" name="name" required placeholder="z.B. Plattform-Team">
</div>
<div class="field short">
<label for="slug">Bezeichner</label>
<span class="help">Leer lassen, um ihn aus dem Namen abzuleiten.</span>
<input type="text" id="slug" name="slug" pattern="[a-z0-9][a-z0-9_-]*" placeholder="plattform">
</div>
<div class="field long">
<label for="description">Beschreibung</label>
<input type="text" id="description" name="description" placeholder="optional">
</div>
<div class="form-actions">
<button type="submit">Projekt anlegen</button>
</div>
</form>
</div>
</section>
{{template "footer" .}}