feat(case-types): colour, versions, folders and the AVG fields - #1938
Merged
Conversation
added 18 commits
September 8, 2026 14:20
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
September 8, 2026 13:29
…-authoring-extras # Conflicts: # l10n/en.js # l10n/en.json # l10n/nl.js # l10n/nl.json
Contributor
Quality Report — ConductionNL/dossiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 541/541 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ deferred — runs on the promotion into beta/main, not on a pull request into development | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-08 13:38 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.
Implements the merged OpenSpec change
case-type-authoring-extras(rows A10, A11, A29, A30, A31 of the round 2 placement). One noun: the case type's blueprint — what a status looks like, where a type gets its blueprint from, how types are grouped, what personal data it processes, and how it leaves and enters the system.Scenario to e2e map
Every
@e2e-tagged scenario in the five spec deltas, intests/e2e/case-type-authoring-extras.spec.ts(13 tests):a coloured status draws its board column in that coloura hidden status keeps its cases off the list, and Closed brings them backthe case page draws the current status in its status's coloura child that declares nothing shows its parent's four statuses, marked Inheriteda child's own deadline beats its parent'sa parent that descends from the type is refused, and the message names the cyclepicking a folder narrows the Case types index to that categoryan attribute saved without a case type is listed on every type, marked Sharedthe personal data block reads back the categories and the basisExport starts a download whose name carries the type's identifierDuplicate lands you on the copy, with the same statusesa draft with findings lists them and stays a drafta valid draft is published with its change note, and the version says soTwo scenarios stay
@e2e excludeexactly as the deltas wrote them: Import needs an OS file dialog (covered by the controller and service tests), and a verwerkingsactiviteit code cannot be refused until OpenRegister exposes the register as a referenceable schema (task 4.3, still blocked).Where the design and the code disagree, and why
Five decisions in
design.mdcould not be implemented as written. Each is recorded intasks.mdbeside its task.run-actionis not a header-action type. The manifest schema enumerates handler, open-modal, open-page, navigate, object-op, export, open-form, refresh, api-call, agent and toggle, andCnActionButtonsresolves exactly those. All four actions as designed would have been refused bycheck:manifest, and had they passed they would have rendered four buttons that dispatch nothing. Export is anapi-callwithdownload: true; the other three are dialogs, each for a reason a declarative action cannot meet — Import takes a file, Publish must show its findings before asking for a change note, Duplicate must land on the copy.folderSidebar.source: "facet"does not exist. CnIndexPage resolves register, field, custom and files, and an unknown source falls through tocustom— whose folder list is the absentfoldersarray, so the pane renders empty and says nothing. It issource: "field"overcategory.$ref.status.hiddenInListsis dropped by OpenRegister, which is a default filter that silently lists everything. The case now carriesstatusHiddenInLists, a materialisedx-openregister-calculationsentry over@ref.statusType.hiddenInLists— the same shapeisFinalStatusalready used.object-listcolumn. An object-list fetches OpenRegister itself, so the only question it can ask iscaseType = @objectId: a child that inherits its lifecycle would render an empty table.GET /api/case-types/{id}/blueprintmerges the chain server-side;case-type-blueprintrenders it, and stays out of any tab strip because atype: "custom"widget named as a tab child resolves by registry type and renders an empty panel without logging.validate.CaseDefinitionController::validate()validates an uploaded package, andZgwZtcRulesService::validatePublish()reads the type's own statuses — so a child would be refused with "give it a status" while its page showed four.CaseTypePublishServicevalidates through the resolver.What the checks found
Five defects that no other check saw, all fixed on the branch:
appinfo/routes.phpstill carriedcaseDefinition#blueprintandcaseDefinition#publishafter the controller they pointed at was reverted. A route with no target method is a 500 at dispatch.#[NoAdminRequired]over an admin-only body, which is what the change's own task text asked for. Both methods now carry#[AuthorizedAdminSetting(AdminSettings::class)]and the body guard is gone.assertNoCycle()was defined and never called. Wired intoCaseTypePublishService::validate(), which is the only write dossiq owns — a case type is saved straight to OpenRegister's object API by the page, so "refused on save" can be met nowhere else. Recorded as a limitation.@spec.ManifestColumnBindingTest: the Versions list bound its Updated column toupdated, whichworkflowTemplatedoes not declare — a column that renders a dash in every row. It is@self.updated.Known limitations, recorded in tasks.md
case.statuscarries anx-relation-filterandcase.caseTypeanx-openregister-prefill; both are OpenRegister's, both read the child's own rows, and neither can express a chain. So the status picker on a new case of a child type offers only the child's own statuses, and the case form does not pick up a shared attribute.effectiveCaseType()inheritsinitialStatusso every PHP reader is right; the picker is filed as an OpenRegister request.Checks, by exit code
Run locally on this branch, AFTER merging
developmentin (four l10n files conflicted, both sides having appended entries at the tail of the translations object; resolved as the union and the.jscatalogues regenerated). E2E was NOT run: it runs on the development push, and apull_requestcheck cannot prove an E2E fix.npm run lintnpx vitest run(72 files, 820 tests)npm run check:manifestnode tests/l10n/check-l10n.jsnode scripts/check-schema-l10n.jsnpm run check:l10n-jsnpm run formatcomposer lintcomposer phpcslib/directorycomposer psalmcomposer phpstan./vendor/bin/phpunit(3262 tests)HYDRA_GATE_BASE_REF=origin/development run-hydra-gates.shcomposer check:strictwas run as its separate legs: as one command it exceeds a 300s budget. phpmd was swept per directory because printing nothing is its OOM signature, so a whole-lib/pass that says nothing proves nothing.🤖 Generated with Claude Code