From c22b3242944e0c2640e74987b4f4761610495295 Mon Sep 17 00:00:00 2001 From: Sebastian Frank Date: Tue, 20 Oct 2026 20:45:24 +0000 Subject: [PATCH] docs(tools): document custom tools and add overview screenshot --- astro.config.mjs | 4 + src/assets/admin/custom-tools-overview.png | Bin 0 -> 73552 bytes src/content/docs/admin/customizing.mdx | 1 + src/content/docs/admin/tools.mdx | 55 ++++++++++++ src/content/docs/projekt/tools-schreiben.mdx | 86 +++++++++++++++++++ src/content/docs/reference/tool-kontext.mdx | 64 ++++++++++++++ src/content/docs/reference/tool-ui.mdx | 85 ++++++++++++++++++ 7 files changed, 295 insertions(+) create mode 100644 src/assets/admin/custom-tools-overview.png create mode 100644 src/content/docs/admin/tools.mdx create mode 100644 src/content/docs/projekt/tools-schreiben.mdx create mode 100644 src/content/docs/reference/tool-kontext.mdx create mode 100644 src/content/docs/reference/tool-ui.mdx diff --git a/astro.config.mjs b/astro.config.mjs index 2308de6..ad9dd9e 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -81,6 +81,7 @@ export default defineConfig({ { label: 'Navigation und Sprachen', slug: 'projekt/navigation-i18n' }, { label: 'Suche', slug: 'projekt/suche' }, { label: 'Pagebuilder-Anbindung', slug: 'projekt/pagebuilder-dev' }, + { label: 'Custom Tools', slug: 'projekt/tools-schreiben' }, { label: 'Website mit SSR', slug: 'projekt/ssr-website' }, { label: 'Jobs und Aktionen', slug: 'projekt/jobs-actions' }, { label: 'LLM nutzen', slug: 'projekt/llm-nutzen' }, @@ -101,6 +102,7 @@ export default defineConfig({ { label: 'Medien', slug: 'admin/medien' }, { label: 'Exporte', slug: 'admin/exporte' }, { label: 'Aktionen', slug: 'admin/aktionen' }, + { label: 'Eigene Tools', slug: 'admin/tools' }, { label: 'Benutzer und Rechte', slug: 'admin/benutzer-rechte' }, { label: 'KI-Funktionen', slug: 'admin/ki-funktionen' }, ], @@ -134,6 +136,8 @@ export default defineConfig({ { label: 'Schema-Properties', slug: 'reference/schema-properties' }, { label: 'System-Routen', slug: 'reference/rest-system' }, { label: 'Hook-Kontexte', slug: 'reference/hook-kontexte' }, + { label: 'Custom-Tool-Kontext', slug: 'reference/tool-kontext' }, + { label: 'Custom-Tool-UI', slug: 'reference/tool-ui' }, { label: 'Hook-Referenz: Daten', slug: 'reference/hooks-daten' }, { label: 'Hook-Referenz: Netze und Nachrichten', slug: 'reference/hooks-netze' }, { label: 'Hook-Referenz: Sicherheit und Identität', slug: 'reference/hooks-sicherheit' }, diff --git a/src/assets/admin/custom-tools-overview.png b/src/assets/admin/custom-tools-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..6d25c7d88ed98039dcd08a3bb9bf387d1b3566b5 GIT binary patch literal 73552 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 literal 0 HcmV?d00001 diff --git a/src/content/docs/admin/customizing.mdx b/src/content/docs/admin/customizing.mdx index c80fdad..6aba920 100644 --- a/src/content/docs/admin/customizing.mdx +++ b/src/content/docs/admin/customizing.mdx @@ -66,6 +66,7 @@ Volle Kontext-Tabelle in der Repo-Doku `custom-export-script.md`; Bedienung unte - Eigene Eingabeelemente registrierst du am `WidgetDispatcher` (Feldtyp + `meta.widget`-Name) — erst Schema in [Felder und Widgets](/projekt/felder-widgets/) prüfen. - Neue Admin-Bereiche folgen dem Muster `components/admin/*Tab + *CreateDrawer + *DetailDrawer` mit Suche, Filter, Sortierung und Paginierung. +- **Eigene Tools** für projektspezifische Abläufe liegen unter `meta.tools` und laufen als ES-Module im Admin — siehe [Eigene Tools](/admin/tools/) und [Custom Tools schreiben](/projekt/tools-schreiben/). - KI-Kontext (`aiController`) bleibt automatisch konsistent, solange du `data-ai-id`-Attribute setzt. diff --git a/src/content/docs/admin/tools.mdx b/src/content/docs/admin/tools.mdx new file mode 100644 index 0000000..da15b62 --- /dev/null +++ b/src/content/docs/admin/tools.mdx @@ -0,0 +1,55 @@ +--- +title: 'Eigene Tools im Admin' +description: 'Projektspezifische Werkzeuge bedienen: Navigation, Rechte, Status, Abbrechen und Grenzen.' +--- + +Eigene Tools erscheinen im Projekt als eigener Abschnitt **Tools** unterhalb der +Sammlungen. Sie sind keine Sammlungen und keine Actions: Ein Tool ist eine eigene +Seite mit freiem Ablauf, die der Admin aus dem Projekt lädt. + +## Wo du Tools findest + +![Projekt-Übersicht als Custom Tool im Mock: Kennzahlen zu Seiten, Artikeln und Produkten sowie eine Tabelle mit den letzten Editor-Einträgen](../../../assets/admin/custom-tools-overview.png) + +Das Beispiel ist **projektabhängig**: Es zählt die Sammlungen `pages`, `articles` und +`products`. In einem anderen Projekt heißt das Referenz-Tool anders und nutzt dessen +Sammlungen. + + +- Öffne ein Projekt. Unter den Sammlungen und Aktionen erscheint der Abschnitt + **Tools**. +- Ein Klick öffnet die Tool-Seite. Die Breadcrumb führt zurück zum Projekt. +- Mit `hidden: true` konfigurierte Tools erscheinen nicht in der Liste; die + direkte URL funktioniert weiterhin. +- Fehlende `permissions` blenden das Tool ebenfalls nur aus. Datenrechte bleiben + serverseitig pro Sammlung geschützt. + +## Bedienung + +| Element | Bedeutung | +|---|---| +| Status-Badge | Bereit, Lädt, Läuft, Abgebrochen oder Fehler | +| **Neu laden** | Startet das Tool neu und räumt den vorherigen Lauf auf | +| **Abbrechen** | Bricht den Lauf zwischen `await`-Schritten ab | +| **Protokoll** | Log-Ausgaben des Tools, inklusive Details | +| **Fortschritt** | Fortschrittsbalken, sofern das Tool `ctx.progress` nutzt | + +Ein Tool kann eigene UI mitbringen oder die Admin-Widgets verwenden. Beides sieht +bewusst wie der Admin aus; das Projekt-Theme kann über `meta.ui.css` gescopet +ergänzt werden. + +## Grenzen + +- Tools laufen im Browser mit der Admin-Session. Es gibt in v1 keine iframe-Sandbox. +- Ein Tool kann den Browser-Tab blockieren, wenn es synchron schwer rechnet. + Abbrechen wirkt nur zwischen `await`-Schritten. +- Gleichzeitige Änderungen sind Last-Write-Wins; das Tool muss selbst neu lesen + oder idempotent arbeiten. +- Nach einem Deployment lädt der Browser das Tool-Modul über einen Config-Hash neu. + +## Für Projekt-Entwickler + +Wie du Tools konfigurierst und schreibst, steht unter +[Custom Tools schreiben](/projekt/tools-schreiben/). Die UI-Referenz liegt unter +[Custom-Tool-UI](/reference/tool-ui/), der Kontext unter +[Custom-Tool-Kontext](/reference/tool-kontext/). diff --git a/src/content/docs/projekt/tools-schreiben.mdx b/src/content/docs/projekt/tools-schreiben.mdx new file mode 100644 index 0000000..df0c78b --- /dev/null +++ b/src/content/docs/projekt/tools-schreiben.mdx @@ -0,0 +1,86 @@ +--- +title: 'Custom Tools schreiben' +description: 'Projektspezifische Werkzeuge als ES-Module im Admin: Config, mount, ctx und Grenzen.' +--- + +Ein Custom Tool ist ein ES-Modul im Projekt-Repo, das der Admin als eigene Seite +lädt. Es läuft im Browser mit der Admin-Session und demselben `ctx`/`context`. + +## Konfiguration + +```yaml title="api/config.yml" +meta: + tools: + - name: stock-import + label: { de: Bestandsabgleich, en: Stock reconciliation } + module: _/assets/tools/stock-import/index.js + permissions: [inventory] + capabilities: [db, files, xlsx, ui] +``` + +`name` ist ein Slug (`[a-z0-9-_]+`). `module` wird projektrelativ aufgelöst; +`.js` ist der Default, `.mjs` optional. `permissions` steuern nur die Sichtbarkeit +in der Navigation – Datenrechte bleiben serverseitig. + +## Modul + +```js title="api/assets/tools/stock-import/index.js" +export const messages = { + de: { 'stock.title': 'Bestand' }, + en: { 'stock.title': 'Stock' }, +} + +export async function mount(el, ctx) { + el.textContent = ctx.i18n.t('stock.title') + return () => el.replaceChildren() +} +``` + +- `mount(el, ctx)` ist Pflicht. +- Die Rückgabe ist eine optionale Cleanup-Funktion. +- `ctx === ctx.context`; beide Bindings sind dasselbe Objekt. +- Module laufen same-origin und sind vertrauenswürdig (eigenes Repo/Deploy). + +## Kontext + +| Feld | Inhalt | +|---|---| +| `ctx.db` | `find`, `count`, `loadAll`, `create`, `update`, `delete`, `updateMany`, `deleteMany` | +| `ctx.files` | Datei/Blob/URL → `{ src, name, type, size }` | +| `ctx.xlsx` | gebündeltes `xlsx-js-style` | +| `ctx.auth` | `{ id, username, role, permissions }` | +| `ctx.state` | `Map` pro Tool-Instanz | +| `ctx.i18n` | `t`, `text`, `has`, `add`, `extend`, `onChange` | +| `ctx.theme` | `{ mode, tokens }` read-only | +| `ctx.log`, `ctx.progress`, `ctx.signal` | Log, Fortschritt, Abbrechen | +| `ctx.project`, `ctx.tool`, `ctx.hostData` | read-only Config/Clone | + +`ctx.db.update` ist Last-Write-Wins. Tools mit Read-Modify-Write müssen vor dem +Schreiben neu lesen oder idempotent arbeiten. `updateMany` bricht beim ersten +Fehler ab (`failedIndex`), ohne Rollback. + +## UI + +`ctx.ui.field` und `ctx.ui.form` rendern die vorhandenen Admin-Widgets. Eigene UI +läuft über DOM/Custom Elements, `ctx.ui.slot`, `ctx.ui.styles` und +`ctx.ui.registerWidget`. Details: [Tool-UI-Referenz](/reference/tool-ui/). + +## Auslieferung und Deployment + +Tool-Module liegen als Projekt-Assets unter `_/assets/...`. Der Browser lädt sie +per dynamischem `import()`; dabei wird **kein** Admin-Token mitgeschickt. Die +Assets müssen deshalb öffentlich lesbar sein, so wie Pagebuilder-Registries heute. +Das ist eine **Projekt-/Deployment-Eigenschaft**: Wenn ein Projekt Assets schützt, +muss die Server-Konfiguration angepasst werden, bevor Tools dort laden können. + +`.js` ist der Default und wird von üblichen Servern als JavaScript ausgeliefert. +`.mjs` ist optional und braucht einen belegten JavaScript-MIME. Der Mock liefert +für beide `text/javascript`; im echten Deployment muss der MIME pro Projekt +geprüft werden. + +## Grenzen + +- Keine iframe-Sandbox in v1. +- Kein serverseitiges `_tools`-Rechtemodell. +- Kein Worker/Timeout; `ctx.signal` wirkt zwischen `await`-Schritten. +- `meta.ui.css` benötigt `@scope`. diff --git a/src/content/docs/reference/tool-kontext.mdx b/src/content/docs/reference/tool-kontext.mdx new file mode 100644 index 0000000..f6cfff3 --- /dev/null +++ b/src/content/docs/reference/tool-kontext.mdx @@ -0,0 +1,64 @@ +--- +title: 'Custom-Tool-Kontext' +description: 'ctx/context-Referenz für Custom Tools: db, files, xlsx, auth, i18n, theme und Signale.' +--- + +`ctx` und `context` sind dasselbe Objekt. Die folgende Tabelle beschreibt den +v1-Vertrag; Erweiterungen sind additiv. + +| Feld | Signatur / Inhalt | +|---|---| +| `ctx.context` | `ctx` selbst | +| `ctx.apiVersion` | `1` | +| `ctx.uiVersion` | `1` | +| `ctx.host` | `"tool"` (später `"macro"`, `"server"`) | +| `ctx.capabilities` | deklarierte Fähigkeiten | +| `ctx.project` | read-only Projekt-Clone | +| `ctx.tool` | read-only Tool-Config | +| `ctx.auth` | `{ id, username, role, permissions } \| null` | +| `ctx.lang` | aktive Admin-Sprache | +| `ctx.languages` | Inhaltssprachen des Projekts | +| `ctx.state` | `Map` pro Tool-Instanz | +| `ctx.signal` | `AbortSignal` beim Verlassen/Abbrechen | +| `ctx.hostData` | Host-Daten (ToolView: `projectId`, `toolName`) | +| `ctx.asset(spec)` | Projekt-Asset-Spezifizierer auflösen | + +## `ctx.db` + +```ts +find(collection, { filter?, sort?, limit?, offset?, select?, lookup? }): Promise[]> +count(collection, { filter? }): Promise +loadAll(collection, opts?, onProgress?): Promise[]> +create(collection, data): Promise> +update(collection, id, data): Promise>> +delete(collection, id): Promise +updateMany(collection, items): Promise<{ ok, failedIndex?, error? }> +deleteMany(collection, ids): Promise<{ ok, failedIndex?, error? }> +``` + +`loadAll` batcht mit 500 Datensätzen, respektiert `ctx.signal` und ruft +`onProgress(done,total)`. + +## `ctx.i18n` + +```ts +t(key, vars?): string +text(value, vars?): string +has(key): boolean +add(lang, messages): () => void +extend(messages, lang?): () => void +onChange(cb): () => void +``` + +Reihenfolge: Laufzeit → Modul → Projekt → Admin-JSON → Key. ICU/Plural wird über +`IntlMessageFormat` formatiert. + +## `ctx.files` + +`ctx.files.get(fileOrBlobOrUrl)` liefert `{ src, name, type?, size? }`; `src` ist +eine Data-URL. Uploads werden erst beim Speichern des Eintrags persistiert. + +## `ctx.xlsx` + +Das gebündelte `xlsx-js-style`-Modul. Große Arbeitsmappen blockieren den +Main-Thread; das ist in v1 dokumentiert und nicht durch einen Worker abgefedert. diff --git a/src/content/docs/reference/tool-ui.mdx b/src/content/docs/reference/tool-ui.mdx new file mode 100644 index 0000000..a94ab49 --- /dev/null +++ b/src/content/docs/reference/tool-ui.mdx @@ -0,0 +1,85 @@ +--- +title: 'Custom-Tool-UI' +description: 'Widget-Katalog, Feld-/Form-Handles, registerWidget und gescoptes Projekt-CSS.' +--- + +`ctx.ui` bietet Admin-Widgets und eine kleine DOM-API. Alle Widgets laufen auf +denselben Admin-Komponenten; eigene UI ist ein opt-in. + +## Feld-Widgets + +```js +const field = ctx.ui.field({ + collection: 'editor_lab', + field: 'title', + value: 'Hallo', + onChange: (value) => console.log(value), +}) +el.appendChild(field.el) +``` + +Typisierte Helfer: `text`, `number`, `boolean`, `select`, `date`, `richtext`, +`json`, `chips`, `file`, `files`, `foreignKey`, `foreignKeys`, `foreignFile`, +`object`, `objectArray`, `navigationTree`, `pagebuilder`. + +`FieldHandle`: `el`, `update`, `destroy`, `getValue`, `setValue`, `validate`, +`flush`. + +## Formulare + +```js +const form = ctx.ui.form({ + collection: 'editor_lab', + fields: ['title', 'score'], + value: { title: 'Formular', score: 7 }, +}) +``` + +`FormHandle` ergänzt `getValue`, `setValue`, `validate` und `flush` (wartet auf +laufende Uploads). + +## Deskriptoren und Handles + +```js +const field = ctx.ui.field({ collection: 'editor_lab', field: 'title' }) +const page = ctx.ui.page({ title: 'Bestand', content: field }) + +ctx.ui.render(el, { + type: 'section', + props: { title: 'Details' }, + slots: { content: [{ type: 'badge', props: { content: '3 Unterschiede' } }] }, +}) +``` + +Unbekannte Typen rendern einen sichtbaren Platzhalter; Fehler fängt die +`WidgetBoundary`. + +## Eigene Deskriptor-Typen + +```js +const dispose = ctx.ui.registerWidget('tool.demo.badge', ({ el, props }) => { + el.textContent = props.label + return { update: (p) => (el.textContent = p.label), destroy: () => el.replaceChildren() } +}) +``` + +Built-ins nur mit `{ replace: true }` überschreiben. Die Registrierung endet mit +dem Tool oder über `dispose()`. + +## Theme und CSS + +`ctx.ui.styles` liefert Admin-Primitives plus rohe Projekt-CSS für Shadow DOM. +`meta.ui.css` wird in `@scope (.tibi-tool-)` geladen; Projekt-CSS ohne +eigenen Tool-Präfix schreiben. Ohne `@scope` wird die Datei nicht geladen. + +## Tabellen + +```js +const table = ctx.ui.table({ + collection: 'editor_lab', + rows, + columns: [{ field: 'title', label: 'Titel' }], + selection: 'multi', + onSelectionChange: (ids) => console.log(ids), +}) +```