Skip to content

feat: library batch 10 - #1777

Merged
rubenvdlinde merged 33 commits into
developmentfrom
integration/batch-10
Oct 18, 2026
Merged

rubenvdlinde merged 33 commits into
developmentfrom
integration/batch-10

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Batch 10 of the library changes. Each branch was merged at its newest origin head with --no-ff (no rebase), onto development 3a209df (batch 9, 2.99.0). Every head matched the coordinator's list, and none was behind development.

Included (11)

  • comp/CnAppNav (b121509): the active wash scoped to the board look, and the caption pencil inline.
  • feat/settings-fields-section (eff3298): L31's follow-up to feat: round 12 board look, batch 9 #1774: dotted keys, saveParams, and the OCS header.
  • comp/NcNoteCard (eb1561c)
  • comp/CnDialog (261f010)
  • comp/CnRecordListWidget (5822cae): a {count:<field>=<value>} token in the header note.
  • comp/record-list-string-rows (df2176e): rows that are plain strings, and presentation: "notice".
  • comp/CnFlowBoard (05fba1a)
  • comp/CnFactsWidget (8bdd47f)
  • comp/CnIndexPage (01ca41c): headerMeta counts another list (config.headerMetaCounts), and a page tab can be drawn for admins only or for one permission only.
  • comp/CnDetailPage (3e72100): actionsMenu.showMarkUnread / showOpenSidebar, and admin entries tagged.
  • comp/CnSetupWizard (d9c3ca2): the app's name and catalog from an admin page, and a choice step's note / footnote.

Dropped (2): each one breaks a gate on its own branch

  • comp/CnChoiceCards (8f773a6): check:docs exits 1. The branch adds a readonly prop to CnChoiceCards.vue, but src/components/CnChoiceCards/CnChoiceCards.md does not mention it ("prop readonly (readonly) not mentioned in doc").
  • comp/CnGroupedCardsWidget (34484a4): eslint exits 1. Its src/index.js puts CnGroupedCardsWidget between CnDeviceFramesWidget and CnDialog (perfectionist/sort-named-exports: "Expected "CnDialog" to come before "CnGroupedCardsWidget""). The same error appears when linting the branch's own src/index.js, not only after the merge.

Both were dropped rather than fixed here. The branch was rebuilt without them before the push, and the final tree differs from the full merge by exactly those two branches' files.

Merge notes

  • CnRecordListWidget / record-list-string-rows: the only conflict was the content prop's JSDoc block. Both descriptions are kept (the {count:…} token, then string rows and notice). Neither feature's code conflicted, and all nine CnRecordListWidget* specs pass.
  • l10n: CnSetupWizard, CnFlowBoard and CnDetailPage add strings. The catalogues merged key by key through the chore(l10n): merge the catalogues key by key #1770 driver without conflicts, and the Dutch ratchet passes, so every new string has Dutch and the baseline is unchanged.

Schema: one bump, 2.123.0

Development was at 2.122.0. The batch takes 2.123.0 and collects every new manifest key:

  • setup.steps[].note and footnote (choice step), from CnSetupWizard
  • config.headerMetaCounts (index page), from CnIndexPage
  • actionsMenu.showMarkUnread and actionsMenu.showOpenSidebar, from CnDetailPage

CnSetupWizard's branch-level 2.123.0 hash covered only its own keys. It is replaced by one entry recorded over the full batch schema with scripts/record-manifest-schema-hash.js, and the version test's comment names all three. No other branch adds a typed manifest key: CnIndexPage's adminOnly / permission live on config.pageTabs, which the schema does not type, and the record-list presentation / variant / lead keys are widget content, which is untyped. The compiled validator is regenerated by pretest and is not committed.

Gates (local, all through heavy.sh, on the final tree c3f1790)

Gate Result
npm test (full jest) 1403/1403 suites, 14676/14676 tests, exit 0
tests/schemas 573/573, exit 0
tests/css 126/126, exit 0
tests/l10n (Dutch ratchet) 91/91, exit 0
npm run check:a11y 26/26 suites, 140/140 tests, exit 0
eslint (src/ eslint/ testing/ tests/ e2e/) exit 0 (0 errors, warnings as before)
stylelint exit 0
check:jsdoc exit 0
check:docs exit 0
check:docs-mdx exit 0
check:docs-fresh exit 0 (reference pages regenerated and committed)
Playwright, full suite, 4 workers 452 passed, 1 failed, 2 skipped, exit 1
Playwright rerun of the failure, 2 workers 1/1 passed, exit 0

