{"version":3,"file":"upload-utils-ui.mjs","sources":["../../../projects/upload-utils-ui/src/lib/batch-upload/models/file-item.model.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/services/file-validation.service.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/services/file-preview.service.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/services/batch-upload.service.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/directives/drag-drop.directive.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/components/file-upload-zone/file-upload-zone.component.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/components/file-item/file-item.component.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/components/file-list/file-list.component.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/components/upload-controls/upload-controls.component.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/batch-upload-manager/batch-upload-manager.component.ts","../../../projects/upload-utils-ui/src/lib/batch-upload/UploadUtilsUIModule.module.ts","../../../projects/upload-utils-ui/src/public-api.ts","../../../projects/upload-utils-ui/src/upload-utils-ui.ts"],"sourcesContent":["export enum FileStatus {\n  PENDING = 'pending',\n  UPLOADING = 'uploading',\n  PAUSED = 'paused',\n  SUCCESS = 'success',\n  ERROR = 'error'\n}\n\nexport interface FileUploadProgress {\n  loaded: number;\n  total: number;\n  percentage: number;\n}\n\nexport interface FileItem {\n  id: string;\n  file: File;\n  name: string;\n  size: number;\n  type: string;\n  status: FileStatus;\n  progress: FileUploadProgress;\n  preview?: string;\n  error?: string;\n  createdAt: Date;\n  lastModified: number;\n  data?: any;\n  originalFileId?:string;\n}\n\nexport interface FileValidationConfig {\n  maxFileSize?: number; // in bytes\n  allowedFileTypes?: string[]; // mime types\n  maxFiles?: number;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: ValidationError[];\n}\n\nexport interface ValidationError {\n  code?: string;\n  message?: string;\n  file?: File;\n}","import { Injectable } from '@angular/core';\nimport {\n  FileValidationConfig,\n  ValidationResult,\n  ValidationError\n} from '../models/file-item.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class FileValidationService {\n  private defaultConfig: FileValidationConfig = {\n    maxFileSize: 10 * 1024 * 1024, // 10MB\n    allowedFileTypes: ['*/*'],\n    maxFiles: 10\n  };\n\n  constructor() { }\n\n  validateFiles(files: File[], config?: FileValidationConfig): ValidationResult {\n    const mergedConfig: FileValidationConfig = { ...this.defaultConfig, ...config };\n    const errors: ValidationError[] = [];\n    console.log(files, mergedConfig, config, \"mergedConfig\")\n\n    // Check if number of files exceeds the limit\n    if (mergedConfig.maxFiles && files.length > mergedConfig.maxFiles) {\n      errors.push({\n        code: 'MAX_FILES_EXCEEDED',\n        message: `Maximum of ${mergedConfig.maxFiles} files allowed.`\n      });\n    }\n\n    // Validate each file\n    files.forEach(file => {\n      // Check file size\n      if (mergedConfig.maxFileSize && file.size > mergedConfig.maxFileSize) {\n        errors.push({\n          code: 'FILE_SIZE_EXCEEDED',\n          message: `File \"${file.name}\" exceeds the maximum size of ${this.formatSize(mergedConfig.maxFileSize)}.`,\n          file\n        });\n      }\n\n      // Check file type\n      if (mergedConfig.allowedFileTypes &&\n        mergedConfig.allowedFileTypes.length > 0 &&\n        mergedConfig.allowedFileTypes[0] !== '*/*') {\n\n        const fileTypeMatched = mergedConfig.allowedFileTypes.some(type => {\n          // Handle wildcard patterns like \"image/*\"\n          if (type.endsWith('/*')) {\n            const category = type.split('/')[0];\n            return file.type.startsWith(`${category}/`);\n          }\n          return file.type === type;\n        });\n\n        if (!fileTypeMatched) {\n          errors.push({\n            code: 'INVALID_FILE_TYPE',\n            message: `File \"${file.name}\" has an invalid type. Allowed types: ${this.formatAllowedTypes(mergedConfig.allowedFileTypes)}.`,\n            file\n          });\n        }\n      }\n    });\n\n    return {\n      valid: errors.length === 0,\n      errors\n    };\n  }\n\n  private formatSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  }\n\n  private formatAllowedTypes(types: string[]): string {\n    return types.map(type => {\n      if (type === '*/*') {\n        return 'All files';\n      }\n\n      if (type.endsWith('/*')) {\n        const category = type.split('/')[0];\n        switch (category) {\n          case 'image': return 'Images';\n          case 'video': return 'Videos';\n          case 'audio': return 'Audio';\n          case 'text': return 'Text files';\n          case 'application': return 'Documents';\n          default: return `All ${category} files`;\n        }\n      }\n      switch (type) {\n        case 'pdf': return 'PDF';\n        case 'msword': return 'Word Document (.doc)';\n        case 'vnd.openxmlformats-officedocument.wordprocessingml.document': return 'Word Document (.docx)';\n        case 'vnd.ms-excel': return 'Excel (.xls)';\n        case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': return 'Excel (.xlsx)';\n        case 'zip': return 'ZIP Archive';\n        case 'json': return 'JSON File';\n        case 'csv': return 'CSV File';\n        case 'plain': return 'Text File';\n        case '.xls': return 'Excel (.xls)';\n        case '.xlsx': return 'Excel (.xls)';\n        default: return type;\n      }\n    }).join(', ');\n  }\n\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class FilePreviewService {\n\n  constructor() { }\n\n  /**\n   * Generate a preview URL for a file\n   * @param file The file to generate a preview for\n   * @returns A promise that resolves to a preview URL or null if preview is not possible\n   */\n  generatePreview(file: File): Promise<string | null> {\n    if (!file) {\n      return Promise.resolve(null);\n    }\n\n    // Handle image files\n    if (file.type.startsWith('image/')) {\n      return this.createImagePreview(file);\n    }\n\n    // Handle PDF files\n    if (file.type === 'application/pdf') {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337946.png');\n    }\n\n    // Handle video files\n    if (file.type.startsWith('video/')) {\n      return this.createVideoPreview(file);\n    }\n\n    // Handle text files\n    if (file.type.startsWith('text/') || \n        file.type === 'application/json' || \n        file.type === 'application/xml') {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337956.png');\n    }\n\n    // Handle audio files\n    if (file.type.startsWith('audio/')) {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337958.png');\n    }\n\n    // Handle archive files\n    if (file.type.includes('zip') || \n        file.type.includes('rar') || \n        file.type.includes('tar') || \n        file.type.includes('7z')) {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337960.png');\n    }\n\n    // Handle spreadsheet files\n    if (file.type.includes('spreadsheet') || \n        file.type.includes('excel') || \n        file.name.endsWith('.xlsx') || \n        file.name.endsWith('.xls') || \n        file.name.endsWith('.csv')) {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337958.png');\n    }\n\n    // Handle document files\n    if (file.type.includes('document') || \n        file.type.includes('word') || \n        file.name.endsWith('.doc') || \n        file.name.endsWith('.docx')) {\n      return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337932.png');\n    }\n\n    // Default icon for unknown file types\n    return Promise.resolve('https://cdn-icons-png.flaticon.com/512/337/337948.png');\n  }\n\n  private createImagePreview(file: File): Promise<string> {\n    return new Promise((resolve) => {\n      const reader = new FileReader();\n      reader.onload = (e: any) => {\n        resolve(e.target.result);\n      };\n      reader.readAsDataURL(file);\n    });\n  }\n\n  private createVideoPreview(file: File): Promise<string> {\n    return new Promise((resolve) => {\n      const video = document.createElement('video');\n      const canvas = document.createElement('canvas');\n      const ctx = canvas.getContext('2d');\n      \n      // Create a blob URL for the video\n      const videoURL = URL.createObjectURL(file);\n      \n      video.onloadedmetadata = () => {\n        // Set canvas dimensions to match the video\n        canvas.width = video.videoWidth;\n        canvas.height = video.videoHeight;\n        \n        // Seek to a frame\n        video.currentTime = 1.0; // 1 second in\n      };\n      \n      video.onseeked = () => {\n        // Draw the video frame to the canvas\n        ctx?.drawImage(video, 0, 0, canvas.width, canvas.height);\n        \n        // Get the data URL from the canvas\n        const dataURL = canvas.toDataURL('image/jpeg');\n        \n        // Clean up\n        URL.revokeObjectURL(videoURL);\n        \n        resolve(dataURL);\n      };\n      \n      video.onerror = () => {\n        // If we can't generate a preview, return a generic video icon\n        URL.revokeObjectURL(videoURL);\n        resolve('https://cdn-icons-png.flaticon.com/512/337/337944.png');\n      };\n      \n      // Set the video source\n      video.src = videoURL;\n      video.load();\n    });\n  }\n}","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpEventType, HttpErrorResponse } from '@angular/common/http';\nimport { BehaviorSubject, Observable, Subject, of, range, throwError } from 'rxjs';\nimport { catchError, concatMap, last, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n  FileItem,\n  FileStatus,\n  FileUploadProgress,\n  FileValidationConfig,\n  ValidationResult\n} from '../models/file-item.model';\nimport { FileValidationService } from './file-validation.service';\nimport { FilePreviewService } from './file-preview.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BatchUploadService {\n  public uploadQueue = new BehaviorSubject<FileItem[]>([]);\n  public uploadQueue$ = this.uploadQueue.asObservable();\n  public uploadQueueData: any = [];\n\n  private uploadCancellationTokens: Map<string, Subject<void>> = new Map();\n  public uploadUrl = 'https://httpbin.org/post'; // Replace with your actual upload URL\n\n  private validationConfig: FileValidationConfig = {\n    maxFileSize: 10 * 1024 * 1024, // 10MB\n    allowedFileTypes: ['*/*'],\n    maxFiles: 10\n  };\n  constructor(\n    private http: HttpClient,\n    private validationService: FileValidationService,\n    private previewService: FilePreviewService) {\n    this.validationConfig = this.getValidationConfig();\n  }\n\n  /**\n   * Add files to the upload queue\n   */\n  addFiles(files: File[]): ValidationResult {\n    // Validate files\n    const validationResult = this.validationService.validateFiles(files, this.validationConfig);\n    if (validationResult.valid) {\n      const currentQueue = this.uploadQueue.getValue();\n      const newFiles: FileItem[] = [];\n      // Process valid files\n      for (const file of files) {\n        // Check if file already exists in queue\n        const fileExists = currentQueue.some(item =>\n          item.name === file.name &&\n          item.size === file.size &&\n          item.lastModified === file.lastModified\n        );\n\n        if (!fileExists) {\n          const fileItem: FileItem = {\n            id: uuidv4(),\n            file,\n            name: file.name,\n            size: file.size,\n            type: file.type,\n            status: FileStatus.PENDING,\n            progress: { loaded: 0, total: file.size, percentage: 0 },\n            createdAt: new Date(),\n            lastModified: file.lastModified\n          };\n          // Generate preview for the file\n          this.previewService.generatePreview(file).then(previewUrl => {\n            if (previewUrl) {\n              // Update the file item with preview\n              this.updateFileItem(fileItem.id, { preview: previewUrl });\n            }\n          });\n          newFiles.push(fileItem);\n        }\n      }\n      this.uploadQueue.next([...currentQueue, ...newFiles]);\n    }\n    return validationResult;\n  }\n\n  /**\n   * Update the validation configuration\n   */\n  setValidationConfig(config: FileValidationConfig): void {\n    this.validationConfig = { ...this.validationConfig, ...config };\n  }\n\n  /**\n   * Get the current validation configuration\n   */\n  getValidationConfig(): FileValidationConfig {\n    return { ...this.validationConfig };\n  }\n\n  /**\n   * Upload a single file\n   */\n  uploadFile(fileId: string): Observable<FileItem> {\n    const files = this.uploadQueue.getValue();\n    const fileIndex = files.findIndex(f => f.id === fileId);\n    if (fileIndex === -1) return throwError(() => new Error('File not found'));\n\n    const fileItem = files[fileIndex];\n\n    if (fileItem.status === FileStatus.UPLOADING || fileItem.status === FileStatus.SUCCESS) {\n      return of(fileItem);\n    }\n\n    const cancelToken = new Subject<void>();\n    this.uploadCancellationTokens.set(fileId, cancelToken);\n    this.updateFileItem(fileId, { status: FileStatus.UPLOADING });\n\n    const CHUNK_SIZE = 1 * 1024 * 1024; // 1MB\n    const file = fileItem.file;\n    const totalChunks = Math.ceil(file.size / CHUNK_SIZE);\n\n    const uploadChunk = (index: number): Observable<FileItem> => {\n      const start = index * CHUNK_SIZE;\n      const end = Math.min(start + CHUNK_SIZE, file.size);\n      const blob = file.slice(start, end);\n\n      const formData = new FormData();\n      formData.append('chunk', blob);\n      formData.append('chunkIndex', index.toString());\n      formData.append('totalChunks', totalChunks.toString());\n      formData.append('fileName', file.name);\n\n      return this.http.post(this.uploadUrl, formData, {\n        reportProgress: true,\n        observe: 'events'\n      }).pipe(takeUntil(cancelToken), map(event => {\n        let currentItem = this.getFileItemById(fileId);\n        if (!currentItem) throw new Error('File not found during upload');\n\n        if (event.type === HttpEventType.UploadProgress && event.total) {\n          const loadedSoFar = index * CHUNK_SIZE + event.loaded;\n          const total = file.size;\n          const percentage = Math.min(Math.round((loadedSoFar * 100) / total), 100);\n          currentItem = this.updateFileItem(fileId, {\n            progress: {\n              loaded: loadedSoFar,\n              total,\n              percentage\n            },\n            data: [],\n          });\n        }\n\n        if (event.type === HttpEventType.Response) {\n          currentItem = this.updateFileItem(fileId, {\n            progress: {\n              loaded: file.size,\n              total: file.size,\n              percentage: 100\n            },\n            data: event.body,\n          });\n        }\n\n        return currentItem; // intermediate progress\n      }),\n        catchError(error => {\n          const errorMessage = this.getErrorMessage(error);\n          const updatedItem = this.updateFileItem(fileId, {\n            status: FileStatus.ERROR,\n            error: errorMessage\n          });\n          this.uploadCancellationTokens.delete(fileId);\n          return throwError(() => error);\n        })\n      );\n    };\n\n    // Sequentially upload chunks\n    const uploadSequence = range(0, totalChunks).pipe(concatMap(index => uploadChunk(index)), last(), // Only emit final state once all chunks uploaded\n      map((event: any) => {\n        const updatedItem = this.updateFileItem(fileId, {\n          status: FileStatus.SUCCESS,\n          progress: {\n            loaded: file.size,\n            total: file.size,\n            percentage: 100\n          },\n          data: event?.data\n        });\n        this.uploadCancellationTokens.delete(fileId);\n        return updatedItem;\n      }),\n      catchError((error: HttpErrorResponse) => {\n        const errorMessage = this.getErrorMessage(error);\n        const updatedItem = this.updateFileItem(fileId, {\n          status: FileStatus.ERROR,\n          error: errorMessage\n        });\n        this.uploadCancellationTokens.delete(fileId);\n        return of(updatedItem);\n      })\n    );\n    return uploadSequence;\n  }\n  /**\n   * Upload all pending files\n   */\n  uploadAllFiles(): Observable<FileItem[]> {\n    const files = this.uploadQueue.getValue();\n    const pendingFiles = files.filter(f => f.status === FileStatus.PENDING || f.status === FileStatus.ERROR);\n\n    if (pendingFiles.length === 0) {\n      return of(files);\n    }\n\n    // Start uploading each file\n    pendingFiles.forEach((file) => {\n      this.uploadFile(file.id).subscribe((res: any) => this.uploadQueueData.push(res));\n    });\n    return this.uploadQueue$;\n  }\n\n  /**\n   * Cancel a file upload\n   */\n  cancelUpload(fileId: string): void {\n    const cancelToken = this.uploadCancellationTokens.get(fileId);\n\n    if (cancelToken) {\n      cancelToken.next();\n      cancelToken.complete();\n      this.uploadCancellationTokens.delete(fileId);\n\n      this.updateFileItem(fileId, { status: FileStatus.PENDING });\n    }\n  }\n\n  /**\n   * Cancel all uploads\n   */\n  cancelAllUploads(): void {\n    const files = this.uploadQueue.getValue();\n    const uploadingFiles = files.filter(f => f.status === FileStatus.UPLOADING);\n\n    uploadingFiles.forEach(file => {\n      this.cancelUpload(file.id);\n    });\n  }\n\n  /**\n   * Remove a file from the queue\n   */\n  removeFile(fileId: string): void {\n    // Cancel upload if in progress\n    this.cancelUpload(fileId);\n\n    // Remove from queue\n    const files = this.uploadQueue.getValue();\n    const updatedFiles = files.filter(f => f.id !== fileId);\n    this.uploadQueue.next(updatedFiles);\n  }\n\n  /**\n   * Remove all files from the queue\n   */\n  clearQueue(): void {\n    // Cancel all active uploads\n    this.cancelAllUploads();\n\n    // Clear the queue\n    this.uploadQueue.next([]);\n  }\n\n  /**\n   * Retry a failed upload\n   */\n  retryUpload(fileId: string): Observable<FileItem> {\n    const files = this.uploadQueue.getValue();\n    const fileIndex = files.findIndex(f => f.id === fileId);\n\n    if (fileIndex === -1) {\n      return throwError(() => new Error('File not found'));\n    }\n\n    // Reset file status and error\n    this.updateFileItem(fileId, {\n      status: FileStatus.PENDING,\n      error: undefined,\n      progress: { loaded: 0, total: files[fileIndex].size, percentage: 0 }\n    });\n\n    // Start upload again\n    return this.uploadFile(fileId);\n  }\n\n  /**\n   * Get overall upload progress\n   */\n  getTotalProgress(): number {\n    const files = this.uploadQueue.getValue();\n\n    if (files.length === 0) {\n      return 0;\n    }\n\n    const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n    const totalLoaded = files.reduce((sum, file) => sum + file.progress.loaded, 0);\n\n    return Math.round((totalLoaded * 100) / totalSize);\n  }\n\n  /**\n   * Check if all files are uploaded\n   */\n  areAllFilesUploaded(): boolean {\n    const files = this.uploadQueue.getValue();\n    return files.length > 0 && files.every(f => f.status === FileStatus.SUCCESS);\n  }\n\n  /**\n   * Helper to get a file item by ID\n   */\n  private getFileItemById(fileId: string): FileItem | undefined {\n    const files = this.uploadQueue.getValue();\n    return files.find(f => f.id === fileId);\n  }\n\n  /**\n   * Helper to update a file item\n   */\n  private updateFileItem(fileId: string, updates: Partial<FileItem>): FileItem {\n    const files = this.uploadQueue.getValue();\n    const fileIndex = files.findIndex(f => f.id === fileId);\n\n    if (fileIndex === -1) {\n      throw new Error('File not found');\n    }\n\n    const updatedFile = { ...files[fileIndex], ...updates };\n    const updatedFiles = [...files];\n    updatedFiles[fileIndex] = updatedFile;\n\n    this.uploadQueue.next(updatedFiles);\n    return updatedFile;\n  }\n\n  /**\n   * Extract error message from HTTP error\n   */\n  private getErrorMessage(error: HttpErrorResponse): string {\n    if (error.error instanceof ErrorEvent) {\n      // Client-side error\n      return `Error: ${error.error.message}`;\n    } else {\n      // Server-side error\n      return `Error Code: ${error.status}, Message: ${error.message}`;\n    }\n  }\n}","import { Directive, EventEmitter, HostBinding, HostListener, Output } from '@angular/core';\n\n@Directive({\n  selector: '[DragDrop]',\n})\nexport class DragDropDirective {\n  @Output() fileDropped = new EventEmitter<FileList>();\n  @Output() dragStateChanged = new EventEmitter<boolean>();\n  @HostBinding('class.drag-over') dragOver = false;\n\n  constructor() { }\n\n  @HostListener('dragover', ['$event'])\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (!this.dragOver) {\n      this.dragOver = true;\n      this.dragStateChanged.emit(true);\n    }\n  }\n\n  @HostListener('dragleave', ['$event'])\n  onDragLeave(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.dragOver = false;\n    this.dragStateChanged.emit(false);\n  }\n\n  @HostListener('drop', ['$event'])\n  onDrop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.dragOver = false;\n    this.dragStateChanged.emit(false);\n    if (event.dataTransfer?.files.length) {\n      this.fileDropped.emit(event.dataTransfer.files);\n    }\n  }\n}","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';\n\n@Component({\n  selector: 'file-upload-zone',\n  template: `\n    <div \n      class=\"upload-zone\" \n      [class.drag-active]=\"isDragging\" DragDrop\n      (fileDropped)=\"onFileDropped($event)\"\n      (dragStateChanged)=\"onDragStateChanged($event)\">\n      <div class=\"upload-content\">\n        <span class=\"material-symbols-rounded upload-icon\">cloud_upload</span>\n        <h3 class=\"upload-title\">Drag & Drop Files Here</h3>\n        <p class=\"upload-subtitle\">or</p>\n        <button \n          type=\"button\" \n          class=\"btn-primary select-files-btn\"\n          (click)=\"fileInput?.click()\">\n          Select Files\n        </button>\n        <input \n          #fileInput\n          type=\"file\" \n          class=\"file-input\" \n          [multiple]=\"this.multipleUpload\"\n          [accept]=\"formatAcceptString()\"\n          (change)=\"onFileSelected($event)\">\n        <p class=\"upload-hint\">\n          Max {{ formatFileSize(maxFileSize) }} per file. Accepted formats: \n          {{ formatAcceptedTypes() }}\n        </p>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .upload-zone {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      border: 2px dashed var(--neutral-300);\n      border-radius: var(--radius-lg);\n      padding: var(--space-5);\n      background-color: var(--neutral-100);\n      transition: all 0.2s ease-in-out;\n      cursor: pointer;\n    }\n    \n    .upload-zone:hover {\n      border-color: var(--primary-400);\n      background-color: var(--primary-50);\n    }\n    \n    .drag-active {\n      border-color: var(--primary-500);\n      background-color: var(--primary-50);\n      transform: scale(1.01);\n      box-shadow: var(--shadow-md);\n    }\n    \n    .upload-content {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      text-align: center;\n    }\n    \n    .upload-icon {\n      font-size: 48px;\n      color: var(--primary-500);\n      margin-bottom: var(--space-2);\n    }\n    \n    .upload-title {\n      font-size: var(--font-size-lg);\n      font-weight: 600;\n      color: var(--neutral-800);\n      margin-bottom: var(--space-1);\n    }\n    \n    .upload-subtitle {\n      font-size: var(--font-size-md);\n      color: var(--neutral-500);\n      margin-bottom: var(--space-2);\n    }\n    \n    .select-files-btn {\n      margin-bottom: var(--space-3);\n      transition: all 0.2s ease;\n    }\n    \n    .select-files-btn:hover {\n      transform: translateY(-2px);\n    }\n    \n    .file-input {\n      display: none;\n    }\n    \n    .upload-hint {\n      font-size: var(--font-size-sm);\n      color: var(--neutral-500);\n      max-width: 400px;\n    }\n    \n    @media (max-width: 640px) {\n      .upload-zone {\n        padding: var(--space-3);\n      }\n      \n      .upload-icon {\n        font-size: 36px;\n      }\n      \n      .upload-title {\n        font-size: var(--font-size-md);\n      }\n    }\n  `]\n})\nexport class FileUploadZoneComponent {\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n  @Input() maxFileSize: number = 10 * 1024 * 1024; // 10MB\n  @Input() allowedFileTypes: string[] = ['*/*'];\n  @Input() maxFiles: number = 10;\n  @Input() multipleUpload: boolean = false;\n  @Output() filesSelected = new EventEmitter<File[]>();\n  isDragging = false;\n\n  onFileSelected(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    if (target.files && target.files.length) {\n      const files = Array.from(target.files);\n      this.filesSelected.emit(files);\n      this.fileInput.nativeElement.value = '';\n    }\n  }\n\n  onFileDropped(fileList: FileList): void {\n    const files = Array.from(fileList);\n    this.filesSelected.emit(files);\n  }\n\n  onDragStateChanged(isDragging: boolean): void {\n    this.isDragging = isDragging;\n  }\n\n  formatFileSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  }\n\n  formatAcceptString(): string {\n    if (this.allowedFileTypes.includes('*/*')) {\n      return '*';\n    }\n    return this.allowedFileTypes.join(',');\n  }\n\n  formatAcceptedTypes(): string {\n    if (this.allowedFileTypes?.includes('*/*')) {\n      return 'All files';\n    }\n\n    return this.allowedFileTypes.map(type => {\n      if (type?.endsWith('/*')) {\n        const category = type?.split('/')[0];\n        switch (category) {\n          case 'image': return 'Images';\n          case 'video': return 'Videos';\n          case 'audio': return 'Audio';\n          case 'text': return 'Text files';\n          case 'application': return 'Documents';\n          default: return `${category?.charAt(0).toUpperCase() + category?.slice(1)} files`;\n        }\n      } else {\n        switch (type.toUpperCase()) {\n          case 'pdf': return 'PDF';\n          case 'msword': return 'Word Document (.doc)';\n          case 'vnd.openxmlformats-officedocument.wordprocessingml.document': return 'Word Document (.docx)';\n          case 'vnd.ms-excel': return 'Excel (.xls)';\n          case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': return 'Excel (.xlsx)';\n          case 'zip': return 'ZIP Archive';\n          case 'json': return 'JSON File';\n          case 'csv': return 'CSV File';\n          case 'plain': return 'Text File';\n          case '.xls': return 'Excel (.xls)';\n          case '.xlsx': return 'Excel (.xls)';\n          default: return type;\n        }\n      }\n    }).join(', ');\n  }\n\n}","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FileItem, FileStatus } from '../../models/file-item.model';\n\n@Component({\n  selector: 'file-item',\n  template: `\n    <div class=\"file-item\" [ngClass]=\"getFileStatusClass()\">\n      <div class=\"file-preview\">\n        <img \n          *ngIf=\"file.preview\" \n          [src]=\"file.preview\" \n          [alt]=\"file.name\" \n          class=\"preview-image\">\n        <div *ngIf=\"!file.preview\" class=\"preview-placeholder\">\n          <span class=\"material-symbols-rounded\">description</span>\n        </div>\n        \n        <div class=\"file-overlay\" *ngIf=\"file.status === 'uploading'\">\n          <div class=\"progress-circle\">\n            <svg viewBox=\"0 0 36 36\" class=\"progress-ring\">\n              <path class=\"progress-ring-bg\"\n                d=\"M18 2.0845\n                  a 15.9155 15.9155 0 0 1 0 31.831\n                  a 15.9155 15.9155 0 0 1 0 -31.831\"\n              />\n              <path class=\"progress-ring-value\"\n                [attr.stroke-dasharray]=\"getProgressDashArray()\"\n                d=\"M18 2.0845\n                  a 15.9155 15.9155 0 0 1 0 31.831\n                  a 15.9155 15.9155 0 0 1 0 -31.831\"\n              />\n            </svg>\n            <span class=\"progress-text\">{{ file.progress.percentage }}%</span>\n          </div>\n        </div>\n      </div>\n      \n      <div class=\"file-info\">\n        <div class=\"file-header\">\n          <div class=\"file-name-wrapper\">\n            <span class=\"file-name\" [title]=\"file.name\">{{ getTruncatedFileName() }}</span>\n            <span class=\"file-status-indicator\" [ngClass]=\"getStatusIndicatorClass()\"></span>\n          </div>\n          <span class=\"file-size\">{{ formatFileSize(file.size) }}</span>\n        </div>\n        \n        <div class=\"file-status-message\" *ngIf=\"file.status === 'error'\">\n          <span class=\"material-symbols-rounded error-icon\">error</span>\n          <span class=\"error-message\">{{ file.error || 'Upload failed' }}</span>\n        </div>\n        \n        <div class=\"file-progress\" *ngIf=\"file.status === 'uploading'\">\n          <div class=\"progress-bar\">\n            <div class=\"progress-bar-value\" [style.width.%]=\"file.progress.percentage\"></div>\n          </div>\n          <span class=\"progress-percentage\">{{ file.progress.percentage }}%</span>\n        </div>\n        \n        <div class=\"file-actions\">\n          <button \n            *ngIf=\"file.status === 'pending'\" \n            class=\"action-btn upload-btn\" \n            (click)=\"upload.emit()\">\n            <span class=\"material-symbols-rounded\">upload</span>\n            Upload\n          </button>\n          \n          <button \n            *ngIf=\"file.status === 'uploading'\" \n            class=\"action-btn cancel-btn\" \n            (click)=\"cancel.emit()\">\n            <span class=\"material-symbols-rounded\">pause</span>\n            Cancel\n          </button>\n          \n          <button \n            *ngIf=\"file.status === 'error'\" \n            class=\"action-btn retry-btn\" \n            (click)=\"retry.emit()\">\n            <span class=\"material-symbols-rounded\">refresh</span>\n            Retry\n          </button>\n          \n          <button \n            *ngIf=\"file.status === 'success'\" \n            class=\"action-btn success-btn\" \n            disabled>\n            <span class=\"material-symbols-rounded\">check_circle</span>\n            Uploaded\n          </button>\n          \n          <button \n            class=\"action-btn remove-btn\" \n            (click)=\"remove.emit()\">\n            <span class=\"material-symbols-rounded\">delete</span>\n            Remove\n          </button>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .file-item {\n      display: flex;\n      flex-direction: column;\n      border-radius: var(--radius-md);\n      background-color: white;\n      box-shadow: var(--shadow-sm);\n      overflow: hidden;\n      transition: all 0.2s ease-in-out;\n    }\n    \n    .file-item:hover {\n      box-shadow: var(--shadow-md);\n      transform: translateY(-2px);\n    }\n    \n    .file-preview {\n      position: relative;\n      height: 160px;\n      background-color: var(--neutral-100);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    \n    .preview-image {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n    \n    .preview-placeholder {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      height: 100%;\n      color: var(--neutral-400);\n    }\n    \n    .preview-placeholder .material-symbols-rounded {\n      font-size: 48px;\n    }\n    \n    .file-overlay {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background-color: rgba(0, 0, 0, 0.5);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    \n    .progress-circle {\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n    }\n    \n    .progress-ring {\n      width: 100%;\n      height: 100%;\n      transform: rotate(-90deg);\n    }\n    \n    .progress-ring-bg {\n      fill: none;\n      stroke: rgba(255, 255, 255, 0.2);\n      stroke-width: 2.8;\n    }\n    \n    .progress-ring-value {\n      fill: none;\n      stroke: white;\n      stroke-width: 2.8;\n      stroke-linecap: round;\n      transition: stroke-dasharray 0.3s ease;\n    }\n    \n    .progress-text {\n      position: absolute;\n      font-size: var(--font-size-sm);\n      font-weight: 600;\n      color: white;\n    }\n    \n    .file-info {\n      padding: var(--space-3);\n      display: flex;\n      flex-direction: column;\n      gap: var(--space-2);\n    }\n    \n    .file-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-start;\n    }\n    \n    .file-name-wrapper {\n      display: flex;\n      align-items: center;\n      gap: var(--space-1);\n      max-width: 80%;\n    }\n    \n    .file-name {\n      font-weight: 600;\n      color: var(--neutral-800);\n      word-break: break-word;\n      line-height: 1.3;\n    }\n    \n    .file-size {\n      font-size: var(--font-size-sm);\n      color: var(--neutral-500);\n      white-space: nowrap;\n    }\n    \n    .file-status-indicator {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n    }\n    \n    .status-pending {\n      background-color: var(--neutral-400);\n    }\n    \n    .status-uploading {\n      background-color: var(--primary-500);\n      animation: pulse 1.5s infinite;\n    }\n    \n    .status-success {\n      background-color: var(--success-500);\n    }\n    \n    .status-error {\n      background-color: var(--error-500);\n    }\n    \n    .file-status-message {\n      display: flex;\n      align-items: center;\n      gap: var(--space-1);\n      color: var(--error-700);\n      font-size: var(--font-size-sm);\n      background-color: var(--error-50);\n      padding: var(--space-1) var(--space-2);\n      border-radius: var(--radius-sm);\n    }\n    \n    .error-icon {\n      font-size: 16px;\n      color: var(--error-500);\n    }\n    \n    .file-progress {\n      display: flex;\n      align-items: center;\n      gap: var(--space-2);\n    }\n    \n    .progress-bar {\n      flex: 1;\n      height: 4px;\n      background-color: var(--neutral-200);\n      border-radius: var(--radius-full);\n      overflow: hidden;\n    }\n    \n    .progress-bar-value {\n      height: 100%;\n      background-color: var(--primary-500);\n      border-radius: var(--radius-full);\n      transition: width 0.3s ease;\n    }\n    \n    .progress-percentage {\n      font-size: var(--font-size-sm);\n      color: var(--neutral-600);\n      min-width: 40px;\n      text-align: right;\n    }\n    \n    .file-actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: var(--space-2);\n      margin-top: var(--space-1);\n    }\n    \n    .action-btn {\n      display: flex;\n      align-items: center;\n      gap: var(--space-1);\n      font-size: var(--font-size-sm);\n      padding: var(--space-1) var(--space-2);\n      border-radius: var(--radius-sm);\n      cursor: pointer;\n      transition: all 0.2s ease;\n    }\n    \n    .action-btn .material-symbols-rounded {\n      font-size: 18px;\n    }\n    \n    .upload-btn {\n      background-color: var(--primary-50);\n      color: var(--primary-700);\n    }\n    \n    .upload-btn:hover {\n      background-color: var(--primary-100);\n    }\n    \n    .cancel-btn {\n      background-color: var(--neutral-100);\n      color: var(--neutral-700);\n    }\n    \n    .cancel-btn:hover {\n      background-color: var(--neutral-200);\n    }\n    \n    .retry-btn {\n      background-color: var(--warning-50);\n      color: var(--warning-700);\n    }\n    \n    .retry-btn:hover {\n      background-color: var(--warning-100);\n    }\n    \n    .success-btn {\n      background-color: var(--success-50);\n      color: var(--success-700);\n      cursor: default;\n    }\n    \n    .remove-btn {\n      background-color: var(--error-50);\n      color: var(--error-700);\n    }\n    \n    .remove-btn:hover {\n      background-color: var(--error-100);\n    }\n    \n    /* Status-based styling */\n    .file-item-uploading {\n      border: 1px solid var(--primary-200);\n    }\n    \n    .file-item-success {\n      border: 1px solid var(--success-200);\n    }\n    \n    .file-item-error {\n      border: 1px solid var(--error-200);\n    }\n    \n    @keyframes pulse {\n      0% {\n        opacity: 1;\n      }\n      50% {\n        opacity: 0.5;\n      }\n      100% {\n        opacity: 1;\n      }\n    }\n    \n    @media (max-width: 640px) {\n      .file-actions {\n        flex-direction: row;\n        justify-content: space-between;\n      }\n      \n      .action-btn {\n        flex: 1;\n        justify-content: center;\n      }\n    }\n  `]\n})\nexport class FileItemComponent {\n  @Input() file!: FileItem;\n  \n  @Output() upload = new EventEmitter<void>();\n  @Output() cancel = new EventEmitter<void>();\n  @Output() retry = new EventEmitter<void>();\n  @Output() remove = new EventEmitter<void>();\n\n  getFileStatusClass(): string {\n    switch (this.file.status) {\n      case FileStatus.UPLOADING:\n        return 'file-item-uploading';\n      case FileStatus.SUCCESS:\n        return 'file-item-success';\n      case FileStatus.ERROR:\n        return 'file-item-error';\n      default:\n        return '';\n    }\n  }\n\n  getStatusIndicatorClass(): string {\n    switch (this.file.status) {\n      case FileStatus.PENDING:\n        return 'status-pending';\n      case FileStatus.UPLOADING:\n        return 'status-uploading';\n      case FileStatus.SUCCESS:\n        return 'status-success';\n      case FileStatus.ERROR:\n        return 'status-error';\n      default:\n        return '';\n    }\n  }\n\n  getTruncatedFileName(): string {\n    if (!this.file.name) return '';\n    \n    if (this.file.name.length > 25) {\n      const ext = this.file.name.split('.').pop();\n      const nameWithoutExt = this.file.name.substring(0, this.file.name.lastIndexOf('.'));\n      return `${nameWithoutExt.substring(0, 20)}...${ext ? '.' + ext : ''}`;\n    }\n    \n    return this.file.name;\n  }\n\n  formatFileSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n    \n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    \n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  }\n\n  getProgressDashArray(): string {\n    const circumference = 2 * Math.PI * 15.9155;\n    const dashOffset = circumference * (1 - this.file.progress.percentage / 100);\n    return `${circumference - dashOffset} ${dashOffset}`;\n  }\n}","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { FileItem, FileStatus } from '../../models/file-item.model';\n\n@Component({\n  selector: 'file-list',\n  template: `\n    <div class=\"file-list-container\">\n      <h3 class=\"file-list-title\">Files ({{ files?.length || 0 }})</h3>\n      <div class=\"file-list\">\n        <file-item\n          *ngFor=\"let file of files\"\n          [file]=\"file\"\n          (upload)=\"onUpload(file.id)\"\n          (cancel)=\"onCancel(file.id)\"\n          (retry)=\"onRetry(file.id)\"\n          (remove)=\"onRemove(file.id)\">\n        </file-item>\n        <div *ngIf=\"!files?.length\" class=\"no-files-message\">\n          No files added yet\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .file-list-container {\n      display: flex;\n      flex-direction: column;\n      gap: var(--space-3);\n    }\n    \n    .file-list-title {\n      font-size: var(--font-size-lg);\n      font-weight: 600;\n      color: var(--neutral-800);\n      margin: 0;\n    }\n    \n    .file-list {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n      gap: var(--space-3);\n    }\n    \n    .no-files-message {\n      grid-column: 1 / -1;\n      text-align: center;\n      padding: var(--space-4);\n      color: var(--neutral-500);\n      background-color: var(--neutral-100);\n      border-radius: var(--radius-md);\n    }\n    \n    @media (max-width: 640px) {\n      .file-list {\n        grid-template-columns: 1fr;\n      }\n    }\n  `]\n})\nexport class FileListComponent {\n  @Input() files: FileItem[] | null = [];\n  @Output() uploadFile = new EventEmitter<string>();\n  @Output() cancelFile = new EventEmitter<string>();\n  @Output() retryFile = new EventEmitter<string>();\n  @Output() removeFile = new EventEmitter<string>();\n  \n  onUpload(fileId: string): void {\n    this.uploadFile.emit(fileId);\n  }\n  \n  onCancel(fileId: string): void {\n    this.cancelFile.emit(fileId);\n  }\n  \n  onRetry(fileId: string): void {\n    this.retryFile.emit(fileId);\n  }\n  \n  onRemove(fileId: string): void {\n    this.removeFile.emit(fileId);\n  }\n}","import { Component, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n  selector: 'upload-controls',\n  template: `\n    <div class=\"upload-controls\">\n      <div class=\"controls-info\">\n        <div class=\"total-progress\">\n          <div class=\"progress-label\">\n            <span>Total Progress</span>\n            <span>{{ uploadProgress }}%</span>\n          </div>\n          <div class=\"progress-bar\">\n            <div \n              class=\"progress-bar-value\" \n              [style.width.%]=\"uploadProgress\"\n              [class.progress-complete]=\"allUploaded\">\n            </div>\n          </div>\n        </div>\n        \n        <div class=\"files-counter\">\n          <span class=\"counter-label\">Files:</span>\n          <span class=\"counter-value\">{{ filesCount }}</span>\n        </div>\n      </div>\n      \n      <div class=\"controls-actions\">\n        <button \n          class=\"btn-primary action-btn upload-all-btn\" \n          (click)=\"uploadAll.emit()\"\n          [disabled]=\"allUploaded\">\n          <span class=\"material-symbols-rounded\">upload</span>\n          Upload All\n        </button>\n        \n        <button \n          class=\"btn-secondary action-btn cancel-all-btn\" \n          (click)=\"cancelAll.emit()\">\n          <span class=\"material-symbols-rounded\">pause</span>\n          Cancel All\n        </button>\n        \n        <button \n          class=\"btn-error action-btn clear-btn\" \n          (click)=\"clearAll.emit()\">\n          <span class=\"material-symbols-rounded\">delete</span>\n          Clear All\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .upload-controls {\n      display: flex;\n      flex-direction: column;\n      gap: var(--space-3);\n      background-color: white;\n      padding: var(--space-3);\n      border-radius: var(--radius-md);\n      box-shadow: var(--shadow-sm);\n    }\n    \n    .controls-info {\n      display: flex;\n      flex-direction: column;\n      gap: var(--space-2);\n    }\n    \n    .total-progress {\n      display: flex;\n      flex-direction: column;\n      gap: var(--space-1);\n    }\n    \n    .progress-label {\n      display: flex;\n      justify-content: space-between;\n      font-size: var(--font-size-sm);\n      color: var(--neutral-700);\n    }\n    \n    .progress-bar {\n      height: 8px;\n      background-color: var(--neutral-200);\n      border-radius: var(--radius-full);\n      overflow: hidden;\n    }\n    \n    .progress-bar-value {\n      height: 100%;\n      background-color: var(--primary-500);\n      border-radius: var(--radius-full);\n      transition: width 0.3s ease;\n    }\n    \n    .progress-complete {\n      background-color: var(--success-500);\n    }\n    \n    .files-counter {\n      display: flex;\n      align-items: center;\n      gap: var(--space-1);\n      font-size: var(--font-size-sm);\n    }\n    \n    .counter-label {\n      color: var(--neutral-700);\n    }\n    \n    .counter-value {\n      font-weight: 600;\n      color: var(--neutral-800);\n    }\n    \n    .controls-actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: var(--space-2);\n    }\n    \n    .action-btn {\n      display: flex;\n      align-items: center;\n      gap: var(--space-1);\n      flex: 1;\n      justify-content: center;\n      min-width: 110px;\n    }\n    \n    .action-btn:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n    \n    @media (max-width: 640px) {\n      .controls-actions {\n        flex-direction: column;\n      }\n    }\n  `]\n})\nexport class UploadControlsComponent {\n  @Input() uploadProgress: number = 0;\n  @Input() filesCount: number = 0;\n  @Input() allUploaded: boolean = false;\n  \n  @Output() uploadAll = new EventEmitter<void>();\n  @Output() cancelAll = new EventEmitter<void>();\n  @Output() clearAll = new EventEmitter<void>();\n}","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { BatchUploadService } from '../services/batch-upload.service';\nimport { ValidationError } from '../models/file-item.model';\nimport { BehaviorSubject } from 'rxjs';\n\n@Component({\n  selector: 'batch-upload-manager',\n  template: `\n    <div class=\"batch-upload-container\">\n      <h2 class=\"section-title\">{{titleHeader}}</h2>\n      \n      <!-- Validation errors display -->\n      <div *ngIf=\"validationErrors.length > 0\" class=\"validation-errors\">\n        <div class=\"error-header\">\n          <span class=\"material-symbols-rounded\">error</span>\n          <h3>Please fix the following errors:</h3>\n        </div>\n        <ul>\n          <li *ngFor=\"let error of validationErrors\">{{ error.message }}</li>\n        </ul>\n      </div>\n      <div *ngIf=\"validationErrors.length==0\">\n      \n      <!-- Upload Zone -->\n      <file-upload-zone\n        [maxFileSize]=\"maxFileSize\"\n        [allowedFileTypes]=\"allowedFileTypes\"\n        [maxFiles]=\"maxFiles\"\n        [multipleUpload]=\"this.multipleUpload\"\n        (filesSelected)=\"onFilesSelected($event)\">\n      </file-upload-zone>\n      \n      <!-- Upload Controls -->\n      <upload-controls \n        *ngIf=\"(files$)?.length\"\n        [uploadProgress]=\"totalProgress\"\n        [filesCount]=\"(files$)?.length || 0\"\n        [allUploaded]=\"allFilesUploaded\"\n        (uploadAll)=\"onUploadAll()\"\n        (cancelAll)=\"onCancelAll()\"\n        (clearAll)=\"onClearAll()\">\n      </upload-controls>\n      \n      <!-- File List -->\n      <file-list \n        *ngIf=\"(files$)?.length\"\n        [files]=\"files$\"\n        (uploadFile)=\"onUploadFile($event)\"\n        (cancelFile)=\"onCancelFile($event)\"\n        (retryFile)=\"onRetryFile($event)\"\n        (removeFile)=\"onRemoveFile($event)\">\n      </file-list>\n    </div>\n     <ng-content></ng-content>\n    </div>\n  `,\n  styleUrls: [`../../styles/global.common.css`, '../../styles/batch-upload-manager.component.css']\n})\nexport class BatchUploadManagerComponent implements OnInit, OnDestroy {\n  files: BehaviorSubject<any> = new BehaviorSubject([]);\n  files$: any = this.files.asObservable();\n  validationErrors: ValidationError[] = [];\n  totalProgress = 0;\n  allFilesUploaded = false;\n  maxFileSize = 10 * 1024 * 1024; // 10MB\n  @Input() allowedFileTypes = ['image/*', 'application/pdf', 'text/plain'];\n  @Input() maxFiles = 10;\n  @Input() uploadUrl = '';\n  @Input() titleHeader = 'Batch Upload Manager';\n  @Output() eventCompleted: EventEmitter<any> = new EventEmitter();\n  @Input() multipleUpload: boolean = false;\n\n  constructor(private uploadService: BatchUploadService) { }\n\n  ngOnInit(): void {\n    // Set validation config\n    if (this.uploadUrl == '') {\n      this.validationErrors.push({ message: \"Please add upload url link!\" })\n    } else {\n      this.validationErrors = [];\n      this.uploadService.uploadUrl = this.uploadUrl;\n      this.uploadService.uploadQueue.subscribe((res) => {\n        this.files$ = res;\n        console.log(res,this.uploadService.areAllFilesUploaded(),\"areAllFilesUploaded\")\n        if (res.length) {\n          this.totalProgress = this.uploadService.getTotalProgress();\n          this.allFilesUploaded = this.uploadService.areAllFilesUploaded();\n        } else {\n          this.totalProgress = 0;\n          this.allFilesUploaded = false;\n        }\n        if (this.allFilesUploaded) {\n          this.eventCompleted.emit({\n            totalProgress: this.totalProgress,\n            allFilesUploaded: this.allFilesUploaded,\n            uploadUrl: this.uploadUrl,\n            uploadQueue: res,\n            validationErrors: this.validationErrors,\n            allowedFileTypes: this.allowedFileTypes,\n            uploadQueueData: this.uploadService.uploadQueueData,\n            maxFiles: this.maxFiles\n          })\n        }\n      });\n      this.uploadService.setValidationConfig({\n        maxFileSize: this.maxFileSize,\n        allowedFileTypes: this.allowedFileTypes,\n        maxFiles: this.maxFiles\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.uploadService.uploadQueue.next([]);\n    this.onClearAll()\n  }\n\n  onFilesSelected(files: File[]): void {\n    if (!this.multipleUpload) {\n      this.uploadService.uploadQueue.next([]);\n      this.onClearAll()\n    }\n    const result = this.uploadService.addFiles(files);\n    this.validationErrors = result.errors;\n    // Clear validation errors after 5 seconds\n    if (this.validationErrors.length) {\n      setTimeout(() => {\n        this.validationErrors = [];\n      }, 5000);\n    }\n  }\n\n  onUploadFile(fileId: string): void {\n    this.uploadService.uploadFile(fileId).subscribe((res: any) => this.uploadService.uploadQueueData.push(res));\n  }\n\n  onCancelFile(fileId: string): void {\n    this.uploadService.cancelUpload(fileId);\n  }\n\n  onRetryFile(fileId: string): void {\n    this.uploadService.retryUpload(fileId).subscribe();\n  }\n\n  onRemoveFile(fileId: string): void {\n    this.uploadService.removeFile(fileId);\n  }\n\n  onUploadAll(): void {\n    this.uploadService.uploadAllFiles().subscribe();\n  }\n\n  onCancelAll(): void {\n    this.uploadService.cancelAllUploads();\n  }\n\n  onClearAll(): void {\n    this.uploadService.clearQueue();\n    this.validationErrors = [];\n  }\n}","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { DragDropDirective } from \"./directives/drag-drop.directive\";\r\nimport { FileUploadZoneComponent } from \"./components/file-upload-zone/file-upload-zone.component\";\r\nimport { FileListComponent } from \"./components/file-list/file-list.component\";\r\nimport { UploadControlsComponent } from \"./components/upload-controls/upload-controls.component\";\r\nimport { BatchUploadManagerComponent } from \"./batch-upload-manager/batch-upload-manager.component\";\r\nimport { FileItemComponent } from \"./components/file-item/file-item.component\";\r\nimport { BatchUploadService } from \"./services/batch-upload.service\";\r\nimport { FilePreviewService } from \"./services/file-preview.service\";\r\nimport { FileValidationService } from \"./services/file-validation.service\";\r\n\r\n@NgModule({\r\n    declarations: [\r\n        DragDropDirective,\r\n        FileUploadZoneComponent,\r\n        FileListComponent,\r\n        UploadControlsComponent,\r\n        BatchUploadManagerComponent,\r\n        FileItemComponent\r\n    ],\r\n    exports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        DragDropDirective,\r\n        FileUploadZoneComponent,\r\n        FileListComponent,\r\n        UploadControlsComponent,\r\n        BatchUploadManagerComponent,\r\n        FileItemComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        ReactiveFormsModule\r\n    ],\r\n    providers: [\r\n        BatchUploadService,\r\n        FilePreviewService,\r\n        FileValidationService\r\n    ]\r\n})\r\nexport class UploadUtilsUIModule {\r\n\r\n}","/*\r\n * Public API Surface of upload-utils-ui\r\n */\r\n\r\nexport * from './lib/batch-upload/batch-upload-manager/batch-upload-manager.component';\r\nexport * from './lib/batch-upload/components/file-item/file-item.component';\r\nexport * from './lib/batch-upload/components/file-list/file-list.component';\r\nexport * from './lib/batch-upload/components/file-upload-zone/file-upload-zone.component';\r\nexport * from './lib/batch-upload/components/upload-controls/upload-controls.component';\r\nexport * from './lib/batch-upload//directives/drag-drop.directive';\r\nexport * from './lib/batch-upload/models/file-item.model';\r\nexport * from './lib/batch-upload/services/batch-upload.service';\r\nexport * from './lib/batch-upload/services/file-preview.service';\r\nexport * from './lib/batch-upload/services/file-validation.service';\r\nexport * from './lib/batch-upload/UploadUtilsUIModule.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4","i2.FileValidationService","i3.FilePreviewService","i1.DragDropDirective","i1","i2.FileItemComponent","i1.BatchUploadService","i2","i3.FileUploadZoneComponent","i4.FileListComponent","i5.UploadControlsComponent"],"mappings":"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"}