@siemens/element-ng 48.2.0 → 48.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/accordion/index.d.ts +5 -2
  2. package/application-header/index.d.ts +15 -2
  3. package/chat-messages/index.d.ts +670 -0
  4. package/chat-messages/package.json +3 -0
  5. package/dashboard/index.d.ts +3 -3
  6. package/fesm2022/siemens-element-ng-accordion.mjs +7 -4
  7. package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
  8. package/fesm2022/siemens-element-ng-application-header.mjs +62 -1
  9. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  10. package/fesm2022/siemens-element-ng-card.mjs +4 -4
  11. package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
  12. package/fesm2022/siemens-element-ng-chat-messages.mjs +959 -0
  13. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -0
  14. package/fesm2022/siemens-element-ng-dashboard.mjs +15 -15
  15. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  16. package/fesm2022/siemens-element-ng-datepicker.mjs +5 -3
  17. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  18. package/fesm2022/siemens-element-ng-file-uploader.mjs +277 -118
  19. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
  20. package/fesm2022/siemens-element-ng-filtered-search.mjs +7 -12
  21. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  22. package/fesm2022/siemens-element-ng-icon.mjs +3 -1
  23. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  24. package/fesm2022/siemens-element-ng-ip-input.mjs +92 -89
  25. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-markdown-renderer.mjs +253 -0
  27. package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +1 -0
  28. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +2 -9
  29. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  30. package/fesm2022/siemens-element-ng-phone-number.mjs +5 -4
  31. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
  32. package/fesm2022/siemens-element-ng-popover.mjs +3 -4
  33. package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
  34. package/fesm2022/siemens-element-ng-resize-observer.mjs +13 -0
  35. package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
  36. package/fesm2022/siemens-element-ng-select.mjs +4 -0
  37. package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
  38. package/fesm2022/siemens-element-ng-side-panel.mjs +3 -5
  39. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
  40. package/fesm2022/siemens-element-ng-status-bar.mjs +3 -4
  41. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  42. package/fesm2022/siemens-element-ng-tour.mjs +58 -21
  43. package/fesm2022/siemens-element-ng-tour.mjs.map +1 -1
  44. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  45. package/fesm2022/siemens-element-ng-tree-view.mjs +43 -4
  46. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  47. package/file-uploader/index.d.ts +119 -15
  48. package/filtered-search/index.d.ts +6 -7
  49. package/icon/index.d.ts +3 -1
  50. package/ip-input/index.d.ts +13 -0
  51. package/markdown-renderer/index.d.ts +36 -0
  52. package/markdown-renderer/package.json +3 -0
  53. package/navbar-vertical/index.d.ts +2 -4
  54. package/package.json +15 -7
  55. package/resize-observer/index.d.ts +13 -0
  56. package/schematics/migrations/action-modal-migration/action-modal-migration.js +47 -6
  57. package/schematics/migrations/data/attribute-selectors.js +6 -0
  58. package/schematics/migrations/data/component-names.js +78 -0
  59. package/schematics/migrations/data/element-selectors.js +10 -0
  60. package/schematics/migrations/data/index.js +17 -0
  61. package/schematics/migrations/data/output-names.js +7 -0
  62. package/schematics/migrations/data/symbol-removals.js +49 -0
  63. package/schematics/migrations/element-migration/element-migration.js +93 -0
  64. package/schematics/migrations/element-migration/index.js +5 -0
  65. package/schematics/migrations/index.js +7 -2
  66. package/schematics/migrations/wizard-migration/index.js +80 -0
  67. package/schematics/scss-import-to-siemens-migration/index.js +3 -3
  68. package/schematics/ts-import-to-siemens-migration/index.js +2 -2
  69. package/schematics/utils/index.js +3 -3
  70. package/schematics/utils/project-utils.js +24 -35
  71. package/schematics/utils/template-utils.js +78 -2
  72. package/schematics/utils/ts-utils.js +5 -5
  73. package/select/index.d.ts +5 -0
  74. package/status-bar/index.d.ts +0 -1
  75. package/template-i18n.json +10 -0
  76. package/tour/index.d.ts +4 -2
  77. package/translate/index.d.ts +10 -0
  78. package/tree-view/index.d.ts +40 -1
  79. package/schematics/migrations/to-legacy-migration/to-legacy-migration.js +0 -55
  80. package/schematics/migrations/to-legacy-migration/to-legacy-replacement.js +0 -35
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n output,\n viewChild\n} from '@angular/core';\nimport { addIcons, elementUpload, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when files are added.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileInput = viewChild.required<ElementRef>('fileInput');\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.handleItems(event.dataTransfer!.items);\n } else {\n this.handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileInput().nativeElement.click();\n }\n\n protected inputHandler(event: Event): void {\n this.handleFiles((event.target as HTMLInputElement).files);\n }\n\n protected handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n newFiles.push(this.makeUploadFile(files[i]));\n }\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileInput().nativeElement.value = '';\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace('.', '.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n private fileSizeToString(num: number): string {\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n }\n if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return this.numberFormat.format(num) + suffix;\n }\n\n private handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n newFiles.push(this.makeUploadFile(file));\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n &nbsp;\n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n [attr.webkitdirectory]=\"directoryUpload() ? true : null\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n (change)=\"inputHandler($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate }}: {{ maxFileSizeString() }}.\n }\n @if (accept()) {\n {{ acceptText() | translate }}: {{ accept() }}.\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n addIcons,\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo,\n SiIconComponent,\n SiStatusIconComponent\n} from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n NgClass,\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n protected uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-upload.directive.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport {\n Directive,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n booleanAttribute,\n output\n} from '@angular/core';\nimport { t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\nexport interface FileUploadError extends UploadFile {\n status: 'invalid';\n errorText: TranslatableString;\n}\n\n/**\n * Directive for handling file uploads with validation for file type and size.\n *\n * @example\n * ```html\n * <input\n * #fileInput\n * type=\"file\"\n * class=\"d-none\"\n * siFileUpload\n * [accept]=\"accept()\"\n * [maxFileSize]=\"maxFileSize()\"\n * [multiple]=\"true\"\n * (validFiles)=\"onFilesAdded($event)\"\n * (fileError)=\"onFileError($event)\"\n * />\n * ```\n */\n@Directive({\n selector: 'input[type=\"file\"][siFileUpload]',\n standalone: true,\n host: {\n '[attr.accept]': 'accept()',\n '[multiple]': 'directoryUpload() || multiple()',\n '[attr.webkitdirectory]': 'directoryUpload() ? \"\" : null',\n '(change)': 'onInputChange($event)'\n }\n})\nexport class SiFileUploadDirective {\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitted when valid files are added.\n * Invalid files (due to size or type) will be ignored and instead the {@link fileError} event will be emitted.\n */\n readonly validFiles = output<UploadFile[]>();\n\n /**\n * Event emitted when valid files are added.\n * Also includes invalid files, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected onInputChange(event: Event): void {\n const inputElement = event.target as HTMLInputElement;\n this.handleFiles(inputElement.files);\n }\n\n /**\n * Handle files from input or drag and drop\n */\n handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n const validFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n const uploadFile = this.makeUploadFile(files[i]);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n } else if (uploadFile.status === 'added') {\n validFiles.push(uploadFile);\n }\n }\n\n if (newFiles.length > 0) {\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.filesAdded.emit(newFiles);\n }\n\n if (validFiles.length > 0) {\n validFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n this.validFiles.emit(validFiles);\n }\n\n this.reset();\n }\n\n /**\n * Handle directory entries for drag and drop\n */\n handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n const uploadFile = this.makeUploadFile(file);\n newFiles.push(uploadFile);\n\n if (uploadFile.status === 'invalid' && uploadFile.errorText) {\n this.fileError.emit(uploadFile as FileUploadError);\n }\n\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n if (newFiles.length > 0) {\n this.filesAdded.emit(newFiles);\n }\n const validFiles = newFiles.filter(f => f.status === 'added');\n if (validFiles.length > 0) {\n this.filesAdded.emit(validFiles);\n }\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n\n /**\n * Reset the file input value\n */\n reset(): void {\n this.elementRef.nativeElement.value = '';\n }\n\n /**\n * Trigger the file input click\n */\n triggerClick(): void {\n this.elementRef.nativeElement.click();\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace(/\\./g, '\\\\.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n fileSizeToString(num: number): string {\n return SiFileUploadDirective.formatFileSize(num, this.numberFormat);\n }\n\n static formatFileSize(num: number, formatter?: Intl.NumberFormat): string {\n const numberFormat = formatter ?? new Intl.NumberFormat('en-US', { maximumFractionDigits: 2 });\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n } else if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return numberFormat.format(num) + suffix;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { addIcons, elementUpload, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { SiFileUploadDirective, FileUploadError } from './si-file-upload.directive';\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe, SiFileUploadDirective],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when valid files are added.\n * Invalid files are also included here, but with status 'invalid' and an errorText describing why they were ignored.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Event emitted when file validation errors occur, including files that were ignored due to size or type.\n */\n readonly fileError = output<FileUploadError>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileUploadDirective().fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileUploadDirective = viewChild.required(SiFileUploadDirective);\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.fileUploadDirective().handleItems(event.dataTransfer!.items);\n } else {\n this.fileUploadDirective().handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileUploadDirective().triggerClick();\n }\n\n protected onFilesAdded(files: UploadFile[]): void {\n this.filesAdded.emit(files);\n }\n\n protected onFileError(error: FileUploadError): void {\n this.fileError.emit(error);\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileUploadDirective().reset();\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n &nbsp;\n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n siFileUpload\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n [multiple]=\"multiple()\"\n [directoryUpload]=\"directoryUpload()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n (filesAdded)=\"onFilesAdded($event)\"\n (fileError)=\"onFileError($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate }}: {{ maxFileSizeString() }}.\n }\n @if (accept()) {\n {{ acceptText() | translate }}: {{ accept() }}.\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n addIcons,\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo,\n SiIconComponent,\n SiStatusIconComponent\n} from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n NgClass,\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n protected uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploadDirective } from './si-file-upload.directive';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent, SiFileUploadDirective]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\nexport * from './si-file-upload.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,18 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { model, input, output, signal, Directive, inject, LOCALE_ID, viewChild, computed, ChangeDetectionStrategy, Component, DestroyRef, untracked, booleanAttribute, ElementRef, viewChildren, ChangeDetectorRef, NgModule } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import * as i1 from '@angular/forms';
4
5
  import { FormsModule } from '@angular/forms';
5
6
  import { isRTL } from '@siemens/element-ng/common';
6
7
  import { addIcons, elementCancel, SiIconComponent, elementSearch } from '@siemens/element-ng/icon';
7
8
  import { SiTypeaheadDirective } from '@siemens/element-ng/typeahead';
8
- import * as i1$1 from '@siemens/element-translate-ng/translate';
9
- import { SiTranslatePipe, injectSiTranslateService, SiTranslateModule, t } from '@siemens/element-translate-ng/translate';
9
+ import { SiTranslatePipe, injectSiTranslateService, t } from '@siemens/element-translate-ng/translate';
10
10
  import { BehaviorSubject, switchMap, of, Subject } from 'rxjs';
11
- import { debounceTime, map, tap, first, takeUntil } from 'rxjs/operators';
11
+ import { debounceTime, map, tap, first } from 'rxjs/operators';
12
12
  import { formatDate, DatePipe } from '@angular/common';
13
13
  import { isValid, SiDatepickerOverlayDirective, getDatepickerFormat, getNamedFormat, SiDatepickerDirective } from '@siemens/element-ng/datepicker';
14
14
  import { CdkMonitorFocus } from '@angular/cdk/a11y';
15
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
15
 
17
16
  /**
18
17
  * Copyright (c) Siemens 2016 - 2025
@@ -291,11 +290,11 @@ class SiFilteredSearchMultiSelectComponent extends SiFilteredSearchOptionValueBa
291
290
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchMultiSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
292
291
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilteredSearchMultiSelectComponent, isStandalone: true, selector: "si-filtered-search-multi-select", inputs: { itemCountText: { classPropertyName: "itemCountText", publicName: "itemCountText", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
293
292
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchMultiSelectComponent }
294
- ], viewQueries: [{ propertyName: "valueInput", first: true, predicate: ["valueInput"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@let value = criterionValue().value;\n@if (!active()) {\n <div\n class=\"criterion-value-text focus-inside px-4\"\n [tabindex]=\"disabled() ? -1 : 0\"\n (keydown.enter)=\"editValue.emit()\"\n (click)=\"editValue.emit()\"\n >\n @if (!!value && hasMultiSelections()) {\n {{ itemCountText() | translate: { itemCount: value.length } }}\n } @else if (optionValue()[0]) {\n {{ optionValue()[0].label ?? optionValue()[0].value | translate }}\n } @else {\n {{ value }}\n }\n </div>\n} @else {\n <input\n #valueInput\n typeaheadOptionField=\"translatedLabel\"\n class=\"px-4 py-0 border-0 focus-inside\"\n typeaheadScrollable\n typeaheadMultiSelect\n [type]=\"inputType()\"\n [step]=\"step()\"\n [siTypeahead]=\"options() ?? []\"\n [typeaheadMinLength]=\"0\"\n [typeaheadOptionsLimit]=\"maxCriteriaOptions()\"\n [readOnly]=\"readonly() || onlySelectValue()\"\n [typeaheadOptionsInScrollableView]=\"optionsInScrollableView()\"\n [attr.aria-label]=\"searchLabel() | translate\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (typeaheadOnSelect)=\"valueTypeaheadSelect($event)\"\n (typeaheadOnInput)=\"inputChange.next($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1$1.SiTranslatePipe, name: "translate" }, { kind: "directive", type: SiTypeaheadDirective, selector: "[siTypeahead]", inputs: ["siTypeahead", "typeaheadProcess", "typeaheadScrollable", "typeaheadOptionsInScrollableView", "typeaheadOptionsLimit", "typeaheadScrollableAdditionalHeight", "typeaheadAutoSelectIndex", "typeaheadCloseOnEsc", "typeaheadClearValueOnSelect", "typeaheadWaitMs", "typeaheadMinLength", "typeaheadOptionField", "typeaheadMultiSelect", "typeaheadTokenize", "typeaheadMatchAllTokens", "typeaheadItemTemplate", "typeaheadSkipSortingMatches", "typeaheadAutocompleteListLabel", "typeaheadFullWidth"], outputs: ["typeaheadOnInput", "typeaheadOnSelect", "typeaheadOnFullMatch", "typeaheadOpenChange"], exportAs: ["si-typeahead"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
293
+ ], viewQueries: [{ propertyName: "valueInput", first: true, predicate: ["valueInput"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@let value = criterionValue().value;\n@if (!active()) {\n <div\n class=\"criterion-value-text focus-inside px-4\"\n [tabindex]=\"disabled() ? -1 : 0\"\n (keydown.enter)=\"editValue.emit()\"\n (click)=\"editValue.emit()\"\n >\n @if (!!value && hasMultiSelections()) {\n {{ itemCountText() | translate: { itemCount: value.length } }}\n } @else if (optionValue()[0]) {\n {{ optionValue()[0].label ?? optionValue()[0].value | translate }}\n } @else {\n {{ value }}\n }\n </div>\n} @else {\n <input\n #valueInput\n typeaheadOptionField=\"translatedLabel\"\n class=\"px-4 py-0 border-0 focus-inside\"\n typeaheadScrollable\n typeaheadMultiSelect\n [type]=\"inputType()\"\n [step]=\"step()\"\n [siTypeahead]=\"options() ?? []\"\n [typeaheadMinLength]=\"0\"\n [typeaheadOptionsLimit]=\"maxCriteriaOptions()\"\n [readOnly]=\"readonly() || onlySelectValue()\"\n [typeaheadOptionsInScrollableView]=\"optionsInScrollableView()\"\n [attr.aria-label]=\"searchLabel() | translate\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (typeaheadOnSelect)=\"valueTypeaheadSelect($event)\"\n (typeaheadOnInput)=\"inputChange.next($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"], dependencies: [{ kind: "pipe", type: SiTranslatePipe, name: "translate" }, { kind: "directive", type: SiTypeaheadDirective, selector: "[siTypeahead]", inputs: ["siTypeahead", "typeaheadProcess", "typeaheadScrollable", "typeaheadOptionsInScrollableView", "typeaheadOptionsLimit", "typeaheadScrollableAdditionalHeight", "typeaheadAutoSelectIndex", "typeaheadCloseOnEsc", "typeaheadClearValueOnSelect", "typeaheadWaitMs", "typeaheadMinLength", "typeaheadOptionField", "typeaheadMultiSelect", "typeaheadTokenize", "typeaheadMatchAllTokens", "typeaheadItemTemplate", "typeaheadSkipSortingMatches", "typeaheadAutocompleteListLabel", "typeaheadFullWidth"], outputs: ["typeaheadOnInput", "typeaheadOnSelect", "typeaheadOnFullMatch", "typeaheadOpenChange"], exportAs: ["si-typeahead"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
295
294
  }
296
295
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchMultiSelectComponent, decorators: [{
297
296
  type: Component,
298
- args: [{ selector: 'si-filtered-search-multi-select', imports: [SiTranslateModule, SiTypeaheadDirective], providers: [
297
+ args: [{ selector: 'si-filtered-search-multi-select', imports: [SiTranslatePipe, SiTypeaheadDirective], providers: [
299
298
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchMultiSelectComponent }
300
299
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let value = criterionValue().value;\n@if (!active()) {\n <div\n class=\"criterion-value-text focus-inside px-4\"\n [tabindex]=\"disabled() ? -1 : 0\"\n (keydown.enter)=\"editValue.emit()\"\n (click)=\"editValue.emit()\"\n >\n @if (!!value && hasMultiSelections()) {\n {{ itemCountText() | translate: { itemCount: value.length } }}\n } @else if (optionValue()[0]) {\n {{ optionValue()[0].label ?? optionValue()[0].value | translate }}\n } @else {\n {{ value }}\n }\n </div>\n} @else {\n <input\n #valueInput\n typeaheadOptionField=\"translatedLabel\"\n class=\"px-4 py-0 border-0 focus-inside\"\n typeaheadScrollable\n typeaheadMultiSelect\n [type]=\"inputType()\"\n [step]=\"step()\"\n [siTypeahead]=\"options() ?? []\"\n [typeaheadMinLength]=\"0\"\n [typeaheadOptionsLimit]=\"maxCriteriaOptions()\"\n [readOnly]=\"readonly() || onlySelectValue()\"\n [typeaheadOptionsInScrollableView]=\"optionsInScrollableView()\"\n [attr.aria-label]=\"searchLabel() | translate\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (typeaheadOnSelect)=\"valueTypeaheadSelect($event)\"\n (typeaheadOnInput)=\"inputChange.next($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"] }]
301
300
  }] });
@@ -776,7 +775,7 @@ class SiFilteredSearchComponent {
776
775
  typeaheadInputChange = new BehaviorSubject('');
777
776
  /** Used to debounce the Search emissions */
778
777
  searchEmitQueue = new Subject();
779
- destroySubscriptions = new Subject();
778
+ destroyRef = inject(DestroyRef);
780
779
  cdRef = inject(ChangeDetectorRef);
781
780
  translateService = injectSiTranslateService();
782
781
  locale = inject(LOCALE_ID).toString();
@@ -837,13 +836,9 @@ class SiFilteredSearchComponent {
837
836
  throw new Error('strict criterion mode activated without predefined criteria!');
838
837
  }
839
838
  this.searchEmitQueue
840
- .pipe(debounceTime(this.searchDebounceTime()), takeUntil(this.destroySubscriptions))
839
+ .pipe(debounceTime(this.searchDebounceTime()), takeUntilDestroyed(this.destroyRef))
841
840
  .subscribe(searchCriteria => this.doSearch.emit(searchCriteria));
842
841
  }
843
- ngOnDestroy() {
844
- this.destroySubscriptions.next(true);
845
- this.destroySubscriptions.unsubscribe();
846
- }
847
842
  initCriteria() {
848
843
  this.internalCriterionDefinitions = this.loadedCriteria().map(c => toInternalCriteria(c));
849
844
  }