This repository was archived by the owner on May 29, 2026. It is now read-only.
fix(wizard): mount Add action, footer nav, namespaced seed schemas + create-app tutorial#70
Merged
Conversation
… seed schema slugs Three integration bugs that broke the create-app user flow, plus the tutorial that walks through it end-to-end. 1) actionsComponent placement (#66) — CnPageRenderer reads page.actionsComponent at page top-level, NOT page.config.actionsComponent. Spec F's finisher had moved it inside config to silence a manifest-shape test; that broke the real CnPageRenderer slot pathway. Moved back to top-level on VirtualApps AND VirtualAppDetail page entries. Added config.showAdd: false to suppress the default Add Item button (cosmetic — investigation in apply-notes). 2) Wizard footer nav (Next/Back/Create) — CreateApplicationWizard.vue used <template #actions>, but NcModal has no actions slot. Buttons rendered nowhere. Moved into an inline .wizard__footer div at the bottom of the modal body, with border-top + flex layout. 3) Schema-slug uniqueness on per-version register seeding — ApplicationCreationService::provisionRegister fed the seed schema slug ('hello-message') verbatim into N registers. OR enforces slug uniqueness per organisation, so the second register's seed failed with a Postgres unique-constraint violation. Now namespaced to {appSlug}-{versionSlug}- prefix so 'test-app-development-hello-message' and 'test-app-production-hello-message' coexist. 4) Tutorial — docs/tutorials/create-a-virtual-app.md with 5 verified screenshots walking through the wizard (Basics → Preset → Review). Captures the troubleshooting context for follow-up issues #66/#67/#68/#69. 5) info.xml version 0.2.0 → 0.3.1 to invalidate Nextcloud's static-asset cache (browser was clinging to the old openbuilt-main.js until ?v= changed). Remaining wizard blocker: ApplicationVersion saveObject reports name/slug/ manifest/register/application missing despite payload carrying all 7 required fields. To be filed as a new follow-up issue alongside the existing #66-#69.
Contributor
Quality Report — ConductionNL/openbuilt @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ❌ | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-16 09:49 UTC
Download the full PDF report from the workflow artifacts.
closes #71) OR's saveObject runs full-schema 'required[]' validation on every call, whether the UUID is set (UPDATE) or not (CREATE). There is no PATCH semantics — passing { promotesTo: <uuid> } + an existing UUID was rejected because OR didn't merge the payload with the existing record before validating; it just validated the partial payload alone and correctly reported the other required fields as missing. Fix: keep the full version payload from the create step in $state['versionPayloads'][$versionSlug], then merge the patched field (promotesTo or productionVersion) and pass the merged payload back to saveObject along with the existing UUID. OR then routes the call as an UPDATE with a fully-validated payload. Same fix applied at both partial-update sites: - Step 4 (chain-wiring): payload includes name/slug/manifest/register/ semver/status/application + the new promotesTo target. - Step 5 (set Application.productionVersion): payload includes the Application's name/slug/description/permissions + the new productionVersion pointer. Also adds versionPayloads to the rollback state shape so the merge step has the data it needs. Verified end-to-end via visual smoke: - Wizard opens, advances through Step 1 → 2 → 3 → Create - App created (URL changes to /applications/<uuid>) - Detail page renders with KPI grid + structural widgets - New app appears in Virtual apps index Tutorial updated with success-state screenshots (app detail page, index after wizard close).
Contributor
Quality Report — ConductionNL/openbuilt @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ❌ | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-16 10:41 UTC
Download the full PDF report from the workflow artifacts.
CnDetailPage's #header slot only forwards presentational props (title / description / icon), NOT the resolved object. The header component's '$props.object' was always null, so 'application' fell back to the 'Untitled application' translation and the version pills + name + status never rendered. Fix: revert 'application' to data, and have refreshApplication fetch the Application record from OR's objects API by UUID (resolved from the route params when objectId prop is missing). mounted() now runs the fetch unconditionally when application is empty. Verified end-to-end: 'Permit Tracker' (the wizard-created app) now shows its real name, status, owner role, and Production version pill in the hero. Tutorial screenshot updated. Three small cosmetic issues remain (description rendering as record field count, Register slug truncated, development version pill not rendered alongside Production) — file as follow-up issues, not blocking the full flow.
Contributor
Quality Report — ConductionNL/openbuilt @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ❌ | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-16 11:02 UTC
Download the full PDF report from the workflow artifacts.
…reenshots Companion to docs/tutorials/create-a-virtual-app.md. Walks through the maintainer dashboard, schema list (per-version), version switching, and the promote flow. Honestly documents which steps currently work and which have known follow-up bugs: - Detail page hero + KPIs + widgets \xe2\x9c\x85 work - Schema list per version \xe2\x9c\x85 works (namespaced slugs visible) - Schema detail / edit \xe2\x9d\x8c 404s on namespaced slug - Version URL routing \xe2\x9c\x85 `?_version=` honoured - Development pill rendering \xe2\x9a\xa0 only Production renders - Promote dialog \xe2\x8f\xb8 untested end-to-end pending schema edit Two new screenshots: - update-01-schemas-list.png: schema list with namespaced slugs - update-02-schema-detail-404.png: schema not found error (with caveat) Cross-links the related follow-up issues so the doc stays useful as the remaining bugs land.
This was referenced May 16, 2026
Contributor
Quality Report — ConductionNL/openbuilt @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ❌ | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-16 11:07 UTC
Download the full PDF report from the workflow artifacts.
This was referenced May 16, 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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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
Three integration bugs surfaced by visual smoke on the merged chain, all fixed, plus a tutorial that walks through the wizard end-to-end.
What was broken
What's in this PR
Companion PR
The nc-vue side of #67 is in conductionnl/nextcloud-vue PR #... (`fix/cnindexpage-register-object-type-positional`). It fixes `CnIndexPage` + `CnLogsPage` to pass positional args to `registerObjectType`. Without that fix the index page still 404s on OR.
Remaining wizard blocker (new follow-up)
After all the above is applied, clicking Create in the wizard now reaches the backend cleanly, but OR returns:
…even though the wizard payload populates all 7 required ApplicationVersion fields (name / slug / manifest / register / semver / status / application). Probable causes:
To file as a new issue with the steps to reproduce. The wizard's UI flow works end-to-end (verified in tutorial screenshots); only the final save is blocked.
Visual-smoke evidence
Tutorial screenshots in `docs/tutorials/img/` show:
Test plan
🤖 Generated with Claude Code