{"version":3,"file":"usitsdasdesign-dds-ng-uploader.mjs","sources":["../../src/app/dds/uploader/typings.ts","../../src/app/dds/uploader/upload-file.ts","../../src/app/dds/uploader/uploader/constants.ts","../../src/app/dds/uploader/uploader/uploader.component.ts","../../src/app/dds/uploader/uploader/uploader.component.html","../../src/app/dds/uploader/uploader.module.ts","../../src/app/dds/uploader/usitsdasdesign-dds-ng-uploader.ts"],"sourcesContent":["import { ButtonKind, ErrorState, Themes } from '@usitsdasdesign/dds-ng/shared';\n\nexport interface UploaderOptions {\n  heading?: string;\n  description?: string;\n  url?: string;\n  dragAndDropIcon?: string;\n  dragAndDropText?: string;\n  customClass?: string;\n  isDragAndDrop?: boolean;\n  isMultiple?: boolean;\n  isDownloadable?: boolean;\n  maxSize?: number;\n  maxTotalSize?: number;\n  maxFiles?: number;\n  maxSymbolsName?: number;\n  maxSymbolsNameError?: number;\n  acceptFormats?: MimeType | string;\n  acceptExtensions?: string;\n  restrictedFormats?: MimeType | string;\n  restrictedExtensions?: string;\n  theme?: Themes | string;\n  exceptSymbols?: string;\n  btnLabel?: string;\n  isError?: boolean;\n  isInverse?: boolean;\n  errorState?: string | ErrorState;\n  errorMessage?: string;\n  itemErrorMessage?: string;\n  itemSuccessMessage?: string;\n  knownExtensions?: ExtensionsMap;\n  unknownExtensionsIcon?: string;\n  disabled?: boolean;\n  isRequired?: boolean;\n  allowFilesWithoutType?: boolean;\n  chooseFileBtnKind?: ButtonKind | string;\n  downloadBtnText?: string;\n  removeBtnText?: string;\n  refreshText?: string;\n  maxSizeError?: string;\n  maxFilesErrorText?: string;\n  specialSymbolsErrorText?: string;\n  fileTypeErrorText?: string;\n  noFileTypeErrorText?: string;\n  maxTotalSizeErrorText?: string;\n  nameLengthErrorText?: string;\n}\n\nexport interface ExtensionsMap {\n  [key: string]: string;\n}\n\nexport interface UploadedFile {\n  name?: string;\n  type?: string;\n  size?: number;\n  [key: string]: any;\n}\n\nexport enum UploadFileStatus {\n  progress,\n  success,\n  error,\n}\n","import { HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Subscription } from 'rxjs';\nimport { UploadFileStatus } from './typings';\n\nexport class UploadFile<T = File> {\n  public file: T;\n  public message: string;\n  public fileName: string;\n  public fileExtenstion: string;\n  public status: UploadFileStatus;\n  public successInfoStatus: boolean;\n  public errorMessage: string[] = [];\n  public progress = 0;\n  public description = '';\n  public request: Subscription = null;\n  public response: HttpResponse<unknown> | HttpErrorResponse = null;\n  public isDownloadable = false;\n\n  constructor(file: T) {\n    this.file = file;\n  }\n\n  public remove = () => { };\n  public update = () => { };\n\n  // statuses\n  public isSuccess = () => this.status === UploadFileStatus.success;\n  public isError = () => this.status === UploadFileStatus.error;\n  public inProgress = () => this.status === UploadFileStatus.progress;\n}\n","import { ThemeClassesMap, ThemeMapEnum } from '@usitsdasdesign/dds-ng/core/theme';\nimport {ButtonKind, ExtThemes} from '@usitsdasdesign/dds-ng/shared';\nimport { ExtensionsMap } from '../typings';\n\nexport const DEFAULT_TITLE = 'Upload files';\nexport const DEFAULT_BTN_LABEL = 'Choose file';\nexport const DEFAULT_ERROR_MESSAGE = 'Something went wrong';\nexport const DEFAULT_SUCCESS_MESSAGE = 'Successfully uploaded';\nexport const DEFAULT_DRAG_AND_DROP_ICON = 'dds-icon_upload';\nexport const KNOWN_EXTENSTIONS: ExtensionsMap = {\n  jpg: 'dds-icon_file_jpg__l__filled',\n  png: 'dds-icon_file_png__l__filled',\n  pdf: 'dds-icon_file_pdf__l__filled',\n  psd: 'dds-icon_file_psd__l__filled',\n  doc: 'dds-icon_file_doc__l__filled',\n  docx: 'dds-icon_file_doc__l__filled',\n  xls: 'dds-icon_file_xls__l__filled',\n  xlsx: 'dds-icon_file_xls__l__filled',\n  csv: 'dds-icon_file_csv__l__filled',\n  xml: 'dds-icon_file_xls__l__filled',\n  zip: 'dds-icon_file_zip__l__filled',\n  txt: 'dds-icon_file_txt__l__filled',\n};\nexport const UNKNOWN_EXTENSTIONS = 'dds-icon_file_other__l__filled';\nexport const SHOWN_SUCCES_TEXT_TIME = 2000;\nexport const CONVERT_MAX_FILE_SIZE = 1024;\nexport const themeClassesMap: ThemeClassesMap = {\n  [ThemeMapEnum.Themes]: {\n    [ExtThemes.dark]: 'dds-uploader_dark',\n    [ExtThemes.blue]: 'dds-uploader_blue',\n  },\n};\nexport const themeBtnClassesMap: ThemeClassesMap = {\n  [ThemeMapEnum.Themes]: {\n    [ExtThemes.dark]: 'dds-btn_dark',\n    [ExtThemes.blue]: 'dds-btn_blue',\n  },\n  [ThemeMapEnum.Kind]: {\n    [ButtonKind.primary]: 'dds-btn_primary',\n    [ButtonKind.secondary]: 'dds-btn_secondary',\n    [ButtonKind.secondaryLoud]: 'dds-btn_secondary-loud',\n    [ButtonKind.silent]: 'dds-btn_silent',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { HttpClient, HttpErrorResponse, HttpEventType, HttpRequest, HttpResponse } from '@angular/common/http';\nimport {\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  Input,\n  OnChanges,\n  OnDestroy,\n  Optional,\n  Output,\n  Self,\n  SimpleChanges,\n  ViewChild\n} from '@angular/core';\nimport { FormGroupDirective, FormsModule, NgControl, NgForm } from '@angular/forms';\nimport {\n  DestroyCtor,\n  DestroyMixin,\n  ErrorStateCtor,\n  ErrorStateMixin,\n  FormAccessorCtor,\n  FormAccessorMixin,\n  I18nCtor,\n  I18nMixin,\n} from '@usitsdasdesign/dds-ng/core/common-behaviors';\nimport { FocusHandlerModule } from '@usitsdasdesign/dds-ng/core/focus-handler';\nimport { SizeModule, SizePipe } from '@usitsdasdesign/dds-ng/core/size';\nimport { ThemeClassesMap, ThemeModule } from '@usitsdasdesign/dds-ng/core/theme';\nimport { coerceBooleanProperty } from '@usitsdasdesign/dds-ng/core/utils';\nimport { ProgressModule } from '@usitsdasdesign/dds-ng/progress';\nimport { AdditionalClass, ButtonKind, ErrorState, Themes } from '@usitsdasdesign/dds-ng/shared';\nimport { DdsConfigService } from '@usitsdasdesign/dds-ng/shared/dds-config';\nimport { I18nModule, I18nService, ITranslation } from '@usitsdasdesign/dds-ng/shared/i18n';\nimport { BehaviorSubject } from 'rxjs';\nimport { ExtensionsMap, UploadFileStatus, UploadedFile } from '../typings';\nimport { UploadFile } from '../upload-file';\nimport {\n  CONVERT_MAX_FILE_SIZE,\n  DEFAULT_BTN_LABEL,\n  DEFAULT_DRAG_AND_DROP_ICON,\n  DEFAULT_ERROR_MESSAGE,\n  DEFAULT_SUCCESS_MESSAGE,\n  DEFAULT_TITLE,\n  KNOWN_EXTENSTIONS,\n  SHOWN_SUCCES_TEXT_TIME,\n  UNKNOWN_EXTENSTIONS,\n  themeBtnClassesMap,\n  themeClassesMap,\n} from './constants';\n\nconst UploaderBase: DestroyCtor & I18nCtor & FormAccessorCtor & ErrorStateCtor = DestroyMixin(\n  I18nMixin(FormAccessorMixin(ErrorStateMixin()))\n);\n\n@Component({\n  selector: 'dds-uploader',\n  templateUrl: './uploader.component.html',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ProgressModule,\n    SizeModule,\n    ThemeModule,\n    FocusHandlerModule,\n    I18nModule,\n    FormsModule\n  ],\n  providers: [SizePipe]\n})\nexport class UploaderComponent extends UploaderBase implements OnChanges, OnDestroy {\n  @HostBinding(`class.${AdditionalClass.disabled}`) @Input() disabled: boolean | undefined;\n\n  // Input properties for various configurations\n  @Input() theme: Themes | string | undefined = this.ddsConfig.getConfig().theme;\n  @Input() description: string | undefined;\n  @Input() url: string | undefined;\n  @Input() exceptSymbols: string | undefined;\n  @Input() heading: string | undefined = DEFAULT_TITLE;\n  @Input() btnLabel: string | undefined = DEFAULT_BTN_LABEL;\n  @Input() errorMessage: string | undefined = DEFAULT_ERROR_MESSAGE;\n  @Input() itemErrorMessage: string | undefined = DEFAULT_ERROR_MESSAGE;\n  @Input() itemSuccessMessage: string | undefined = DEFAULT_SUCCESS_MESSAGE;\n  @Input() dragAndDropIcon: string | undefined = DEFAULT_DRAG_AND_DROP_ICON;\n  @Input() dragAndDropText: string | undefined;\n  @Input() customClass: string | undefined;\n  @Input() acceptFormats: MimeType | string | undefined;\n  @Input() acceptExtensions: string | undefined;\n  @Input() isDragAndDrop: boolean | undefined;\n  @Input() isMultiple: boolean | undefined;\n  @Input() isError: boolean | undefined;\n  @Input() errorState: string | ErrorState | undefined = this.ddsConfig.getConfig().errorState;\n  @Input() maxSize: number | undefined;\n  @Input() maxTotalSize: number | undefined;\n  @Input() maxFiles: number | undefined;\n  @Input() maxSymbolsName: number | undefined;\n  @Input() maxSymbolsNameError: number | undefined;\n  @Input() knownExtensions: ExtensionsMap | undefined;\n  @Input() unknownExtensionsIcon: string | undefined = UNKNOWN_EXTENSTIONS;\n  @Input() isInverse: boolean | undefined;\n  @Input() isDownloadable: boolean | undefined = false;\n  @Input() isRequired: boolean | undefined = false;\n  @Input() allowFilesWithoutType: boolean | undefined = true;\n  @Input() chooseFileBtnKind: ButtonKind | string | undefined = ButtonKind.primaryLoud;\n  @Input() value: FileList | UploadedFile[] | undefined;\n\n  // Setter for restricted formats\n  @Input()\n  set restrictedFormats(formats: MimeType | string | undefined) {\n    if (formats?.toString()?.length) {\n      this.restrictedFormatsList = this.getRestrictedArray(formats);\n    }\n  }\n\n  // Setter for restricted extensions\n  @Input()\n  set restrictedExtensions(extensions: string | undefined) {\n    if (extensions?.toString()?.length) {\n      this.restrictedExtensionsList = this.getRestrictedArray(extensions);\n    }\n  }\n\n  @Input() downloadBtnText: string | undefined;\n  @Input() removeBtnText: string | undefined;\n  @Input() refreshText: string | undefined;\n  @Input() maxSizeError: string | undefined;\n  @Input() maxFilesErrorText: string | undefined;\n  @Input() specialSymbolsErrorText: string | undefined;\n  @Input() fileTypeErrorText: string | undefined;\n  @Input() noFileTypeErrorText: string | undefined;\n  @Input() maxTotalSizeErrorText: string | undefined;\n  @Input() nameLengthErrorText: string | undefined;\n  @Input() extensionErrorText: string | undefined;\n\n  // Output events for uploaded, removed, and downloaded items\n  @Output() uploadedItems: EventEmitter<UploadFile[]> = new EventEmitter();\n  @Output() removedItem: EventEmitter<UploadFile> = new EventEmitter();\n  @Output() downloadedItem: EventEmitter<UploadFile> = new EventEmitter();\n\n  @ViewChild('fileInput') fileInput: ElementRef<HTMLInputElement>;\n\n  // Public properties for managing upload state\n  public uploadList: BehaviorSubject<UploadFile[]>;\n  public errorMaxFiles: string;\n  public errorMaxTotalSize: string;\n  public errorDuplicate: string[] = [];\n  public errorSpecialSymbols: string[] = [];\n  public invalidExtensionFileNames: string[] = [];\n  public convertedMaxSize: number;\n  public convertedMaxTotalSize: number;\n  public uploadBtnDisabled: boolean;\n  public dragAreaActive: boolean;\n  public dragAndDropTextInternal: string;\n  public duplicateErrorText: string[];\n  public themeConfig: ThemeClassesMap = themeClassesMap;\n  public themeBtnConfig: ThemeClassesMap = themeBtnClassesMap;\n\n  // Private properties for internal state management\n  private uploadFiles: UploadFile[] = [];\n  private shownFiles: UploadFile[] = [];\n  private addedTotalSize: number;\n  private restrictedFormatsList: string[] = [];\n  private restrictedExtensionsList: string[] = [];\n\n  // Getter to check if total size is within limit\n  get notMaxTotalSize(): boolean {\n    if (this.maxTotalSize) {\n      const uploadedTotalSize = this.uploadFiles.reduce((acc, uploadedFile) => acc + uploadedFile.file.size, 0);\n      return this.addedTotalSize + uploadedTotalSize <= this.convertedMaxTotalSize ? true : false;\n    } else {\n      return true;\n    }\n  }\n\n  // Getter to check if error message should be shown\n  get isErrorMessageShown(): boolean {\n    return this._isError;\n  }\n\n  constructor(\n    private ddsConfig: DdsConfigService,\n    public i18n: I18nService,\n    public cdr: ChangeDetectorRef,\n    @Optional() @Self() public ngControl: NgControl,\n    @Optional() public parentForm: NgForm,\n    @Optional() public parentFormGroup: FormGroupDirective,\n    @Optional() private http: HttpClient,\n    private sizePipe: SizePipe\n  ) {\n    super();\n    this.uploadList = new BehaviorSubject(this.uploadFiles);\n\n    if (this.ngControl !== null) {\n      this.ngControl.valueAccessor = this;\n    }\n  }\n\n  // Lifecycle hook for changes\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes.value) {\n      changes.value.currentValue ? this.addToListAndLoad(changes.value.currentValue) : this.reset();\n    }\n    if (changes.disabled) {\n      this.uploadBtnDisabled = this.disabled || this.uploadFiles.length >= this.maxFiles;\n    }\n    if (changes.isRequired) {\n      this.isRequired = coerceBooleanProperty(changes.isRequired.currentValue);\n    }\n    if (changes.dragAndDropText?.currentValue) {\n      this.dragAndDropTextInternal = this.dragAndDropText;\n    }\n\n    super.ngOnChanges(changes);\n  }\n\n  // Lifecycle hook for cleanup\n  public ngOnDestroy(): void {\n    this.uploadFiles.forEach((uploadFile: UploadFile) => {\n      if (uploadFile.request) {\n        uploadFile.request.unsubscribe();\n      }\n    });\n  }\n\n  // Method to write value to the component\n  public writeValue(fileList: FileList): void {\n    super.writeValue(fileList);\n    if (fileList?.length) {\n      this.addToListAndLoad(fileList, false);\n    } else {\n      this.reset();\n    }\n  }\n\n  // Method to set disabled state\n  public setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n\n  // Method to handle file drop\n  public dropFiles(event: DragEvent): void {\n    const files = event.dataTransfer.files;\n\n    this.eventDefault(event);\n    this.addToListAndLoad(files);\n    this.toggleActiveDragArea(false);\n  }\n\n  // Method to toggle drag area active state\n  public toggleActiveDragArea(status: boolean): void {\n    this.dragAreaActive = status;\n  }\n\n  // Method to handle drag over event\n  public dragoverFiles(event: DragEvent): void {\n    this.eventDefault(event);\n  }\n\n  // Method to add files to the list and load them\n  public addToListAndLoad(fileList?: FileList | UploadedFile[], isModelChange = true): void {\n    const files = fileList ? fileList : this.fileInput.nativeElement.files;\n    let isDublicate = true;\n    let isAcceptFormat = true;\n    this.errorDuplicate = [];\n    this.invalidExtensionFileNames = [];\n    this.errorMaxTotalSize = '';\n    this.checkAndSetMaxSize();\n    this.addedTotalSize = Array.from(files as FileList).reduce((acc, file) => acc + file.size, 0);\n\n    if (this.notMaxTotalSize) {\n      Array.from(files as FileList).forEach((file, index) => {\n        isDublicate = this.checkDublicateFile(file);\n        isAcceptFormat = this.checkFilesFormat(file);\n\n        if (!isDublicate && isAcceptFormat) {\n          this.validateLengthFiles(file, index);\n        } else if (isDublicate) {\n          this.errorDuplicate.push(this.duplicateNameErrorText(file.name));\n        }\n\n        if (!isAcceptFormat) {\n          this.invalidExtensionFileNames.push(this.invalidExtensionErrorText(file.name));\n        }\n      });\n    } else {\n      this.errorMaxTotalSize = this.maxTotalSizeErrorText;\n    }\n\n    this.setDisabledUploadBtn();\n\n    if (!isDublicate && isAcceptFormat) {\n      this.uploadAll(isModelChange);\n    }\n  }\n\n  // Method to clean file input\n  public cleanInput(fileList: HTMLInputElement): void {\n    fileList.value = null;\n  }\n\n  // Method to get file extension icon\n  public getFileExtensionIcon(name: string): string {\n    const extenstions = { ...KNOWN_EXTENSTIONS, ...this.knownExtensions };\n\n    return extenstions[name] ? extenstions[name] : this.unknownExtensionsIcon;\n  }\n\n  // Method to refresh upload file\n  public refreshUploadFile(file: UploadFile): void {\n    this._upload(file);\n  }\n\n  // Method to reset the uploader\n  public reset(): void {\n    this.shownFiles = [];\n    this.uploadFiles = [];\n    this.fieldInputReset();\n    this.uploadList.next(this.shownFiles);\n    this.uploadedItems.emit(this.uploadFiles);\n  }\n\n  // Method to download a file\n  public download(item: UploadFile): void {\n    this.downloadedItem.emit(item);\n  }\n\n  // Private method to check and set max size\n  private checkAndSetMaxSize(): void {\n    if (this.maxSize) {\n      this.convertedMaxSize = this.maxSize * CONVERT_MAX_FILE_SIZE;\n    }\n\n    if (this.maxTotalSize) {\n      this.convertedMaxTotalSize = this.maxTotalSize * CONVERT_MAX_FILE_SIZE;\n    }\n  }\n\n  // Private method to check for duplicate files\n  private checkDublicateFile(file: File): boolean {\n    const dublicateFiles = this.uploadFiles.filter((item) => item.file.name === file.name);\n\n    return Boolean(dublicateFiles.length);\n  }\n\n  // Private method to check file format\n  private checkFilesFormat(file: File): boolean {\n    const acceptFormats = this.acceptExtensions ? this.acceptExtensions : this.acceptFormats;\n    const fileExtension = file.name.split('.').pop();\n\n    let isAcceptFormat = true;\n\n    if (acceptFormats) {\n      isAcceptFormat = Boolean(acceptFormats.toString().indexOf(this.acceptExtensions ? fileExtension : file.type) + 1);\n    }\n\n    return isAcceptFormat;\n  }\n\n  // Private method to check for file limitations\n  private checkForLimitation(file: File): string[] {\n    let areSpecialSymbols = false;\n    let isMaxNameLengthExceeded = false;\n    let hasFormatRestriction = false;\n    let hasExtensionRestriction = false;\n    let hasNoFileType = false;\n    const errorSpecialSymbols = [];\n\n    if (this.exceptSymbols) {\n      const re = new RegExp(`[${this.exceptSymbols}]`, 'g');\n      areSpecialSymbols = re.test(`${file.name}`);\n\n      if (areSpecialSymbols) {\n        errorSpecialSymbols.push(this.specialSymbolsErrorText);\n      }\n    }\n\n    if (this.maxSymbolsNameError) {\n      isMaxNameLengthExceeded = file.name.length > this.maxSymbolsNameError;\n\n      if (isMaxNameLengthExceeded) {\n        errorSpecialSymbols.push(this.nameLengthErrorText);\n      }\n    }\n\n    if (this.restrictedFormatsList?.length || this.restrictedExtensionsList?.length) {\n      const extensionFile = '.' + file.name.split('.').pop();\n      const fileType = file.type;\n\n      hasFormatRestriction = this.restrictedFormatsList.some((format) => format === fileType);\n      hasExtensionRestriction = this.restrictedExtensionsList.some((extension) => extension === extensionFile);\n\n      if (hasFormatRestriction || hasExtensionRestriction) {\n        errorSpecialSymbols.push(this.fileTypeErrorText);\n      }\n    }\n\n    if (!this.allowFilesWithoutType) {\n      hasNoFileType = !file.type;\n\n      if (hasNoFileType) {\n        errorSpecialSymbols.push(this.noFileTypeErrorText);\n      }\n    }\n\n    return errorSpecialSymbols;\n  }\n\n  // Private method to set disabled state for upload button\n  private setDisabledUploadBtn(): void {\n    if (this.isMultiple) {\n      if (this.maxFiles) {\n        this.uploadBtnDisabled = this.uploadFiles.length >= this.maxFiles;\n      }\n    } else {\n      this.uploadBtnDisabled = this.uploadFiles.length >= 1;\n    }\n  }\n\n  // Private method to validate file length\n  private validateLengthFiles(file: File, index: number): void {\n    const uploadedLength = this.uploadList.getValue()?.length || 0;\n    const fileNumber = index + 1;\n\n    if (!this.maxFiles || (fileNumber <= this.maxFiles && this.maxFiles !== uploadedLength)) {\n      this._addToUploadList(file);\n    } else {\n      this.errorMaxFiles = this.maxFilesErrorText;\n    }\n  }\n\n  // Private method to truncate file name\n  private truncateFileName(file: File): string {\n    const truncatedName = file.name.slice(0, this.maxSymbolsName);\n    const extensionFile = file.name.split('.').pop();\n    let fileName = file.name;\n\n    if (file.name.length > this.maxSymbolsName) {\n      fileName = truncatedName + '...' + extensionFile;\n    }\n\n    return fileName;\n  }\n\n  // Private method to add file to upload list\n  private _addToUploadList(file: File, info?: { status: UploadFileStatus; message: string }): void {\n    const uploadFile = new UploadFile(file);\n    const errorsList = this.checkForLimitation(file);\n\n    if (file.size > this.convertedMaxSize) {\n      errorsList.push(`${this.maxSizeError} (${this.sizePipe.transform(this.convertedMaxSize, 2)})`);\n    }\n\n    uploadFile.fileName = this.maxSymbolsName ? this.truncateFileName(file) : file.name;\n    uploadFile.fileExtenstion = uploadFile.fileName.split('.').pop();\n    uploadFile.remove = () => this._remove(uploadFile);\n    uploadFile.update = () => this.cdr.detectChanges();\n    uploadFile.isDownloadable = errorsList.length ? false : this.isDownloadable;\n\n    if (!this.isMultiple) {\n      this.uploadFiles = [];\n    }\n\n    if (info) {\n      uploadFile.status = errorsList.length ? UploadFileStatus.error : info.status;\n      uploadFile.message = info.message;\n      uploadFile.errorMessage = errorsList;\n    } else {\n      uploadFile.status = errorsList.length ? UploadFileStatus.error : UploadFileStatus.success;\n      uploadFile.errorMessage = errorsList;\n    }\n\n    this.shownFiles.push(uploadFile);\n    this.uploadList.next(this.shownFiles);\n    if (uploadFile.status !== UploadFileStatus.error) this.uploadFiles.push(uploadFile);\n  }\n\n  // Private method to remove file from upload list\n  private _remove(uploadFile: UploadFile): void {\n    this.errorMaxFiles = '';\n    this.errorDuplicate = [];\n    this.uploadBtnDisabled = false;\n\n    if (uploadFile.request) {\n      uploadFile.request.unsubscribe();\n    }\n\n    this.shownFiles = this.shownFiles.filter((item) => item !== uploadFile);\n    const isUploadedFileRemoved = this.uploadFiles.some((item) => item === uploadFile);\n    this.uploadFiles = this.uploadFiles.filter((item) => item !== uploadFile);\n    this.fieldInputReset();\n    this.uploadList.next(this.shownFiles);\n    if (isUploadedFileRemoved) {\n      this.removedItem.emit(uploadFile);\n      this.changeHandle();\n    }\n  }\n\n  // Private method to upload all files\n  private uploadAll(isModelChange = true): void {\n    this.uploadFiles.forEach((uploadFile: UploadFile) => {\n      if (uploadFile.status !== UploadFileStatus.error) {\n        this._upload(uploadFile);\n      }\n    });\n\n    this.changeHandle(isModelChange);\n  }\n\n  // Private method to upload a single file\n  private _upload(uploadFile: UploadFile): void {\n    if (this.url) {\n      const form = new FormData();\n\n      form.append('file', uploadFile.file, uploadFile.file.name);\n\n      const req = new HttpRequest('POST', this.url, form, {\n        reportProgress: true,\n      });\n\n      uploadFile.request = this.http.request(req).subscribe(\n        (event) => {\n          if (event.type === HttpEventType.UploadProgress) {\n            this._uploadProgress(uploadFile, event);\n          } else if (event instanceof HttpResponse) {\n            this._uploadComplete(uploadFile, event);\n          }\n        },\n        (err: HttpErrorResponse) => {\n          this._uploadFailed(uploadFile, err);\n        }\n      );\n    }\n  }\n\n  // Private method to handle upload progress\n  private _uploadProgress(uploadFile: UploadFile, event): void {\n    uploadFile.progress = Math.round((100 * event.loaded) / event.total);\n    uploadFile.status = UploadFileStatus.progress;\n    this.uploadList.next(this.shownFiles);\n  }\n\n  // Private method to handle upload completion\n  private _uploadComplete(uploadFile: UploadFile, response): void {\n    uploadFile.progress = 100;\n    uploadFile.status = UploadFileStatus.success;\n    uploadFile.response = response;\n    uploadFile.successInfoStatus = true;\n\n    setTimeout(() => {\n      uploadFile.successInfoStatus = false;\n    }, SHOWN_SUCCES_TEXT_TIME);\n\n    uploadFile.request.unsubscribe();\n\n    this.uploadList.next(this.shownFiles);\n  }\n\n  // Private method to handle upload failure\n  private _uploadFailed(uploadFile: UploadFile, response: HttpErrorResponse): void {\n    uploadFile.progress = 0;\n    uploadFile.status = UploadFileStatus.error;\n    uploadFile.response = response;\n\n    if (uploadFile.request) {\n      uploadFile.request.unsubscribe();\n    }\n\n    this.uploadList.next(this.shownFiles);\n  }\n\n  // Private method to reset file input field\n  private fieldInputReset(): void {\n    if (this.fileInput) {\n      this.fileInput.nativeElement.value = null;\n    }\n  }\n\n  // Private method to handle changes\n  private changeHandle(isModelChange = true): void {\n    if (isModelChange) {\n      this.onModelChange(this.uploadFiles);\n      this.uploadedItems.emit(this.uploadFiles);\n      this.onModelTouched();\n      this.checkError();\n      this.onModelTouched();\n    }\n  }\n\n  private eventDefault(event: Event): void {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  // Sets the internationalization (i18n) texts for the uploader component.\n  protected setI18nTexts(translation: ITranslation): void {\n    this.dragAndDropTextInternal = this.dragAndDropText || translation.UPLOADER.DRAG_AND_DROP_TEXT;\n    this.refreshText ||= translation.UPLOADER.REFRESH_BTN_TEXT;\n    this.maxSizeError ||= translation.UPLOADER.ERROR_MAX_SIZE;\n    this.maxFilesErrorText ||= translation.UPLOADER.MAX_FILES_ERROR_TEXT;\n    this.specialSymbolsErrorText ||= translation.UPLOADER.SPECIAL_SYMBOLS_ERROR_TEXT;\n    this.fileTypeErrorText ||= translation.UPLOADER.FILE_TYPE_ERROR_TEXT;\n    this.noFileTypeErrorText ||= translation.UPLOADER.NO_FILE_TYPE_ERROR_TEXT;\n    this.maxTotalSizeErrorText ||= this.i18n.joinByValue(\n      `${this.maxTotalSize / 1000}`,\n      '{{number}}',\n      translation.UPLOADER.MAX_TOTAL_SIZE_ERROR_TEXT\n    );\n    this.nameLengthErrorText ||= this.i18n.joinByValue(\n      `${this.maxSymbolsNameError}`,\n      '{{number}}',\n      translation.UPLOADER.NAME_LENGTH_ERROR_TEXT\n    );\n    this.duplicateErrorText = this.i18n.splitByValue('{{filename}}', translation.UPLOADER.DUPLICATE_ERROR_TEXT);\n    this.extensionErrorText ||= translation.UPLOADER.EXTENSION_ERROR_TEXT;\n  }\n\n  // Generates an ARIA label for the download button.\n  public downloadBtnAriaLabel(filename: string): string {\n    return this.downloadBtnText || this.i18n.joinByValue(\n      `${filename}`,\n      '{{filename}}',\n      this.i18n.getTranslation().UPLOADER.A11Y.DOWNLOAD_ARIA_LABEL);\n  }\n\n  // Generates an ARIA label for the remove button.\n  public removeBtnAriaLabel(filename: string): string {\n    return this.removeBtnText || this.i18n.joinByValue(\n      `${filename}`,\n      '{{filename}}',\n      this.i18n.getTranslation().UPLOADER.A11Y.REMOVE_ARIA_LABEL);\n  }\n\n  private duplicateNameErrorText(fileName: string): string {\n    return `${this.duplicateErrorText[0]}${fileName}${this.duplicateErrorText[1]}`;\n  }\n\n  private invalidExtensionErrorText(fileName: string): string {\n    return this.extensionErrorText?.replaceAll('{{filename}}', fileName);\n  }\n\n  private getRestrictedArray(value: MimeType | string): string[] {\n    return value\n      .toString()\n      .split(',')\n      .map((format) => format.trim());\n  }\n}\n","<div [attr.aria-disabled]=\"disabled\"\n     class=\"dds-uploader {{customClass}}\"\n     [ngClass]=\"{\n        'dds-uploader_inverse': isInverse\n      }\"\n     [theme]=\"theme\"\n     [ddsTheme]=\"themeConfig\">\n  <strong class=\"dds-uploader__title\">{{heading}}\n    @if (isRequired) {\n      <span class=\"dds-required\"></span>\n    }\n  </strong>\n\n  @if (description && !errorMaxFiles) {\n    <span class=\"dds-uploader__description\">{{description}}</span>\n  }\n\n  @if (isErrorMessageShown) {\n    <span class=\"dds-uploader__error\">\n      {{errorMessage}}\n    </span>\n  }\n\n  @if (errorMaxFiles) {\n    <span class=\"dds-uploader__error\">\n      {{errorMaxFiles}}\n    </span>\n  }\n\n  @if (errorMaxTotalSize) {\n    <span class=\"dds-uploader__error\">\n      {{errorMaxTotalSize}}\n    </span>\n  }\n\n  @if (errorDuplicate.length) {\n    @for (error of errorDuplicate; track error) {\n      <span class=\"dds-uploader__error\">\n        {{error}}\n      </span>\n    }\n  }\n\n  @if (invalidExtensionFileNames?.length) {\n    @for (error of invalidExtensionFileNames; track error) {\n      <span class=\"dds-uploader__error\">\n        {{error}}\n      </span>\n    }\n  }\n\n  <label class=\"dds-uploader__label\">\n    @if (isDragAndDrop) {\n      <div [ngClass]=\"{\n          'dds-uploader-drag-area_active': dragAreaActive,\n          'dds-uploader-drag-area_disabled': disabled || uploadBtnDisabled\n         }\"\n           role=\"region\"\n           class=\"dds-uploader-drag-area\"\n           (dragenter)=\"toggleActiveDragArea(true)\"\n           (dragleave)=\"toggleActiveDragArea(false)\"\n           (dragover)=\"dragoverFiles($event)\"\n           (drop)=\"dropFiles($event)\">\n        <span class=\"dds-uploader-drag-area__icon dds-icon {{dragAndDropIcon}}\"></span>\n        <span class=\"dds-uploader-drag-area__title\">{{dragAndDropTextInternal}}</span>\n      </div>\n    }\n\n    <div [ngClass]=\"{\n           'dds-btn_disabled': disabled || uploadBtnDisabled,\n           'dds-btn_inverse': isInverse\n         }\"\n         class=\"dds-btn dds-uploader__upload-btn\"\n         [theme]=\"theme\"\n         [ddsTheme]=\"themeBtnConfig\"\n         [kind]=\"chooseFileBtnKind\"\n         #uploadBtnWrap>\n      <div [ngClass]=\"{\n              'dds-uploader__btn-content_disabled': disabled || uploadBtnDisabled\n            }\"\n           class=\"dds-btn__content dds-uploader__btn-content\">\n        <span class=\"dds-btn__text\">{{btnLabel}}</span>\n\n        <input [multiple]=\"isMultiple\"\n               [accept]=\"acceptFormats || acceptExtensions\"\n               [disabled]=\"disabled || uploadBtnDisabled\"\n               [ddsFocus]=\"uploadBtnWrap\"\n               [attr.aria-required]=\"isRequired || _isFormControlRequired\"\n               [required]=\"isRequired\"\n               type=\"file\"\n               class=\"dds-uploader__field\"\n               (change)=\"addToListAndLoad()\"\n               (click)=\"cleanInput(fileInput)\"\n               #fileInput />\n      </div>\n    </div>\n\n    <div class=\"dds-uploader__status\"\n         role=\"log\"\n         aria-live=\"polite\">\n      @for (item of uploadList | async; track item) {\n        {{ item.fileName }}\n        <!-- Error message -->\n        @if (item.isError() && !item.errorMessage?.length) {\n          {{item.message || itemErrorMessage}}\n        }\n        @if (item.isError() && item.errorMessage.length) {\n          @for (error of item.errorMessage; track error) { {{error}} }\n        }\n        <!-- Success message -->\n        @if (item.isSuccess()) { {{itemSuccessMessage}} }\n      }\n    </div>\n  </label>\n\n  <div role=\"list\"\n       class=\"dds-uploader__list\">\n    @for (item of uploadList | async; track item) {\n      <div [ngClass]=\"{\n           'dds-uploader-item_success': item.isSuccess() && !item.successInfoStatus\n         }\"\n           role=\"listitem\"\n           class=\"dds-uploader-item\">\n        <div class=\"dds-uploader-item__head\">\n          <span class=\"dds-uploader-item__name\">\n            <span [ngClass]=\"getFileExtensionIcon(item.fileExtenstion)\"\n                  class=\"dds-uploader-item__extenstion-img dds-icon\"></span>\n            {{ item.fileName }}\n          </span>\n          <div class=\"dds-uploader-item__wrap\">\n            @if (item.isDownloadable) {\n              <button [attr.aria-label]=\"downloadBtnAriaLabel(item.fileName)\"\n                      class=\"dds-uploader-item__btn\"\n                      (click)=\"download(item)\"\n                      ddsFocus>\n                <span class=\"dds-icon dds-icon_download\"></span>\n              </button>\n            }\n            <button class=\"dds-uploader-item__btn\"\n                    [attr.aria-label]=\"removeBtnAriaLabel(item.fileName)\"\n                    (click)=\"item.remove()\"\n                    ddsFocus>\n              <span class=\"dds-icon dds-icon_close\"></span>\n            </button>\n          </div>\n        </div>\n        @if (!item.isSuccess() || item.successInfoStatus) {\n          <dds-progress [value]=\"item.progress\"\n                        [theme]=\"theme\"\n                        [description]=\"!item.isSuccess() ? item.description : ''\"\n                        [isInverse]=\"isInverse\"\n                        [isError]=\"item.isError()\"\n                        class=\"dds-uploader-item__progress\"></dds-progress>\n        }\n        <div class=\"dds-uploader-item__footer\">\n          <div class=\"dds-uploader-item__info\">\n            @if (!item.isError() && !item.successInfoStatus) {\n              <span class=\"dds-uploader-item__size\">{{ item.file.size | size: 2 }}</span>\n            }\n            @if (item.isError() && !item.errorMessage?.length) {\n              <span class=\"dds-uploader-item__message dds-uploader-item__message_error\">\n                {{item.message || itemErrorMessage}}\n              </span>\n            }\n            @if (item.isError() && item.errorMessage.length) {\n              @for (error of item.errorMessage; track error) {\n                <span class=\"dds-uploader-item__message dds-uploader-item__message_error\">\n                  {{error}}\n                </span>\n              }\n            }\n            @if (item.isSuccess() && item.successInfoStatus) {\n              <span class=\"dds-uploader-item__message dds-uploader-item__message_success\">\n                {{itemSuccessMessage}}\n              </span>\n            }\n          </div>\n          @if (item.isError() && !item.errorMessage.length) {\n            <button role=\"button\"\n                    [attr.aria-label]=\"refreshText\"\n                    class=\"dds-uploader-item__refresh\"\n                    tabindex=\"0\"\n                    ddsFocus\n                    (click)=\"refreshUploadFile(item)\">{{refreshText}}</button>\n          }\n        </div>\n      </div>\n    }\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { UploaderComponent } from './uploader/uploader.component';\nimport {provideHttpClient} from \"@angular/common/http\";\n\n@NgModule({\n  declarations: [],\n  imports: [UploaderComponent],\n  exports: [UploaderComponent],\n  providers: [provideHttpClient()]\n})\nexport class UploaderModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}