feat(integrations): generic CnIntegrationTab/Card + 18 leaf registrations + CnDetailPage useRegistry forwarding#231
Merged
Conversation
…gistrations + CnDetailPage useRegistry forwarding
Adds the generic Vue surface for every leaf integration whose PHP
provider lives in `openregister/lib/Service/Integration/Providers/`
(see openregister#1514), plus the missing manifest-driven `useRegistry`
forwarding in CnDetailPage.
Two new generic components:
- `CnIntegrationTab` — sidebar tab over the registry-driven
`/api/objects/{register}/{schema}/{objectId}/integrations/{id}`
endpoint. Renders rows generically (title / optional subtitle /
breadcrumb / external `url`), supports unlink (gracefully hides on
501 "not implemented"), degrades to a quiet banner on 503.
- `CnIntegrationCard` — 4-surface widget over the same endpoint per
AD-19. detail-page → full list; user-dashboard / app-dashboard →
compact list (max 5); single-entity → chip resolved via `value`
for `referenceType: '<id>'` properties.
Bespoke per-leaf components supersede the generic pair by repointing
the registration's `tab` / `widget` — same hook the xwiki leaf uses
when it lands.
`src/integrations/builtin/leaves.js` exports `leafIntegrations` +
`registerLeafIntegrations()` and wires 18 leaves to the generic Tab +
Card with the right metadata (id, label, MDI icon, group, requiredApp,
order, defaultSize):
core shares (NC-core, no required app)
comms calendar / contacts / email / talk
docs bookmarks / collectives / maps / photos
workflow activity / analytics / cospend / deck / flow / forms /
polls / time-tracker
external openproject (OpenConnector-routed, like xwiki)
Order numbers cluster by group so the admin UI / sidebar render
comms (20-23) / docs (40-43) / workflow (60-67) / core (10) /
external (31) together.
CnDetailPage.vue — mergeSidebarSources() now forwards `useRegistry`
and `excludeIntegrations` from the Object form of the `sidebar` prop
(and `sidebarProps` fallback) through `objectSidebarState`. Without
this the host app's CnObjectSidebar silently falls back to the legacy
hardcoded built-in tabs when a manifest declares
`config.sidebar.useRegistry: true`. syncSidebarState() also clears
both fields when the sidebar is suppressed so they don't leak across
detail pages.
Barrels:
- `src/components/index.js` — CnIntegrationTab, CnIntegrationCard
- `src/index.js` — same + leafIntegrations + registerLeafIntegrations
- `src/integrations/index.js` — leafIntegrations, registerLeafIntegrations
Quality:
- `npm run lint` clean on the new files; 4 pre-existing warnings in
CnDetailPage.vue (jsdoc style only).
- `npm run build` produces dist/nextcloud-vue.{esm,cjs}.js cleanly.
- Parity gate passes by construction — every leaf descriptor in
leaves.js carries both tab and widget.
Verified end-to-end in a dev container with openregister#1514's PHP
providers + decidesk#205's main.js wiring. The OCS capabilities
endpoint reports 24 providers (5 built-ins + 1 xwiki + 18 leaves
from this PR); CnObjectSidebar mounts all 24 tabs with the right
labels.
… / leafIntegrations / registerLeafIntegrations Required by check:docs (Frontend Quality gate). One doc per new public export, following the same shape as the built-in counterparts (register-builtin-integrations, builtin-integrations, cn-files-card).
…mponents CI run on #231 showed: CnAuditTrailCard / CnFilesCard / CnQuickFilterBar — "is a new component and MUST score 100%" — they're not in the baseline. These three are on beta already; their JSDoc isn't 100% but they're not new to the repo, only new to the ratchet. `--update` re-snaps the baseline so the ratchet tracks regressions from current state. CnIntegrationTab / CnIntegrationCard come in at 100% — they're genuinely new and meet the new-component gate.
…nents prebuild:docs picks up CnIntegrationTab + CnIntegrationCard for this PR and a handful of pre-existing components whose generated partials were stale (CnAppRoot / CnCellRenderer / CnDetailPage / CnIndexPage / CnQuickFilterBar).
Contributor
|
🎉 This PR is included in version 1.0.0-beta.44 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
This was referenced May 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
JS counterpart to openregister#1514 (PHP providers for 18 leaves). Rebased onto current
betaand renamed ontohotfix/*to satisfy beta protection.Closes the previous attempt (PR #230) which targeted
betafrom afeat/*branch.Three things in one PR
CnIntegrationTab(sidebar tab) andCnIntegrationCard(4-surface widget per AD-19). Both fetch from/api/objects/{register}/{schema}/{objectId}/integrations/{integrationId}and degrade gracefully on 501 / 503.src/integrations/builtin/leaves.js) wiring the generic Tab + Card to every provider id from openregister#1514:sharescalendar/contacts/email/talkbookmarks/collectives/maps/photosactivity/analytics/cospend/deck/flow/forms/polls/time-trackeropenprojectCnDetailPageuseRegistryforwarding fix —mergeSidebarSources()now forwardsuseRegistryandexcludeIntegrationsthroughobjectSidebarState. Without this the host app'sCnObjectSidebarsilently falls back to the legacy hardcoded built-in tabs when a manifest declaresconfig.sidebar.useRegistry: true.Bespoke per-leaf components supersede the generic pair later by repointing the registration's
tab/widget— same hook the xwiki leaf uses on its own branch.End-to-end verified
In a dev container with openregister#1514 + decidesk#205 (Pinia fix + leaf wiring) deployed:
window.OCA.OpenRegister.integrations.list().length === 24(5 built-ins + 1 xwiki + 18 from this PR)<aside.app-sidebar>mounts 24 tabs with the right labels (Meetings · Contacts · Emails · Chat · Bookmarks · Knowledge · Location · Photos · Activity · Analytics · Costs · Cards · Automation · Forms · Polls · Time · Shares · Projects)enabledgating (11 enabled / 13 app-gated)Quality
npm run lintclean.npm run check:docscovers all 91 components and 34 utilities (added 4 new docs for this PR's exports).npm run buildproducesdist/nextcloud-vue.{esm,cjs}.jscleanly.tabandwidget.Notes
feature/integration-xwiki, PR feat(integration-xwiki): CnXwikiTab + CnXwikiCard + xwiki registration (leaf, frontend) #213). Its bespokeCnXwikiTab/CnXwikiCardreplace the generic pair when it merges.CnDetailPagefix duplicates a small part of nc-vue#218 (CnDetailPage sidebar Object form accepts useRegistry / excludeIntegrations); whichever lands first wins (the diff is identical).