11import {
22Component ,
3- Input ,
4- Output ,
53EventEmitter ,
64HostBinding ,
7- OnDestroy
5+ Input ,
6+ OnDestroy ,
7+ Output ,
8+ TemplateRef
89} from "@angular/core" ;
910
1011import { I18n } from "carbon-components-angular/i18n" ;
@@ -13,43 +14,64 @@ import { FileItem } from "./file-item.interface";
1314@Component ( {
1415selector : "cds-file, ibm-file" ,
1516template : `
16- <p class="cds--file-filename" [title]="fileItem.file.name">{{fileItem.file.name}}</p>
17- <span
18- *ngIf="fileItem.state === 'edit'"
19- class="cds--file__state-container">
17+ <p class="cds--file-filename" [title]="fileItem.file.name">
18+ <ng-template
19+ *ngIf="isTemplate(nameTpl); else defaultName"
20+ [ngTemplateOutlet]="nameTpl"
21+ [ngTemplateOutletContext]="{ $implicit: fileItem }">
22+ </ng-template>
23+ <ng-template #defaultName>{{ fileItem.file.name }}</ng-template>
24+ </p>
25+ <span *ngIf="fileItem.state === 'edit'" class="cds--file__state-container">
2026<svg
2127*ngIf="isInvalidText"
2228cdsIcon="warning--filled"
2329class="cds--file--invalid"
2430size="16">
2531</svg>
26- <button
27- type="button"
28- class="cds--file-close"
29- [attr.aria-label]="translations.REMOVE_BUTTON"
30- tabindex="0"
31- (click)="remove.emit()"
32- (keyup.enter)="remove.emit()"
33- (keyup.space)="remove.emit()">
34- <svg cdsIcon="close" size="16"></svg>
35- </button>
32+ <ng-template
33+ *ngIf="isTemplate(actionsTpl); else defaultActions"
34+ [ngTemplateOutlet]="actionsTpl">
35+ </ng-template>
36+ <ng-template #defaultActions>
37+ <button
38+ type="button"
39+ cdsButton="ghost"
40+ iconOnly="true"
41+ [size]="size"
42+ [attr.aria-label]="translations.REMOVE_BUTTON"
43+ (click)="remove.emit()"
44+ (keyup.enter)="remove.emit()"
45+ (keyup.space)="remove.emit()">
46+ <svg cdsIcon="trash-can" size="16"></svg>
47+ </button>
48+ </ng-template>
3649</span>
3750<span *ngIf="fileItem.state === 'upload'">
3851<div class="cds--inline-loading__animation">
3952<cds-loading size="sm"></cds-loading>
4053</div>
4154</span>
42- <span *ngIf="fileItem.state === 'complete'" class="cds--file__state-container">
55+ <span
56+ *ngIf="fileItem.state === 'complete'"
57+ class="cds--file__state-container">
4358<svg
4459cdsIcon="checkmark--filled"
4560size="16"
4661class="cds--file-complete"
4762[ariaLabel]="translations.CHECKMARK">
4863</svg>
4964</span>
50- <div class="cds--form-requirement" role="alert" *ngIf="fileItem.invalid">
51- <div class="cds--form-requirement__title">{{fileItem.invalidTitle}}</div>
52- <p class="cds--form-requirement__supplement">{{fileItem.invalidText}}</p>
65+ <div
66+ class="cds--form-requirement"
67+ role="alert"
68+ *ngIf="fileItem.invalid">
69+ <div class="cds--form-requirement__title">
70+ {{ fileItem.invalidTitle }}
71+ </div>
72+ <p class="cds--form-requirement__supplement">
73+ {{ fileItem.invalidText }}
74+ </p>
5375</div>
5476`
5577} )
@@ -65,6 +87,16 @@ export class FileComponent implements OnDestroy {
6587
6688@Input ( ) size : "sm" | "md" | "lg" = "lg" ;
6789
90+ /**
91+ * A custom template for the file name
92+ */
93+ @Input ( ) nameTpl : TemplateRef < unknown > ;
94+
95+ /**
96+ * A custom template for the available file actions
97+ */
98+ @Input ( ) actionsTpl : TemplateRef < unknown > ;
99+
68100@Output ( ) remove = new EventEmitter ( ) ;
69101
70102@HostBinding ( "class.cds--file__selected-file" ) selectedFile = true ;
@@ -84,8 +116,13 @@ export class FileComponent implements OnDestroy {
84116@HostBinding ( "class.cds--file__selected-file--lg" ) get fileSizeLarge ( ) {
85117return this . size === "lg" ;
86118}
119+
87120constructor ( protected i18n : I18n ) { }
88121
122+ public isTemplate ( value : unknown ) : boolean {
123+ return value instanceof TemplateRef ;
124+ }
125+
89126ngOnDestroy ( ) {
90127this . remove . emit ( ) ;
91128}
0 commit comments