Skip to content

feat: re-apply openbuilt-page-editor onto the Tier-4 shell (closes #4)#23

Merged
rubenvdlinde merged 1 commit into
developmentfrom
feature/page-editor-reapply
May 12, 2026
Merged

feat: re-apply openbuilt-page-editor onto the Tier-4 shell (closes #4)#23
rubenvdlinde merged 1 commit into
developmentfrom
feature/page-editor-reapply

Conversation

@rubenvdlinde
Copy link
Copy Markdown
Contributor

Re-applies the already-written, already-reviewed openbuilt-page-editor spec (chain spec #4 — the visual manifest page designer) onto the current development branch. The original PR #4 (feature/spec-openbuilt-page-editor) was never merged because it shipped a competing replacement ApplicationEditor.vue shell + a Pinia store refactor that conflicted with the Tier-4 manifest shell that landed in #20. That structural blocker is now gone; this PR grafts #4's new content on top of the current shell.

What's in

  • src/views/PageDesigner.vue — three-pane visual manifest page designer: page list + menu-tree on the left, per-page-type sub-editor in the centre, validator error list on the right. Controlled component (manifest / slug props, update:manifest event).
  • src/components/page-editor/** — page-type sub-editors (index, detail, dashboard, form, logs, settings, chat, files, custom, stub), PageListEditor, MenuTreeEditor, and the fields/* builders (ActionBuilder, ColumnBuilder, FormFieldBuilder, LayoutItemBuilder, SidebarSectionBuilder, SidebarTabBuilder, WidgetBuilder).
  • src/composables/{useLivePreview,useManifestValidator,useRegisterPicker}.js.
  • src/store/modules/applicationEditor.js — editor-local manifest state slice (Pinia; CRUD delegated to the shared object store).

Wiring into the Tier-4 shell

  • src/customComponents.js registers PageDesignerView.
  • src/manifest.json adds the page { "id": "PageDesigner", "route": "/builder/:slug/pages", "type": "custom", "component": "PageDesignerView" }, placed after SchemaDesigner and before the BuilderHost wildcard so route ordering is preserved. No top-level menu entry — it's a per-virtual-app sub-page reached from the virtual-app context, like the schema designer's /builder/:slug/schemas.
  • ApplicationEditor.vue's merged Editor / History / Diff tabs are not touched.

Tooling

  • vuedraggable added to dependencies (used by PageListEditor / MenuTreeEditor).
  • eslint.config.js: no-unused-vars varsIgnorePattern now also allows leading-underscore discarded-destructure vars (const { foo: _foo, ...rest } = x).
  • vitest.config.js: vuedraggable added to inline deps + aliased to a stub; the @conduction/nextcloud-vue stub gains a useAppManifest export.
  • tests/vitest/stubs/{nextcloud-auth,nextcloud-router,vuedraggable}.js added.

Tests

tests/views/PageDesigner.spec.js, tests/components/page-editor/{FormPageEditor,IndexPageEditor,MenuTreeEditor,PageListEditor}.spec.js, tests/composables/{useLivePreview,useManifestValidator}.spec.js, tests/e2e/page-designer.spec.ts, tests/integration/openbuilt-page-editor.postman_collection.json.

Quality gates

  • npm run lint (eslint) — clean
  • npm run stylelint — clean (rule-deprecation warnings only)
  • npm run build (webpack) — compiles (pre-existing asset-size warnings only)
  • npx vitest run173 tests pass (84 baseline + 89 new)
  • PHP gates (PHPCS / PHPMD / Psalm / PHPStan) and PHPUnit / Newman: pre-existing debt on development untouched — this changeset is frontend-only and adds no PHP. PHPCS reports 117 pre-existing errors across 14 unrelated controllers/services (named-parameter sniff vs. the documented Entity-setter rule); not in scope for this re-application.

Known limitation

PageDesigner.vue is a controlled component (it expects a parent to feed/persist the manifest). The original #4 wired that plumbing through the competing ApplicationEditor.vue Design tab + applicationEditor.js store; since that shell is intentionally not re-introduced here, PageDesigner is registered as the /builder/:slug/pages route view but currently renders with the default empty manifest — the load/save integration (and the object.jscreateObjectStore migration that applicationEditor.js depends on) is a follow-up.

Grafts the never-merged #4 (feature/spec-openbuilt-page-editor) content
onto the current Tier-4 manifest shell, without the competing
ApplicationEditor.vue replacement / store refactor that originally
blocked it.

New:
- src/views/PageDesigner.vue — three-pane visual manifest page designer
  (page list + menu tree / per-page-type sub-editor / validator panel).
- src/components/page-editor/** — page-type sub-editors (index, detail,
  dashboard, form, logs, settings, chat, files, custom, stub),
  PageListEditor, MenuTreeEditor, and the fields/* builders.
- src/composables/{useLivePreview,useManifestValidator,useRegisterPicker}.js
- src/store/modules/applicationEditor.js — editor-local manifest state
  slice (Pinia; CRUD delegated to the shared object store).

Wiring:
- customComponents.js registers PageDesignerView.
- manifest.json adds the /builder/:slug/pages page (after SchemaDesigner,
  before the BuilderHost wildcard). No top-level menu entry — it is a
  per-virtual-app sub-page like the schema designer.
- ApplicationEditor.vue's Editor/History/Diff tabs are untouched.

Tooling:
- vuedraggable added to dependencies (used by PageListEditor/MenuTreeEditor).
- eslint.config.js: no-unused-vars varsIgnorePattern now also allows
  leading-underscore discarded-destructure vars.
- vitest.config.js: vuedraggable added to inline deps + aliased to a stub;
  conduction-nextcloud-vue stub gains a useAppManifest export.
- tests/vitest/stubs/{nextcloud-auth,nextcloud-router,vuedraggable}.js added.

Tests: PageDesigner.spec.js, page-editor component specs, composable specs,
the page-designer e2e spec, and the page-editor Postman collection.

Quality gates: eslint, stylelint, webpack build, and vitest (173 tests)
all green. PHPCS/PHPMD/Psalm/PHPStan and PHPUnit/Newman pre-existing
debt on development is untouched (this changeset is frontend-only).
@github-actions
Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openbuilt @ 487458f

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 100/100
npm ✅ 432/432
PHPUnit
Newman
Playwright ⏭️

Coverage: 0% (0/19 statements)


Quality workflow — 2026-05-12 09:55 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde force-pushed the feature/page-editor-reapply branch from e12b3ed to 88929a2 Compare May 12, 2026 09:55
@rubenvdlinde rubenvdlinde merged commit c97f964 into development May 12, 2026
31 of 45 checks passed
@rubenvdlinde rubenvdlinde deleted the feature/page-editor-reapply branch May 12, 2026 09:57
rubenvdlinde added a commit that referenced this pull request May 12, 2026
…page-editor (#24)

Both chain specs are now on development (PRs #22, #23), so move their change
dirs to openspec/changes/archive/ and fold their requirements into
openspec/specs/:
- openbuilt-templates-marketplace → openbuilt-template-catalogue
- openbuilt-page-editor            → openbuilt-page-designer, openbuilt-runtime

(The page-editor change dir wasn't carried over with PR #23, so it's brought
in here from the original feature branch and archived in the same commit.)
`openspec validate --specs` → 8/8 pass; no active changes remain. All 9
chain specs + the Tier-4 shell refactor are landed.
@github-actions
Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openbuilt @ d74edeb

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 100/100
npm ✅ 432/432
PHPUnit
Newman
Playwright ⏭️

Coverage: 0% (0/19 statements)


Quality workflow — 2026-05-12 09:59 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant