Über die Architect-RAG-Suche (ac_search_code_global) drei UX-Muster aus dem enconf-Schwesterprojekt (React/Ant Design) identifiziert und als reines CSS/HTML nachgebaut, da Deklarix bewusst kein SPA ist: - .table-responsive: Tabellen werden unter 640px zu einer Card-Liste statt horizontal zu scrollen (enconfs ProTable-Verhalten), via data-label-Attribut je <td>. Angewendet auf beide Werkzeugkatalog-Tabellen. - .page-header: Titel+Unterzeile links, primäre Aktion rechts, statt eines nackten <h1> mit Link irgendwo unten. - .stat-cards: Kennzahl-Kacheln mit farbigem Akzentrand (nur farbig bei Wert > 0) statt einfacher Text-Links, auf der Startseite.
129 lines
4.4 KiB
HTML
129 lines
4.4 KiB
HTML
{{define "mandant-werkzeuge"}}<!doctype html>
|
|
<html lang="de">
|
|
<head>{{template "head" .}}</head>
|
|
<body>
|
|
{{template "nav" .Nav}}
|
|
<div class="page">
|
|
<h1>Werkzeugkatalog</h1>
|
|
|
|
<div class="page-header">
|
|
<div>
|
|
<h2>Zentraler Katalog</h2>
|
|
<p class="hinweis">
|
|
Wird von der Plattform gepflegt. Ein gesperrtes Werkzeug bleibt im
|
|
zentralen Katalog unverändert — es wird nur für diesen Mandanten
|
|
aus der Werkzeugsuche ausgeblendet.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<form method="get" class="filter-bar">
|
|
<input type="search" name="q" value="{{.Filter.Suche}}" placeholder="Suche (Name, Anbieter, Land)">
|
|
<select name="zweck">
|
|
<option value="">Alle Zwecke</option>
|
|
{{$zweck := .Filter.Zweck}}
|
|
{{range .ZweckeOptionen}}
|
|
<option value="{{.}}" {{if eq . $zweck}}selected{{end}}>{{.}}</option>
|
|
{{end}}
|
|
</select>
|
|
<button type="submit">Filtern</button>
|
|
{{if .Filter.Aktiv}}<a href="/verwaltung/werkzeuge">Zurücksetzen</a>{{end}}
|
|
</form>
|
|
{{if not .Werkzeuge}}
|
|
<p class="hinweis">{{if .Filter.Aktiv}}Keine Treffer für diese Filter.{{else}}Der zentrale Katalog ist noch leer.{{end}}</p>
|
|
{{else}}
|
|
<div class="table-responsive">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th><th>Anbieter</th><th>Verarbeitungsländer</th><th>AVV</th>
|
|
<th>Training aus</th><th>Aufbewahrung</th><th>Geeignete Zwecke</th><th>Zuletzt geprüft</th><th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Werkzeuge}}
|
|
<tr>
|
|
<td data-label="Name">{{.Name}}</td>
|
|
<td data-label="Anbieter">{{.Anbieter}}</td>
|
|
<td data-label="Verarbeitungsländer">{{.Verarbeitungslaender}}</td>
|
|
<td data-label="AVV">{{if .AVVVerfuegbar}}ja{{else}}nein{{end}}</td>
|
|
<td data-label="Training aus">{{if .TrainingStandard}}ja{{else}}nein{{end}}</td>
|
|
<td data-label="Aufbewahrung">{{.Aufbewahrung}}</td>
|
|
<td data-label="Geeignete Zwecke">{{.GeeigneteZwecke}}</td>
|
|
<td data-label="Zuletzt geprüft">{{.LetztePruefung}} <span class="status {{.PruefStatusCSS}}">{{.PruefStatusLabel}}</span></td>
|
|
<td data-label="Status">
|
|
{{if .Gesperrt}}
|
|
<span class="status">gesperrt</span>
|
|
<form method="post" action="/verwaltung/werkzeuge/{{.ID}}/entsperren" style="display:inline">
|
|
<button type="submit">Entsperren</button>
|
|
</form>
|
|
{{else}}
|
|
<form method="post" action="/verwaltung/werkzeuge/{{.ID}}/sperren" style="display:inline">
|
|
<input type="text" name="grund" placeholder="Grund (optional)">
|
|
<button type="submit">Sperren</button>
|
|
</form>
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="pagination">
|
|
<span class="hinweis">Seite {{.Pagination.Page}} von {{.Pagination.TotalPages}} ({{.Pagination.Total}} Einträge)</span>
|
|
<span>
|
|
{{if .Pagination.HasPrev}}
|
|
<form method="get" style="display:inline">
|
|
<input type="hidden" name="q" value="{{.Filter.Suche}}">
|
|
<input type="hidden" name="zweck" value="{{.Filter.Zweck}}">
|
|
<input type="hidden" name="page" value="{{.Pagination.PrevPage}}">
|
|
<button type="submit">← Zurück</button>
|
|
</form>
|
|
{{end}}
|
|
{{if .Pagination.HasNext}}
|
|
<form method="get" style="display:inline">
|
|
<input type="hidden" name="q" value="{{.Filter.Suche}}">
|
|
<input type="hidden" name="zweck" value="{{.Filter.Zweck}}">
|
|
<input type="hidden" name="page" value="{{.Pagination.NextPage}}">
|
|
<button type="submit">Weiter →</button>
|
|
</form>
|
|
{{end}}
|
|
</span>
|
|
</div>
|
|
{{end}}
|
|
|
|
<div class="page-header">
|
|
<div>
|
|
<h2>Eigene Werkzeuge</h2>
|
|
<p class="hinweis">
|
|
Zusätzliche Katalogeinträge nur für diesen Mandanten — sichtbar nur
|
|
hier, nicht im zentralen Katalog der Plattform.
|
|
</p>
|
|
</div>
|
|
<a class="page-header-action" href="/verwaltung/werkzeuge/neu">Eigenes Werkzeug anlegen</a>
|
|
</div>
|
|
{{if not .EigeneWerkzeuge}}
|
|
<p class="hinweis">Noch keine eigenen Werkzeuge.</p>
|
|
{{else}}
|
|
<div class="table-responsive">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Name</th><th>Anbieter</th><th>Verarbeitungsländer</th><th>Zuletzt geprüft</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .EigeneWerkzeuge}}
|
|
<tr>
|
|
<td data-label="Name"><a href="/verwaltung/werkzeuge/{{.ID}}">{{.Name}}</a></td>
|
|
<td data-label="Anbieter">{{.Anbieter}}</td>
|
|
<td data-label="Verarbeitungsländer">{{.Verarbeitungslaender}}</td>
|
|
<td data-label="Zuletzt geprüft">{{.LetztePruefung}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</body>
|
|
</html>
|
|
{{end}}
|