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.
@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' }}
}
}
`,
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];
}
}