@siemens/element-ng 48.0.2 → 48.1.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 (69) hide show
  1. package/README.md +9 -0
  2. package/accordion/index.d.ts +2 -1
  3. package/avatar/index.d.ts +3 -4
  4. package/card/index.d.ts +1 -1
  5. package/circle-status/index.d.ts +2 -1
  6. package/dashboard/index.d.ts +5 -1
  7. package/datepicker/index.d.ts +6 -2
  8. package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
  9. package/fesm2022/siemens-element-ng-avatar.mjs +32 -36
  10. package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
  11. package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
  12. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
  13. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +2 -2
  14. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-dashboard.mjs +32 -35
  16. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-datepicker.mjs +15 -3
  18. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-file-uploader.mjs +7 -0
  20. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-filtered-search.mjs +21 -12
  22. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  24. package/fesm2022/siemens-element-ng-formly.mjs +18 -18
  25. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  27. package/fesm2022/siemens-element-ng-list-details.mjs +8 -2
  28. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
  29. package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
  30. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +15 -2
  31. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  32. package/fesm2022/siemens-element-ng-notification-item.mjs +71 -0
  33. package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -0
  34. package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -1
  35. package/fesm2022/siemens-element-ng-resize-observer.mjs +0 -1
  36. package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
  37. package/fesm2022/siemens-element-ng-result-details-list.mjs +5 -0
  38. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
  39. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -1
  40. package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
  41. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  42. package/fesm2022/siemens-element-ng-tabs.mjs +41 -8
  43. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
  44. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  45. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  46. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  47. package/file-uploader/index.d.ts +3 -1
  48. package/filter-bar/index.d.ts +4 -2
  49. package/form/index.d.ts +28 -29
  50. package/inline-notification/index.d.ts +3 -2
  51. package/landing-page/index.d.ts +3 -2
  52. package/language-switcher/index.d.ts +3 -1
  53. package/list-details/index.d.ts +2 -0
  54. package/main-detail-container/index.d.ts +4 -4
  55. package/navbar/index.d.ts +1 -1
  56. package/notification-item/index.d.ts +141 -0
  57. package/notification-item/package.json +3 -0
  58. package/package.json +19 -15
  59. package/progressbar/index.d.ts +3 -3
  60. package/result-details-list/index.d.ts +4 -2
  61. package/select/index.d.ts +7 -5
  62. package/sort-bar/index.d.ts +3 -3
  63. package/split/index.d.ts +3 -2
  64. package/status-bar/index.d.ts +3 -2
  65. package/tabs/index.d.ts +15 -1
  66. package/template-i18n.json +1 -0
  67. package/translate/index.d.ts +1 -0
  68. package/tree-view/index.d.ts +4 -4
  69. package/wizard/index.d.ts +2 -1
@@ -8,6 +8,11 @@ import { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notifi
8
8
  import { SiProgressbarComponent } from '@siemens/element-ng/progressbar';
9
9
  import { retry } from 'rxjs/operators';
10
10
 
11
+ /**
12
+ * Copyright (c) Siemens 2016 - 2025
13
+ * SPDX-License-Identifier: MIT
14
+ */
15
+
11
16
  /**
12
17
  * Copyright (c) Siemens 2016 - 2025
13
18
  * SPDX-License-Identifier: MIT
@@ -527,6 +532,8 @@ class SiFileUploaderComponent {
527
532
  // needed for drag drop of directory
528
533
  this.cdRef.markForCheck();
529
534
  if (this.autoUpload()) {
535
+ // allow concurrent uploads for auto upload mode.
536
+ this.uploadEnabled = true;
530
537
  this.fileUpload(false);
531
538
  }
532
539
  }
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../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 */\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 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 }\n @if (!file.errorText) {\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-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 }\n @if (!file.errorText) {\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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"}
@@ -6,7 +6,7 @@ import { isRTL } from '@siemens/element-ng/common';
6
6
  import { addIcons, elementCancel, SiIconComponent, elementSearch } from '@siemens/element-ng/icon';
7
7
  import { SiTypeaheadDirective } from '@siemens/element-ng/typeahead';
8
8
  import * as i1$1 from '@siemens/element-translate-ng/translate';
9
- import { SiTranslatePipe, SiTranslateService, SiTranslateModule, t, injectSiTranslateService } from '@siemens/element-translate-ng/translate';
9
+ import { SiTranslatePipe, injectSiTranslateService, SiTranslateModule, t } from '@siemens/element-translate-ng/translate';
10
10
  import { BehaviorSubject, switchMap, of, Subject } from 'rxjs';
11
11
  import { debounceTime, map, tap, first, takeUntil } from 'rxjs/operators';
12
12
  import { formatDate, DatePipe } from '@angular/common';
@@ -154,13 +154,13 @@ class SiFilteredSearchDateValueComponent extends SiFilteredSearchValueBase {
154
154
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchDateValueComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
155
155
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilteredSearchDateValueComponent, isStandalone: true, selector: "si-filtered-search-date-value", providers: [
156
156
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchDateValueComponent }
157
- ], viewQueries: [{ propertyName: "valueInput", first: true, predicate: ["valueInput"], descendants: true, isSignal: true }, { propertyName: "datepickerOverlay", first: true, predicate: SiDatepickerOverlayDirective, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let dateValue = criterionValue().dateValue;\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 (!validFormat()) {\n <!-- DatePipe throws an error if the date is invalid, so we have to do it on our own. -->\n <!-- We may should have a better solution here. Ideally we would keep the broken string so that a user can fix it later. -->\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(dateValue).toString() }}\n } @else if (!disableTime() || definition().validationType === 'date-time') {\n {{ dateValue | date: dateFormat() }}\n } @else {\n {{ dateValue | date: shortDateFormat }}\n }\n </div>\n} @else {\n <input\n #valueInput\n type=\"text\"\n siDatepicker\n class=\"px-4 py-0 border-0 focus-inside\"\n [attr.aria-label]=\"searchLabel() | translate\"\n [siDatepickerConfig]=\"dateConfig()\"\n [ngModel]=\"dateValue\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (siDatepickerDisabledTime)=\"disableTime.set($event)\"\n (ngModelChange)=\"valueDateSelect($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: SiDatepickerDirective, selector: "[siDatepicker]", inputs: ["autoClose"], exportAs: ["siDatepicker"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
157
+ ], viewQueries: [{ propertyName: "valueInput", first: true, predicate: ["valueInput"], descendants: true, isSignal: true }, { propertyName: "datepickerOverlay", first: true, predicate: SiDatepickerOverlayDirective, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let dateValue = criterionValue().dateValue;\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 (!validFormat()) {\n <!-- DatePipe throws an error if the date is invalid, so we have to do it on our own. -->\n <!-- We may should have a better solution here. Ideally we would keep the broken string so that a user can fix it later. -->\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(dateValue)?.toString() }}\n } @else if (!disableTime() || definition().validationType === 'date-time') {\n {{ dateValue | date: dateFormat() }}\n } @else {\n {{ dateValue | date: shortDateFormat }}\n }\n </div>\n} @else {\n <input\n #valueInput\n type=\"text\"\n siDatepicker\n class=\"px-4 py-0 border-0 focus-inside\"\n [attr.aria-label]=\"searchLabel() | translate\"\n [siDatepickerConfig]=\"dateConfig()\"\n [ngModel]=\"dateValue\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (siDatepickerDisabledTime)=\"disableTime.set($event)\"\n (ngModelChange)=\"valueDateSelect($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: SiDatepickerDirective, selector: "[siDatepicker]", inputs: ["autoClose"], exportAs: ["siDatepicker"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
158
158
  }
