125 lines
5.3 KiB
HTML
125 lines
5.3 KiB
HTML
{{template "kopf" .}}
|
|
|
|
<div class="seitenkopf">
|
|
<div class="seitenkopf-titel">
|
|
<h1>Projekte {{if .Session.IsPlatformAdmin}}{{template "hilfelink" "plattform-admin#projekte"}}{{else}}{{template "hilfelink" "zugaenge#workspace-admin"}}{{end}}</h1>
|
|
<span class="hilfe">Jedes Projekt hat eigene Einträge, eigene Zugänge und einen
|
|
eigenen MCP-Endpunkt. Projekte sehen sich gegenseitig nicht.</span>
|
|
</div>
|
|
<div class="seitenkopf-aktionen reihe">
|
|
{{/* Der Download geht an jeden, der diese Seite sieht (Plattform- und
|
|
Workspace-Admin), und braucht kein EXPORT_DIR. */}}
|
|
<a href="/admin/export.zip" class="knopf zweitrangig" 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="reihe">
|
|
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
|
|
<button type="submit" class="zweitrangig">Jetzt exportieren</button>
|
|
</form>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
{{if .Data.Projects}}
|
|
<div class="tabelle-huelle">
|
|
<table class="tabelle">
|
|
<thead>
|
|
<tr>
|
|
<th>Projekt</th>
|
|
<th>Bezeichner</th>
|
|
<th class="zahl">Einträge</th>
|
|
<th class="zahl">Schreibvorgänge<div class="hilfe">letzte 30 Tage</div></th>
|
|
<th>Zuletzt geändert</th>
|
|
<th class="zahl">Schreibbudget</th>
|
|
<th class="schmal rechts">Verwaltung</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Data.Projects}}
|
|
<tr>
|
|
<td>
|
|
<a href="/p/{{.Project.Slug}}/">{{.Project.Name}}</a>
|
|
{{if .Project.Description}}<div class="hilfe">{{.Project.Description}}</div>{{end}}
|
|
</td>
|
|
<td><code>{{.Project.Slug}}</code></td>
|
|
<td class="zahl">
|
|
{{.Entries}}
|
|
{{if .Entries}}<div class="hilfe">{{.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="zahl">
|
|
{{if $t.Writes}}
|
|
{{$t.Writes}}
|
|
<div class="hilfe">{{$t.Created}} neu · {{$t.Updated}} akt. · Agenten {{.Usage.Agent.Writes}}</div>
|
|
{{else}}
|
|
<span class="marke">keine</span>
|
|
{{end}}
|
|
</td>
|
|
<td class="hilfe">{{if .Usage.LastUpdatedAt.IsZero}}—{{else}}{{datum .Usage.LastUpdatedAt}}{{end}}</td>
|
|
<td class="zahl">
|
|
{{if .Limit}}
|
|
{{.Frei}} / {{.Limit}}
|
|
<div class="hilfe">
|
|
{{if .EigenesLimit}}eigene Grenze{{else}}Standard{{end}} · je Stunde
|
|
</div>
|
|
{{else}}
|
|
<span class="hilfe">unbegrenzt</span>
|
|
{{end}}
|
|
</td>
|
|
<td class="schmal rechts">
|
|
<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="leer">
|
|
<p>Noch kein Projekt angelegt.</p>
|
|
<p class="hilfe">Ein Projekt ist die Einheit der Abschottung — meist eines je Team.</p>
|
|
</div>
|
|
{{end}}
|
|
|
|
<section class="abschnitt">
|
|
<h2>Neues Projekt</h2>
|
|
<span class="hilfe">Der Bezeichner erscheint in der URL und in der MCP-Konfiguration
|
|
und lässt sich später nicht mehr ändern.</span>
|
|
|
|
<div class="karte">
|
|
<form method="POST" action="/admin/projects/create" class="formular">
|
|
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
|
|
|
|
<div class="feld mittel">
|
|
<label for="name">Name</label>
|
|
<input type="text" id="name" name="name" required placeholder="z.B. Plattform-Team">
|
|
</div>
|
|
|
|
<div class="feld kurz">
|
|
<label for="slug">Bezeichner</label>
|
|
<span class="hilfe">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="feld lang">
|
|
<label for="description">Beschreibung</label>
|
|
<input type="text" id="description" name="description" placeholder="optional">
|
|
</div>
|
|
|
|
<div class="formular-aktionen">
|
|
<button type="submit">Projekt anlegen</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</section>
|
|
|
|
{{template "fuss" .}}
|