The one full-run failure was e2e/l16-spawned-wizard.e2e.js: after the close click, the dialog was still counted once within the default assertion window. It passes on the rerun, so this is the close transition running long under load, not a regression. Playwright ran against the repo's Vite harness on its own port, with the browser installed under this lane's own PLAYWRIGHT_BROWSERS_PATH.

Not run locally: the build, the Vue 3 compile sweep and check:smoke. CI covers those.

AI disclosure: this batch was put together with Claude Code (claude-opus-5-5). The coordinator reviews and merges it. Commits carry Assisted-by: ClaudeCode:claude-opus-5-5.

🤖 Generated with Claude Code

…as fields, on a shared CnSettingsField

Assisted-by: ClaudeCode:claude-opus-5-5
…n image field uploads at once

Assisted-by: ClaudeCode:claude-opus-5-5
…under a theme

The active entry painted its primary-light wash on the link as well as the
entry, so a theme that tints the entry (thematiq's accent wash, as DqZijbalk
draws it) was covered by the link. The wash now sits on the entry only.

The red attention count wrote its number in --color-error-text, which is the
error colour for text on a light ground (#8A0000 under thematiq), so the
number was dark red on red. It is white now.

Assisted-by: ClaudeCode:claude-opus-5-5
…r nc-vue's mix

NcAppNavigationItem paints an active entry with a 16% (22% hovered) primary
mix at `!important`. Moving the board wash from the link to the entry left
it below that rule, so the open entry showed the mix instead of
--color-primary-element-light (screens-chrome-nav-parity e2e). The entry now
carries the tonal primary at `!important`, hovered too, scoped to the board
look, and the link carries the same ground again. Outside the board look
nothing changes.

Assisted-by: ClaudeCode:claude-opus-5-5
… board look

DqZijbalk draws the "Mijn zaaktypen" pencil at the end of the caption line,
a 28px round muted button with a 16px icon that adds no height. Under
thematiq's Zuiddrecht sheet the caption is `display: block` at id strength,
so the pencil wrapped onto a 39px line of its own. In the board look the
pencil is now placed absolutely at the caption's end, 4px in.

Assisted-by: ClaudeCode:claude-opus-5-5
…itten, for every target

Assisted-by: ClaudeCode:claude-opus-5-5
NcNoteCard type="info" drew a dark edge bar and, under thematiq, the body
ink on the info ground. The boards draw an info note as a light-blue
rounded box: no bar, 12px 14px of padding, radius 8, an 18px icon 10px
before 14px text in the deep primary ink, and a bold heading line
(DqBesluit and 13 other boards). The board look now does. NcNoteCard sets
its ground and ink with `!important` and thematiq forces the ink and weight
of every p, so the ground, the ink and the heading weight carry
`!important`, scoped to the board look.

Assisted-by: ClaudeCode:claude-opus-5-5
…fields-section

# Conflicts:
#	docs/components/cn-settings-fields-section.md
#	l10n/en.json
#	l10n/nl.json
#	src/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue
#	tests/components/CnSettingsFieldsSection.spec.js
…argets get the OCS-APIRequest header

Assisted-by: ClaudeCode:claude-opus-5-5
…tion

A record list reading an endpoint that answers ["…", "…"] reads each row
as { value }: templates reach it as {value}, and without a title a row shows
the value. presentation: "notice" draws the rows as sentences in one box
toned by variant, after an optional lead with {total} (board
DqZaaktypeOverzicht, Controle). No schema change.

Assisted-by: ClaudeCode:claude-opus-5-5
A Nextcloud text field in a board dialog floated its label inside the border
and drew that border as NcInputField's 65%-transparent shadow, which on the
white dialog read as an empty band (PlanItemDialog). In a board dialog a text
field or text area now takes the board's field: its own label above the
control at 14px/600, the control 40px with a solid 1px grey border and
radius 8. A field with `labelOutside` keeps the app's label and gets the
same control.

Assisted-by: ClaudeCode:claude-opus-5-5
…board choice step's intro and footnote

From an admin page the setup wizard read "Set up this app" with an English
eyebrow, and its step copy stayed in the manifest's source language:
CnAdminSettingsShell passed no `appName`, and no CnAppRoot wraps an admin
page to provide `cnTranslate`. The shell now passes its `appName` ("Dossiq
instellen, stap 1 van 3") and, when no ancestor provides one, hands down the
app's own catalog as `cnTranslate`. CnWizardDialog's default button labels,
success text and title were English literals; they now go through the
library catalog ("Wizard" added, nl "Assistent").

A choice step in the board look sets its `body` as a plain paragraph above
the options (the Nextcloud look keeps the info note), and a new `note` (or
`footnote`) draws a muted line under them, translated like the body
(DqInstellen). Manifest schema 2.123.0 adds the step's `note` and
`footnote`.

Assisted-by: ClaudeCode:claude-opus-5-5
… its count line for it

DqContracten reads "38 contracten bij 21 leveranciers" after the breadcrumb;
headerMeta could only count its own list. A page can now name other lists
in `headerMetaCounts` ({ name: { register, schema, filter? } }), each read as
one list total and filled in for `{count:<name>}`. While a count loads, or
when it fails, the note is left out rather than shown with a gap.

In the board look, when the note after the breadcrumb already carries a
count ({shown}, {total} or {count:...}) the page no longer adds its own
"{shown} of {total}" line under the title (DqPrivacy, DqContracten); a page
that sets countText keeps it.

Needs schema key: config.headerMetaCounts (added here; the schema version
and hash bump are left to the batch integration).

Assisted-by: ClaudeCode:claude-opus-5-5
…only

DqContracten's "Portaalaccounts" tab belongs to an administrator. A manifest
page tab can now carry `adminOnly` (drawn only for an instance admin, from
Nextcloud's current user) or `permission` (drawn only for a user who holds
it; with no permissions known it shows, as a menu entry does).

This hides the tab and nothing more. It is not access control: the page a
hidden tab points to must still refuse the user on the server, since anyone
can type its address. The docs row says so. A hidden tab does not shift the
counts of the tabs after it.

Assisted-by: ClaudeCode:claude-opus-5-5
A record list's header note could only say `{total}`; a checklist card says
"5 van 7 stappen klaar". `headerNote` (and the header link's label) now
fills `{count:<field>=<value>}` with the number of loaded rows whose field
reads that value. It counts the rows the list loaded, so it is exact when
`limit` covers the list; the docs say so.

Assisted-by: ClaudeCode:claude-opus-5-5
DqFlow's header has "Testen met een zaak". With `testSubject` ({ register,
schema, labelField?, label? }, manifest `config.testSubject` on a
flow-detail page) the board header draws that button. It opens a dialog
with a record picker on that register and schema, and runs the saved flow
once with the picked record as its subject; the run shows on the canvas as
any run does. An unsaved flow cannot be tested. `label` goes through the
app's catalogue; without it the button reads "Test with a record" (nl
"Testen met een record").

Assisted-by: ClaudeCode:claude-opus-5-5
…in the card

DqBezwaar's advice card has "Advies ontvangen" as a pill beside its title
and a light note band under its facts. A facts widget can now declare
`headerPill` ({ path?, text?, map?, variant?, variantMap?, colorMap? }),
read from the record like a `pill` entry and reported through its `header`
event, which the detail host draws beside the card title; nothing shows
while the value is empty. `notice` ({ text, variant? }) draws a note band
inside the card under the facts, info by default.

Assisted-by: ClaudeCode:claude-opus-5-5
…s, tag admin entries

DqZaakMeer's Actions menu has no "Markeren als ongelezen" and no "Zijbalk
openen", and each admin-only entry ends in a muted "beheerder" tag. A page
can now drop the two built-ins with `actionsMenu.showMarkUnread: false` and
`actionsMenu.showOpenSidebar: false`; omitted, both stay as before. In the
board look every entry in the admin group carries the tag ("admin", nl
"beheerder"), drawn from an attribute because the menu renders entry text
as plain text and opens outside the page.

Needs schema keys: actionsMenu.showMarkUnread and actionsMenu.showOpenSidebar
(added here; the version and hash bump are left to the batch integration).

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5

# Conflicts:
#	src/components/CnRecordListWidget/CnRecordListWidget.vue
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
One bump for the batch: the setup step's note and footnote,
config.headerMetaCounts, and actionsMenu.showMarkUnread / showOpenSidebar.
The hash is recorded over all three; the branch-level 2.123.0 entry is replaced.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/nextcloud-vue @ e4b10bb

Check PHP Vue Security License Tests
lint ⏭️
phpcs ⏭️
phpmd ⏭️
psalm ⏭️
phpstan ⏭️
phpmetrics ⏭️
eslint ✅
stylelint ✅
build ✅
test ✅
check-build ✅
check-vue3-compile ✅
check-public-safe ✅
check-journey-vocabulary ✅
check-docs ✅
check-docs-mdx ✅
check-jsdoc ✅
check-integration-parity ✅
check-peers ✅
check-docs-fresh ✅
check-a11y ✅
check-smoke ✅
composer ✅ ✅
npm ✅ ✅ 643/643
app:check-code ⏭️
info.xml ⏭️
REUSE ✅
lockfile sync ✅
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️
Hydra gates ⏭️

Quality workflow — 2026-10-18 10:16 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 86a59b9 into development Oct 18, 2026
44 checks passed
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