TEDY.13 — Releases
State: Built — list + TxResourceBar detail (Summary with Resources/Checks/Notes/Tasks · Metadata · Provenance · Comparison) + create. Detail via TxResourceBar.
Template: tool-feature. Prefix: TEDY.
Overview
A Release is a publication bundle that groups pinned resource versions (CodeSystem / ValueSet / MapSet) for coordinated review, validation, server sync, and release-notes generation. Served off /releases; numeric id; a draft → active → retired publication lifecycle. The add-to-release bulk action (TEDY.12) already writes into a release; this family adds the release’s own list + detail.
Data model (libs/tedy/src/lib/client/releaseClient.ts — extend)
Release { id?:number, code?, names?:LocalizedName, planned?, releaseDate?, status?, authors?:string[], resources?:ReleaseResource[], terminologyServer? }.
ReleaseResource { id?:number, resourceType?:'CodeSystem'|'ValueSet'|'MapSet', resourceId?, resourceVersion?, resourceNames?:LocalizedName }.
ReleaseSearchParams extends QueryParams { textContains?, status? } (already present).
REST API (base /releases)
- Release:
GET /releases(search),GET /releases/{id},POST /releases(create) /PUT /releases/{id}(update). - Resources:
GET /releases/{id}/resources,POST /releases/{id}/resources(add — already used by TEDY.12),PUT /releases/{id}/resources/{rid},DELETE /releases/{id}/resources/{rid}. - Lifecycle:
POST /releases/{id}/draft·/activate·/retire. - Sync / notes:
POST /releases/{id}/server-sync {resourceId}(→ job),POST /releases/{id}/validate-sync(→ job),POST /releases/{id}/generate-notes;GET /releases/{id}/notes,GET /releases/{id}/notes/{file}. - Provenance:
GET /releases/{id}/provenances.
Screens
- List (
resource-list) — a standardResourceList: Code (link → summary) · Name · Status (tag) · Planned · Release date · Authors. Search (textContains); Add (gated*.Release.write). - Detail — via
TxResourceBar(unversioned “Management” resource, no version chip), tabs:- Summary — status + lifecycle actions (Make draft / Activate / Retire) only (the release’s own metadata lives on the Metadata tab, not here); a Resources table (Type · Reference → resource summary · Version · Name · Errors = failing checklist count) with Add resource (draft) and a per-row … menu (Edit / Delete, draft-gated); an Unaccomplished checks widget (failing checklist assertions grouped by resource + Run all checks →
POST /checklists/assertions/run-checks); a Notes widget (Generate notes + downloadable attachments via/releases/{id}/notes); and a Tasks widget (ResourceTasksWidgetscoped to the release). Add/Edit resource = a modal with resource-type → resource autocomplete (searchable CS/VS/MS) → version select for the chosen resource. - Metadata (edit) —
ResourceForm: code (immutable on edit), name, planned, releaseDate, authors, terminologyServer. - Provenance — the release’s provenance history (reuse the provenance widget).
- Comparison (diff) — per-resource release diff (current vs comparable server), driven by the sync/diff endpoints.
- Summary — status + lifecycle actions (Make draft / Activate / Retire) only (the release’s own metadata lives on the Metadata tab, not here); a Resources table (Type · Reference → resource summary · Version · Name · Errors = failing checklist count) with Add resource (draft) and a per-row … menu (Edit / Delete, draft-gated); an Unaccomplished checks widget (failing checklist assertions grouped by resource + Run all checks →
Business rules / constraints
- Resources are editable only while
draft(Add / edit / delete resource).active/retiredlock the resource set. - Server-sync requires
status === 'active'+ aterminologyServer+{id}.Release.maintain. - Lifecycle: Make draft (from non-draft), Activate (from draft), Retire (unless retired).
- Add-to-release picks a draft release (see TEDY.12).
Routes & nav
/releases (list), /releases/new (create), /releases/:id/{summary|details|provenances|diff}. Nav: Management → Releases. Add release to TxResourceType / TYPE_SEGMENT / TYPE_LABEL / tabsFor() in TxResourceBar, a TEDY_CONTEXT_META marker (RL), and ReleaseResourceLayout.MODES.
Privileges
*.Release.read (list/view), *.Release.write (add/edit/resources), {id}.Release.write (edit a specific release), {id}.Release.maintain (server-sync).
Phased implementation plan
- Data layer — extend
releaseClient(loadRelease, saveRelease, loadReleaseResources, updateReleaseResource, deleteReleaseResource, changeReleaseStatus, serverSync, validateSync, generateNotes, loadReleaseProvenances) +useReleases/useReleasehooks + exports. - List (
ReleaseList) + route + Management menu entry. - Detail shell —
TxResourceBarreleasetype +ReleaseResourceLayout(Summary/Metadata/Provenance/Comparison) + routes. - Summary — metadata card + resources table (add/edit/delete, draft-gated) + lifecycle actions.
- Metadata create/edit
ResourceForm+/releases/new. - Provenance tab (reuse provenance widget) and Comparison (diff) tab; checks / notes / tasks widgets.
Commit + git push origin master:main per phase.
i18n
tedy.release.* (fields.*, status.*, list.*, resource table labels, lifecycle labels, sync/notes labels, validation, notifications).