Audit + Umbau: Faktenfehler behoben, Server-/Admin-Lücken geschlossen, 49 Screenshots, Schema-Matrix generiert
- Audit: plans/doku-audit.md (Befunde, Phasen P1-P9, Ausführungsprotokoll) + plans/audit/ (8 Detailreports) + plans/offene-issues.md - Werkzeuge: scripts/audit-docs.mjs (Links/Anker/Bilder/Tabellen), scripts/gen-schema-matrix.mjs (npm run gen:schemas) - Neue Seiten: projekt/feld-rechte, reference/rest-system, reference/schema-properties, projekt/tests, 5 Anwender-Seiten - Fehler behoben: EMBEDDING_BGE_M3_*-Env, allowSnapshots, MCP-Scopes (.read/.create/.update), meta.views, loadAll-Signatur, OpenAPI-Endpunkt, MongoDB 8, Befehlspalette - Screenshots: 9 Admin + 10 Anwender aus Mock-Projekt corporate (t1 entfernt), 49 Bilder gesamt - AGENTS.md: Sync-Behauptung richtiggestellt, Belegpflicht/UI-Namen/Screenshot-Regeln, Werkzeug-Abschnitt - Build: 71 Seiten grün, 0 tote Links, 0 kaputte Tabellen
This commit is contained in:
1 parent
1897bb50d9
commit
1928922e07
104 files changed
+4756
-1044
No files matched your search
@@ -3,7 +3,7 @@ title: 'Aktionen'
|
||||
description: 'Actions im Admin starten: Parameter ausfüllen, ausführen, Ausgabe und Fortschritt lesen.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Steps, Badge } from '@astrojs/starlight/components';
|
||||
|
||||
Du stößt im **tibi-admin** (Verwaltungs-Backend, Release Nova) eine **Action** an — z. B. Versand, Import oder Aufräum-Job. Du füllst Parameter aus, klickst Ausführen und liest das Ergebnis. Diese Seite beschreibt die Bedienung — das Schreiben von Actions steht unter [Jobs und Actions](/projekt/jobs-actions/).
|
||||
|
||||
@@ -26,7 +26,28 @@ Du stößt im **tibi-admin** (Verwaltungs-Backend, Release Nova) eine **Action**
|
||||
| Upload-Toast | Enthält die Eingabe Datei-Bytes, zeigt der Admin einen Byte-Fortschritt (`upload-progress`) |
|
||||
| Verlauf | Werkzeug-Menü (Schild-Icon) → Audit mit Filter `collection=_actions/<name>` |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Action-Ansicht mit Methoden-Reitern, Eingabeformular und Ausführen-Knopf. -->
|
||||
### Ausführung: `kind`, `cancellable`, Upload-Pfad
|
||||
|
||||
Jede Methode darf `execution` tragen (Schema: `action.schema.json:274-288`, eingebunden unter `methods.<name>.execution`):
|
||||
|
||||
```yaml title="Action-Config — execution-Meta"
|
||||
meta:
|
||||
methods:
|
||||
post:
|
||||
execution:
|
||||
kind: "long-running" # freier String, nur Doku-Charakter
|
||||
cancellable: true # geplant, vom Admin aktuell nicht ausgewertet
|
||||
```
|
||||
|
||||
| Feld | Stand im Admin (Release Nova) |
|
||||
|---|---|
|
||||
| `execution.kind` | Freier String — der Admin wertet ihn **nicht** aus (kein kind-spezifischer Runner; `ActionView.svelte` kennt nur ausführbar vs. gesperrt) |
|
||||
| `execution.cancellable` | Schema-seitig vorgesehen, im Frontend **ohne Verwendung** (kein Abbruch-Knopf; `grep` über `frontend/src` findet keine Auswertung) — lang laufende Actions brechen nur über SSE-Ende oder Netzwerkfehler ab |
|
||||
| Upload-Fortschritt | Enthält `data` Datei-Bytes (`hasInlineUploadPayload`), erzeugt `runAction` einen Byte-Toast (`createByteProgressToast`, `ActionView.svelte:350-357`) und füttert ihn per `onUploadProgress` (`ActionView.svelte:377`) — Erfolgs-Toast erst nach Server-Antwort |
|
||||
|
||||
<Aside type="note">Fortschritt während der Ausführung kommt ausschließlich aus SSE-Events plus `output.mapping.progress` (siehe Reiter oben) — `execution` steuert daran nichts.</Aside>
|
||||
|
||||

