Repository navigation
feat(site): the Zuiddrecht example site, installed and removed with one command - #1206
Merged
Merged
Conversation
… read through /api/content/news newsItem 0.4.0 (register 0.59.0) gains public, portal and audienceLabel. PublicNewsReader serves only published items staff put on this portal, never one about single children, and only photos from the portal's own published media library.
…d for the school home pages nlQuickTasks, nlNewsList, nlNewsArticle and nlEventList load on demand. nlSignIn gains a card display and is handed the portal's own ways in; nlList draws numbered steps. OpenSpec change site-school-blocks.
…ch, the account button, the footer button and contact column, and the sign-in cards
…he theme does to buttons
… secondary-button rule can hide it
…p, phone menu), designed footer, sign-in cards, motif and hero styling
…th its own name for screen readers (lane L3's shape)
…and sign-in page this demo site builds on
…ts through logoFileFor, the register test knows the new keys
…demo site places The register moves to 0.63.0 with portal 0.10.0 and newsItem 0.4.0, so the schema keys of both merged branches reach an instance on upgrade.
…the menu is folded
… read-back proof, and the two occ commands
…link list and button link open pages of the site wherever it is served
…laration is checked against the register, the widgets and its own links
…anded) The register moves to 0.65.0 with portal 0.10.0: development is at 0.64.0, and the portal keys of site-chrome-follows-the-design reach an instance only when the version moves.
…s and link lists are readable without a role, documentation
…ows and the proof are each their own class
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
October 5, 2026 17:28
Contributor
Quality Report — ConductionNL/portaliq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ❌ | ||||
| check-manifest | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ❌ | ||||
| check-reuse | ✅ | ||||
| composer | ✅ | ✅ 108/108 | |||
| npm | ✅ | ✅ 984/984 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-05 17:53 UTC
Download the full PDF report from the workflow artifacts.
Contributor
Quality Report — ConductionNL/portaliq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-reuse | ✅ | ||||
| composer | ✅ | ✅ 108/108 | |||
| npm | ✅ | ✅ 984/984 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-05 18:29 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.
What this adds
The website of Zuiddrecht, a municipality that does not exist, as a site an administrator installs with one command and removes with one command. It replaces the hand-made VNG-styled portal we show in demonstrations, which nobody can install.
OpenSpec change:
example-site-zuiddrecht.lib/Settings/sites/zuiddrecht.json: the portal record (themezuiddrecht, header search, the button "Mijn Zuiddrecht", the footer with its button and contact column), the main menu and two footer menus, 33 pages and 4 public news items. Header, footer, home and the page "Afval scheiden en ophalen" follow the approved boards (Kop, Voet, Home, Contentpagina). The other 31 pages are short new copy, so no link is dead.occ portaliq:example-site:install zuiddrechtwrites what is missing and never changes what is there. After writing it reads the instance back: per type the number found, and per created object every declared key the stored object lost. Exit 0 complete, 1 nothing done, 2 something missing or lost. It does not trust the answer of the write, because OpenRegister echoes a key the schema drops.occ portaliq:example-site:remove zuiddrechtdeletes the objects the install recorded and nothing else. A portal that was there before, or that holds content of your own, stays.--nldesign-website-nav-current-in-lineand--nldesign-website-nav-current-color. Without them the item keeps its bar.bodyas a literal, so the menu, hero heading, task labels and link lists stayed in Roboto under a set that names Fira Sans (measured: 40 of 78 text runs on the home page). Only for a portal with the designed header.nlLinkListandnlButtonLinkopen pages of the site wherever it is served. Their links were plain paths, so on a portal reached through Nextcloud (?portal=), which is how every fresh install is reached, they left the site. Link list links also take the theme's link colour instead of the browser's blue.--nldesign-emblem-grey-url), for a watermark without a tint.docs/Installation/example-site-zuiddrecht.md.Depends on
ca591037), so the diff is this change only: 29 files.zuiddrechtset its light hero and the two current-item tokens. Without it the site works: the hero is the dark blue band and the current item shows a red bar on the red line.portal0.11.0, which holds every key the declaration uses. This change adds no schema key, and its diff oflib/Settings/portaliq_register.jsonagainst development is empty. An instance still below 0.66.0 gets the keys fromocc maintenance:repair; the install command names every key that was not kept and exits 2 when that has not happened.Files of this change
lib/Settings/sites/zuiddrecht.json,lib/Service/ExampleSite/*(7 classes),lib/Command/ExampleSiteInstall.php,lib/Command/ExampleSiteRemove.php,appinfo/info.xml,css/site-theme.css(the blocks markedexample-site-zuiddrecht),src/site/widgets/nlLinkList,nlButtonLink,nlActionGroup, theemblem-greyvariant inPortalThemeResolver,PortalPageControllerandtemplates/site.php,package.json(the new check),docs/Installation/example-site-zuiddrecht.md,openspec/changes/example-site-zuiddrecht, and the tests below.Verified
All of this ran on the branch after development was merged in (head
defafc7d).ExampleSiteInstallerTest(against the shipped declaration and a store that drops unknown keys, refuses a page, ignores filters),ExampleSiteStoreTest,ExampleSiteCommandsTest: 24 tests green. 17 mutations tried in two rounds on the installer, remover, record and proof: five survived, four are caught now by added tests, one is equivalent (the guard for a portal row without an id).tests/example-site.spec.mjs, incheck:specs. It holds the declaration against the register's schemas (a key a schema does not declare is an error), the widgets the site renders and the props each takes, its own links, and the house style. Ten controls tried, each fails the right test. Rerun after the merge against a register from before feat(site): the header, footer, sign-in page and motif of the school designs #1202: it fails and namesportal.headerSearch,portal.accountLabelandportal.footer.cta.composer check:strict, full run: exit 1.origin/development(ca591037) beside this one, same PHP, same vendor: 46 errors, and the list of failing tests is identical (compared line by line). None is a test of this change.ExampleSiteCatalogue::find()complexity 13 at a method that now has two branches). The same command on the whole oflib/with a cache of its own (a freshHOME, so not the~/.pdependevery clone on this machine shares) finds nothing, exit 0, for both rulesets. The three were served from the shared cache.npm run lint0 errors,stylelint0,format0,check:manifest0,check:l10n-js0,check:schema-l10n0,check:reuse0.check:specs: each of its 113 checks run on its own, without a build injs/: 113 pass.check:ways-in-screens, red while this branch carried feat(site): the header, footer, sign-in page and motif of the school designs #1202 unmerged, passes now.origin/development): 87 of 87 applicable gates ran, all passed. Gate-16, red before on feat(site): the header, footer, sign-in page and motif of the school designs #1202's files, is clean.openspec validate example-site-zuiddrecht --strict: valid.Seen in a browser, and how
Rendered in Chromium from this branch's own bundle (development build), this branch's CSS, thematiq #1097's files plus the six follow-up token lines, with the content API answered from the declaration through the real
PortalShellprojection. No instance was changed.Not seen: the install against a real OpenRegister, the site served by PHP from stored objects, the remove command on an instance, and the search page with OpenCatalogi. The coordinator's live check covers these.
Live check
occ maintenance:repair(register 0.66.0), thenocc portaliq:example-site:install zuiddrecht. Expect four lines ending in1,3,33,4 found afterwardsand exit 0./index.php/apps/portaliq/site?portal=zuiddrecht: logo, search box, button "Mijn Zuiddrecht", seven menu items, the red line with the piece under "Home", the footer with the three bands.portal=zuiddrecht.0 created.occ portaliq:example-site:remove zuiddrecht:Portal: deleted, exit 0, and the address answers not found.Copy that is not from the design files
Header, footer, home and "Afval scheiden en ophalen" carry the boards' text. These 31 pages exist so no link is dead, and their copy is new. Strike any you do not want: each is one entry in
pagesof the declaration, and the check then names the links that point at it./afval/afvalbrengstation/afval/container/afval/afvalstoffenheffing/wonen-en-leven/paspoort-en-id-kaart/verhuizing-doorgeven/melding-openbare-ruimte/afspraak-maken/belastingen/parkeren/ondernemen/bestuur/bestuur/vergaderingen/bestuur/raadsleden/bestuur/inspreken/bestuur/college/bestuur/collegebesluiten/bestuur/coalitieakkoord/bestuur/inkoop/werken-bij-zuiddrecht/klacht/contact/onderwerpen/toegankelijkheid/privacy/cookies/kwetsbaarheid-melden/nieuws(no copy of its own: shows the news items)/nieuwsoverzicht(no copy of its own: shows the news items)/zoeken(one line of copy; the search and detail blocks do the rest)/publicatie(one line of copy; the search and detail blocks do the rest)The four news items have the boards' titles and dates. Their body text is new, except the first item's opening line.
Left out of the design, and why
🤖 Generated with Claude Code