+
+
+ {{ project.project()?.key }} · {{ project.project()?.name }} ·
+ {{ kind() === 'sprint' ? 'Sprint' : 'Release' }}
+
+ {{ s.name }}
+ {{ s.status }} · {{ s.dates }}
+ @if (s.about) {
+ {{ s.about }}
+ }
+
+
+ @if (!list.loaded()) {
+
+ } @else {
+
+
+
- Tickets
+ - {{ totals().tickets }}
+
+
+
- Terminados
+ - {{ totals().done }} · {{ totals().percent }}%
+
+
+
- Puntos
+ - {{ totals().donePoints }} de {{ totals().points }}
+
+
+
- Sin terminar
+ - {{ totals().open }}
+
+
+
+ @if (s.notes) {
+
+ Notas de la versión
+
+
+ }
+
+ @for (group of groups(); track group.category) {
+
+
+ {{ group.label }}
+ {{ group.issues.length }}
+
+
+
+
+ | Clave |
+ Título |
+ Tipo |
+ Estado |
+ Asignado |
+ Pts |
+
+
+
+ @for (issue of group.issues; track issue.id) {
+
+ | {{ issue.key }} |
+ {{ issue.title }} |
+ {{ typeOf(issue) }} |
+ {{ statusOf(issue) }} |
+ {{ issue.assignee?.name ?? '—' }} |
+
+ {{ issue.storyPoints ?? '—' }}
+ |
+
+ }
+
+
+
+ } @empty {
+ Sin tickets.
+ }
+
+ @if (list.total() > list.issues().length) {
+
+ Se muestran {{ list.issues().length }} de {{ list.total() }}.
+
+ }
+
+ }
+
+ }
+ `,
+ styles: `
+ :host {
+ display: grid;
+ gap: 1rem;
+ }
+ .ts-report__toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ }
+ .ts-report {
+ display: grid;
+ gap: 1.25rem;
+ padding: 1.5rem;
+ }
+ .ts-report__eyebrow {
+ margin: 0;
+ color: var(--ts-muted);
+ font-size: 0.8125rem;
+ }
+ h1 {
+ margin: 0.25rem 0;
+ font-size: 1.75rem;
+ }
+ .ts-report__meta,
+ .ts-report__about {
+ margin: 0;
+ color: var(--ts-ink-soft);
+ }
+ .ts-report__about {
+ margin-top: 0.5rem;
+ white-space: pre-line;
+ }
+ .ts-report__totals {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 0.75rem;
+ margin: 0;
+ div {
+ padding: 0.625rem 0.75rem;
+ border: 1px solid var(--ts-line);
+ border-radius: 0.625rem;
+ }
+ dt {
+ color: var(--ts-muted);
+ font-size: 0.75rem;
+ }
+ dd {
+ margin: 0.125rem 0 0;
+ font-size: 1.125rem;
+ font-weight: 600;
+ }
+ }
+ h2 {
+ display: flex;
+ align-items: baseline;
+ gap: 0.5rem;
+ margin: 0 0 0.5rem;
+ font-size: 1rem;
+ }
+ .ts-report__count {
+ color: var(--ts-muted);
+ font-size: 0.8125rem;
+ font-weight: 400;
+ }
+ .ts-report__group {
+ break-inside: auto;
+ }
+ table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.8125rem;
+ }
+ th {
+ color: var(--ts-muted);
+ font-weight: 500;
+ text-align: left;
+ }
+ th,
+ td {
+ padding: 0.375rem 0.5rem;
+ border-bottom: 1px solid var(--ts-line);
+ vertical-align: top;
+ }
+ tr {
+ break-inside: avoid;
+ }
+ .ts-report__key {
+ font-family: var(--ts-font-mono, monospace);
+ white-space: nowrap;
+ }
+ .ts-report__num {
+ text-align: right;
+ }
+ .ts-report__foot {
+ color: var(--ts-muted);
+ font-size: 0.75rem;
+ }
+ @media (max-width: 640px) {
+ .ts-report__totals {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ .ts-report {
+ padding: 1rem;
+ overflow-x: auto;
+ }
+ }
+ @media print {
+ .ts-report__toolbar {
+ display: none;
+ }
+ .ts-report {
+ padding: 0;
+ border: 0;
+ box-shadow: none;
+ background: none;
+ color: #000;
+ }
+ }
+ `,
+})
+export class ReportPage {
+ readonly kind = input<'sprint' | 'release'>('sprint');
+ readonly id = input.required