|
||||
|
||||
## Parameter
|
||||
|
||||
@@ -47,13 +68,13 @@ Das Formular (`ActionMethodScaffold.svelte`) trennt zwei Blöcke:
|
||||
## Ausgabe und Fortschritt
|
||||
|
||||
<Tabs>
|
||||
<TabItem label="Kurfassung und Details">
|
||||
<TabItem label="Zusammenfassung und Details">
|
||||
|
||||
`ActionOutputMapping.svelte` zeigt gemappte Felder statt Roh-JSON:
|
||||
|
||||
- **Kurzfassung** (`output.mapping.summary.fields`) — immer sichtbar, Werte per `source`-Pfad aus dem Ergebnis gelesen (`deepGet`, z. B. `totals.grandTotal`).
|
||||
- **Zusammenfassung** (`output.mapping.summary.fields`, UI-String `outputSummary`) — immer sichtbar, Werte per `source`-Pfad aus dem Ergebnis gelesen (`deepGet`, z. B. `totals.grandTotal`).
|
||||
- **Details** (`output.mapping.details.fields`) — aufklappbar, als Widgets gerendert.
|
||||
- Ohne Mapping zeigt der Admin das Ergebnis als formatiertes JSON; kennt die Methode nur einen Titel ohne Felder, steht dort „keine Ausgabefelder“.
|
||||
- Ohne Mapping zeigt der Admin das Ergebnis als formatiertes JSON; kennt die Methode nur einen Titel ohne Felder, steht dort „Fuer diese Aktion sind keine Ergebnisfelder konfiguriert.“ (`admin.actions.noOutputFields`).
|
||||
|
||||
</TabItem>
|
||||
<TabItem label="Fortschritt (SSE)">
|
||||
@@ -88,4 +109,6 @@ Formular (query + data) → Ausführen → [SSE-Events → Balken] → Ergebnis
|
||||
|
||||
Klick-Abläufe dazu stehen im Test-Plan `docs/test-plans/40-actions.md` (Methoden-Tabs, ausführbar vs. gesperrt, Ergebnis und Fortschritt).
|
||||
|
||||
Verifiziert am 2b091d899590b392491c59a54f50de43f1057280 2026-10-16 (tibi-admin-nova)
|
||||
Anwender-Sicht zum Starten einer Aktion: [Aktionen ausführen](/anwender/aktionen/).
|
||||
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova); `execution`-Abschnitt verifiziert am 4c55f82 (tibi-types: action.schema.json:274-288, 401-403), am 2b091d8 (ActionView.svelte:260-295, 350-382)
|
||||
@@ -3,7 +3,7 @@ title: 'Ansichten und Listen'
|
||||
description: 'Tabellen-, Karten-, Medien- und Navigations-Ansichten, Suche, Sortierung, Filter, Blättern.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Badge } from '@astrojs/starlight/components';
|
||||
|
||||
Du öffnest eine Sammlung im **tibi-admin** (Verwaltungs-Backend, Release Nova) und siehst eine Liste aller Einträge. Suche, Sortierung, Filter und Blättern funktionieren in allen Ansichten gleich. Diese Seite beschreibt die Bedienung aus Redakteurs- und Projekt-Sicht — Konzept und Einordnung stehen unter [Admin-Konzept](/admin/konzept/).
|
||||
|
||||
@@ -100,6 +100,8 @@ Teile eine gefilterte Liste per URL — Empfänger sehen exakt dieselbe Auswahl,
|
||||
| Gesamtzahl fehlt oder lädt lange | `/_count` auf altem Server nicht verfügbar | Direkt laden lassen (Fallback) oder Server aktualisieren |
|
||||
| Ansicht startet „falsch“ | `viewHint` der Sammlung schlägt die Startansicht vor | Ansicht einmal wechseln — `view=…` in der URL gewinnt |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Listenansicht mit Suchfeld, Filter-Popover und Paginierung, Alt-Text deutsch, max. 200 KB unter src/assets/. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d89 2026-10-13 (tibi-admin-nova)
|
||||
Anwender-Sicht zum Ändern vieler Einträge auf einmal: [Massenbearbeitung](/anwender/massenbearbeitung/).
|
||||
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova)
|
||||
@@ -3,7 +3,7 @@ title: 'Benutzer, Teams, Tokens'
|
||||
description: 'Anmelden, Personen, Teams und Orgs verwalten, Rollen und Berechtigungen, PATs, Stellvertretung.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Steps, Badge } from '@astrojs/starlight/components';
|
||||
|
||||
Du verwaltest im **tibi-admin** (Verwaltungs-Backend, Release Nova), wer sich anmelden und was jede Person darf: Benutzerkonten, Teams, Organisationen, Rollen, persönliche Token (PATs) und die Stellvertretung. Server-Regeln dazu stehen unter [Rechte und Tokens](/projekt/rechte-tokens/), die vier HTTP-Köpfe unter [Token-Köpfe](/reference/token-koepfe/).
|
||||
|
||||
@@ -54,7 +54,7 @@ Die Kette lautet **Org → Team → Benutzer → Projekt**. Du pflegst sie im Ad
|
||||
| Benutzer | `role: 1` | Zugriff nur über Org-/Team-Mitgliedschaft, neutrales Badge |
|
||||
|
||||
- Die Rolle stellst du per Auswahl um (mit Admin-Warnung); im Nur-Lesen-Modus zeigt der Admin nur das Badge.
|
||||
- Feinrechte vergibst du als **Chips** (`PermissionChipsInput.svelte`): Eintippen, Vorschlag anklicken oder Entfernen per ×. Vorschläge kommen aus der Projekt-Meta (`project-meta`) oder als Team-Rückfall (`team-fallback`); Platzhalter-Beispiel: `pages, media`.
|
||||
- Feinrechte vergibst du als **Chips** (`PermissionChipsInput.svelte`): Eintippen, Vorschlag anklicken oder per × entfernen. Die Vorschläge gruppiert der Admin nach Herkunft — aus der Projekt-Meta (`project-meta`) oder als Team-Rückfall (`team-fallback`); das Eingabefeld zeigt als Beispiel `pages, media`.
|
||||
|
||||
## Tokens
|
||||
|
||||
@@ -78,6 +78,32 @@ Persönliche Token (PATs) pflegst du auf zwei Wegen: im eigenen **Profil** (`Tok
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Projekt-Admin-Token
|
||||
|
||||
Der Admin ruft Reload, Suchindex-Aufbau, Backup und Snapshots mit einem **Projekt-Token** auf.
|
||||
Welche dieser vier Operationen das Token darf, steuern vier Flags in `api/config.yml` (`admin.tokens[]`):
|
||||
|
||||
| Flag | Erlaubt | Wofür im Admin |
|
||||
|---|---|---|
|
||||
| `allowReload` | Projekt neu laden | Nach Config-Änderungen |
|
||||
| `allowRegenerateSearch` | Suchindex neu aufbauen | Nach Index-Problemen (siehe [Suche](/projekt/suche/)) |
|
||||
| `allowBackup` | Backup herunterladen und wiederherstellen | Sicherung (siehe [Audit und Backup](/projekt/audit-backup/)) |
|
||||
| `allowSnapshots` | Snapshots auslösen, listen, löschen, wiederherstellen, herunterladen | Versionierte Sicherung (siehe [Audit und Backup](/projekt/audit-backup/)) |
|
||||
|
||||
Schema: `tibi-types/schemas/config/project.schema.json:227-261` (alle vier optional, nur `token` ist Pflicht); Server-Modell: `tibi-server/internal/models/project.go:116-120`.
|
||||
|
||||
```yaml title="api/config.yml — Projekt-Admin-Token mit allen Rechten"
|
||||
admin:
|
||||
tokens:
|
||||
- token: "REDACTED_CREDENTIALS"
|
||||
allowReload: true
|
||||
allowRegenerateSearch: true
|
||||
allowBackup: true
|
||||
allowSnapshots: true
|
||||
```
|
||||
|
||||
<Aside type="caution">Fehlt ein Flag, scheitert die Operation serverseitig — der Admin zeigt dann einen Rechte-Fehler. Vergib nur, was das Projekt wirklich braucht.</Aside>
|
||||
|
||||
## Stellvertretung (Impersonation)
|
||||
|
||||
Admins können sich als ein Benutzerkonto anmelden, um dessen Sicht zu prüfen:
|
||||
@@ -100,8 +126,8 @@ Admins können sich als ein Benutzerkonto anmelden, um dessen Sicht zu prüfen:
|
||||
| Token-Bereich leer | Server ohne Token-Feature (`404`) | Normal — kein Fehler, Bereich bleibt verborgen |
|
||||
| `permission denied` | Kopf oder Recht falsch | [Token-Köpfe](/reference/token-koepfe/) und Chips prüfen |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Hub mit Benutzerliste und Detail-Drawer inkl. Rollen-Badge und Chips. -->
|
||||

|
||||
|
||||
Klick-Abläufe zur Stellvertretung stehen im Test-Plan `docs/test-plans/42-impersonation.md` (Auslöser, Bestätigungsdialog, Banner, Rückkehr zur Admin-Sitzung — nur im Mock-Modus testen).
|
||||
|
||||
Verifiziert am 2b091d899590b392491c59a54f50de43f1057280 2026-10-16 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova); Projekt-Admin-Token verifiziert am 4c55f82 (tibi-types: project.schema.json:227-261), am 68b4278 (tibi-server: models/project.go:116-120)
|
||||
@@ -3,7 +3,7 @@ title: 'Admin anpassen'
|
||||
description: 'Sammlungen, Ansichten, Widgets, Fremdschlüssel, Vorschau, Aktionen, Suche und eigene Exporte im Admin.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
|
||||
Du passt das **tibi-admin** (Verwaltungs-Backend, Release Nova) an dein Projekt an: Was Listen zeigen, welche Eingabeelemente Formulare nutzen, wie Datensätze verknüpft und gesucht werden. Das meiste steuerst du über die Sammlungs-Config — Schema-Details stehen unter [Sammlungen anlegen](/projekt/sammlungen-anlegen/) und [Felder und Widgets](/projekt/felder-widgets/).
|
||||
|
||||
@@ -11,26 +11,15 @@ Du passt das **tibi-admin** (Verwaltungs-Backend, Release Nova) an dein Projekt
|
||||
|
||||
| Mittel | Wirkung |
|
||||
|---|---|
|
||||
| `meta.views` (Tabelle, Karten, Kalender …) | Welche [Ansichten](/admin/ansichten-listen/) die Sammlung anbietet |
|
||||
| `meta.viewHint` (Tabelle, Karten, Medien, Navigation) | Startansicht der [Ansichten](/admin/ansichten-listen/) für die Sammlung |
|
||||
| `meta.subNavigation` (Reiter-Filter) | Filter-Reiter über der Liste (z. B. nach Status oder Gruppe) |
|
||||
| Sichtbare Spalten | Per Checkbox im Listen-Kopf; [Exporte](/admin/exporte/) übernehmen sie als Vorauswahl |
|
||||
| URL-Parameter | Ansicht ist teilbar: `?view=cards&q=hero&qm=combined&sort=name&order=asc&page=2&size=25` — `qm` ist der Suchmodus aus dem `search`-Block |
|
||||
| Sortierung | Klick auf Spaltenkopf; manuelle Reihenfolge per Drag, wo freigegeben |
|
||||
|
||||
## Widgets und Felder
|
||||
|
||||
Der `WidgetDispatcher` wählt das Eingabeelement: zuerst `meta.widget`, sonst der Feldtyp. Alle **25 Schema-Enum-Werte** kommen vor (`pagebuilder` und `pageBuilder` meinen dasselbe):
|
||||
|
||||
| Gruppe | Widgets |
|
||||
|---|---|
|
||||
| Text | `text`, `textarea`, `richtext`, `html`, `json` |
|
||||
| Zahl/Auswahl | `number`, `checkbox`, `switch`, `select`, `selectArray`, `chipArray`, `color` |
|
||||
| Datum | `date`, `datetime` |
|
||||
| Dateien | `file`, `image`, `foreignFile`, `foreignMedia` |
|
||||
| Verknüpfung | `foreignKey`, `foreignKeyChipArray` |
|
||||
| Struktur | `pagebuilder`/`pageBuilder`, `templateProps`, `containerLessObject`, `containerLessObjectArray` |
|
||||
|
||||
- Pflicht, Formate und `dependsOn`-Sichtbarkeit kommen aus dem Feld-Schema — Bedienung siehe [Eintrags-Editor](/admin/eintrags-editor/).
|
||||
- Mehrsprachige Felder bekommen automatisch Sprachtabs (`I18nLanguageTabs`).
|
||||
Der `WidgetDispatcher` wählt das Eingabeelement: zuerst `meta.widget`, sonst der Feldtyp (`pagebuilder` und `pageBuilder` meinen dasselbe). Die vollständige Liste aller Schema-Widgets mit Beispielen steht unter [Felder und Widgets](/projekt/felder-widgets/) — hier nur die Bedienung: Pflicht, Formate und `dependsOn`-Sichtbarkeit kommen aus dem Feld-Schema (siehe [Eintrags-Editor](/admin/eintrags-editor/)), mehrsprachige Felder bekommen automatisch Sprachtabs (`I18nLanguageTabs`).
|
||||
|
||||
## Fremdschlüssel und Vorschau
|
||||
|
||||
@@ -84,6 +73,6 @@ Volle Kontext-Tabelle in der Repo-Doku `custom-export-script.md`; Bedienung unte
|
||||
|
||||
<Aside type="caution">Anpassungen an Sammlungs-Config und Skripten erst im lokalen Stack ([einrichten](/admin/setup/)) testen — falsche `meta`-Einträge blenden Ansichten oder Export-Reiter ersatzlos aus.</Aside>
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): angepasste Listenansicht mit Spaltenwahl und eigenem Export-Reiter. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d899590b392491c59a54f50de43f1057280 2026-10-16 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova); Widerspruchsprüfung am 2026-10-17: veraltete `meta.views`-Zeile parallel zu `meta.viewHint` korrigiert, kein Custom-Views-Widerspruch mehr.
|
||||
@@ -3,7 +3,7 @@ title: 'Eintrags-Editor'
|
||||
description: 'Felder ausfüllen, Widgets, Fremdschlüssel, i18n-Tabs, Verlauf, Tastaturkürzel.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Steps } from '@astrojs/starlight/components';
|
||||
|
||||
Du öffnest einen Eintrag aus einer [Liste](/admin/ansichten-listen/) und bearbeitest seine Felder im Editor des **tibi-admin** (Verwaltungs-Backend, Release Nova). Links liegt das Formular, rechts die Seitenleiste mit Aktionen und Gruppen (`meta.position`: `main`, `sidebar:<gruppe>`, `sidebar:settings`). Diese Seite beschreibt die Bedienung — Feldtypen und Schema-Details stehen unter [Felder und Widgets](/projekt/felder-widgets/).
|
||||
|
||||
@@ -26,21 +26,7 @@ Du öffnest einen Eintrag aus einer [Liste](/admin/ansichten-listen/) und bearbe
|
||||
|
||||
## Widgets
|
||||
|
||||
Der `WidgetDispatcher` wählt das Eingabeelement aus `meta.widget` — sonst aus dem Feldtyp. Alle 25 Schema-Widgets aus [Felder und Widgets](/projekt/felder-widgets/) werden unterstützt (`text`, `textarea`, `number`, `checkbox`, `switch`, `select`, `selectArray`, `chipArray`, `date`, `datetime`, `file`, `image`, `json`, `richtext`, `html`, `foreignKey`, `foreignKeyChipArray`, `foreignFile`, `foreignMedia`, `pagebuilder`/`pageBuilder`, `templateProps`, `containerLessObject`, `containerLessObjectArray`, `color`).
|
||||
|
||||
| Eingabe | Widgets | Hinweis |
|
||||
|---|---|---|
|
||||
| Kurztext | `text` | Eine Zeile, Standard für `string` |
|
||||
| Langtext | `textarea`, `richtext`, `html` | Editor mit Werkzeugleiste bei `richtext` |
|
||||
| Zahl | `number` | Auch für `number[]` |
|
||||
| Ja/Nein | `checkbox`, `switch` | Reine Flags brauchen kein Widget |
|
||||
| Auswahl | `select`, `selectArray`, `chipArray` | Optionen aus `meta.choices` |
|
||||
| Datum | `date`, `datetime` | Zeitanteil nur bei `datetime` |
|
||||
| Datei/Bild | `file`, `image` | Vorschau plus [Bildeditor](/admin/medien/) |
|
||||
| Struktur | `json`, `templateProps`, `containerLessObject(-Array)` | Freies JSON ohne `subFields` |
|
||||
| Seite | `pagebuilder` | Blöcke mit Typ-Umschalter und `dependsOn`-Feldern |
|
||||
| Farbe | `color` | Farbwähler |
|
||||
| Verweis | `foreignKey`, `foreignKeyChipArray`, `foreignFile`, `foreignMedia` | Siehe unten |
|
||||
Der `WidgetDispatcher` wählt das Eingabeelement aus `meta.widget` — sonst aus dem Feldtyp. Welcher Widget-Name zu welchem Feldtyp gehört und was jeder Widget kann, steht vollständig unter [Felder und Widgets](/projekt/felder-widgets/). Zur Bedienung genügt: Kurztext trägst du in einer Zeile ein, Langtext im mehrzeiligen Feld (mit Werkzeugleiste bei `richtext`), Zahlen über Pfeile oder Eingabe, Ja/Nein über Schalter oder Kästchen, Datum und Uhrzeit im Kalenderfeld, Dateien und Bilder über Vorschau plus [Bildeditor](/admin/medien/), Verweise über den Auswahl-Dialog unten, Seiten über Blöcke mit Typ-Umschalter.
|
||||
|
||||
<Aside type="note">
|
||||
Felder mit `meta.dependsOn.eval` blendet der Editor per JavaScript ein oder aus (z. B. Block-Optionen nur beim passenden Blocktyp). `meta.hide: true` versteckt Technikfelder dauerhaft.
|
||||
@@ -74,6 +60,21 @@ Jede Sprache ist ein eigener Eintrag mit gleichem Gruppenschlüssel (`meta.i18n.
|
||||
|
||||
Sprachwechsel-Tastenkürzel: `Strg + L` (zyklisch durch die Inhaltssprachen).
|
||||
|
||||
## Verlauf im Editor
|
||||
|
||||
Über das Verlaufs-Symbol am Eintrag öffnest du die Audit-Historie (`AuditHistoryPanel`): Sie listet Zeitpunkt, Aktion (**erstellt**, **geändert**, **gelöscht**), **Benutzer** und **Quelle** — aufklappen zeigt den Unterschied **Vorher** gegen **Nachher** (`AuditDiff`: **hinzugefügt**, **entfernt**, **geändert**). Über **Wiederherstellen** wählst du im Dialog (`AuditRestoreDialog`) unter **Felder zur Wiederherstellung** aus, was übernommen wird (**Alle auswählen**, **Keine**, einzeln pro Feld, **Ganzes Array übernehmen** für ganze Listen); **Media-Dateien werden nicht wiederhergestellt**. Übernehmen trägt die Werte nur ins Formular ein — gespeichert wird erst mit **Speichern**. In der Seitenleiste zeigt `AuditSidebarHistory` denselben Verlauf als Ausschnitt mit **Ältere Einträge**. Schritt für Schritt aus Redakteurs-Sicht steht unter [Verlauf wiederherstellen](/anwender/verlauf-wiederherstellen/).
|
||||
|
||||
| Detail | Verhalten | Quelle |
|
||||
|---|---|---|
|
||||
| Blättern | **25 Einträge pro Seite** (`PAGE_SIZE`) | `AuditView.svelte:37,107-108,376` |
|
||||
| Aufklappen | Pfeil pro Zeile (`mdiChevronRight`/`mdiChevronDown`, `toggleExpand`) zeigt den Vorher/Nachher-Diff | `AuditHistoryPanel.svelte:75-76,158-162`, `AuditView.svelte:322` |
|
||||
| Kopieren | Kopieren-Schalter je Diff-Wert (`copyValue`, `navigator.clipboard`, Titel „Kopieren") | `AuditDiff.svelte:81-83,276,309` |
|
||||
| Zähler | Änderungsanzeige „sichtbar / gesamt" (`selection.size` / `diffs.length`) | `AuditDiff.svelte:168` |
|
||||
|
||||
## Pagebuilder-Ansicht
|
||||
|
||||
Seitenfelder (`pagebuilder`) rendert `PagebuilderWidget` als Stapel aus Block-Karten mit Block-Label und Farbpunkt. Ein Klick öffnet den Overlay-Editor (`PagebuilderOverlay`): links das Formular, rechts die Live-Vorschau, oben der Modus-Umschalter (**Nur Formular**, **Formular und Vorschau**, **Nur Vorschau**) und **OK** (oder `Esc`) zum Schließen. Das Übersichts-Overlay (`PagebuilderOverviewOverlay`, Knopf **Pagebuilder-Overlay öffnen**) listet alle Blöcke als Blueprint-Karten (`BlueprintCard`: Typ, Bilder, Kind-Elemente, weitere Felder) zum Anspringen und Umsortieren. Unter der Vorschau steuert `PagebuilderViewportControl` die simulierte Breite: **Desktop** (1280), **Tablet** (768), **Mobil** (375), per Slider frei von 320 bis 1920 px. Blöcke anlegen und füllen steht unter [Seiten bauen](/anwender/seiten-bauen/).
|
||||
|
||||
## Tastatur
|
||||
|
||||
| Kürzel | Wirkung |
|
||||
@@ -88,7 +89,7 @@ Sprachwechsel-Tastenkürzel: `Strg + L` (zyklisch durch die Inhaltssprachen).
|
||||
| `?` | Tastaturhilfe öffnen |
|
||||
|
||||
<Aside type="tip">
|
||||
Drücke `?` im Editor — die Hilfe listet alle Kürzel inklusive Listen-Kürzel (`s`, `f`, `x`, `o`, `v`, `p` + Ziffer).
|
||||
Drücke `?` im Editor — die Hilfe listet alle Kürzel inklusive Listen-Kürzel (`s`, `f`, `x`, `o`, `v`, `p` + Ziffer). Die vollständige Referenz aller Kürzel steht unter [Tastatur-Kurzbefehle](/reference/tastatur-kurzbefehle/).
|
||||
</Aside>
|
||||
|
||||
## Häufige Fehler
|
||||
@@ -100,6 +101,6 @@ Drücke `?` im Editor — die Hilfe listet alle Kürzel inklusive Listen-Kürzel
|
||||
| Übersetzung fehlt in der Leiste | Kein Gruppenschlüssel oder Sprache nicht konfiguriert | `translationKey`/`lang` prüfen, fehlende Sprache per `+` anlegen |
|
||||
| Änderung „verschwunden“ | Drawer geschlossen ohne Speichern | Auf Änderungs-Warnung achten, erst Drawer-, dann Haupt-Speichern |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Editor mit Formular, Seitenleiste und Übersetzungsleiste, Alt-Text deutsch, max. 200 KB unter src/assets/. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d89 2026-10-13 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova)
|
||||
@@ -3,7 +3,7 @@ title: 'Exporte'
|
||||
description: 'CSV, XLSX, JSON aus Listen, vordefinierte und eigene Skript-Exporte.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge } from '@astrojs/starlight/components';
|
||||
import { Aside, Steps } from '@astrojs/starlight/components';
|
||||
|
||||
Du exportierst Einträge einer Sammlung im **tibi-admin** (Verwaltungs-Backend, Release Nova) direkt aus der [Liste](/admin/ansichten-listen/): als Datei für Tabellenkalkulation, Datenaustausch oder eigene Berichte. Exportiert wird, was du siehst — Filter und Suche der Liste gelten auch für den Export.
|
||||
|
||||
@@ -41,13 +41,36 @@ Stehen im Export-Dialog eigene Reiter **vor** dem Standard-Tab, hat das Projekt
|
||||
exports:
|
||||
- name: bestellreport
|
||||
label: { de: "Bestellreport", en: "Order report" }
|
||||
file: "_/assets/exports/reports.mjs"
|
||||
file: "_/exports/reports.mjs"
|
||||
filename: "bestellreport-{date}.xlsx"
|
||||
```
|
||||
|
||||
## Eigenes Skript
|
||||
|
||||
Projekt-Entwickler legen eigene Exporte als ES-Modul unter `meta.exports[].file` ab (Pfad mit `_/`-Präfix = projekt-relativ, empfohlen). Das Modul exportiert **eine Standard-Funktion**, die Kontext (Filter, Auswahl, Fortschritt) bekommt und genau ein Ergebnis zurückgibt:
|
||||
Projekt-Entwickler legen eigene Exporte als ES-Modul unter `meta.exports[].file` ab (Pfad mit `_/…`-Präfix = projekt-relativ, empfohlen; daneben `/_/…`-Alias, `/…` host-absolut, `https://…`, `data:`, `blob:` und `{ eval }` — gleiche Regeln wie bei der [Block-Registry](/projekt/pagebuilder-dev/)). Das Modul exportiert **eine** Standard-Funktion, die `ctx` bekommt und genau ein Ergebnis zurückgibt.
|
||||
|
||||
### `ctx` vollständig
|
||||
|
||||
Quelle: `frontend/src/lib/utils/custom-export.types.ts:72-102` (einzige Typ-Wahrheit).
|
||||
|
||||
| Feld | Inhalt |
|
||||
|---|---|
|
||||
| `api`, `project`, `collection` | Config-Kopien in GetMap-Form (lesen ja, ändern sinnlos) |
|
||||
| `namespace`, `$project`, `$namespace`, `$method ("export")`, `context` (selbst) | Wie Server-Hook-`jsData` — **kein `$auth`** (läuft als eingeloggte Admin-Sitzung, Server prüft Rechte) |
|
||||
| `export`, `exportName` | Eigene `meta.exports`-Zeile bzw. deren `name` (ein Modul bedient N Exporte) |
|
||||
| `view` | Listenzustand: `search`, `searchMode`, `sortField`, `sortOrder`, `manualSort`, `fieldFilters`, `subNavFilter`, `filter` (gemischt) |
|
||||
| `db.find(coll, opts)` | `{ filter, select, selector, sort, offset, limit, lookup }` — `select` exklusiv mit `selector` (nur `1`-Werte, `0` → Fehler); **nur `sort[0]`** wird genutzt (REST-Grenze); kein `projection` |
|
||||
| `db.count(coll, { filter })` | Trefferzahl für Fortschritt und Batch-Planung |
|
||||
| `db.loadAll(coll, opts, onProgress?)` | Zählt, lädt in 500er-Paketen (Retry-once pro Batch, Abbruch per `signal`), meldet pro Batch |
|
||||
| `xlsx` | Gebündelte `xlsx-js-style`-Lib — kein Eigen-Import nötig |
|
||||
| `helpers` | `deepGet`, `formatValue`, `csvCell` (Formel-Injektionsschutz: führende `=+-@` → `'…'`), `csvWithBom` (UTF-8-BOM für Excel-Umlaute) |
|
||||
| `lang`, `languageCodes`, `defaultLanguage` | i18n |
|
||||
| `progress(done, total, label?)` | Schreibt auf die Dialog-Fortschrittsleiste |
|
||||
| `signal` | `AbortSignal` des Abbrechen-Knopfs (`fetch` wirft `AbortError`) |
|
||||
|
||||
Nur lesend: kein `create`/`update`/`delete` über `db`.
|
||||
|
||||
### Rückgabe und Grenzen
|
||||
|
||||
| Rückgabe | Inhalt |
|
||||
|---|---|
|
||||
@@ -56,19 +79,23 @@ Projekt-Entwickler legen eigene Exporte als ES-Modul unter `meta.exports[].file`
|
||||
| `text` | Text wie CSV oder HTML |
|
||||
| `bytes` | Binärdaten wie PDF (`Uint8Array`/`ArrayBuffer`) |
|
||||
|
||||
Dazu Pflicht: `filename` und `contentType` (z. B. `text/csv`, `application/pdf`) — ohne `contentType` wirft der Admin einen Fehler. Genau ein Payload pro Ergebnis.
|
||||
Dazu Pflicht: `filename` und `contentType` (z. B. `text/csv`, `application/pdf`) — ohne `contentType` wirft der Admin einen Fehler. Genau ein Payload pro Ergebnis. Dateinamen werden sanitiert (`/:*?"<>|` → `_`, `{date}` → `YYYY-MM-DD`; `custom-export-result.ts:14-18`).
|
||||
|
||||
```js title="reports.mjs (vereinfacht)"
|
||||
// reports.mjs — stark vereinfacht
|
||||
```js title="reports.mjs — lauffähiges Minimalbeispiel (CSV)"
|
||||
// _/exports/reports.mjs
|
||||
export default async function (ctx) {
|
||||
const rows = await ctx.db.loadAll({ filter: ctx.filter });
|
||||
ctx.progress(1, 1, "Fertig");
|
||||
const wb = ctx.xlsx.utils.json_to_sheet(rows);
|
||||
return { workbook: { SheetNames: ["Report"], Sheets: { Report: wb } }, filename: "bestellreport-{date}.xlsx", contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" };
|
||||
const rows = await ctx.db.loadAll(
|
||||
"orders",
|
||||
{ select: ["orderNo", "total"], filter: ctx.view.filter, sort: [`-${ctx.view.sortField || "orderNo"}`] },
|
||||
(done, total) => ctx.progress(done, total, "Lade Bestellungen …")
|
||||
);
|
||||
const lines = [["orderNo", "total"], ...rows.map((r) => [r.orderNo, r.total ?? ""])];
|
||||
const csv = lines.map((cols) => cols.map((c) => ctx.helpers.csvCell(c)).join(";")).join("\n");
|
||||
return { text: ctx.helpers.csvWithBom(csv), filename: "bestellreport-{date}.csv", contentType: "text/csv;charset=utf-8" };
|
||||
}
|
||||
```
|
||||
|
||||
Details für Entwickler (Kontext-Felder, Dateinamen-Platzhalter, Sanitizing) stehen in der Admin-Repo-Doku `custom-export-script.md` — im Zweifel gilt der Code (`utils/load-custom-export.ts`, `utils/custom-export-context.ts`, `utils/export.ts`).
|
||||
Details für Entwickler (Styling per `cell.s`, Spaltenbreiten, Autofilter) stehen in der Admin-Repo-Doku `custom-export-script.md` — im Zweifel gilt der Code (`utils/load-custom-export.ts`, `utils/custom-export-context.ts`, `utils/export.ts`).
|
||||
|
||||
## Häufige Fehler
|
||||
|
||||
@@ -80,6 +107,6 @@ Details für Entwickler (Kontext-Felder, Dateinamen-Platzhalter, Sanitizing) ste
|
||||
| Skript-Fehler im Dialog | Modul ohne Standard-Export oder Laufzeitfehler | Browser-Konsole lesen, Modul-Export und Rückgabeformat prüfen |
|
||||
| Leere Datei trotz Treffern | Leserecht auf Zielfelder fehlt | Rechte unter [Rechte und Tokens](/projekt/rechte-tokens/) klären |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Export-Dialog mit Formatwahl und Spaltenliste, Alt-Text deutsch, max. 200 KB unter src/assets/. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d89 2026-10-13 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova); `ctx`-Tabelle und Beispiel verifiziert am 2b091d8 (custom-export.types.ts:17-102, custom-export-script.md, custom-export-result.ts:14-18)
|
||||
@@ -3,7 +3,7 @@ title: 'KI-Funktionen'
|
||||
description: 'Chat, Zusammenfassen, Stimme und Werkzeuge im Admin: was die KI kann und wo ihre Grenzen liegen.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Steps } from '@astrojs/starlight/components';
|
||||
|
||||
Die KI im **tibi-admin** (Verwaltungs-Backend, Release Nova) hilft dir beim Redigieren: Sie chattet im Kontext der aktuellen Ansicht, fasst lange Verläufe zusammen, hört zu (STT) und liest vor (TTS). **Wichtig vorab: Im Frontend wählst du kein Modell** — alle Modellentscheidungen trifft der Proxy (`config/ai-proxy.config.json`); das Frontend ruft nur Endpunkte aus `frontend/assets/system.config.json` auf.
|
||||
|
||||
@@ -27,7 +27,14 @@ Was die KI dabei sieht (`aiController.ts`, `AiChat.svelte`): Neben dem UI-Snapsh
|
||||
| Werkzeug-Definitionen | `lib/aiTools.ts` | Funktionsaufrufe für den Chat (nächster Abschnitt) |
|
||||
| Schätzung | `lib/aiTokenEstimator.ts` | Heuristik ~4 Zeichen ≈ 1 Token, nur für Vorab-Entscheidungen |
|
||||
|
||||
**„Token-Status“** (Knopf im Chat, `showTokenStatus`): Das Popover zeigt **„Kontext-Auslastung“** (Prozent mit Farbstufe: grün < 40 %, gelb < 70 %, orange < 85 %, rot darüber — `getContextStatus`), **„Letzter Turn“** (**„Prompt-Tokens“**, **„Completion-Tokens“**, **„Gesamt-Tokens“**, **„Geschätzte Kosten“**), **„Konversation gesamt“** (inkl. Zusammenfassungs-, Spracheingabe- und Sprachausgabe-Kosten) sowie **„Modell“** und **„Kontextfenster“**. Gezählt wird zweigleisig: Die Schätzung (`estimateTokens`, `estimateSystemOverhead`) steuert Vorab-Entscheidungen, die echten Zähler kommen aus der Stream-Antwort (`stream_options`) und landen in **„Geschätzte Kosten“** über die Anzeigetabelle `TEXT_TOKEN_PRICING` — reine Anzeige, keine Abrechnung.
|
||||
**„Token-Status“** (Knopf im Chat) öffnet ein Popover: Oben steht die **„Kontext-Auslastung“** in Prozent mit Farbstufe, darunter **„Letzter Turn“** (**„Prompt-Tokens“**, **„Completion-Tokens“**, **„Gesamt-Tokens“**, **„Geschätzte Kosten“**), **„Konversation gesamt“** (inkl. Zusammenfassungs-, Spracheingabe- und Sprachausgabe-Kosten) sowie **„Modell“** und **„Kontextfenster“**. Gezählt wird zweigleisig: Die Schätzung steuert Vorab-Entscheidungen, die echten Zähler kommen aus der Stream-Antwort und landen in **„Geschätzte Kosten“** über die Anzeigetabelle `TEXT_TOKEN_PRICING` — reine Anzeige, keine Abrechnung.
|
||||
|
||||
| Schwelle | Farbe | Bedeutung |
|
||||
|---|---|---|
|
||||
| unter 40 % | Grün | Reichlich Platz — normal weiterarbeiten |
|
||||
| 40 bis unter 70 % | Gelb | Füllstand im Blick behalten |
|
||||
| 70 bis unter 85 % | Orange | Bald zusammenfassen oder neuen Chat starten |
|
||||
| ab 85 % | Rot | Kritisch — Zusammenfassen oder hartes Kürzen steht an |
|
||||
|
||||
Das **„Kontextfenster“** liest der Chat aus dem Modellkatalog (Endpunkt `/api/ai/models`, `configured.chat.contextWindow`); antwortet der Katalog nicht, gelten 96 000 Token (`MODEL_CONTEXT_WINDOW`). Aktuell meldet der Proxy 262 144 (siehe `config/ai-proxy.config.json`, `chat.contextWindow`).
|
||||
|
||||
@@ -41,7 +48,7 @@ Wächst ein Gespräch Richtung Kontextgrenze, komprimiert `lib/aiSummarizer.ts`
|
||||
|---|---|---|
|
||||
| Verdichten (kostenlos, synchron) | Mehr als 12 Werkzeug-Aktivitäten | `condenseHistoricalToolMessages`: abgeschlossene alte Werkzeug-Gruppen werden zu je einer Historie-Notiz (`[HISTORY-CONDENSED: …]`, Rolle `user`), die neuesten 12 Aktivitäten bleiben roh |
|
||||
| Zusammenfassen per LLM | 60 % des Fensters (`SUMMARIZE_THRESHOLD`) | Ältere Nachrichten per LLM zusammenfassen, neueste ~6 Nachrichten (max. ~8 000 Token) roh behalten |
|
||||
| 85 % (`HARD_TRUNCATE_THRESHOLD`) | Hart kürzen: älteste Nachrichten verwerfen |
|
||||
| Hart kürzen | 85 % (`HARD_TRUNCATE_THRESHOLD`) | Älteste Nachrichten verwerfen |
|
||||
|
||||
- Reserviert sind 10 000 Token für System-Prompt, Werkzeug-Definitionen und Antwort (`RESERVED_TOKENS`).
|
||||
- Zusammenfassungs-Modell: `proxy-managed` — auch hier entscheidet der Proxy, nicht das Frontend. Der Aufruf geht an den Zusammenfassungs-Endpunkt mit Profil `summarizer` und liest einen SSE-Strom (inkl. Zähler); Antwort leer oder Netzfehler → Rückfall auf hartes Kürzen.
|
||||
@@ -88,7 +95,7 @@ Die KI ruft UI-Werkzeuge statt zu raten (`aiTools.ts` → `aiController.ts`). La
|
||||
|---|---|
|
||||
| Navigation | `navigate` (**„Navigieren“**), `guide_to` (**„Geführte Tour“**), `list_projects` (**„Projekte auflisten“**), `select_project` (**„Projekt öffnen“**), `select_collection` (**„Collection öffnen“**) |
|
||||
| Liste | `search` (**„Suchen“**), `set_search_mode` (**„Suchmodus wechseln“**), `set_filter` (**„Filter setzen“**), `clear_filters` (**„Filter löschen“**), `sort_by` (**„Sortieren“**), `set_page` (**„Seite wechseln“**), `set_page_size` (**„Seitengröße ändern“**) |
|
||||
| Auswahl | `select_records` (**„Datensätze auswählen“**), `select_all` (**„Alle auswählen“**), `deselect_all` (**„Auswahl aufheben“**), `open_collection_record` (Datensatz öffnen), `set_view_mode` (**„Ansicht wechseln“**) |
|
||||
| Auswahl | `select_records` (**„Datensätze auswählen“**), `select_all` (**„Alle auswählen“**), `deselect_all` (**„Auswahl aufheben“**), `open_collection_record` (öffnet den Datensatz, Tool-Name als Anzeige), `set_view_mode` (**„Ansicht wechseln“**) |
|
||||
| Stapel | `open_bulk_edit` (**„Massenbearbeitung“**), `prepare_bulk_delete` (**„Löschung vorbereiten“**) |
|
||||
| Eintrag & Formular | `get_entry_context` (**„Eintrag-Kontext abrufen“**), `fill_field` (**„Feld ausfüllen“**), `fill_form` (**„Formular ausfüllen“**), `focus_field` (**„Feld fokussieren“**), `save_entry` (**„Eintrag speichern“**), `cancel_entry` (**„Bearbeitung abbrechen“**), `create_entry` (**„Neuen Eintrag anlegen“**), `duplicate_entry` (**„Eintrag duplizieren“**) |
|
||||
| Array-Felder | `add_array_item` (**„Array-Element hinzufügen“**), `remove_array_item` (**„Array-Element entfernen“**), `duplicate_array_item` (**„Array-Element duplizieren“**), `reorder_array_items` (**„Array-Elemente sortieren“**), `clear_array` (**„Array leeren“**) |
|
||||
@@ -129,6 +136,6 @@ Wichtig zur Einordnung: Der Admin-Chat läuft über den Proxy (`/api/ai/chat`, `
|
||||
| **„Transkription fehlgeschlagen: {error}“** | Rate-Limit, Netz oder Proxy-Fehler | Kürzeren Abschnitt sprechen, erneut versuchen |
|
||||
| Stimme klingt falsch | Andere Stimme aktiv | Stimme in den KI-Einstellungen zurück auf `eva-de` setzen |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): geöffneter KI-Chat mit Werkzeugstatus und Mikro-Knopf. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d89 2026-10-16 (tibi-admin-nova: AiChat/AiButton/AiConversationList/AiToolStatus/AiToolInspector/AiDebugContext, aiChatHistory/aiController/aiTools/aiTokenEstimator/aiVoiceInput/aiSummarizer/aiTTS/aiModelCatalog, config/ai-proxy.config.json, frontend/assets/system.config.json, de.json admin.ai + Befehle)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova: AiChat/AiButton/AiConversationList/AiToolStatus/AiToolInspector/AiDebugContext, aiChatHistory/aiController/aiTools/aiTokenEstimator/aiVoiceInput/aiSummarizer/aiTTS/aiModelCatalog, config/ai-proxy.config.json, frontend/assets/system.config.json, de.json admin.ai + Befehle)
|
||||
@@ -33,4 +33,4 @@ import { Card, CardGrid } from '@astrojs/starlight/components';
|
||||
</Card>
|
||||
</CardGrid>
|
||||
|
||||
Verifiziert am 2b091d89 2026-10-13 (tibi-admin-nova).
|
||||
Verifiziert am 2b091d8 2026-10-13 (tibi-admin-nova)
|
||||
@@ -3,7 +3,7 @@ title: 'Medien im Admin'
|
||||
description: 'Raster, Upload-Warteschlange, Bildeditor, Vorschau aus Admin-Sicht.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge } from '@astrojs/starlight/components';
|
||||
import { Tabs, TabItem, Steps } from '@astrojs/starlight/components';
|
||||
|
||||
Bilder, PDFs und andere Dateien verwaltest du im **tibi-admin** (Verwaltungs-Backend, Release Nova) in einer Medien-Sammlung — meist `medialib` mit `viewHint.media`. Dieselben Werkzeuge stecken auch in Datei-Feldern des [Eintrags-Editors](/admin/eintrags-editor/). Projekt-Grundlagen (Pfade, Größen, Formate) stehen unter [Dateien und Bilder](/projekt/dateien-bilder/).
|
||||
|
||||
@@ -78,6 +78,6 @@ Bilder im Fließtext verwaltet das `richtext`-Widget des Editors (siehe [Eintrag
|
||||
| Bild-Einbettung bleibt leer | Verweis ohne `lookup` gelesen oder Eintrag nicht öffentlich | `lookup` auf `medialib` prüfen, `active`-Status und Rechte unter [Rechte und Tokens](/projekt/rechte-tokens/) klären |
|
||||
| Editor-Änderung weg | Dialog ohne Übernehmen geschlossen | Erst im Bildeditor übernehmen, dann den Eintrag speichern |
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): Medienraster mit Warteschlange und Bildeditor-Dialog, Alt-Text deutsch, max. 200 KB unter src/assets/. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d89 2026-10-13 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova)
|
||||
@@ -3,7 +3,7 @@ title: 'Admin einrichten'
|
||||
description: 'tibi-admin lokal starten und mit dem Server verbinden: Installieren, Docker-Stack, URLs, Mock-Modus.'
|
||||
---
|
||||
|
||||
import { Aside, Tabs, TabItem, Steps, Card, CardGrid, Badge, FileTree } from '@astrojs/starlight/components';
|
||||
import { Aside, Tabs, TabItem, Steps } from '@astrojs/starlight/components';
|
||||
|
||||
Du richtest das **tibi-admin** (Verwaltungs-Backend, Release Nova) lokal ein und verbindest es mit dem Tibi-Server. Code-Repo ist ausschließlich `tibi-admin-nova` — alte `tibi-admin`-Repos ignorieren. Stack: **Svelte 5**, **esbuild**-Build, **Tailwind 4**, **Playwright**-Tests (siehe `package.json`).
|
||||
|
||||
@@ -70,6 +70,24 @@ Nützliche Ziele: `make docker-ps`, `make docker-logs`, `make docker-down`, `mak
|
||||
- Laufzeitwerte liegen in `frontend/assets/system.config.json` (KI-Endpunkte, TTS-Stimmen); Proxy-Ziele und Modelle in `config/ai-proxy.config.json` — siehe [KI-Funktionen](/admin/ki-funktionen/).
|
||||
- Fehlerbilder bei falscher Verbindung: Login-Fehlerbox, Netzwerkfehler bei Listen/Actions — dann `API_BASE`, Server-Container (`make docker-ps`) und [Token-Köpfe](/reference/token-koepfe/) prüfen.
|
||||
|
||||
## Runtime-System-Config
|
||||
|
||||
Die Datei `frontend/assets/system.config.json` steuert zur Laufzeit KI-Endpunkte, TTS-Stimmen und Engine-Modi.
|
||||
Schema: `schemas/config/system-config.schema.json` (Pflichtblock `ai` mit `chat`, `summarizer`, `translation`, `vision`, `stt`, `tts`); geladen per `loadRuntimeSystemConfig` (`frontend/src/lib/runtime-system-config.ts:205-225`).
|
||||
|
||||
| Bereich | Felder | Engine-Modi |
|
||||
|---|---|---|
|
||||
| `ai.chat` | `enabled`, `endpoint` (`/api/ai/chat`), `modelsEndpoint` (`/api/ai/models`) | — |
|
||||
| `ai.summarizer` | `endpoint` (teilt sich den Chat-Endpunkt) | — |
|
||||
| `ai.translation` | `enabled`, `endpoint`, `systemPrompt` | — |
|
||||
| `ai.vision` | `enabled`, `endpoint` (`/api/ai/vision`), `defaultPrompt`, `image` (`maxWidth`/`maxHeight`/`quality`) | — |
|
||||
| `ai.stt` | `enabled`, `endpoint` (`/api/ai/transcribe`), `engine` | `auto` / `api` / `browser` / `none` |
|
||||
| `ai.tts` | `enabled`, `endpoint` (`/api/ai/tts`), `engine`, `defaultVoice`, `voices`, `speed` (`min`/`max`/`step`/`default`) | `auto` / `api` / `browser` / `none` |
|
||||
|
||||
Stimmen (Schema-Enum): `eva-de` (Standard), `kerstin-de`, `ramona-de`; Tempo-Defaults `0.5–2.0`, Schritt `0.1`, Standard `1.3`. Beleg: `frontend/assets/system.config.json:35-39` (`defaultVoice`, `voices`), `schemas/config/system-config.schema.json:20-26` (`ttsVoice`-Enum), Anzeige-Labels `frontend/src/lib/i18n/locales/de.json:1130-1136` (`ttsVoice`, `ttsSourceAi`).
|
||||
|
||||
Fehlt die Datei oder ist sie ungültig, fällt der Admin still auf die eingebauten Defaults zurück (`console.warn`, `runtime-system-config.ts:219-222`) — die Werte entsprechen der ausgelieferten `system.config.json`. Eigene Werte werden tief mit den Defaults verschmolzen (`deepMerge`) und danach sanitiert (unbekannte Engine → `auto`, leere Stimmenliste → Defaults, TTS-Tempo auf `min`/`max` geklemmt).
|
||||
|
||||
## Prüfen
|
||||
|
||||
```sh title="Build und Tests"
|
||||
@@ -80,6 +98,6 @@ yarn test:e2e # Playwright E2E
|
||||
|
||||
<Aside type="tip">Läuft `yarn build` grün und zeigt der Admin nach Login die Projektliste, ist das Setup fertig. Weiter geht es mit [Admin anpassen](/admin/customizing/).</Aside>
|
||||
|
||||
<!-- Screenshot-Platzhalter (T-SHOTS): frisch gestarteter Admin mit Projektliste nach Login. -->
|
||||

|
||||
|
||||
Verifiziert am 2b091d899590b392491c59a54f50de43f1057280 2026-10-16 (tibi-admin-nova)
|
||||
Verifiziert am 2b091d8 2026-10-17 (tibi-admin-nova); Runtime-System-Config verifiziert am 2b091d8 (runtime-system-config.ts:205-222, frontend/assets/system.config.json:35-39, schemas/config/system-config.schema.json:20-26)
|
||||
Reference in new issue
Block a user