import { Component, computed, input, output } from '@angular/core';
import type { Upload } from '@shared/domain/upload.machine';
import { DocumentChipComponent } from '@shared/ui/atoms/upload/document-chip/document-chip.component';
import { UploadProgressBarComponent } from '@shared/ui/atoms/upload/upload-progress-bar/upload-progress-bar.component';
/** Molecule: one row in a CIBG Bestand-upload file list — a `.file-container` `
`
with the `.file` block (via document-chip), the `.actions` (retry/remove), and a
progress bar while uploading. Used on an ` ` so `ul.file-list`'s direct child is
a native ` `. Pure UI: emits `remove`/`retry`; the container decides what they mean. */
@Component({
selector: 'li[app-single-upload]',
host: { class: 'file-container' },
imports: [DocumentChipComponent, UploadProgressBarComponent],
styles: [
`
:host {
flex-wrap: wrap;
align-items: center;
}
.upload-progress {
flex: 1 0 100%;
margin-block-start: var(--rhc-space-max-sm);
}
.actions .btn {
background: none;
border: none;
cursor: pointer;
padding: 0;
}
.actions .btn-retry {
color: var(--rhc-color-foreground-link);
text-decoration: underline;
font: inherit;
}
`,
],
template: `
@if (upload().status.type === 'failed') {
Opnieuw
}
@if (upload().status.type !== 'deleting') {
}
@if (progressPct() !== null) {
}
`,
})
export class SingleUploadComponent {
upload = input.required();
/** Builds a preview URL for a completed upload's documentId (undefined = no link). */
previewUrlFor = input<(documentId: string) => string | undefined>();
/** Narrow the status union once, in TS, so the template stays type-safe. */
protected readonly progressPct = computed(() => {
const status = this.upload().status;
return status.type === 'uploading' ? status.progressPct : null;
});
protected readonly previewUrl = computed(() => {
const status = this.upload().status;
return status.type === 'complete' ? this.previewUrlFor()?.(status.documentId) : undefined;
});
remove = output();
retry = output();
protected get removeLabel(): string {
return $localize`:@@upload.chip.removeAria:${this.upload().fileName}:fileName: verwijderen`;
}
protected get retryLabel(): string {
return $localize`:@@upload.chip.retryAria:${this.upload().fileName}:fileName: opnieuw uploaden`;
}
}