feat(page-editor): v1.1 — structured Logs/Settings/Chat/Files/Custom editors + validator inline marks + undo/redo#35
Merged
Conversation
…sable
- useManifestValidator: add errorMap ({prefix -> {hasError, message}})
+ errorFor(prefix); JSON-Pointer boundary matching so /pages/1 does not
swallow /pages/10/...; register() now takes an optional second arg.
- new useManifestHistory: bounded (default 50) undo/redo stack — no-ops
on structurally identical states, truncates the redo tail on push.
- new InlineFieldMark presentational component + pageEditorValidation
mixin (inject pageEditorValidator -> register/unregister config keys,
markFor/isInvalid helpers); optional injection so sub-editors still
mount standalone.
Refs #9 (5.5, OQ-1).
…itors + inline marks on all 9 sub-editors - LogsPageEditor (4.4): register+schema OR source one-of (OR-REST pickers), columns via ColumnBuilder. - SettingsPageEditor (4.5) + SettingsSectionBuilder: saveEndpoint, sections|tabs XOR, each section one-of fields/component(+props)/widgets (built-in widget types version-info, register-mapping, component). - ChatPageEditor (4.6): conversationSource OR postUrl one-of + optional schema. - FilesPageEditor (4.7): folder path + allowedTypes tag input. - CustomPageEditor (4.9): customComponents key (free-text, datalist when preview registry available) + props JSON. - All editors keep unsurfaced config keys on update (lossless round-trip). - Index/Detail/Dashboard/Form: wired to the pageEditorValidation mixin + InlineFieldMark + aria-invalid. Refs #9 (4.4-4.9, 5.5).
…orValidator
- toolbar with Undo / Redo buttons (canUndo/canRedo gating) above the
three panes; Ctrl+Z undo, Ctrl+Shift+Z / Ctrl+Y redo via a document
keydown listener (removed on destroy).
- seeds + feeds useManifestHistory from the manifest watcher (push
no-ops on identical states, so the controlled-component echo is free);
undo/redo re-emit the historical manifest without re-pushing.
- provide()s pageEditorValidator { register, unregister, errorFor } that
maps a sub-editor's config key to /pages/<selected>/config/<key> and
reads back the validator's errorMap for inline marks.
Refs #9 (OQ-1, 5.5).
…story, undo/redo - LogsPageEditor / SettingsPageEditor / SettingsSectionBuilder / ChatPageEditor / FilesPageEditor / CustomPageEditor specs — mount with sample config, drive interactions, assert update:config payload shape and lossless round-trip (task 7.1). - InlineFieldMark + pageEditorValidation mixin spec. - useManifestValidator.inline-marks spec (errorMap/errorFor, boundary, suffix forms, register/unregister). - useManifestHistory spec (push/no-op/undo/redo/bounds/reset/clone). - PageDesigner.undo-redo spec (controlled-component echo, toolbar, keybindings, no-thrash, redo-tail truncation). 280 vitest specs green (was 182). Refs #9 (7.1).
16 tasks
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 12:47 UTC
Download the full PDF report from the workflow artifacts.
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.
Implements the bulk of #9 (
openbuilt-page-editor v1.1 follow-up).Landed
Page-type structured editors (5 stubs → real editors)
LogsPageEditor— one-of picker between (register + schema, via the OR-REST pickersIndexPageEditoruses) OR asourcestring; columns list reusingColumnBuilder.SettingsPageEditor+ newSettingsSectionBuilder—saveEndpointfield;sectionsvstabsXOR (radio switch, tabbed mode owns nested section builders); each section declares exactly-one-offields[]/component(+props) /widgets[]with built-in widget typesversion-info,register-mapping,component(componentName).ChatPageEditor—conversationSourceORpostUrlone-of + optionalschema.FilesPageEditor— folder path + an allowed-types tag input (datalist of common MIME types / extensions).CustomPageEditor—componentregistry key (free-text, plus a<datalist>of known keys when a live-preview registry is available) + apropsJSON textarea (parse errors surfaced inline, no emit on invalid JSON).SUB_EDITOR_MAPinPageDesigneralready pointed at these names;StubPageEditorstays the fallback for unknown types. Every editor keeps config keys it doesn't surface onupdate(lossless round-trip).5.5 Validator inline marks (REQ-OBPD-011)
useManifestValidatorgainserrorMap({ prefix → { hasError, message } }) +errorFor(prefix), with JSON-Pointer boundary matching so/pages/1doesn't swallow/pages/10/...(and<pointer> is required/<pointer>: <msg>suffix forms still match).InlineFieldMarkpresentational component +pageEditorValidationmixin: sub-editorsinjectthepageEditorValidatorPageDesignerprovides,register/unregistertheir top-level config keys, setaria-invalidand render an inline<span role="alert">next to each field. Injection is optional so each editor still mounts standalone. The right-pane error list is kept as the overview.OQ-1 Undo/redo
useManifestHistorycomposable: bounded (default 50) stack, no-ops on structurally-identical states, truncates the redo tail on a fresh push, exposescanUndo/canRedo.PageDesignertoolbar gains Undo/Redo buttons;Ctrl+Zundo,Ctrl+Shift+Z/Ctrl+Yredo via adocumentkeydown listener (removed on destroy). History is fed from the manifest watcher; undo/redo re-emit the historical manifest and (becausepushno-ops on identical states) the controlled-component echo doesn't thrash the stack.PageDesignerHost's save flow is untouched.7.1 Tests
New vitest specs for
LogsPageEditor,SettingsPageEditor,SettingsSectionBuilder,ChatPageEditor,FilesPageEditor,CustomPageEditor,InlineFieldMark+ the mixin,useManifestValidator.inline-marks,useManifestHistory,PageDesigner.undo-redo. 280 vitest specs green (was 182).npm run lint/npm run stylelintclean;npm run buildcompiles.Deferred (residual #9)
useManifestValidatordebounce + 7.4useLivePreviewalready exist; 7.5/7.6 Playwright e2e depend on chain spec Apply bootstrap-openbuilt — core implementation (sections 1–3) #2's live preview)#9 stays open with that residual.