Phase 3 — Migrate the widget library to @conduction/nextcloud-vue
Status: planned, not started. Phases 1 (catalog deprecation) and 2 (dead-code cleanup) are done. This document is the migration plan + parity audit for the remaining work: removing launchpad's local widget renderers/forms and consuming the shared
Cn*Widget/Cn*WidgetFormlibrary from nc-vue.
Goal
Launchpad currently ships its own copy of ~36 widget renderers + config forms
under src/components/Widgets/Renderers/ and src/components/Widgets/Forms/.
nc-vue has a parallel Cn*Widget / Cn*WidgetForm set. The grid engine already
moved to nc-vue (CnWidgetGrid / CnWidgetWrapper); the widgets should follow so
launchpad keeps only the workspace shell + glue (widgetRegistry.js, the
WidgetRenderer dispatcher, the nc-widget bridge).
The reality (why this is a program, not a cleanup)
The nc-vue widget library is not finished as a public API, and not published:
- The published package launchpad consumes (
@conduction/nextcloud-vuebeta.102) ships exactly one of these components:CnTileWidget. Everything else is absent from the published dist. - In nc-vue source, the components exist as files but are not wired into the
barrel (
src/components/index.js/src/index.js) — so they are not part of the public API even locally. - nc-vue enforces a
check:docsCI gate: every barrel export must have adocs/components/<kebab>.md. None of these widgets have docs yet. - nc-vue also enforces a
check:jsdocratchet (new components require 100% prop/event/slot JSDoc) and a docgen freshness gate.
So "port to nc-vue" means: finish, export, document, test, parity-audit, and publish a ~36-component library in the shared fleet lib (consumed by OpenRegister / OpenCatalogi / Procest / Pipelinq / MyDash), then migrate launchpad onto it. That is multi-day and has fleet-wide blast radius — it cannot be done in one pass, and a half-done state breaks both repos.
Parity audit — current nc-vue readiness
exists = dir present in nextcloud-vue/src/components/; export = in the barrel;
test = has tests/components/<name>*; doc = has docs/components/<kebab>.md.
| launchpad renderer/form | nc-vue component | exists | export | test | doc |
|---|---|---|---|---|---|
| Renderers/LabelWidget | CnLabelWidget | Y | – | – | – |
| Renderers/TextDisplayWidget | CnTextWidget | Y | – | Y | – |
| Renderers/ImageWidget | CnImageWidget | Y | – | Y | – |
| Renderers/LinkButtonWidget | CnLinkButtonWidget | Y | – | Y | – |
| Renderers/HeaderWidget | CnHeaderWidget | Y | – | Y | – |
| Renderers/DividerWidget | CnDividerWidget | Y | – | – | – |
| Renderers/FilesWidget | CnFilesWidget | Y | – | Y | – |
| Renderers/PeopleWidget | CnPeopleWidget | Y | – | Y | – |
| Renderers/NewsWidget | CnNewsWidget | Y | – | Y | – |
| Renderers/QuicklinksWidget | CnQuicklinksWidget | Y | – | Y | – |
| Renderers/LinksWidget | CnLinksWidget | Y | – | Y | – |
| Renderers/MenuWidget | CnMenuWidget | Y | – | Y | – |
| Renderers/ContainerWidget | CnContainerWidget | Y | – | Y | – |
| Renderers/VideoWidget | CnVideoWidget | Y | – | Y | – |
| Renderers/CalendarWidget | CnCalendarWidget | Y | – | Y | – |
| Renderers/SpendAnalyticsWidget | CnSpendAnalyticsWidget | Y | – | Y | – |
| Renderers/NcDashboardWidget | CnNcWidgetWidget | Y | – | Y | – |
| Renderers/TileWidget | CnDashTileWidget | Y | – | Y | – |
| Forms/LabelForm | CnLabelWidgetForm | Y | – | – | – |
| Forms/TextDisplayForm | CnTextWidgetForm | Y | – | – | – |
| Forms/ImageForm | CnImageWidgetForm | Y | – | Y | – |
| Forms/LinkButtonForm | CnLinkButtonWidgetForm | Y | – | – | – |
| Forms/HeaderForm | CnHeaderWidgetForm | Y | – |