Repository navigation
fix(ui): name references in the catalogue tables and narrow the Applications list by _ids - #1275
Conversation
…cations list by _ids The Applications page sent the facet/search match as a plain `id` filter, which OpenRegister's objects endpoint ignores (verified on 2.1.36: `id[]=` returns the whole list, `_ids[]=` narrows), so a search or GEMMA facet selection narrowed nothing while the counts said it did. The narrowing filter now uses `_ids` (and the no-match sentinel still yields an empty list); the helper has its own spec. Reference columns rendered the raw uuid: `provider` on Applications, the organisation on an application's Usages, the application on an organisation's usages, connections and compliance claims, and the module on Module versions and Applications in use. Those columns are now column objects with the library's `fkResolve` cell widget (uuid → name through the object store) and their own label — an object-typed property gets no schema-generated column, so a bare key showed the key as its header. An organisation's Applications list named no application (only licence and BBN level) and had no way to the rest beyond "+N more"; it now leads with the name and links to the Applications page filtered on the organisation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review of #1275 (f1): "In development since" and "In use since" were the only two of the thirteen new column labels missing from nl.json, so Dutch users saw them in English. Added to en.json and nl.json and the browser files rebuilt with `npm run l10n:build`; `npm run test:l10n` passes (every used key present in en.json). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Quality Report — ConductionNL/stackiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue-demi | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ❌ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| composer | ✅ | ✅ 133/133 | |||
| npm | ✅ | ✅ 807/807 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 1223/1223 · 20 skipped (no test failed, the job failed for another reason — see its log) | ||||
| 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-08 15:24 UTC
Download the full PDF report from the workflow artifacts.
| { "id": "org-diensten", "type": "object-list", "title": "Services", "icon": "HandshakeOutline", "content": { "register": "@resolve:voorzieningen_register", "schema": "catalogService", "filter": { "provider": "@objectId" }, "columns": [ { "key": "type", "label": "Type" } ], "limit": 25, "emptyText": "No services registered for this organisation yet" } }, | ||
| { "id": "org-modules", "type": "object-list", "title": "Applications", "icon": "Package", "content": { "register": "@resolve:voorzieningen_register", "schema": "module", "filter": { "provider": "@objectId" }, "columns": [ { "key": "licentietype", "label": "License type" }, { "key": "bbnLevel", "label": "BBN level" } ], "limit": 25, "rowRoute": "ModuleDetail", "emptyText": "No applications registered for this organisation yet" } }, | ||
| { "id": "org-usages", "type": "object-list", "title": "Applications in use", "icon": "OfficeBuilding", "content": { "register": "@resolve:voorzieningen_register", "schema": "usage", "filter": { "consumer": "@objectId" }, "columns": [ { "key": "module", "label": "Application" }, { "key": "moduleVersion", "label": "Version" }, { "key": "status", "label": "Status" } ], "limit": 25, "rowRoute": "GebruikDetail", "viewAllRoute": "Gebruik", "viewAllQuery": { "consumer": "@objectId" }, "allowCreate": false, "emptyText": "No applications in use recorded for this organisation yet" } }, | ||
| { "id": "org-modules", "type": "object-list", "title": "Applications", "icon": "Package", "content": { "register": "@resolve:voorzieningen_register", "schema": "module", "filter": { "provider": "@objectId" }, "columns": [ { "key": "name", "label": "Name" }, { "key": "licentietype", "label": "License type" }, { "key": "bbnLevel", "label": "BBN level" } ], "limit": 25, "rowRoute": "ModuleDetail", "viewAllRoute": "Modules", "viewAllQuery": { "provider": "@objectId" }, "emptyText": "No applications registered for this organisation yet" } }, |
There was a problem hiding this comment.
🟢 Minor — GEMMA facet counts ignore the provider narrowing from "View all"
Opening an organisation's applications through this viewAllRoute lands on /modules?provider=<uuid>: CnIndexPage's self-fetch applies that query key (resolveQueryFilters skips only _-prefixed keys) and syncUrl keeps it, but fetchFacets sends only the _gf_* filters and the search term, so the sidebar counts cover all applications while the table shows the organisation's. Cosmetic; a later change could forward non-_gf_ query keys to the facets request or hide the sidebar when the list is pre-filtered.
Verification: grep -n provider src/views/FacetedCatalogIndexView.vue src/store/modules/facets.js → no match; fetchFacets in src/store/modules/facets.js passes { filters, search } only.
CI on #1275: `quality / Frontend Check (format)` flagged the three new or changed JS/Vue files (`npx prettier --write` on them; no semantic change, `npm run format` now clean) and Hydra gate-16 spec-coverage flagged `facetNarrowingFilter` as a changed method without an @SPEC tag — the tag now sits on the function docblock (both anchors are requirement headings in openspec/specs/gemma-faceted-search/spec.md). eslint 0 errors; the helper's spec still passes (3 tests). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
WilcoLouwerse
left a comment
There was a problem hiding this comment.
Verdict: APPROVE (Standard) — self-review posted as COMMENT (GitHub blocks a self-APPROVE)
The manifest columns, the _ids narrowing and the organisation list do what the PR says, verified on the WOO-586 rig with the 1135 imported applications; the one defect the analysis found (two untranslated labels) was fixed on the branch before this verdict.
🟢 Minor (1)
- GEMMA facet counts ignore the
providernarrowing from "View all" —src/manifest.json:424. The facets request sends only the_gf_*filters and the search term, so the sidebar counts cover all applications while the table is pre-filtered on the organisation; cosmetic.
✅ Fixed before posting (1)
- Two new column labels missing from nl.json — "In development since" and "In use since" had no Dutch entry while the other eleven new labels did; added to
en.json/nl.jsonand the browser files rebuilt (npm run l10n:build,npm run test:l10ngreen) in3ee26f5.
Gates: CI quality / Hydra Gates ❌ on 3ee26f5 — gate-16 spec-coverage only (facetNarrowingFilter had no @spec tag), fixed in 50e116f; the rerun on that head was still queued at this verdict, so the required check is reported, not waited out. quality / Frontend Check (format) ❌ on 3ee26f5 (prettier on the three new/changed JS/Vue files) — fixed in the same commit, npm run format clean. quality / PHPUnit (PHP 8.3, NC stable35, pgsql) ❌: 1243 tests pass; the "Guard coverage baseline" step aborts with "scripts/coverage-guard.php predates merge-base comparison (it does not report the 'against' capability)" — the shared quality.yml@main changed between stackiq#1271's green run (10:34 today) and this run (15:05); not a change of this PR and not a required check. Fix for the repo: copy the canonical quality-config/coverage-guard.php from ConductionNL/.github into scripts/, or set enable-coverage-guard: false until then.
Jira context: WOO-586 — CMDB-export (TOPdesk, xlsx) via Stackiq in OpenRegister; these are the UI defects from the manual test round, in scope as bijvangst.
Scope decision: the library-side defects (items per page, clicking through the Related block) are in ConductionNL/nextcloud-vue#1390; stackiq picks them up with the next @conduction/nextcloud-vue bump.
🤖 Review by Claude Code (/review-pr, Standard; analysis agent: Sonnet).
Quality Report — ConductionNL/stackiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue-demi | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| composer | ✅ | ✅ 133/133 | |||
| npm | ✅ | ✅ 807/807 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ 1223/1223 · 20 skipped | ||||
| 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-08 16:11 UTC
Download the full PDF report from the workflow artifacts.
What
Findings from the WOO-586 walkthrough of the stackiq UI on the CMDB rig (Gemeente Rotterdam import, 1135 applications):
idfilter; OpenRegister's objects endpoint ignoresid(id[]=returned all 1138 rows on 2.1.36,_ids[]=returns the match). The narrowing filter now uses_ids; the no-match sentinel still yields an empty list. New helperfacetNarrowingFilterwith its own spec.provideron Applications; the organisation on an application's Usages; the application on an organisation's usages, on connections, on compliance claims; the module on Module versions and Applications in use. These columns are now column objects with the library's built-infkResolvecell widget (uuid → name through the shared object store, per-schema cached) and an explicit label (an object-typed property gets no schema-generated column, so the bare key was the header: "provider", "type").provider=<organisation>.Verified on the rig
NC 35, OpenRegister 2.1.36-unstable.20261008084301, stackiq development 8be3192 + this branch: search "EsbFilterBeheer" → 1 row; Leverancier column "Gemeente Rotterdam Mendix"; organisation page lists application names with "View all (125)"; application page Usages shows "Gemeente Rotterdam".
Not in this PR (library)
Items per page on the Applications page and clicking through the "Vendor & services" block are
@conduction/nextcloud-vuebugs — ConductionNL/nextcloud-vue PR follows; stackiq picks them up with the next library bump.Checks
npm test(jest, 184),node tests/validate-manifest.js(Ajv PASS),npm run build, eslint 0 errors.Jira: WOO-586 — plan: https://github.com/ConductionNL/readonly-mirror-wilco-claude-plans/blob/dev-mirror/issues/jira/WOO-586/WOO-586-plan-08-10.txt
🤖 Generated with Claude Code