Frontend-architectuur¶
De frontend van IntroVox is een Vue-3-single-page-app gebundeld met webpack, geïntegreerd in Nextcloud als drie entry-points: de wizard-runtime, de admin-instellingen-pagina en de persoonlijke-instellingen-pagina.
Entry-points¶
| Entry | Output-bundle | Geladen op |
|---|---|---|
src/main.js |
js/main.js |
Elke Nextcloud-pagina (via LoadScripts-listener) |
src/admin.js |
js/admin.js |
Admin-instellingen → IntroVox |
src/personal.js |
js/personal.js |
Persoonlijke instellingen → IntroVox |
Webpack produceert ~210 KB voor main.js. Andere bundles zijn kleiner (admin/personal zijn gescoped tot hun respectievelijke instellingen-pagina's).
Component-boom¶
App.vue
└── WizardManager.vue ← Shepherd.js-tour-levenscyclus
├── (Shepherd-managed step-DOM, geen Vue-componenten)
└── PWA-installatie-instructies (~50 strings, v1.6.0+)
Admin-instellingen-pagina (src/admin.js)
└── AdminSettings.vue
├── Stappen-tabblad (CRUD + drag-drop + import/export)
├── Instellingen-tabblad (globaal + talen)
├── Statistieken-tabblad (telemetrie)
└── Support-tabblad → SupportSettings.vue (v1.5.0+)
Persoonlijke-instellingen-pagina (src/personal.js)
└── PersonalSettings.vue
Kern-bestanden¶
src/App.vue¶
Root-component. Beslist of WizardManager gemount wordt op basis van:
- Server-response van
GET /api/steps localStorage['introvox_completed']- Huidige pagina (start alleen automatisch op het dashboard)
src/components/WizardManager.vue¶
Beheert de Shepherd.js-tour:
- Ontvangt stap-lijst van parent
- Instantiëert
new Shepherd.Tour({...}) - Registreert Next/Back/Done/Skip-handlers
- Vuurt telemetrie-events via
axios.post('/api/wizard/...') - Updatet localStorage bij close/complete/skip
- Roept
POST /personal/settingsaan bij Skip en Done ompermanent_disablete zetten
src/components/wizardSteps.js¶
Default-stap-definities gewrapped in t('introvox', ...). Gebruikt wanneer:
GET /api/stepsuseDefault: trueteruggeeft- Voor nieuwe installaties vóór enige admin-customization
Sinds v1.6.0 gebruiken alle 16 default-stap-titels en -teksten Engelse source-strings als Transifex-msgids in plaats van opaque step_welcome_title-achtige keys.
src/components/SupportSettings.vue (v1.5.0+)¶
Enterprise-subscription-beheer-UI:
- Subscription-key-input
- Validatie tegen
licenses.voxcloud.nl - Per-taal stap-tellings-progress-bars die free-tier (10 stappen per taal) vs. licensed-limieten tonen
src/utils/deviceDetection.js (v1.6.0+)¶
OS-/browser-detectie gebruikt door de PWA-installatie-stap. Alle ~40 gebruikers-strings zijn gewrapped in t() (gefixt in v1.6.0 — voorheen waren ze hardcoded Nederlands).
State-management¶
IntroVox gebruikt geen Vuex of Pinia. Staat blijft lokaal per component:
- Stap-lijst — eenmalig per pagina geladen via
GET /api/steps, gehouden in de reactive state vanWizardManager.vue - Admin-stap-bewerking — lokale component-state in
AdminSettings.vue; alleen gepersisteerd wanneer Wijzigingen opslaan wordt geklikt - Gebruikers-voltooiings-staat — gesplitst over browser-localStorage (alleen frontend) en de server-preferences-tabel (
permanent_disable) - Taal-selectie (admin) — lokale staat; wisselen met niet-opgeslagen wijzigingen triggert een bevestigings-dialoog
Tour-engine: Shepherd.js¶
IntroVox wrapt Shepherd.js voor tour-rendering:
- Elke stap wordt geregistreerd als
tour.addStep({...}) - Element-markering (
.shepherd-target-click-disabled) wordt overschreven zodat gebruikers nog steeds op gemarkeerde elementen kunnen klikken - Custom styling overschrijft Shepherd's default-classes om Nextcloud's thema-variabelen te matchen (zie Thema-ondersteuning)
Bug-fixes gerelateerd aan Shepherd-integratie¶
- v1.6.1 —
.nextcloud-wizard-step[hidden] { display: none }toegevoegd om te voorkomen dat Shepherd-verborgen stappen zichtbaar stapelen achter de actieve stap (werd veroorzaakt door.nextcloud-wizard-step { display: flex }die de browser-default overschreef) - v1.5.0 —
max-heighten interne body-scrolling toegevoegd zodat lange mobiele stappen navigeerbaar blijven - v1.4.2 — fallback-CSS-selectors en 10s-timeout toegevoegd aan de app-menu-readiness-check
- v1.4.1 — stappen met ontbrekende doel-elementen vallen nu terug op gecentreerde weergave in plaats van stil te worden overgeslagen
Build-configuratie¶
npm run build— productie-build (geminified, geen source-maps)npm run build:dev— development-build (leesbaar, source-maps)npm run watch— watch-modus voor actieve ontwikkeling
Bundle-outputs gaan naar js/. De src/-directory is niet opgenomen in App-Store-tarballs — alleen gecompileerde assets.
Vertaal-flow¶
- Vue-componenten en JS gebruiken
t('introvox', '<Engelse bron>')uit@nextcloud/l10n python3 regenerate_js_translations.pyconverteertl10n/<lang>.json-bestanden naarl10n/<lang>.js-bestanden die webpack oppaktOCP\L10N\IFactory::getLanguages()levert display-namen voor de taal-picker (v1.6.0+)
Zie Transifex-integratie voor de volledige vertaal-workflow.
Zie ook¶
- Architectuur-overzicht
- Backend-architectuur
- Geleide tours — Shepherd-levenscyclus
- Thema-ondersteuning — CSS-variabele-overerving