Views
Das Modul wippy/views bietet ein virtuelles Seiten- und Komponentensystem mit Template-Rendering, Ressourcenverwaltung und Mapping von Umgebungsvariablen. Seiten können durch Jet-Templates oder externe Komponenten (SPAs, Micro-Frontends) gestützt werden.
Modul zum Projekt hinzufügen:
wippy add wippy/viewswippy installAbhängigkeit deklarieren:
version: "1.0"namespace: app
entries: - name: dep.views kind: ns.dependency component: wippy/views version: "*" parameters: - name: api_router value: app:api.public - name: env_storage value: app:env.storage| Parameter | Erforderlich | Standard | Beschreibung |
|---|---|---|---|
api_router | ja | — | HTTP-Router für View-API-Endpunkte |
env_storage | nein | intern | Environment-Storage, der die Variable PUBLIC_API_URL bereitstellt |
Template-Seiten
Abschnitt betitelt „Template-Seiten“Template-Seiten werden serverseitig mit Jet-Templates gerendert:
entries: - name: contact_page kind: template.jet meta: type: view.page name: contact title: Contact Us icon: mail order: 5 group: main group_icon: layout-grid group_order: 1 announced: true secure: false data: set: app.templates:default data_func: app:contact_data resources: - contact_stylesSeiten-Metadaten
Abschnitt betitelt „Seiten-Metadaten“| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
meta.type | string | — | Muss view.page sein |
meta.name | string | Eintragsname | Seitenkennung |
meta.title | string | — | Anzeigetitel |
meta.icon | string | — | Icon-Bezeichner |
meta.order | number | 9999 | Sortierreihenfolge innerhalb der Gruppe |
meta.group | string | — | Gruppenkategorie |
meta.group_icon | string | — | Gruppensymbol |
meta.group_order | number | 9999 | Gruppensortierreihenfolge |
meta.group_placement | string | "default" | Platzierung: "default", "sidebar" |
meta.secure | boolean | false | Erfordert Authentifizierung |
meta.public | boolean | false | Öffentlich zugänglich |
meta.announced | boolean | = public | In Navigation anzeigen |
meta.inline | boolean | false | In der Benutzeroberfläche ausgeblendet |
meta.content_type | string | text/html | MIME-Typ der Antwort |
meta.parent | string | — | ID der übergeordneten Seite |
Template-Daten
Abschnitt betitelt „Template-Daten“| Feld | Beschreibung |
|---|---|
data.set | Registry-ID des Template-Sets |
data.data_func | Funktions-ID, die Seitendaten zurückgibt |
data.resources | Array von Ressourcen-Registry-IDs |
Die data_func empfängt { params, query } und gibt eine Tabelle zurück, die zum data-Kontext im Template wird.
Rendering-Pipeline
Abschnitt betitelt „Rendering-Pipeline“- Seite aus Registry laden
- Zugriff prüfen (Sicherheit)
data_funcaufrufen, falls definiert- Ressourcen sammeln: globale + Template-Set-Ressourcen + seitenspezifische Ressourcen
- Umgebungsvariablen laden
- Jet-Template mit Kontext rendern:
{ data, resources, query_params, route_params, env }
Komponenten-Seiten
Abschnitt betitelt „Komponenten-Seiten“Komponenten-Seiten verweisen auf externe Anwendungen (SPAs, Micro-Frontends):
entries: - name: dashboard kind: registry.entry meta: type: view.page name: dashboard title: Dashboard icon: chart-bar url: https://cdn.example.com/dashboard/ secure: true announced: true data: proxy: enabled: true css: prime_vue: true theme_config: true tailwind_config: trueDie API gibt einen Komponentendeskriptor mit der Basis-URL und der Proxy-Konfiguration zurück. Das Frontend rendert die Komponente in einem iframe oder inline.
Komponentenfelder
Abschnitt betitelt „Komponentenfelder“| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
meta.url | string | — | Öffentliche URL der Komponente |
meta.entry_point | string | index.html (Seiten), index.js (Komponenten) | Eintragsdatei |
Proxy-Konfiguration
Abschnitt betitelt „Proxy-Konfiguration“Der Proxy steuert, welches CSS und Verhalten in die Komponente injiziert wird:
| Option | Standard | Beschreibung |
|---|---|---|
proxy.enabled | true | Proxy-Wrapper aktivieren |
proxy.css.fonts | true | Font-Stile injizieren |
proxy.css.theme_config | true | Theme-Variablen injizieren |
proxy.css.iframe | true | Iframe-spezifische Stile |
proxy.css.prime_vue | false | PrimeVue-Komponenten-Stile |
proxy.css.markdown | false | Markdown-Rendering-Stile |
proxy.css.custom_css | false | Benutzerdefiniertes CSS |
proxy.css.custom_variables | false | Benutzerdefinierte CSS-Variablen |
proxy.tailwind_config | false | Tailwind-Konfiguration injizieren |
proxy.resize_observer | true | Iframe automatisch skalieren |
proxy.prevent_link_clicks | true | Link-Navigation abfangen |
proxy.iconify_icons | false | Iconify-Icon-Set laden |
View-Komponenten
Abschnitt betitelt „View-Komponenten“Eigenständige Komponenten, die keine Seiten sind (kein Navigationseintrag):
entries: - name: widget kind: registry.entry meta: type: view.component name: chat-widget title: Chat Widget url: https://cdn.example.com/chat-widget/ data: proxy: enabled: trueKomponenten verwenden meta.type: view.component anstelle von view.page. Sie verwenden standardmäßig index.js als Eintragspunkt.
Ressourcen
Abschnitt betitelt „Ressourcen“Ressourcen sind CSS-, JS- und Font-Dateien, die mit Seiten verknüpft sind:
entries: - name: global_styles kind: registry.entry meta: type: view.resource name: Global Styles resource_type: style global: true order: 1 url: https://cdn.example.com/global.css
- name: app_script kind: registry.entry meta: type: view.resource name: App Script resource_type: script template_set: app.templates:default order: 10 url: https://cdn.example.com/app.js defer: trueRessourcenfelder
Abschnitt betitelt „Ressourcenfelder“| Feld | Typ | Beschreibung |
|---|---|---|
meta.type | string | Muss view.resource sein |
meta.resource_type | string | Frei waehlbar (Standard "other"); haeufige Werte sind "style", "script", "font" |
meta.order | number | Sortierreihenfolge innerhalb des Typs |
meta.global | boolean | Wird auf alle Seiten angewendet |
meta.template_set | string | Spezifisch für ein Template-Set |
meta.url | string | Ressourcen-URL |
meta.integrity | string | SRI-Hash |
meta.crossorigin | string | "anonymous" oder "use-credentials" |
meta.media | string | CSS-Media-Query |
meta.defer | boolean | Verzögertes Skript-Laden |
meta.async | boolean | Asynchrones Skript-Laden |
Ressourcensammlung
Abschnitt betitelt „Ressourcensammlung“Ressourcen werden in drei Schichten gesammelt und in dieser Reihenfolge zusammengeführt:
- Globale Ressourcen —
global: true, auf alle Seiten angewendet - Template-Set-Ressourcen — über die
template_set-ID zugeordnet - Seitenressourcen — im
data.resources-Array gelistet
Innerhalb jeder Schicht werden Ressourcen nach resource_type gruppiert und nach order sortiert.
Mapping von Umgebungsvariablen
Abschnitt betitelt „Mapping von Umgebungsvariablen“Der Env-Loader bildet Umgebungsvariablen über ein prioritätsbasiertes System auf Template-Kontext-Schlüssel ab.
Mappings definieren
Abschnitt betitelt „Mappings definieren“entries: - name: app_env kind: registry.entry meta: type: view.env_mapping priority: 20 data: mappings: api_endpoint: API_BASE_URL app_title: APP_NAME debug_mode: DEBUG_ENABLEDJeder Mapping-Eintrag verknüpft Kontext-Schlüssel (in Templates als env.api_endpoint verwendet) mit Umgebungsvariablennamen.
Prioritätssystem
Abschnitt betitelt „Prioritätssystem“| Bereich | Kategorie | Beschreibung |
|---|---|---|
| 0–9 | Framework-Standards | Eingebaute Framework-Mappings |
| 10–19 | System-Overrides | Konfiguration auf Systemebene |
| 20–29 | Anwendungs-Mappings | Anwendungsspezifische Mappings |
| 30–100 | Umgebungs-Overrides | Laufzeit-Overrides |
Höhere Priorität gewinnt, wenn mehrere Mappings denselben Kontext-Schlüssel definieren.
Verwendung in Templates
Abschnitt betitelt „Verwendung in Templates“Aufgelöste Umgebungswerte sind im env-Kontextobjekt verfügbar:
<script> window.API_URL = "{{ env.api_endpoint }}"; document.title = "{{ env.app_title }}";</script>HTTP-API-Endpunkte
Abschnitt betitelt „HTTP-API-Endpunkte“Das Views-Modul registriert diese Endpunkte am konfigurierten Router:
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /pages/list | Zugängliche, angekündigte Seiten auflisten |
| GET | /components/list | View-Komponenten auflisten |
| GET | /pages/content/{id} | Seite rendern oder Komponentendeskriptor zurückgeben |
| GET | /pages/public/{id} | Komponenten-Basis-URL abrufen |
Render-Antwort
Abschnitt betitelt „Render-Antwort“Für Template-Seiten wird gerenderter HTML mit dem content_type der Seite zurückgegeben.
Für Komponenten-Seiten wird ein Deskriptor zurückgegeben:
{ "name": "dashboard", "version": "1.0.0", "specification": "wippy-component-1.0", "title": "Dashboard", "baseUrl": "https://cdn.example.com/dashboard/", "wippy": { "type": "page", "path": "index.html", "proxy": { "enabled": true, "injections": { "css": { "fonts": true, "themeConfig": true, "iframe": true }, "tailwindConfig": false, "resizeObserver": true, "preventLinkClicks": true } } }}Zugriffskontrolle
Abschnitt betitelt „Zugriffskontrolle“Seiten mit secure: true erfordern Authentifizierung. Die Seiten-Registry prüft security.can("view", "page:<page_id>") gegen den aktuellen Aktor und Scope.
Nicht-sichere Seiten sind immer zugänglich. Das announced-Flag steuert die Sichtbarkeit in Navigationslisten, ohne den Zugriff zu beeinflussen.
ID-Qualifizierung
Abschnitt betitelt „ID-Qualifizierung“Relative IDs in Seitendefinitionen werden mit dem Namespace des Eintrags qualifiziert:
# In namespace "app"data: data_func: my_data_func # resolves to app:my_data_func set: templates:default # stays as templates:default (already qualified) resources: - page_styles # resolves to app:page_stylesSiehe auch
Abschnitt betitelt „Siehe auch“- Facade - Frontend-iframe-Facade und Navigations-Sidebar
- Template - Jet-Template-Engine
- Sicherheit - Sicherheitsaktoren und Zugriffskontrolle
- Umgebung - Speicherung von Umgebungsvariablen
- Framework-Übersicht - Verwendung des Framework-Moduls