159
159
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchDateValueComponent, decorators: [{
160
160
  type: Component,
161
161
  args: [{ selector: 'si-filtered-search-date-value', imports: [DatePipe, FormsModule, SiDatepickerDirective, SiTranslatePipe], providers: [
162
162
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchDateValueComponent }
163
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let dateValue = criterionValue().dateValue;\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 (!validFormat()) {\n <!-- DatePipe throws an error if the date is invalid, so we have to do it on our own. -->\n <!-- We may should have a better solution here. Ideally we would keep the broken string so that a user can fix it later. -->\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(dateValue).toString() }}\n } @else if (!disableTime() || definition().validationType === 'date-time') {\n {{ dateValue | date: dateFormat() }}\n } @else {\n {{ dateValue | date: shortDateFormat }}\n }\n </div>\n} @else {\n <input\n #valueInput\n type=\"text\"\n siDatepicker\n class=\"px-4 py-0 border-0 focus-inside\"\n [attr.aria-label]=\"searchLabel() | translate\"\n [siDatepickerConfig]=\"dateConfig()\"\n [ngModel]=\"dateValue\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (siDatepickerDisabledTime)=\"disableTime.set($event)\"\n (ngModelChange)=\"valueDateSelect($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"] }]
163
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let dateValue = criterionValue().dateValue;\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 (!validFormat()) {\n <!-- DatePipe throws an error if the date is invalid, so we have to do it on our own. -->\n <!-- We may should have a better solution here. Ideally we would keep the broken string so that a user can fix it later. -->\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(dateValue)?.toString() }}\n } @else if (!disableTime() || definition().validationType === 'date-time') {\n {{ dateValue | date: dateFormat() }}\n } @else {\n {{ dateValue | date: shortDateFormat }}\n }\n </div>\n} @else {\n <input\n #valueInput\n type=\"text\"\n siDatepicker\n class=\"px-4 py-0 border-0 focus-inside\"\n [attr.aria-label]=\"searchLabel() | translate\"\n [siDatepickerConfig]=\"dateConfig()\"\n [ngModel]=\"dateValue\"\n (keydown.backspace)=\"valueBackspace()\"\n (keydown.enter)=\"valueEnter()\"\n (siDatepickerDisabledTime)=\"disableTime.set($event)\"\n (ngModelChange)=\"valueDateSelect($event)\"\n />\n}\n", styles: ["input{background:transparent}\n"] }]
164
164
  }], ctorParameters: () => [] });
165
165
 
166
166
  /**
@@ -178,7 +178,7 @@ class SiFilteredSearchOptionValueBase extends SiFilteredSearchValueBase {
178
178
  isStrictOrOnlySelectValue = input.required();
179
179
  inputChange = new BehaviorSubject('');
180
180
  destroyRef = inject(DestroyRef);
181
- translateService = inject(SiTranslateService);
181
+ translateService = injectSiTranslateService();
182
182
  inputType = computed(() => this.definition().validationType === 'integer' || this.definition().validationType === 'float'
183
183
  ? 'number'
184
184
  : 'text');
@@ -271,12 +271,9 @@ class SiFilteredSearchMultiSelectComponent extends SiFilteredSearchOptionValueBa
271
271
  }
272
272
  buildOptions() {
273
273
  const translatedOptions = super.buildOptions();
274
- if (this.definition().options) {
275
- return translatedOptions?.pipe(switchMap(options => this.selectionChange.pipe(tap(value => selectOptions(options, value)), map(() => options))));
276
- }
277
- else {
278
- return translatedOptions;
279
- }
274
+ return translatedOptions?.pipe(switchMap(options => this.selectionChange.pipe(tap(value => {
275
+ selectOptions(options, value);
276
+ }), map(() => options))));
280
277
  }
281
278
  processTypeaheadOptions(options) {
282
279
  const value = this.criterionValue().value;
@@ -294,13 +291,13 @@ class SiFilteredSearchMultiSelectComponent extends SiFilteredSearchOptionValueBa
294
291
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchMultiSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
295
292
  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: [
296
293
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchMultiSelectComponent }
297
- ], 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 />\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 });
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 });
298
295
  }
299
296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilteredSearchMultiSelectComponent, decorators: [{
300
297
  type: Component,
301
298
  args: [{ selector: 'si-filtered-search-multi-select', imports: [SiTranslateModule, SiTypeaheadDirective], providers: [
302
299
  { provide: SiFilteredSearchValueBase, useExisting: SiFilteredSearchMultiSelectComponent }
303
- ], 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 />\n}\n", styles: ["input{background:transparent}\n"] }]
300
+ ], 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"] }]
304
301
  }] });
305
302
 
306
303
  /**
@@ -453,6 +450,11 @@ class SiFilteredSearchValueComponent {
453
450
  this.edit();
454
451
  }
455
452
  }
453
+ closeOverlay() {
454
+ if (this.active()) {
455
+ this.active.set(false);
456
+ }
457
+ }
456
458
  edit(field) {
457
459
  if (this.readonly()) {
458
460
  return;
@@ -889,6 +891,13 @@ class SiFilteredSearchComponent {
889
891
  if (this.isReadOnly()) {
890
892
  return;
891
893
  }
894
+ // Close any active overlays before deleting the criterion
895
+ // This could happen in case when user has opened a multiselect pill
896
+ // and then clicks on clear button of other pill.
897
+ this.valueComponents().forEach(component => {
898
+ component.closeOverlay();
899
+ });
900
+ this.cdRef.detectChanges();
892
901
  this.values = this.values.filter(v => v.value !== criterion);
893
902
  this.emitChangeEvent();
894
903
  this.allowedCriteriaCache = undefined;