Skip to content

fix(ui): name references in the catalogue tables and narrow the Applications list by _ids - #1275

Merged
WilcoLouwerse merged 3 commits into
developmentfrom
fix/woo586-stackiq-ui-findings
Oct 8, 2026
Merged

WilcoLouwerse merged 3 commits into
developmentfrom
fix/woo586-stackiq-ui-findings

Conversation

@WilcoLouwerse

Copy link
Copy Markdown

What

Findings from the WOO-586 walkthrough of the stackiq UI on the CMDB rig (Gemeente Rotterdam import, 1135 applications):

  • Search on Applications narrowed nothing. The faceted page sent the match set as a plain id filter; OpenRegister's objects endpoint ignores id (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 helper facetNarrowingFilter with its own spec.
  • Reference columns showed uuids. provider on 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-in fkResolve cell 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").
  • An organisation's Applications list had no name column (only licence form and BBN level) and no way to the other rows beyond "+N more". It now leads with the name and links "View all (N)" to the Applications page filtered on 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-vue bugs — 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

…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>
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/stackiq @ fa60cc5

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.

Comment thread src/manifest.json
{ "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" } },

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 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 WilcoLouwerse left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)

✅ 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.json and the browser files rebuilt (npm run l10n:build, npm run test:l10n green) in 3ee26f5.

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).

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/stackiq @ b67b2ff

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.

@WilcoLouwerse
WilcoLouwerse merged commit 1e85adb into development Oct 8, 2026
49 checks passed
@WilcoLouwerse
WilcoLouwerse deleted the fix/woo586-stackiq-ui-findings branch October 8, 2026 16:12
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