Zum Inhalt springen

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:

Terminal-Fenster
wippy add wippy/views
wippy install

Abhä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
ParameterErforderlichStandardBeschreibung
api_routerjaHTTP-Router für View-API-Endpunkte
env_storageneininternEnvironment-Storage, der die Variable PUBLIC_API_URL bereitstellt

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_styles
FeldTypStandardBeschreibung
meta.typestringMuss view.page sein
meta.namestringEintragsnameSeitenkennung
meta.titlestringAnzeigetitel
meta.iconstringIcon-Bezeichner
meta.ordernumber9999Sortierreihenfolge innerhalb der Gruppe
meta.groupstringGruppenkategorie
meta.group_iconstringGruppensymbol
meta.group_ordernumber9999Gruppensortierreihenfolge
meta.group_placementstring"default"Platzierung: "default", "sidebar"
meta.securebooleanfalseErfordert Authentifizierung
meta.publicbooleanfalseÖffentlich zugänglich
meta.announcedboolean= publicIn Navigation anzeigen
meta.inlinebooleanfalseIn der Benutzeroberfläche ausgeblendet
meta.content_typestringtext/htmlMIME-Typ der Antwort
meta.parentstringID der übergeordneten Seite
FeldBeschreibung
data.setRegistry-ID des Template-Sets
data.data_funcFunktions-ID, die Seitendaten zurückgibt
data.resourcesArray von Ressourcen-Registry-IDs

Die data_func empfängt { params, query } und gibt eine Tabelle zurück, die zum data-Kontext im Template wird.

  1. Seite aus Registry laden
  2. Zugriff prüfen (Sicherheit)
  3. data_func aufrufen, falls definiert
  4. Ressourcen sammeln: globale + Template-Set-Ressourcen + seitenspezifische Ressourcen
  5. Umgebungsvariablen laden
  6. Jet-Template mit Kontext rendern: { data, resources, query_params, route_params, env }

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: true

Die API gibt einen Komponentendeskriptor mit der Basis-URL und der Proxy-Konfiguration zurück. Das Frontend rendert die Komponente in einem iframe oder inline.

FeldTypStandardBeschreibung
meta.urlstringÖffentliche URL der Komponente
meta.entry_pointstringindex.html (Seiten), index.js (Komponenten)Eintragsdatei

Der Proxy steuert, welches CSS und Verhalten in die Komponente injiziert wird:

OptionStandardBeschreibung
proxy.enabledtrueProxy-Wrapper aktivieren
proxy.css.fontstrueFont-Stile injizieren
proxy.css.theme_configtrueTheme-Variablen injizieren
proxy.css.iframetrueIframe-spezifische Stile
proxy.css.prime_vuefalsePrimeVue-Komponenten-Stile
proxy.css.markdownfalseMarkdown-Rendering-Stile
proxy.css.custom_cssfalseBenutzerdefiniertes CSS
proxy.css.custom_variablesfalseBenutzerdefinierte CSS-Variablen
proxy.tailwind_configfalseTailwind-Konfiguration injizieren
proxy.resize_observertrueIframe automatisch skalieren
proxy.prevent_link_clickstrueLink-Navigation abfangen
proxy.iconify_iconsfalseIconify-Icon-Set laden

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: true

Komponenten verwenden meta.type: view.component anstelle von view.page. Sie verwenden standardmäßig index.js als Eintragspunkt.

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: true
FeldTypBeschreibung
meta.typestringMuss view.resource sein
meta.resource_typestringFrei waehlbar (Standard "other"); haeufige Werte sind "style", "script", "font"
meta.ordernumberSortierreihenfolge innerhalb des Typs
meta.globalbooleanWird auf alle Seiten angewendet
meta.template_setstringSpezifisch für ein Template-Set
meta.urlstringRessourcen-URL
meta.integritystringSRI-Hash
meta.crossoriginstring"anonymous" oder "use-credentials"
meta.mediastringCSS-Media-Query
meta.deferbooleanVerzögertes Skript-Laden
meta.asyncbooleanAsynchrones Skript-Laden

Ressourcen werden in drei Schichten gesammelt und in dieser Reihenfolge zusammengeführt:

  1. Globale Ressourcenglobal: true, auf alle Seiten angewendet
  2. Template-Set-Ressourcen — über die template_set-ID zugeordnet
  3. Seitenressourcen — im data.resources-Array gelistet

Innerhalb jeder Schicht werden Ressourcen nach resource_type gruppiert und nach order sortiert.

Der Env-Loader bildet Umgebungsvariablen über ein prioritätsbasiertes System auf Template-Kontext-Schlüssel ab.

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_ENABLED

Jeder Mapping-Eintrag verknüpft Kontext-Schlüssel (in Templates als env.api_endpoint verwendet) mit Umgebungsvariablennamen.

BereichKategorieBeschreibung
0–9Framework-StandardsEingebaute Framework-Mappings
10–19System-OverridesKonfiguration auf Systemebene
20–29Anwendungs-MappingsAnwendungsspezifische Mappings
30–100Umgebungs-OverridesLaufzeit-Overrides

Höhere Priorität gewinnt, wenn mehrere Mappings denselben Kontext-Schlüssel definieren.

Aufgelöste Umgebungswerte sind im env-Kontextobjekt verfügbar:

<script>
window.API_URL = "{{ env.api_endpoint }}";
document.title = "{{ env.app_title }}";
</script>

Das Views-Modul registriert diese Endpunkte am konfigurierten Router:

MethodePfadBeschreibung
GET/pages/listZugängliche, angekündigte Seiten auflisten
GET/components/listView-Komponenten auflisten
GET/pages/content/{id}Seite rendern oder Komponentendeskriptor zurückgeben
GET/pages/public/{id}Komponenten-Basis-URL abrufen

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
}
}
}
}

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.

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_styles