Skip to content

Convert OpenBuilt's own shell to Tier-4 (manifest.json + CnAppRoot + customComponents) #17

@rubenvdlinde

Description

@rubenvdlinde

Why

OpenBuilt currently hand-rolls its own app shell — src/App.vue (NcContent + MainMenu.vue + vue-router + router-view) and a bespoke src/router/index.js. Per ADR-024 new apps should adopt at least Tier 1 from inception: a src/manifest.json rendered by CnAppRoot / CnPageRenderer / useAppManifest, with a small src/customComponents.js registry for the views that don't map to a built-in page type. decidesk is the Tier-4 reference (decidesk/src/{manifest.json,customComponents.js,App.vue,main.js}).

Converting OpenBuilt's shell:

Plan (mirror decidesk)

  1. src/manifest.json{$schema, version, dependencies:["openregister"], menu[], pages[]}. Pages (all type: "custom" — they are tooling UIs, not generic register CRUD):
    • Dashboard /DashboardView
    • VirtualApps /applications (+ VirtualAppDetail /applications/:slug) → ApplicationsView
    • Schemas /builder/:slug/schemas (+ SchemaDetail /builder/:slug/schemas/:schemaId) → SchemaDesignerView
    • Templates /templatesTemplatesView (from spec(openbuilt-templates-marketplace): starter template gallery + clone-from-template (#8/9) #8)
    • Exports /exportsExportJobsView
    • BuilderHost /builder/:slug/:pathMatch(.*)?BuilderHostView (declare last — wildcard)
    • menu: Dashboard / Virtual apps / Schemas / Templates / Exports / Documentation(href, section:settings). Admin settings stay server-side (AdminSettings.php); no in-app admin route (ADR-004 / hydra-gate-admin-router).
  2. src/customComponents.js{ DashboardView, ApplicationsView, SchemaDesignerView, TemplatesView, ExportJobsView, BuilderHostView } mapping to the existing src/views/*.vue (renamed/wrapped as needed). feat(openspec): openbuilt-page-editor — visual manifest designer (chain spec #5) #4's PageDesigner.vue becomes a "Design" tab inside ApplicationsView (or its own type:custom page); feat(openspec): openbuilt-page-editor — visual manifest designer (chain spec #5) #4's sub-editors live in components/page-editor/.
  3. src/App.vue — thin wrapper: <CnAppRoot :manifest :custom-components :page-types app-id="openbuilt" :translate :permissions>. Delete navigation/MainMenu.vue.
  4. src/main.js — build vue-router config from manifest.pages (decidesk's routesFromManifest), registerIcons(), registerTranslations(), fire-and-forget loadTranslations, mount App.vue with manifest/customComponents/pageTypes props.
  5. Delete src/router/index.js (routes now derived from the manifest).
  6. Update Vitest/Playwright suites; run quality gates.

Reconciliation tasks folded in

Notes

  • Backend is already largely declarative: lib/Settings/openbuilt_register.json uses x-openregister-lifecycle (ADR-031); ApplicationsController (runtime manifest API / listMine / clone / diff / export) is genuinely needed; ApplicationVersionSnapshotListener / DeepLinkRegistrationListener are documented ADR-031 §Exceptions(1) fallbacks. This issue is about the frontend shell.
  • Do this via the opsx flow (opsx-new openbuilt-adopt-manifestopsx-ffopsx-applyopsx-verify), not ad-hoc, so it carries ADR-022/024/032 in the loop.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions