Story: Badge colour scheme: visual polish and self-badging fixes
Table of Contents
This page documents a story in Sprint 24. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
Split from Improve badge colour scheme support (Sprint 23) at
close: that story shipped its core deliverable — the badge_mapping
browser UI and the migration of badge_definition=/=badge_severity=/
=code_domain onto standard codegen + DQ publishing — but left two
concrete, scoped defects unfixed:
- The Badge Definitions/Severities admin UI shows colours as plain
hex text instead of swatches, so semantic misuse of the
grey/green/red/yellow convention can't be eyeballed, and the
unmapped-value fallback colour is still a hardcoded Qt-only
constant instead of a real
badge_definitionrow. - An entity that is a badge source (e.g.
book_status) doesn't badge itself on its own list — only consumers of it do.
Both are small, well-understood fixes, not open-ended discovery — distinct from the coverage-audit-and-rollout work split into Classify and roll out badge/image/plain-text rendering across domain entities.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 24 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-07-30 |
3. Acceptance
badge_definition=/=badge_severityadmin UI renders colours as swatches (not hex text), with a colour picker in the detail dialog.- The unmapped-value fallback is a real, reserved
badge_definitionrow, resolved throughBadgeCachelike any other badge, visually distinct from a legitimate grey/inactive badge. - At least one badge-source entity (e.g.
book_status) badges itself on its own list, via an explicit codegen model annotation (not DB introspection). - No regression to any currently-working badge rendering.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Badge palette swatch rendering + data-driven fallback badge | DONE | 2026-07-22 | 2026-07-26 | Colour-swatch delegate and picker for Badge Definitions/Severities admin UI; replace the hardcoded Qt fallback constant with a real, reserved badge_definition row. |
| Badge sources should badge their own list too | DONE | 2026-07-28 | 2026-07-28 | Codegen mechanism so a badge-source entity's own code/name column also gets badge_key wired to its own code_domain. |
| Close story: badge colour scheme visual polish and self-badging fixes | DONE | 2026-07-30 | 2026-07-30 | Both tasks (badge palette swatch rendering + fallback, badge source self-annotation) are DONE; close the story out. |
5. Decisions
- Colour fields get a dedicated
colourcodegen detail-field type (swatch button + QColorDialog) rather than a rawline_editwith hex text – any future entity needing a colour picker inherits this for free. - A column that is a colour (e.g.
background_colour) gets its own self-colour list-column style, distinct fromis_badge(which resolves a code throughBadgeCache) – the two facets model different relationships (own value vs. lookup) and must not be conflated. - The fallback for an unresolved badge is a real, reserved
badge_definitionrow (code'unmapped'), not a second hardcoded constant living alongside =ColorConstants::badge_fallback– every client/delegate resolves it throughBadgeCache::fallback()the same way it resolves any other badge, and it gets a dashed-border treatment so it never reads as a legitimate grey/inactive badge. - Qt-client caches that need to stay fresh (
BadgeCache,ChangeReasonCache) subscribe directly to their NATS change-event(s) viaClientManagerand reload on receipt, re-subscribing on login/reconnect – this is a different, GUI-tier pattern from the server-side entity-mirror cache facet (see 4FF4167B-D970-4383-A263-24E329C9AB95), not a shared mechanism.
6. Out of scope
- The badge adoption coverage audit and rollout across
domain_entitymodels — see Classify and roll out badge/image/plain-text rendering across domain entities. - Wt-side badge rendering — carried over as out of scope from the parent story (explicit user instruction).
- A manual QA
* Test Scenariospass against a live client for either sibling task – both shipped with build + unit-test verification only. Closed at explicit instruction rather than left open pending QA; worth a live-client pass later if the swatch rendering/fallback badge/self-badging behaviour is ever in question.