S-09 (scoped to the portal — approval flow split out to #75). Adds the anonymous Openbaar Register portal and closes the walking-skeleton loop: submit → BFF → domain → projection → public visibility.
Changes
apps/openbaar — new anonymous Angular app (standalone + signals, NL DS via libs/ui, no auth/OIDC, no config.json). RegisterPage loads the full public register on open and searches via the BFF's /openbaar/register?q=; results table (referentie + status), loading + empty states.
Serving — nginx image + compose service on :8141, reverse-proxying /openbaar to the BFF (same-origin, no CORS), health-checked over IPv4, no Keycloak dependency. Added to the health-wait list.
e2e — extended the walking-skeleton happy path: after the self-service submit, the openbaar portal shows the submitted INGEDIEND entry (polls for the async projection).
Docs — frontend-decisions.md (openbaar decisions) + demo-script.md (public-visibility demo). BACKLOG.md updated for the S-09/S-09b split.
TDD / verification
Red → green: test(portal-openbaar) (failing register-page spec) → feat(portal-openbaar) (implementation). 5 openbaar unit tests incl. a11y (axe); make frontend green across all 6 projects.
Verified the portal end-to-end locally against a real BFF + stub projection: renders the register, bsn never leaves the BFF (asserted in-browser), search re-queries. Public-safe filtering itself is already unit/mutation-tested in the BFF.
Full submit→projection→openbaar chain runs in CI verify-stack (needs the live NRC→projection path + selectielijst egress, not reproducible locally).
Public-safe
Only id + status cross the BFF (OpenbaarProjection.PublicView); the portal never receives bsn/naam.
## What & why
S-09 (scoped to the **portal** — approval flow split out to #75). Adds the anonymous **Openbaar Register portal** and closes the walking-skeleton loop: submit → BFF → domain → projection → **public visibility**.
## Changes
- **`apps/openbaar`** — new anonymous Angular app (standalone + signals, NL DS via `libs/ui`, no auth/OIDC, no `config.json`). `RegisterPage` loads the full public register on open and searches via the BFF's `/openbaar/register?q=`; results table (referentie + status), loading + empty states.
- **Serving** — nginx image + compose service on `:8141`, reverse-proxying `/openbaar` to the BFF (same-origin, no CORS), health-checked over IPv4, no Keycloak dependency. Added to the health-wait list.
- **e2e** — extended the walking-skeleton happy path: after the self-service submit, the openbaar portal shows the submitted `INGEDIEND` entry (polls for the async projection).
- **Docs** — `frontend-decisions.md` (openbaar decisions) + `demo-script.md` (public-visibility demo). `BACKLOG.md` updated for the S-09/S-09b split.
## TDD / verification
- Red → green: `test(portal-openbaar)` (failing register-page spec) → `feat(portal-openbaar)` (implementation). 5 openbaar unit tests incl. a11y (axe); `make frontend` green across all 6 projects.
- Verified the portal end-to-end locally against a **real BFF + stub projection**: renders the register, **bsn never leaves the BFF** (asserted in-browser), search re-queries. Public-safe filtering itself is already unit/mutation-tested in the BFF.
- Full submit→projection→openbaar chain runs in CI `verify-stack` (needs the live NRC→projection path + selectielijst egress, not reproducible locally).
## Public-safe
Only `id` + `status` cross the BFF (`OpenbaarProjection.PublicView`); the portal never receives bsn/naam.
closes #10
The walking skeleton has only INGEDIEND and no approval/status-transition path, so
the Openbaar portal (demoable against the existing public-safe BFF endpoint) and the
approve→visible flow are separate slices. See #75 for the approval flow.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Scaffolds the anonymous openbaar Angular app (mirrors self-service: standalone +
signals, NL DS via the ui lib, no auth) and adds a failing register-page spec:
loads the public register from the BFF on open, searches by term, and shows an
empty-state message. The stub page renders only the heading, so the list/search/
empty-state assertions fail (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implement RegisterPage: load the full public register from the BFF on open, filter
by the search term via /openbaar/register?q=, and show a results table (referentie +
status), a loading indicator, and an empty-state message. Anonymous, same-origin
relative calls. Adds the app-shell spec. All openbaar lint/test/build green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add the openbaar nginx image (serves the Angular app, reverse-proxies /openbaar to
the BFF, same-origin) and wire it into the compose stack on :8141, anonymous (no
Keycloak dependency). Add it to the health-wait list so the e2e can rely on it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extend the walking-skeleton happy path: after the self-service submit + confirmation,
open the anonymous openbaar register portal and poll (reload) until the submitted
INGEDIEND entry appears — completing submit → BFF → domain → projection → public
visibility. Verified the openbaar portal renders the public-safe register (id+status,
no bsn) against a real BFF + stub projection.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What & why
S-09 (scoped to the portal — approval flow split out to #75). Adds the anonymous Openbaar Register portal and closes the walking-skeleton loop: submit → BFF → domain → projection → public visibility.
Changes
apps/openbaar— new anonymous Angular app (standalone + signals, NL DS vialibs/ui, no auth/OIDC, noconfig.json).RegisterPageloads the full public register on open and searches via the BFF's/openbaar/register?q=; results table (referentie + status), loading + empty states.:8141, reverse-proxying/openbaarto the BFF (same-origin, no CORS), health-checked over IPv4, no Keycloak dependency. Added to the health-wait list.INGEDIENDentry (polls for the async projection).frontend-decisions.md(openbaar decisions) +demo-script.md(public-visibility demo).BACKLOG.mdupdated for the S-09/S-09b split.TDD / verification
test(portal-openbaar)(failing register-page spec) →feat(portal-openbaar)(implementation). 5 openbaar unit tests incl. a11y (axe);make frontendgreen across all 6 projects.verify-stack(needs the live NRC→projection path + selectielijst egress, not reproducible locally).Public-safe
Only
id+statuscross the BFF (OpenbaarProjection.PublicView); the portal never receives bsn/naam.closes #10