11import {
22 Component ,
3- Input ,
4- Output ,
53 EventEmitter ,
64 HostBinding ,
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,65 @@ import { FileItem } from "./file-item.interface";
1314@Component ( {
1415 selector : "cds-file, ibm-file" ,
1516 template : `
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"
2228 cdsIcon="warning--filled"
2329 class="cds--file--invalid"
2430 size="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+ [ngTemplateOutletContext]="{ $implicit: fileItem }">
36+ </ng-template>
37+ <ng-template #defaultActions>
38+ <button
39+ type="button"
40+ cdsButton="ghost"
41+ iconOnly="true"
42+ [size]="size"
43+ [attr.aria-label]="translations.REMOVE_BUTTON"
44+ (click)="remove.emit()"
45+ (keyup.enter)="remove.emit()"
46+ (keyup.space)="remove.emit()">
47+ <svg cdsIcon="trash-can" size="16"></svg>
48+ </button>
49+ </ng-template>
3650 </span>
3751 <span *ngIf="fileItem.state === 'upload'">
3852 <div class="cds--inline-loading__animation">
3953 <cds-loading size="sm"></cds-loading>
4054 </div>
4155 </span>
42- <span *ngIf="fileItem.state === 'complete'" class="cds--file__state-container">
56+ <span
57+ *ngIf="fileItem.state === 'complete'"
58+ class="cds--file__state-container">
4359 <svg
4460 cdsIcon="checkmark--filled"
4561 size="16"
4662 class="cds--file-complete"
4763 [ariaLabel]="translations.CHECKMARK">
4864 </svg>
4965 </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>
66+ <div
67+ class="cds--form-requirement"
68+ role="alert"
69+ *ngIf="fileItem.invalid">
70+ <div class="cds--form-requirement__title">
71+ {{ fileItem.invalidTitle }}
72+ </div>
73+ <p class="cds--form-requirement__supplement">
74+ {{ fileItem.invalidText }}
75+ </p>
5376 </div>
5477 `
5578} )
@@ -65,6 +88,16 @@ export class FileComponent implements OnDestroy {
6588
6689 @Input ( ) size : "sm" | "md" | "lg" = "lg" ;
6790
91+ /**
92+ * A custom template for the file name
93+ */
94+ @Input ( ) nameTpl : TemplateRef < unknown > ;
95+
96+ /**
97+ * A custom template for the available file actions
98+ */
99+ @Input ( ) actionsTpl : TemplateRef < unknown > ;
100+
68101 @Output ( ) remove = new EventEmitter ( ) ;
69102
70103 @HostBinding ( "class.cds--file__selected-file" ) selectedFile = true ;
@@ -84,8 +117,13 @@ export class FileComponent implements OnDestroy {
84117 @HostBinding ( "class.cds--file__selected-file--lg" ) get fileSizeLarge ( ) {
85118 return this . size === "lg" ;
86119 }
120+
87121 constructor ( protected i18n : I18n ) { }
88122
123+ public isTemplate ( value : unknown ) : boolean {
124+ return value instanceof TemplateRef ;
125+ }
126+
89127 ngOnDestroy ( ) {
90128 this . remove . emit ( ) ;
91129 }
0 commit comments