feat: re-apply openbuilt-page-editor onto the Tier-4 shell (closes #4)#23
Merged
Merged
Conversation
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).
Contributor
Quality Report — ConductionNL/openbuilt @
|
| 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.
e12b3ed to
88929a2
Compare
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.
Contributor
Quality Report — ConductionNL/openbuilt @
|
| 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.
This was referenced May 12, 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.
Re-applies the already-written, already-reviewed
openbuilt-page-editorspec (chain spec #4 — the visual manifest page designer) onto the currentdevelopmentbranch. The original PR #4 (feature/spec-openbuilt-page-editor) was never merged because it shipped a competing replacementApplicationEditor.vueshell + 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/slugprops,update:manifestevent).src/components/page-editor/**— page-type sub-editors (index,detail,dashboard,form,logs,settings,chat,files,custom,stub),PageListEditor,MenuTreeEditor, and thefields/*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.jsregistersPageDesignerView.src/manifest.jsonadds the page{ "id": "PageDesigner", "route": "/builder/:slug/pages", "type": "custom", "component": "PageDesignerView" }, placed afterSchemaDesignerand before theBuilderHostwildcard 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
vuedraggableadded todependencies(used byPageListEditor/MenuTreeEditor).eslint.config.js:no-unused-varsvarsIgnorePatternnow also allows leading-underscore discarded-destructure vars (const { foo: _foo, ...rest } = x).vitest.config.js:vuedraggableadded to inline deps + aliased to a stub; the@conduction/nextcloud-vuestub gains auseAppManifestexport.tests/vitest/stubs/{nextcloud-auth,nextcloud-router,vuedraggable}.jsadded.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) — cleannpm run stylelint— clean (rule-deprecation warnings only)npm run build(webpack) — compiles (pre-existing asset-size warnings only)npx vitest run— 173 tests pass (84 baseline + 89 new)developmentuntouched — 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.vueis a controlled component (it expects a parent to feed/persist themanifest). The original #4 wired that plumbing through the competingApplicationEditor.vueDesign tab +applicationEditor.jsstore; since that shell is intentionally not re-introduced here,PageDesigneris registered as the/builder/:slug/pagesroute view but currently renders with the default empty manifest — the load/save integration (and theobject.js→createObjectStoremigration thatapplicationEditor.jsdepends on) is a follow-up.