import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { FileUploadComponent, UploadedFile } from '../../../../../ui-essentials/src/lib/components/forms/file-upload/file-upload.component'; @Component({ selector: 'ui-file-upload-demo', standalone: true, imports: [CommonModule, ReactiveFormsModule, FileUploadComponent], template: `

File Upload Demo

Sizes

@for (size of sizes; track size) {

{{ size.toUpperCase() }} Size

File upload with {{ size }} sizing.

}

Variants

@for (variant of variants; track variant) {

{{ variant | titlecase }} Variant

File upload with {{ variant }} styling.

}

File Type Restrictions

Images Only

Accepts only image files (JPEG, PNG, GIF, WebP).

Documents Only

Accepts PDF, Word, and Excel documents.

Size & File Limits

Size Limit (5MB)

Maximum file size of 5MB per file.

File Count Limit

Maximum of 3 files can be selected.

Single File

Only one file can be selected.

States

Disabled State

File upload in disabled state.

Error State

File upload showing error state.

Success State

File upload showing success state.

Reactive Form Integration

Form with Validation

File upload integrated with Angular reactive forms and validation.

Form Status: {{ uploadForm.status }} | Form Valid: {{ uploadForm.valid }} | Files Count: {{ uploadForm.get('files')?.value?.length || 0 }}
@if (submittedFiles.length > 0) {
Submitted Files:
@for (file of submittedFiles; track file.id) {
{{ file.name }}
{{ formatFileSize(file.size) }}
}
}

Event Handling

Event Monitoring

Monitor file upload events in real-time.

Recent Events:
@if (recentEvents.length === 0) {

No events yet. Add or remove files to see events.

} @else { @for (event of recentEvents.slice(-5).reverse(); track $index) {
{{ event.type }}: {{ event.fileName }}
{{ event.timestamp | date:'medium' }}
} }

Usage Example

{{ codeExample }}
`, styleUrl: './file-upload-demo.component.scss' }) export class FileUploadDemoComponent { sizes = ['sm', 'md', 'lg'] as const; variants = ['outlined', 'filled', 'underlined'] as const; uploadForm = new FormGroup({ files: new FormControl([], [Validators.required]) }); submittedFiles: UploadedFile[] = []; recentEvents: Array<{type: string, fileName: string, timestamp: Date}> = []; readonly codeExample = `import { FileUploadComponent, UploadedFile } from '../../../../../ui-essentials/src/lib/components/forms/file-upload/file-upload.component'; // Basic usage // With reactive forms // Event handling onFilesSelected(files: UploadedFile[]): void { console.log('Selected files:', files); files.forEach(file => { console.log(file.name, file.size, file.type); }); }`; onFilesSelected(context: string, files: UploadedFile[]): void { console.log(`Files selected in ${context}:`, files); } onFormFilesSelected(files: UploadedFile[]): void { this.uploadForm.patchValue({ files }); this.uploadForm.get('files')?.markAsTouched(); } onEventFilesSelected(files: UploadedFile[]): void { this.addEvent('filesSelected', `${files.length} files total`); } onFileAdded(file: UploadedFile): void { this.addEvent('fileAdded', file.name); } onFileRemoved(file: UploadedFile): void { this.addEvent('fileRemoved', file.name); } private addEvent(type: string, fileName: string): void { this.recentEvents.push({ type, fileName, timestamp: new Date() }); } onSubmit(): void { if (this.uploadForm.valid) { this.submittedFiles = this.uploadForm.get('files')?.value || []; console.log('Form submitted with files:', this.submittedFiles); } } resetForm(): void { this.uploadForm.reset(); this.uploadForm.get('files')?.setValue([]); this.submittedFiles = []; } getFormFieldState(fieldName: string): 'default' | 'error' | 'success' { const control = this.uploadForm.get(fieldName); if (control?.invalid && control?.touched) { return 'error'; } if (control?.valid && control?.value?.length > 0) { return 'success'; } return 'default'; } getFormFieldError(fieldName: string): string { const control = this.uploadForm.get(fieldName); if (control?.invalid && control?.touched) { if (control.errors?.['required']) { return 'Please select at least one file'; } } return ''; } formatFileSize(bytes: number): string { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; } }