Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

feat(nav): manifest-driven CnAppNav — three-section menu + roadmap + org switcher preserved#1919

Merged
rubenvdlinde merged 6 commits into
developmentfrom
feat/manifest-driven-nav
May 25, 2026
Merged

feat(nav): manifest-driven CnAppNav — three-section menu + roadmap + org switcher preserved#1919
rubenvdlinde merged 6 commits into
developmentfrom
feat/manifest-driven-nav

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented May 25, 2026

Copy link
Copy Markdown
Contributor

What

Converts OpenRegister's hand-built MainMenu.vue (raw NcAppNavigation + 21 hand-coded NcAppNavigationItems) to manifest-driven CnAppNav fed by a new src/manifest.json. Brings OR onto the fleet three-section nav model (matching opencatalogi/openconnector) and adds the standard footer items.

The menu is now data:

  • main — AI Chat, Registers, Schemas, Templates, Search / views, Files, Agents
  • footer (pinned bottom) — Documentation (→ openregister.conduction.nl), Features & roadmap (→ existing /features-roadmap route)
  • settings (gear foldout) — Organisations, Applications, Data sources, Configurations, Entities, Deleted, Audit Trails, Search Trails, Webhooks, AVG, Reports, Endpoints

The active-organisation switcher (live store-driven label) is preserved via CnAppNav's new #primary-action slot — shipped in @conduction/nextcloud-vue 1.0.0-beta.103 (#444, merged).

Supporting changes

  • router/index.js — every route now has a name (CnAppNav navigates by named route; existing path-based push() calls unchanged; pre-existing names preserved).
  • main.js — registers the nav's MDI icons by name so CnAppNav resolves each item's icon against ICON_MAP.
  • nav.includePersonalSettings: false — OR has no per-user NcAppSettingsDialog and isn't wrapped in CnAppRoot.
  • Deps: @conduction/nextcloud-vue^1.0.0-beta.103; merged development (which bumped @nextcloud/vue^8.39.0).

Verification

Built against the #444 code via useLocalLib, deployed to the dev container, Playwright-verified:

  • CnAppNav mounts; org-switcher shows the live org name ("Default Organisation") via the slot
  • ✅ 7 main items, 2 footer items pinned, 12-item Settings foldout
  • ✅ Named-route navigation + active highlighting (Registers → /registers, only that item active)
  • ✅ Features & roadmap footer item routes client-side to /features-roadmap
  • ✅ Dashboard (charts/stats/filter sidebar) + Registers index render under the beta.32→beta.103 jump

Notes

  • The lockfile was bumped surgically (beta.102→beta.103, no new deps) because OR's vue override-vs-dep mismatch makes a full npm install regen EOVERRIDE — npm ci (CI) installs from the lockfile without re-evaluating overrides.
  • A useNcFormBox console error in the dev container traces to a stale openregister-integration-global.js (not a webpack entry on development, not produced by this build) — orthogonal, absent from clean CI builds.
  • Hard deep-links (typing /features-roadmap) 404 server-side (SPA history-mode catch-all) — pre-existing, unrelated.

🤖 Generated with Claude Code

…n model)

Replaces the hand-built MainMenu.vue (raw NcAppNavigation + per-item
NcAppNavigationItem) with manifest-driven CnAppNav fed by a new
src/manifest.json. The menu is now declared as data in three sections:

- main:     AI Chat, Registers, Schemas, Templates, Search / views, Files, Agents
- footer:   Documentation (-> openregister.conduction.nl), Features & roadmap
            (pinned to the bottom via NcAppNavigationItem's native pinned prop)
- settings: Organisations, Applications, Data sources, Configurations, Entities,
            Deleted, Audit Trails, Search Trails, Webhooks, AVG, Reports,
            Endpoints (inside the NcAppNavigationSettings gear foldout)

The active-organisation switcher is preserved via CnAppNav's new
#primary-action slot (its label is live store state, so it can't be a
static manifest field). nav.includePersonalSettings is false — OR has no
per-user NcAppSettingsDialog and isn't wrapped in CnAppRoot.

Supporting changes:
- router/index.js: every route gets a name (CnAppNav navigates by named
  route; existing path-based push() calls are unchanged).
- main.js: registers the navigation MDI icons by name so CnAppNav resolves
  each menu item's icon against ICON_MAP.

DRAFT: depends on @conduction/nextcloud-vue#444 (the #primary-action
slot). Dep is temporarily ^1.0.0-beta.102; must bump to the version that
publishes the slot before merge, otherwise the org button is inert.
…y-action slot)

beta.103 publishes the CnAppNav #primary-action slot (nextcloud-vue#444)
that MainMenu.vue's active-organisation button depends on. Unblocks the
manifest-driven nav conversion.
…driven-nav

# Conflicts:
#	package-lock.json
#	package.json
@rubenvdlinde rubenvdlinde marked this pull request as ready for review May 25, 2026 22:47
…or beta.103

The development merge auto-kept this branch's stale vue (^2.6 || ^3.0) and
vue-frag (^1.0.0) instead of development's ^2.7.16 / ^1.4.3. The stale
vue spec mismatched overrides.vue (^2.7.16), tripping npm EOVERRIDE and
leaving the lockfile out of sync (npm ci EUSAGE). Take development's
values and regenerate the lockfile cleanly so npm ci installs beta.103.
…anifest

OR's tests/validate-manifest.js crashed on the new src/manifest.json:
ajv-formats@2 expects ajv@8 but a transitive ajv@6 resolves (addFormats
reads undefined ajv.opts.code), and ajv@6 can't compile the draft-2020
schema. This path never ran before because OR had no manifest. Wrap
addFormats + ajv.compile so any setup failure degrades to the existing
structural lint instead of crashing the validate gate.

Also add an empty 'pages': [] to the nav-only manifest (the structural
lint requires a pages array; it's valid + clarifies intent) and a
@param on handleNavigate.
Two files carried lint errors from an earlier coverage retrofit (also
red on development's own Code Quality):

- ObjectDetails.vue: NcLoadingIcon/BPagination/ExclamationThick/OpenInNew
  were imported and used in the template but never registered in
  components:{}, so no-unused-vars flagged the imports. Register them
  (correct fix — the template references them).
- DashboardIndex.vue: the <script setup> block's ensureIntegrationRegistry()
  call sat between the setup imports and the Options <script> imports, so
  import/first flagged all 7 Options-block imports. Move the import + call
  into the Options block after its imports; <script setup> keeps only the
  template-exposed store imports.
@rubenvdlinde rubenvdlinde merged commit 93f0dc1 into development May 25, 2026
3 checks passed
@rubenvdlinde rubenvdlinde deleted the feat/manifest-driven-nav branch May 25, 2026 23:15
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant