@eui/eds 22.0.0-alpha.16 → 22.0.0-alpha.18
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.
- package/docs/changelog.html +28 -0
- package/docs/components/EdsLanguageSelectorDialog.html +1 -1
- package/docs/js/search/search_index.js +2 -2
- package/docs/json/documentation.json +42 -42
- package/docs/llms.txt +1 -1
- package/docs/properties.html +1 -1
- package/fesm2022/eui-eds-charts-eds-chart-legend.mjs +2 -2
- package/fesm2022/eui-eds-charts-eds-chart-legend.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-accordion.mjs +2 -2
- package/fesm2022/eui-eds-eds-accordion.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-alert.mjs +2 -2
- package/fesm2022/eui-eds-eds-alert.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-autocomplete.mjs +2 -2
- package/fesm2022/eui-eds-eds-autocomplete.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-avatar.mjs +4 -4
- package/fesm2022/eui-eds-eds-avatar.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-blockquote.mjs +2 -2
- package/fesm2022/eui-eds-eds-blockquote.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-calendar.mjs +4 -4
- package/fesm2022/eui-eds-eds-calendar.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-card.mjs +2 -2
- package/fesm2022/eui-eds-eds-card.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-date-block.mjs +2 -2
- package/fesm2022/eui-eds-eds-date-block.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-datepicker.mjs +2 -2
- package/fesm2022/eui-eds-eds-datepicker.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-discussion-thread.mjs +4 -4
- package/fesm2022/eui-eds-eds-discussion-thread.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-empty-state.mjs +2 -2
- package/fesm2022/eui-eds-eds-empty-state.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-fieldset.mjs +2 -2
- package/fesm2022/eui-eds-eds-fieldset.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-file-upload.mjs +2 -2
- package/fesm2022/eui-eds-eds-file-upload.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-growl.mjs +2 -2
- package/fesm2022/eui-eds-eds-growl.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-language-selector.mjs +4 -4
- package/fesm2022/eui-eds-eds-language-selector.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-list.mjs +2 -2
- package/fesm2022/eui-eds-eds-list.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-menu.mjs +2 -2
- package/fesm2022/eui-eds-eds-menu.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-multiselect.mjs +2 -2
- package/fesm2022/eui-eds-eds-multiselect.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-page.mjs +2 -2
- package/fesm2022/eui-eds-eds-page.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-popover.mjs +2 -2
- package/fesm2022/eui-eds-eds-popover.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-progress-bar.mjs +2 -2
- package/fesm2022/eui-eds-eds-progress-bar.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-progress-circle.mjs +2 -2
- package/fesm2022/eui-eds-eds-progress-circle.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-select.mjs +2 -2
- package/fesm2022/eui-eds-eds-select.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-shell.mjs +4 -4
- package/fesm2022/eui-eds-eds-shell.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-table.mjs +2 -2
- package/fesm2022/eui-eds-eds-table.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-tabs.mjs +2 -2
- package/fesm2022/eui-eds-eds-tabs.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-timeline.mjs +2 -2
- package/fesm2022/eui-eds-eds-timeline.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-timepicker.mjs +2 -2
- package/fesm2022/eui-eds-eds-timepicker.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-user-profile.mjs +2 -2
- package/fesm2022/eui-eds-eds-user-profile.mjs.map +1 -1
- package/fesm2022/eui-eds-eds-wizard.mjs +2 -2
- package/fesm2022/eui-eds-utilities-eds-label.mjs +2 -2
- package/fesm2022/eui-eds-utilities-eds-label.mjs.map +1 -1
- package/fesm2022/eui-eds-utilities-eds-trend.mjs +2 -2
- package/fesm2022/eui-eds-utilities-eds-trend.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-eds-eds-file-upload.mjs","sources":["../../eds-file-upload/eds-filesize.pipe.ts","../../eds-file-upload/eds-file-upload-preview.ts","../../eds-file-upload/eds-file-upload-preview.html","../../eds-file-upload/eds-file-upload.ts","../../eds-file-upload/eds-file-upload.html","../../eds-file-upload/eds-file-upload.utils.ts","../../eds-file-upload/eds-file-upload.mime-types.ts","../../eds-file-upload/eds-file-upload.validators.ts","../../eds-file-upload/index.ts","../../eds-file-upload/eui-eds-eds-file-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Transforms a file size in bytes into a human-readable format (e.g., KB, MB, GB).\n *\n * @example\n * ```html\n * {{ 1024 | edsFilesize }} <!-- Outputs: \"1.00 KB\" -->\n * {{ 1048576 | edsFilesize:1 }} <!-- Outputs: \"1.0 MB\" -->\n * ```\n */\n@Pipe({\n name: 'edsFilesize',\n})\nexport class EdsFilesizePipe implements PipeTransform {\n private units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n transform(bytes = 0, precision = 2): string {\n if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) {\n return '?';\n }\n\n let unit = 0;\n\n while (bytes >= 1024) {\n bytes /= 1024;\n unit++;\n }\n\n return bytes.toFixed(+precision) + ' ' + this.units[unit];\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnInit,\n TemplateRef,\n booleanAttribute,\n inject,\n input,\n output,\n computed,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { EDS_ICON } from '@eui/eds/eds-icon';\nimport { EDS_ICON_BUTTON } from '@eui/eds/eds-icon-button';\n\nimport { EdsUploadedFile } from './eds-file-upload.model';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\n/** Map of file extensions to EDS icon names. */\nconst ICON_MAP: Record<string, string> = {\n avi: 'file-video',\n html: 'file-code',\n htm: 'file-code',\n js: 'file-code',\n json: 'file-code',\n mp3: 'file-audio',\n mp4: 'file-video',\n pdf: 'file',\n png: 'file-image',\n svg: 'file-image',\n txt: 'file-text',\n xml: 'file-code',\n jpeg: 'file-image',\n jpg: 'file-image',\n zip: 'file',\n doc: 'file-text',\n docx: 'file-text',\n xls: 'file',\n xlsx: 'file',\n ppt: 'file',\n csv: 'file',\n rtf: 'file-text',\n};\n\n/**\n * Internal sub-component used by `eds-file-upload` to render individual file previews.\n * Displays file information (name, size, type) with optional image preview or icon, and a remove button.\n */\n@Component({\n selector: 'eds-file-upload-preview',\n templateUrl: './eds-file-upload-preview.html',\n styleUrl: './eds-file-upload-preview.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n ...EDS_ICON,\n ...EDS_ICON_BUTTON,\n EdsFilesizePipe,\n ],\n host: {\n class: 'eds-file-upload-preview',\n '[attr.data-e2e]': '\"eds-file-upload-preview\"',\n },\n})\nexport class EdsFileUploadPreview implements OnInit {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly file = input<Blob | EdsUploadedFile | any>(undefined);\n readonly index = input<number>(undefined);\n readonly uploadedFileTemplate = input<TemplateRef<unknown>>(undefined);\n\n readonly hasPreview = input(true, { transform: booleanAttribute });\n readonly hasPreviewAsImage = input(true, { transform: booleanAttribute });\n readonly hasPreviewAsIcon = input(false, { transform: booleanAttribute });\n readonly isItemsClickable = input(false, { transform: booleanAttribute });\n readonly isFileObject = input(false, { transform: booleanAttribute });\n readonly isFilenameDisplayed = input(true, { transform: booleanAttribute });\n readonly isFilesizeDisplayed = input(true, { transform: booleanAttribute });\n readonly isFiletypeDisplayed = input(true, { transform: booleanAttribute });\n\n readonly removeFromList = output<number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly itemClick = output<Blob | EdsUploadedFile | any>();\n\n protected url: string;\n protected icon: string;\n protected fileExtension: string;\n protected previewData: { image: boolean; display: string };\n protected isLoading = false;\n protected typeFromFileExtension: string = null;\n\n protected fileName = computed(() => this.file()?.name ?? '');\n protected fileSize = computed(() => this.file()?.size ?? 0);\n protected fileType = computed(() => {\n const f = this.file();\n if (f?.type?.length > 0) {\n return f.type;\n }\n return this.typeFromFileExtension ?? '';\n });\n\n private cd = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n const file = this.file();\n if (file instanceof Blob) {\n const reader = new FileReader();\n reader.readAsArrayBuffer(file as Blob);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reader.onload = (event: any): void => {\n this.url = event.target.result;\n this.fileExtension = this.getFileExtension(this.file().name);\n this.icon = this.getIconForExtension(this.fileExtension);\n\n if (this.fileExtension === 'msg') {\n this.typeFromFileExtension = 'application/vnd.ms-outlook';\n }\n\n const blob = new Blob([reader.result], { type: this.file().type });\n const imageUrl = URL.createObjectURL(blob);\n\n this.previewData = this.getPreviewForMime(this.fileExtension, imageUrl);\n this.cd.detectChanges();\n };\n reader.onloadstart = (): void => {\n this.isLoading = true;\n this.cd.detectChanges();\n };\n reader.onloadend = (): void => {\n this.isLoading = false;\n this.cd.detectChanges();\n };\n } else {\n this.url = (file as EdsUploadedFile).url;\n this.fileExtension = this.getFileExtension(file.name);\n this.icon = this.getIconForExtension(this.fileExtension);\n this.previewData = this.getPreviewForMime(this.fileExtension, this.url);\n this.cd.detectChanges();\n }\n }\n\n protected onRemoveFromList(): void {\n this.removeFromList.emit(this.index());\n }\n\n protected onItemClick(e: Event): void {\n this.itemClick.emit(this.file());\n e.preventDefault();\n }\n\n private getFileExtension(fileName: string): string {\n const ext = fileName?.split('.') ?? [];\n return ext[ext.length - 1] ?? '';\n }\n\n private getPreviewForMime(fileExtension: string, imgUrl: string): { image: boolean; display: string } {\n const f = fileExtension.toLowerCase();\n const isImage = f === 'jpeg' || f === 'jpg' || f === 'png' || f === 'gif';\n const display = isImage ? imgUrl : this.getIconForExtension(f);\n return { image: isImage, display };\n }\n\n private getIconForExtension(fileExtension: string): string {\n const f = fileExtension.toLowerCase();\n return ICON_MAP[f] ?? 'file';\n }\n}\n","@if (uploadedFileTemplate()) {\n <ng-template\n [ngTemplateOutlet]=\"uploadedFileTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: { file: { id: file().id, name: file().name, url: file().url || previewData?.display, size: file().size, type: file().type }, index: index(), isFileObject: isFileObject() } }\" />\n} @else {\n <div class=\"eds-file-upload-preview__content\">\n <div class=\"eds-file-upload-preview__left\">\n @if (hasPreview() && hasPreviewAsImage() && !hasPreviewAsIcon()) {\n <div class=\"eds-file-upload-preview__image\">\n @if (url && previewData?.image) {\n <img [src]=\"previewData.display\" alt=\"File preview image\" />\n }\n @if (previewData && !previewData.image) {\n <eds-icon [icon]=\"previewData.display\" />\n }\n @if (isLoading) {\n <div class=\"eds-file-upload-preview__loading\">\n <eds-icon icon=\"spinner:core\" />\n </div>\n }\n </div>\n }\n @if (hasPreview() && hasPreviewAsIcon()) {\n <div class=\"eds-file-upload-preview__icon\">\n <eds-icon [icon]=\"icon\" />\n </div>\n }\n @if (isFilenameDisplayed()) {\n <div class=\"eds-file-upload-preview__filename\">\n @if (!isItemsClickable()) {\n {{ fileName() }}\n }\n @if (isItemsClickable()) {\n <a href=\"#\" (click)=\"onItemClick($event)\" class=\"eds-file-upload-preview__link\">{{ fileName() }}</a>\n }\n </div>\n }\n </div>\n <div class=\"eds-file-upload-preview__right\">\n @if (isFilesizeDisplayed()) {\n <span class=\"eds-file-upload-preview__size\">{{ fileSize() | edsFilesize }}</span>\n }\n @if (isFiletypeDisplayed() && fileType()) {\n <span class=\"eds-file-upload-preview__type\">{{ fileType() }}</span>\n }\n <button edsIconButton\n color=\"critical\"\n icon=\"trash:core\"\n [ariaLabel]=\"'Remove ' + fileName() + ' from the list'\"\n (buttonClick)=\"onRemoveFromList()\">\n </button>\n </div>\n </div>\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n HostListener,\n TemplateRef,\n booleanAttribute,\n computed,\n effect,\n input,\n output,\n signal,\n viewChildren,\n contentChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { EDS_BUTTON } from '@eui/eds/eds-button';\nimport { EDS_FEEDBACK_MESSAGE } from '@eui/eds/eds-feedback-message';\nimport { EDS_PROGRESS_BAR } from '@eui/eds/eds-progress-bar';\n\nimport { EdsUploadedFile } from './eds-file-upload.model';\nimport { EdsFileUploadPreview } from './eds-file-upload-preview';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\n/**\n * File upload component supporting both traditional file selection and drag-and-drop functionality.\n * Implements ControlValueAccessor for integration with Angular reactive and template-driven forms.\n *\n * Provides file preview, upload progress tracking, file type filtering, and multiple file management.\n *\n * @usageNotes\n * ### Basic file upload\n * ```html\n * <eds-file-upload\n * isMultiple\n * accept=\".pdf,.doc,.docx\"\n * [maxFiles]=\"5\">\n * </eds-file-upload>\n * ```\n *\n * ### With form control\n * ```html\n * <eds-file-upload\n * [formControl]=\"fileControl\"\n * hasDragArea\n * [progress]=\"uploadProgress\">\n * </eds-file-upload>\n * ```\n *\n * ### Accessibility\n * - Native file input is keyboard accessible\n * - Drag-and-drop area has appropriate aria-label\n * - File list items are navigable and removable via keyboard\n */\n@Component({\n selector: 'eds-file-upload',\n templateUrl: './eds-file-upload.html',\n styleUrl: './eds-file-upload.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: EdsFileUpload,\n multi: true,\n },\n ],\n imports: [\n NgTemplateOutlet,\n ...EDS_BUTTON,\n ...EDS_FEEDBACK_MESSAGE,\n ...EDS_PROGRESS_BAR,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-e2e]': 'e2eAttr()',\n },\n})\nexport class EdsFileUpload implements ControlValueAccessor {\n /**\n * Data attribute value for end-to-end testing identification.\n * @default 'eds-file-upload'\n */\n readonly e2eAttr = input('eds-file-upload');\n\n /**\n * Current upload progress percentage (0–100).\n * Only effective when hasProgressBar is true.\n * @default 0\n */\n readonly progress = input(0);\n\n /**\n * Comma-separated list of allowed file extensions or MIME types.\n * Files not matching the specified types will be rejected.\n * Use '*' to allow all file types.\n * @default '*'\n */\n readonly accept = input('*');\n\n /**\n * Maximum number of files that can be uploaded simultaneously.\n * When limit is reached, additional file selection is disabled.\n * @default undefined (unlimited)\n */\n readonly maxFiles = input<number>(undefined);\n\n /**\n * Enables selection of multiple files in a single upload operation.\n * @default true\n */\n readonly isMultiple = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a progress bar indicating upload completion percentage.\n * @default true\n */\n readonly hasProgressBar = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a visual preview for each file in the upload list.\n * @default true\n */\n readonly hasPreview = input(true, { transform: booleanAttribute });\n\n /**\n * Renders file previews as thumbnail images for supported image file types.\n * @default true\n */\n readonly hasPreviewAsImage = input(true, { transform: booleanAttribute });\n\n /**\n * Renders file previews as file format icons instead of image thumbnails.\n * @default false\n */\n readonly hasPreviewAsIcon = input(false, { transform: booleanAttribute });\n\n /**\n * Shows the total combined size of all files in the upload queue.\n * @default true\n */\n readonly hasTotalSizeDisplayed = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a button to clear all files from the upload queue.\n * Only visible when isMultiple is true and files are present.\n * @default true\n */\n readonly hasResetButton = input(true, { transform: booleanAttribute });\n\n /**\n * Enables drag-and-drop functionality for file selection.\n * Displays a drop zone area where users can drag files from their file system.\n * @default false\n */\n readonly hasDragArea = input(false, { transform: booleanAttribute });\n\n /**\n * Makes files in the upload list clickable, emitting itemClick events.\n * @default false\n */\n readonly isItemsClickable = input(false, { transform: booleanAttribute });\n\n /**\n * Label text for the browse button.\n * @default 'Choose file'\n */\n readonly browseLabel = input('Choose file');\n\n /**\n * Label text for the drag area hint.\n * @default 'or drag and drop file here'\n */\n readonly dragLabel = input('or drag and drop file here');\n\n /**\n * Label text for the reset button.\n * @default 'Reset list'\n */\n readonly resetLabel = input('Reset list');\n\n /**\n * Label text shown for total size.\n * @default 'total size'\n */\n readonly totalSizeLabel = input('total size');\n\n /**\n * Error message shown for rejected file extensions.\n * @default 'File extension not allowed'\n */\n readonly rejectedFileLabel = input('File extension not allowed');\n\n /**\n * Emitted when files are dropped into the drag-and-drop area.\n */\n readonly fileDrop = output();\n\n /**\n * Emitted when a file in the upload list is clicked (when isItemsClickable is true).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly itemClick = output<Blob | EdsUploadedFile | any>();\n\n /** Internal state for currently selected files. */\n protected internalFiles = signal<File[]>([]);\n\n /** Internal state for pre-existing uploaded files (from writeValue). */\n protected internalUploadedFiles = signal<EdsUploadedFile[]>([]);\n\n /** Internal progress (synced from input via effect). */\n protected internalProgress = signal(0);\n\n /** Drag state indicator. */\n protected dragEntered = signal(false);\n\n /** Rejected file message. */\n protected rejectedFileMessage = signal<string | null>(null);\n\n /** Random id for unique file input element. */\n protected readonly randomNumberId = Math.floor(Math.random() * 10000);\n\n /** References to all file input elements. */\n protected readonly fileInputs = viewChildren<ElementRef<HTMLInputElement>>('input');\n\n /** Custom templates provided by content projection. */\n protected uploadedFileTemplate: TemplateRef<unknown>;\n protected browseButtonTemplate: TemplateRef<unknown>;\n protected resetButtonTemplate: TemplateRef<unknown>;\n protected progressBarTemplate: TemplateRef<unknown>;\n\n /** Computed total file size. */\n protected filesTotalSize = computed(() => {\n return this.internalFiles().reduce((total, f) => total + f.size, 0);\n });\n\n /** Whether to show the reset button. */\n protected showResetBtn = computed(() => {\n return this.hasResetButton() && this.isMultiple() &&\n (this.internalFiles().length > 0 || this.internalUploadedFiles().length > 0);\n });\n\n /** Whether the drop area is disabled. */\n protected isDropAreaDisabled = computed(() => {\n const totalFiles = this.internalUploadedFiles().length + this.internalFiles().length;\n return (!this.isMultiple() && this.internalFiles().length === 1) || totalFiles === this.maxFiles();\n });\n\n /** Effective preview-as-image flag. */\n protected effectiveHasPreviewAsImage = computed(() => {\n if (this.hasPreviewAsIcon()) return false;\n return this.hasPreviewAsImage();\n });\n\n hostClasses = computed(() => {\n return 'eds-file-upload';\n });\n\n constructor() {\n effect(() => {\n this.internalProgress.set(this.progress());\n });\n }\n\n /**\n * Host listener for file input change events.\n */\n @HostListener('change', ['$any($event.target).files'])\n emitFiles(fileList: FileList): void {\n let i = this.internalUploadedFiles().length + this.internalFiles().length;\n const rejectedFiles: string[] = [];\n const newFiles: File[] = [...this.internalFiles()];\n\n for (const property in fileList) {\n const maxFiles = this.maxFiles();\n if (fileList[property] && typeof fileList[property] === 'object' && (!maxFiles || i < maxFiles)) {\n const fileName = fileList[property].name.split('.');\n const fileExtension = fileName[fileName.length - 1];\n\n if (this.accept().indexOf(fileExtension.toLowerCase()) !== -1 || this.accept() === '*') {\n newFiles.push(fileList[property]);\n } else {\n rejectedFiles.push(fileList[property].name);\n }\n\n i++;\n }\n }\n\n this.internalFiles.set(newFiles);\n this.rejectedFileMessage.set(rejectedFiles.length ? rejectedFiles.join(', ') : null);\n\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n\n const fileInputs = this.fileInputs();\n if (fileInputs?.length) {\n fileInputs.at(0)!.nativeElement.value = '';\n if (fileInputs.length > 1) {\n fileInputs.at(-1)!.nativeElement.value = '';\n }\n }\n\n this.dragEntered.set(false);\n this.fileDrop.emit();\n }\n\n // --- ControlValueAccessor ---\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writeValue(value: any): void {\n this.internalUploadedFiles.set(value || []);\n this.internalFiles.set([]);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n protected onDragEnter(): void {\n if (!this.isDropAreaDisabled()) {\n this.dragEntered.set(true);\n }\n }\n\n protected onDragLeave(): void {\n this.dragEntered.set(false);\n }\n\n protected removeFromList(index: number): void {\n this.internalFiles.update(files => files.filter((_, i) => i !== index));\n if (this.internalFiles().length === 0) {\n this.internalProgress.set(0);\n }\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n }\n\n protected removeFromUploadedList(index: number): void {\n this.internalUploadedFiles.update(files => files.filter((_, i) => i !== index));\n if (this.internalFiles().length === 0) {\n this.internalProgress.set(0);\n }\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n }\n\n protected resetList(): void {\n this.internalFiles.set([]);\n this.internalUploadedFiles.set([]);\n this.internalProgress.set(0);\n this._onChange([]);\n }\n\n protected openBrowseWindow(): void {\n this.fileInputs()?.at(0)?.nativeElement.click();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected onItemClick(e: Blob | EdsUploadedFile | any): void {\n this.itemClick.emit(e);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onChange: (value: any) => void = () => {/* noop */};\n private _onTouched: () => void = () => {/* noop */};\n}\n","@if (hasDragArea()) {\n <div\n class=\"eds-file-upload__drop-area\"\n [class.eds-file-upload__drop-area--active]=\"dragEntered()\"\n [class.eds-file-upload__drop-area--disabled]=\"isDropAreaDisabled()\">\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" class=\"eds-file-upload__browse-btn\">{{ browseLabel() }}</button>\n <span class=\"eds-file-upload__drag-hint\">{{ dragLabel() }}</span>\n <input\n #input\n class=\"eds-file-upload__file-input\"\n [attr.aria-label]=\"browseLabel() + ' ' + dragLabel()\"\n type=\"file\"\n [accept]=\"accept()\"\n [attr.disabled]=\"isDropAreaDisabled() ? 'disabled' : null\"\n [multiple]=\"isMultiple()\"\n (dragenter)=\"onDragEnter()\"\n (dragleave)=\"onDragLeave()\" />\n </div>\n} @else {\n <div class=\"eds-file-upload__simple-input\">\n <label [attr.for]=\"'eds-file-' + randomNumberId\">\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" (click)=\"openBrowseWindow()\">{{ browseLabel() }}</button>\n </label>\n @if (isMultiple()) {\n <input\n #input\n [attr.aria-label]=\"'Choose multiple files'\"\n class=\"eds-file-upload__hidden-input\"\n [id]=\"'eds-file-' + randomNumberId\"\n type=\"file\"\n [accept]=\"accept()\"\n multiple />\n } @else {\n <input\n #input\n [attr.aria-label]=\"'Choose a single file'\"\n class=\"eds-file-upload__hidden-input\"\n [id]=\"'eds-file-' + randomNumberId\"\n type=\"file\"\n [accept]=\"accept()\" />\n }\n </div>\n}\n\n@if (hasProgressBar() && internalProgress() > 0) {\n <eds-progress-bar\n class=\"eds-file-upload__progress\"\n [progress]=\"internalProgress()\"\n [label]=\"internalProgress() + '%'\" />\n}\n\n@if (rejectedFileMessage()) {\n <eds-feedback-message edsCritical class=\"eds-file-upload__error\">\n {{ rejectedFileLabel() }}: {{ rejectedFileMessage() }}\n </eds-feedback-message>\n}\n\n@for (uploadedFile of internalUploadedFiles(); let i = $index; track i) {\n <eds-file-upload-preview\n [isItemsClickable]=\"isItemsClickable()\"\n [index]=\"i\"\n [file]=\"uploadedFile\"\n [hasPreview]=\"hasPreview()\"\n [hasPreviewAsImage]=\"effectiveHasPreviewAsImage()\"\n [hasPreviewAsIcon]=\"hasPreviewAsIcon()\"\n [uploadedFileTemplate]=\"uploadedFileTemplate\"\n (itemClick)=\"onItemClick($event)\"\n (removeFromList)=\"removeFromUploadedList($event)\" />\n}\n\n@for (file of internalFiles(); let i = $index; track i) {\n <eds-file-upload-preview\n isFileObject\n [isItemsClickable]=\"isItemsClickable()\"\n [index]=\"i\"\n [file]=\"file\"\n [hasPreview]=\"hasPreview()\"\n [hasPreviewAsImage]=\"effectiveHasPreviewAsImage()\"\n [hasPreviewAsIcon]=\"hasPreviewAsIcon()\"\n [uploadedFileTemplate]=\"uploadedFileTemplate\"\n (itemClick)=\"onItemClick($event)\"\n (removeFromList)=\"removeFromList($event)\" />\n}\n\n@if (filesTotalSize() && hasTotalSizeDisplayed()) {\n <div class=\"eds-file-upload__total-size\">\n {{ filesTotalSize() | edsFilesize }} {{ totalSizeLabel() }}\n </div>\n}\n\n<div class=\"eds-u-flex eds-u-flex-gap-s\">\n <ng-content />\n \n @if (showResetBtn()) {\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" (click)=\"resetList()\">\n {{ resetLabel() }}\n </button>\n }\n</div>\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpResponse } from '@angular/common/http';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { pipe, Observable, UnaryFunction, MonoTypeOperatorFunction } from 'rxjs';\n\n/**\n * Service providing utility methods for file upload operations.\n * Handles sending form data to a backend, tracking upload progress, and extracting response bodies.\n *\n * @usageNotes\n * ```ts\n * this.fileUploadUtils.sendData(formValue, '/api/upload').pipe(\n * this.fileUploadUtils.uploadProgress((progress) => console.log(progress)),\n * this.fileUploadUtils.toResponseBody(),\n * ).subscribe(response => console.log(response));\n * ```\n */\n@Injectable()\nexport class EdsFileUploadUtils {\n private httpClient = inject(HttpClient);\n\n /**\n * Formats data as FormData and sends it to the specified endpoint.\n *\n * @param data - Data to send (will be serialized to FormData).\n * @param apiEndpoint - The URL endpoint to POST to.\n * @returns Observable of HttpEvents for tracking progress.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public sendData(data: any, apiEndpoint: string): Observable<any> {\n return this.httpClient.post(apiEndpoint, this.toFormData(data), {\n reportProgress: true,\n observe: 'events',\n });\n }\n\n /**\n * RxJS operator that emits upload progress via a callback function.\n *\n * @param cb - Callback receiving progress percentage (0–100).\n * @returns MonoTypeOperatorFunction that passes through events while reporting progress.\n */\n public uploadProgress<T>(cb: (progress: number) => void): MonoTypeOperatorFunction<HttpEvent<T>> {\n return tap((event: HttpEvent<T>) => {\n if (event.type === HttpEventType.UploadProgress) {\n cb(Math.round((100 * event.loaded) / event.total));\n }\n });\n }\n\n /**\n * RxJS operator that extracts the response body from HttpEvents.\n *\n * @returns UnaryFunction that filters to only HttpResponse events and maps to the body.\n */\n public toResponseBody<T>(): UnaryFunction<Observable<HttpEvent<T>>, Observable<T>> {\n return pipe(\n filter((event: HttpEvent<T>) => event.type === HttpEventType.Response),\n map((res: HttpResponse<T>) => res.body),\n );\n }\n\n /**\n * Returns the icon name for a given file extension.\n *\n * @param fileExtension - The file extension (without dot).\n * @returns Icon name string.\n */\n public getIconForExtension(fileExtension: string): string {\n const iconConfig: Record<string, string> = {\n avi: 'file-video',\n html: 'file-code',\n htm: 'file-code',\n js: 'file-code',\n json: 'file-code',\n mp3: 'file-audio',\n mp4: 'file-video',\n pdf: 'file',\n png: 'file-image',\n svg: 'file-image',\n txt: 'file-text',\n xml: 'file-code',\n jpeg: 'file-image',\n jpg: 'file-image',\n zip: 'file',\n doc: 'file-text',\n docx: 'file-text',\n xls: 'file',\n xlsx: 'file',\n ppt: 'file',\n csv: 'file',\n rtf: 'file-text',\n };\n\n const f = fileExtension.toLowerCase();\n return iconConfig[f] ?? 'file';\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toFormData(formValue: any): FormData {\n const formData = new FormData();\n\n for (const key of Object.keys(formValue)) {\n if (Array.isArray(formValue[key])) {\n let fileIndex = 0;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n formValue[key].forEach((value: any) => {\n if (value instanceof File) {\n formData.append(key + fileIndex, value);\n fileIndex++;\n }\n });\n\n const a: unknown[] = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n formValue[key].forEach((value: any): void => {\n a.push(value);\n });\n\n formData.append(key, JSON.stringify(a));\n } else {\n if (typeof formValue[key] === 'string') {\n formData.set(key, formValue[key]);\n } else {\n formData.set(key, JSON.stringify(formValue[key]));\n }\n }\n }\n\n return formData;\n }\n}\n","export type MimeType =\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp'\n | 'image/flif'\n | 'image/x-xcf'\n | 'image/x-canon-cr2'\n | 'image/x-canon-cr3'\n | 'image/tiff'\n | 'image/bmp'\n | 'image/icns'\n | 'image/vnd.ms-photo'\n | 'image/vnd.adobe.photoshop'\n | 'application/x-indesign'\n | 'application/epub+zip'\n | 'application/x-xpinstall'\n | 'application/vnd.oasis.opendocument.text'\n | 'application/vnd.oasis.opendocument.spreadsheet'\n | 'application/vnd.oasis.opendocument.presentation'\n | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n | 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | 'application/zip'\n | 'application/json'\n | 'application/x-tar'\n | 'application/x-rar-compressed'\n | 'application/gzip'\n | 'application/x-bzip2'\n | 'application/x-7z-compressed'\n | 'application/x-apple-diskimage'\n | 'video/mp4'\n | 'audio/midi'\n | 'video/x-matroska'\n | 'video/webm'\n | 'video/quicktime'\n | 'video/vnd.avi'\n | 'audio/vnd.wave'\n | 'audio/qcelp'\n | 'audio/x-ms-asf'\n | 'video/x-ms-asf'\n | 'application/vnd.ms-asf'\n | 'video/mpeg'\n | 'video/3gpp'\n | 'audio/mpeg'\n | 'audio/mp4'\n | 'audio/opus'\n | 'video/ogg'\n | 'audio/ogg'\n | 'application/ogg'\n | 'audio/x-flac'\n | 'audio/ape'\n | 'audio/wavpack'\n | 'audio/amr'\n | 'application/pdf'\n | 'application/x-elf'\n | 'application/x-msdownload'\n | 'application/x-shockwave-flash'\n | 'application/rtf'\n | 'application/wasm'\n | 'font/woff'\n | 'font/woff2'\n | 'application/vnd.ms-fontobject'\n | 'font/ttf'\n | 'font/otf'\n | 'image/x-icon'\n | 'video/x-flv'\n | 'application/postscript'\n | 'application/eps'\n | 'application/x-xz'\n | 'application/x-sqlite3'\n | 'application/x-nintendo-nes-rom'\n | 'application/x-google-chrome-extension'\n | 'application/vnd.ms-cab-compressed'\n | 'application/x-deb'\n | 'application/x-unix-archive'\n | 'application/x-rpm'\n | 'application/x-compress'\n | 'application/x-lzip'\n | 'application/x-cfb'\n | 'application/x-mie'\n | 'application/x-apache-arrow'\n | 'application/mxf'\n | 'video/mp2t'\n | 'application/x-blender'\n | 'image/bpg'\n | 'image/j2c'\n | 'image/jp2'\n | 'image/jpx'\n | 'image/jpm'\n | 'image/mj2'\n | 'audio/aiff'\n | 'application/xml'\n | 'application/x-mobipocket-ebook'\n | 'image/heif'\n | 'image/heif-sequence'\n | 'image/heic'\n | 'image/heic-sequence'\n | 'image/ktx'\n | 'application/dicom'\n | 'audio/x-musepack'\n | 'text/calendar'\n | 'text/vcard'\n | 'model/gltf-binary'\n | 'application/vnd.tcpdump.pcap'\n | 'audio/x-voc'\n | 'audio/vnd.dolby.dd-raw'\n | 'audio/x-m4a'\n | 'image/apng'\n | 'image/x-olympus-orf'\n | 'image/x-sony-arw'\n | 'image/x-adobe-dng'\n | 'image/x-nikon-nef'\n | 'image/x-panasonic-rw2'\n | 'image/x-fujifilm-raf'\n | 'video/x-m4v'\n | 'video/3gpp2'\n | 'application/x-esri-shape'\n | 'audio/aac'\n | 'audio/x-it'\n | 'audio/x-s3m'\n | 'audio/x-xm'\n | 'video/MP1S'\n | 'video/MP2P'\n | 'application/vnd.sketchup.skp'\n | 'image/avif'\n | 'application/x-lzh-compressed'\n | 'application/pgp-encrypted'\n | 'application/x-asar'\n | 'model/stl'\n | 'application/vnd.ms-htmlhelp'\n | 'model/3mf'\n | 'image/jxl'\n | 'application/zstd'\n | 'image/jls'\n | 'application/vnd.ms-outlook'\n | 'image/vnd.dwg'\n | 'application/x-parquet'\n | 'application/java-vm'\n | 'application/x-arj'\n | 'application/x-cpio'\n | 'application/x-ace-compressed'\n | 'application/avro'\n | 'application/vnd.iccprofile';\n\nexport const getMimeType = (header: Uint8Array): MimeType => {\n const hex = uint8ArrayToHexString(header);\n\n if (hex.startsWith('ffd8ff')) return 'image/jpeg';\n if (hex.startsWith('89504e47')) return 'image/png';\n if (hex.startsWith('464c4946')) return 'image/flif';\n if (hex.startsWith('67696d7020786366')) return 'image/x-xcf';\n if (hex.startsWith('49492a00')) return 'image/tiff';\n if (hex.startsWith('424d')) return 'image/bmp';\n if (hex.startsWith('69636e73')) return 'image/icns';\n if (hex.startsWith('49491a0000004845415050')) return 'image/vnd.ms-photo';\n if (hex.startsWith('38425053')) return 'image/vnd.adobe.photoshop';\n if (hex.startsWith('504b0304')) return identifyZipBasedFormat(header);\n if (hex.startsWith('7573746172')) return 'application/x-tar';\n if (hex.startsWith('526172211a0700')) return 'application/x-rar-compressed';\n if (hex.startsWith('1f8b08')) return 'application/gzip';\n if (hex.startsWith('425a68')) return 'application/x-bzip2';\n if (hex.startsWith('377abcaf271c')) return 'application/x-7z-compressed';\n if (hex.startsWith('00000020667479706d70')) return 'video/mp4';\n if (hex.startsWith('4d546864')) return 'audio/midi';\n if (hex.startsWith('1a45dfa3')) return 'video/webm';\n if (hex.startsWith('255044462d312e')) return 'application/pdf';\n if (hex.startsWith('7f454c46')) return 'application/x-elf';\n if (hex.startsWith('4d5a')) return 'application/x-msdownload';\n if (hex.startsWith('7b5c72746631')) return 'application/rtf';\n if (hex.startsWith('0061736d')) return 'application/wasm';\n if (hex.startsWith('774f4646')) return 'font/woff';\n if (hex.startsWith('774f4632')) return 'font/woff2';\n if (hex.startsWith('464c560105')) return 'video/x-flv';\n if (hex.startsWith('25215053')) return 'application/postscript';\n if (hex.startsWith('fd377a585a00')) return 'application/x-xz';\n if (hex.startsWith('53514c69746520666f726d6174203300')) return 'application/x-sqlite3';\n if (hex.startsWith('d0cf11e0a1b11ae1')) return 'application/x-cfb';\n if (hex.startsWith('4f676753')) return 'audio/ogg';\n if (hex.startsWith('664c6143')) return 'audio/x-flac';\n if (hex.startsWith('494433')) return 'audio/mpeg';\n if (hex.startsWith('3c3f786d6c20')) return 'application/xml';\n\n return null;\n};\n\nconst identifyZipBasedFormat = (data: Uint8Array): MimeType => {\n try {\n const fileEntries = extractZipFileList(data);\n\n if (fileEntries.includes('META-INF/container.xml') || fileEntries.includes('mimetype')) {\n return 'application/epub+zip';\n }\n\n if (fileEntries.includes('[Content_Types].xml')) {\n if (fileEntries.includes('ppt/presentation.xml')) return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\n if (fileEntries.includes('xl/workbook.xml')) return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n if (fileEntries.includes('word/document.xml')) return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n }\n\n return 'application/zip';\n } catch {\n return 'application/zip';\n }\n};\n\nconst extractZipFileList = (data: Uint8Array): string[] => {\n const files: string[] = [];\n let offset = 0;\n\n while (offset < data.length - 4) {\n if (data[offset] === 0x50 && data[offset + 1] === 0x4b &&\n data[offset + 2] === 0x03 && data[offset + 3] === 0x04) {\n\n const filenameLength = data[offset + 26] | (data[offset + 27] << 8);\n const extraFieldLength = data[offset + 28] | (data[offset + 29] << 8);\n\n if (filenameLength > 0 && offset + 30 + filenameLength <= data.length) {\n const filename = new TextDecoder().decode(data.slice(offset + 30, offset + 30 + filenameLength));\n files.push(filename);\n }\n\n offset += 30 + filenameLength + extraFieldLength;\n } else {\n offset++;\n }\n }\n\n return files;\n};\n\nconst uint8ArrayToHexString = (uint8Array: Uint8Array): string => {\n return Array.prototype.map.call(uint8Array, (byte: number) => ('00' + byte.toString(16)).slice(-2)).join('');\n};\n","import { AbstractControl, AsyncValidatorFn, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { Observable, of, zip } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { getMimeType, MimeType } from './eds-file-upload.mime-types';\n\n/**\n * Validator that requires the maximum number of files that can be uploaded.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxFilesValidator(3));\n * console.log(fileUpload.errors); // { maxFiles: 3 }\n * ```\n *\n * @param maxFiles - The maximum number of files allowed.\n * @returns A validator function that returns `{ maxFiles }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxFilesValidator =\n (maxFiles: number): ValidatorFn =>\n (control: AbstractControl): { maxFiles: number } | null =>\n control.value && control.value.length > maxFiles ? { maxFiles } : null;\n\n/**\n * Validator that checks the total combined size (in bytes) of the selected files.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxSize: 300000 }\n * ```\n *\n * @param maxSize - Maximum allowed total size in bytes.\n * @returns A validator function that returns `{ maxSize }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxSizeValidator =\n (maxSize: number): ValidatorFn =>\n (control: AbstractControl): { maxSize: number } | null => {\n let totalSize = 0;\n if (control.value) {\n control.value.forEach((file: File) => {\n totalSize += file.size;\n });\n }\n\n return control.value && totalSize > maxSize ? { maxSize } : null;\n };\n\n/**\n * Validator that checks the maximum size per file (in bytes).\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxFileSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxFileSize: 300000, indexes: [0, 2] }\n * ```\n *\n * @param maxFileSize - Maximum allowed size per file in bytes.\n * @returns A validator function that returns `{ maxFileSize, indexes }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxFileSizeValidator =\n (maxFileSize: number): ValidatorFn =>\n (control: AbstractControl): { maxFileSize: number; indexes: number[] } | null => {\n const fileIndexes: number[] = [];\n let maxFileExceeded = false;\n if (control.value) {\n control.value.forEach((file: File, index: number) => {\n if (file.size > maxFileSize) {\n fileIndexes.push(index);\n maxFileExceeded = true;\n }\n });\n }\n\n return control.value && maxFileExceeded ? { maxFileSize, indexes: fileIndexes } : null;\n };\n\n/**\n * Validator that checks file extensions against a list of allowed MIME types.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMimeTypeExtensionValidator(['image/jpeg']));\n * console.log(fileUpload.errors); // { invalidFileExtension: ['file.png'] }\n * ```\n *\n * @param mimeTypes - The list of allowed MIME types.\n * @returns A validator function that returns `{ invalidFileExtension }` if the validation fails, otherwise `null`.\n */\nexport const edsMimeTypeExtensionValidator =\n (mimeTypes: string[]): ValidatorFn =>\n (control: AbstractControl): { invalidFileExtension: string[] } | null => {\n const invalidFileExtension: string[] = [];\n if (control.value) {\n control.value.forEach((file: File) => {\n if (mimeTypes.indexOf(file.type) === -1) {\n invalidFileExtension.push(file.name);\n }\n });\n }\n\n return control.value && invalidFileExtension.length > 0 ? { invalidFileExtension } : null;\n };\n\n/**\n * Async validator that checks MIME types by reading file header bytes.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, { asyncValidators: [edsAsyncMimeTypeValidator(['image/jpeg'])] });\n * console.log(fileUpload.errors); // { invalidMimeFileType: [{ 'file.png': 'image/png' }] }\n * ```\n *\n * @param mimeTypes - The list of allowed MIME types.\n * @returns An async validator function that returns `{ invalidMimeFileType }` if the validation fails, otherwise `null`.\n */\nexport const edsAsyncMimeTypeValidator =\n (mimeTypes: MimeType[]): AsyncValidatorFn =>\n (control: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {\n if (control.value) {\n const fileErrorObservables: Observable<ValidationErrors | null>[] = [];\n control.value.forEach((file: File) => {\n fileErrorObservables.push(validateFileMimeType(file, mimeTypes));\n });\n return zip(...fileErrorObservables).pipe(\n map((fileErrors) => {\n const errors = fileErrors.filter((fileError) => fileError !== null);\n if (errors.length === 0) {\n return null;\n }\n return { invalidMimeFileType: errors };\n }),\n );\n }\n return of(null);\n };\n\nconst validateFileMimeType = (file: File, mimeTypes: MimeType[]): Observable<Record<string, MimeType> | null> => {\n return new Observable<Record<string, MimeType> | null>((subscriber) => {\n const reader = new FileReader();\n reader.onloadend = (): void => {\n const buffer = reader.result as ArrayBuffer;\n const headerBytes = new Uint8Array(buffer).slice(0, Math.min(1024, buffer.byteLength));\n const mime = getMimeType(headerBytes);\n if (mimeTypes.includes(mime)) {\n subscriber.next(null);\n } else {\n subscriber.next({ [file.name]: mime });\n }\n subscriber.complete();\n };\n reader.readAsArrayBuffer(file);\n });\n};\n","import { EdsFileUpload } from './eds-file-upload';\nimport { EdsFileUploadPreview } from './eds-file-upload-preview';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\nexport {\n EdsFileUpload,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n};\n\nexport * from './eds-file-upload.model';\nexport * from './eds-file-upload.utils';\nexport * from './eds-file-upload.validators';\nexport * from './eds-file-upload.mime-types';\n\n/** Convenience array for importing all eds-file-upload components. */\nexport const EDS_FILE_UPLOAD = [\n EdsFileUpload,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-eds-eds-file-upload.mjs","sources":["../../eds-file-upload/eds-filesize.pipe.ts","../../eds-file-upload/eds-file-upload-preview.ts","../../eds-file-upload/eds-file-upload-preview.html","../../eds-file-upload/eds-file-upload.ts","../../eds-file-upload/eds-file-upload.html","../../eds-file-upload/eds-file-upload.utils.ts","../../eds-file-upload/eds-file-upload.mime-types.ts","../../eds-file-upload/eds-file-upload.validators.ts","../../eds-file-upload/index.ts","../../eds-file-upload/eui-eds-eds-file-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Transforms a file size in bytes into a human-readable format (e.g., KB, MB, GB).\n *\n * @example\n * ```html\n * {{ 1024 | edsFilesize }} <!-- Outputs: \"1.00 KB\" -->\n * {{ 1048576 | edsFilesize:1 }} <!-- Outputs: \"1.0 MB\" -->\n * ```\n */\n@Pipe({\n name: 'edsFilesize',\n})\nexport class EdsFilesizePipe implements PipeTransform {\n private units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n transform(bytes = 0, precision = 2): string {\n if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) {\n return '?';\n }\n\n let unit = 0;\n\n while (bytes >= 1024) {\n bytes /= 1024;\n unit++;\n }\n\n return bytes.toFixed(+precision) + ' ' + this.units[unit];\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnInit,\n TemplateRef,\n booleanAttribute,\n inject,\n input,\n output,\n computed,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { EDS_ICON } from '@eui/eds/eds-icon';\nimport { EDS_ICON_BUTTON } from '@eui/eds/eds-icon-button';\n\nimport { EdsUploadedFile } from './eds-file-upload.model';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\n/** Map of file extensions to EDS icon names. */\nconst ICON_MAP: Record<string, string> = {\n avi: 'file-video',\n html: 'file-code',\n htm: 'file-code',\n js: 'file-code',\n json: 'file-code',\n mp3: 'file-audio',\n mp4: 'file-video',\n pdf: 'file',\n png: 'file-image',\n svg: 'file-image',\n txt: 'file-text',\n xml: 'file-code',\n jpeg: 'file-image',\n jpg: 'file-image',\n zip: 'file',\n doc: 'file-text',\n docx: 'file-text',\n xls: 'file',\n xlsx: 'file',\n ppt: 'file',\n csv: 'file',\n rtf: 'file-text',\n};\n\n/**\n * Internal sub-component used by `eds-file-upload` to render individual file previews.\n * Displays file information (name, size, type) with optional image preview or icon, and a remove button.\n */\n@Component({\n selector: 'eds-file-upload-preview',\n templateUrl: './eds-file-upload-preview.html',\n styleUrl: './eds-file-upload-preview.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n ...EDS_ICON,\n ...EDS_ICON_BUTTON,\n EdsFilesizePipe,\n ],\n host: {\n class: 'eds-file-upload-preview',\n '[attr.data-e2e]': '\"eds-file-upload-preview\"',\n },\n})\nexport class EdsFileUploadPreview implements OnInit {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly file = input<Blob | EdsUploadedFile | any>(undefined);\n readonly index = input<number>(undefined);\n readonly uploadedFileTemplate = input<TemplateRef<unknown>>(undefined);\n\n readonly hasPreview = input(true, { transform: booleanAttribute });\n readonly hasPreviewAsImage = input(true, { transform: booleanAttribute });\n readonly hasPreviewAsIcon = input(false, { transform: booleanAttribute });\n readonly isItemsClickable = input(false, { transform: booleanAttribute });\n readonly isFileObject = input(false, { transform: booleanAttribute });\n readonly isFilenameDisplayed = input(true, { transform: booleanAttribute });\n readonly isFilesizeDisplayed = input(true, { transform: booleanAttribute });\n readonly isFiletypeDisplayed = input(true, { transform: booleanAttribute });\n\n readonly removeFromList = output<number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly itemClick = output<Blob | EdsUploadedFile | any>();\n\n protected url: string;\n protected icon: string;\n protected fileExtension: string;\n protected previewData: { image: boolean; display: string };\n protected isLoading = false;\n protected typeFromFileExtension: string = null;\n\n protected fileName = computed(() => this.file()?.name ?? '');\n protected fileSize = computed(() => this.file()?.size ?? 0);\n protected fileType = computed(() => {\n const f = this.file();\n if (f?.type?.length > 0) {\n return f.type;\n }\n return this.typeFromFileExtension ?? '';\n });\n\n private cd = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n const file = this.file();\n if (file instanceof Blob) {\n const reader = new FileReader();\n reader.readAsArrayBuffer(file as Blob);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reader.onload = (event: any): void => {\n this.url = event.target.result;\n this.fileExtension = this.getFileExtension(this.file().name);\n this.icon = this.getIconForExtension(this.fileExtension);\n\n if (this.fileExtension === 'msg') {\n this.typeFromFileExtension = 'application/vnd.ms-outlook';\n }\n\n const blob = new Blob([reader.result], { type: this.file().type });\n const imageUrl = URL.createObjectURL(blob);\n\n this.previewData = this.getPreviewForMime(this.fileExtension, imageUrl);\n this.cd.detectChanges();\n };\n reader.onloadstart = (): void => {\n this.isLoading = true;\n this.cd.detectChanges();\n };\n reader.onloadend = (): void => {\n this.isLoading = false;\n this.cd.detectChanges();\n };\n } else {\n this.url = (file as EdsUploadedFile).url;\n this.fileExtension = this.getFileExtension(file.name);\n this.icon = this.getIconForExtension(this.fileExtension);\n this.previewData = this.getPreviewForMime(this.fileExtension, this.url);\n this.cd.detectChanges();\n }\n }\n\n protected onRemoveFromList(): void {\n this.removeFromList.emit(this.index());\n }\n\n protected onItemClick(e: Event): void {\n this.itemClick.emit(this.file());\n e.preventDefault();\n }\n\n private getFileExtension(fileName: string): string {\n const ext = fileName?.split('.') ?? [];\n return ext[ext.length - 1] ?? '';\n }\n\n private getPreviewForMime(fileExtension: string, imgUrl: string): { image: boolean; display: string } {\n const f = fileExtension.toLowerCase();\n const isImage = f === 'jpeg' || f === 'jpg' || f === 'png' || f === 'gif';\n const display = isImage ? imgUrl : this.getIconForExtension(f);\n return { image: isImage, display };\n }\n\n private getIconForExtension(fileExtension: string): string {\n const f = fileExtension.toLowerCase();\n return ICON_MAP[f] ?? 'file';\n }\n}\n","@if (uploadedFileTemplate()) {\n <ng-template\n [ngTemplateOutlet]=\"uploadedFileTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: { file: { id: file().id, name: file().name, url: file().url || previewData?.display, size: file().size, type: file().type }, index: index(), isFileObject: isFileObject() } }\" />\n} @else {\n <div class=\"eds-file-upload-preview__content\">\n <div class=\"eds-file-upload-preview__left\">\n @if (hasPreview() && hasPreviewAsImage() && !hasPreviewAsIcon()) {\n <div class=\"eds-file-upload-preview__image\">\n @if (url && previewData?.image) {\n <img [src]=\"previewData.display\" alt=\"File preview image\" />\n }\n @if (previewData && !previewData.image) {\n <eds-icon [icon]=\"previewData.display\" />\n }\n @if (isLoading) {\n <div class=\"eds-file-upload-preview__loading\">\n <eds-icon icon=\"spinner:core\" />\n </div>\n }\n </div>\n }\n @if (hasPreview() && hasPreviewAsIcon()) {\n <div class=\"eds-file-upload-preview__icon\">\n <eds-icon [icon]=\"icon\" />\n </div>\n }\n @if (isFilenameDisplayed()) {\n <div class=\"eds-file-upload-preview__filename\">\n @if (!isItemsClickable()) {\n {{ fileName() }}\n }\n @if (isItemsClickable()) {\n <a href=\"#\" (click)=\"onItemClick($event)\" class=\"eds-file-upload-preview__link\">{{ fileName() }}</a>\n }\n </div>\n }\n </div>\n <div class=\"eds-file-upload-preview__right\">\n @if (isFilesizeDisplayed()) {\n <span class=\"eds-file-upload-preview__size\">{{ fileSize() | edsFilesize }}</span>\n }\n @if (isFiletypeDisplayed() && fileType()) {\n <span class=\"eds-file-upload-preview__type\">{{ fileType() }}</span>\n }\n <button edsIconButton\n color=\"critical\"\n icon=\"trash:core\"\n [ariaLabel]=\"'Remove ' + fileName() + ' from the list'\"\n (buttonClick)=\"onRemoveFromList()\">\n </button>\n </div>\n </div>\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n HostListener,\n TemplateRef,\n booleanAttribute,\n computed,\n effect,\n input,\n output,\n signal,\n viewChildren,\n contentChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { EDS_BUTTON } from '@eui/eds/eds-button';\nimport { EDS_FEEDBACK_MESSAGE } from '@eui/eds/eds-feedback-message';\nimport { EDS_PROGRESS_BAR } from '@eui/eds/eds-progress-bar';\n\nimport { EdsUploadedFile } from './eds-file-upload.model';\nimport { EdsFileUploadPreview } from './eds-file-upload-preview';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\n/**\n * File upload component supporting both traditional file selection and drag-and-drop functionality.\n * Implements ControlValueAccessor for integration with Angular reactive and template-driven forms.\n *\n * Provides file preview, upload progress tracking, file type filtering, and multiple file management.\n *\n * @usageNotes\n * ### Basic file upload\n * ```html\n * <eds-file-upload\n * isMultiple\n * accept=\".pdf,.doc,.docx\"\n * [maxFiles]=\"5\">\n * </eds-file-upload>\n * ```\n *\n * ### With form control\n * ```html\n * <eds-file-upload\n * [formControl]=\"fileControl\"\n * hasDragArea\n * [progress]=\"uploadProgress\">\n * </eds-file-upload>\n * ```\n *\n * ### Accessibility\n * - Native file input is keyboard accessible\n * - Drag-and-drop area has appropriate aria-label\n * - File list items are navigable and removable via keyboard\n */\n@Component({\n selector: 'eds-file-upload',\n templateUrl: './eds-file-upload.html',\n styleUrl: './eds-file-upload.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: EdsFileUpload,\n multi: true,\n },\n ],\n imports: [\n NgTemplateOutlet,\n ...EDS_BUTTON,\n ...EDS_FEEDBACK_MESSAGE,\n ...EDS_PROGRESS_BAR,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-e2e]': 'e2eAttr()',\n },\n})\nexport class EdsFileUpload implements ControlValueAccessor {\n /**\n * Data attribute value for end-to-end testing identification.\n * @default 'eds-file-upload'\n */\n readonly e2eAttr = input('eds-file-upload');\n\n /**\n * Current upload progress percentage (0–100).\n * Only effective when hasProgressBar is true.\n * @default 0\n */\n readonly progress = input(0);\n\n /**\n * Comma-separated list of allowed file extensions or MIME types.\n * Files not matching the specified types will be rejected.\n * Use '*' to allow all file types.\n * @default '*'\n */\n readonly accept = input('*');\n\n /**\n * Maximum number of files that can be uploaded simultaneously.\n * When limit is reached, additional file selection is disabled.\n * @default undefined (unlimited)\n */\n readonly maxFiles = input<number>(undefined);\n\n /**\n * Enables selection of multiple files in a single upload operation.\n * @default true\n */\n readonly isMultiple = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a progress bar indicating upload completion percentage.\n * @default true\n */\n readonly hasProgressBar = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a visual preview for each file in the upload list.\n * @default true\n */\n readonly hasPreview = input(true, { transform: booleanAttribute });\n\n /**\n * Renders file previews as thumbnail images for supported image file types.\n * @default true\n */\n readonly hasPreviewAsImage = input(true, { transform: booleanAttribute });\n\n /**\n * Renders file previews as file format icons instead of image thumbnails.\n * @default false\n */\n readonly hasPreviewAsIcon = input(false, { transform: booleanAttribute });\n\n /**\n * Shows the total combined size of all files in the upload queue.\n * @default true\n */\n readonly hasTotalSizeDisplayed = input(true, { transform: booleanAttribute });\n\n /**\n * Displays a button to clear all files from the upload queue.\n * Only visible when isMultiple is true and files are present.\n * @default true\n */\n readonly hasResetButton = input(true, { transform: booleanAttribute });\n\n /**\n * Enables drag-and-drop functionality for file selection.\n * Displays a drop zone area where users can drag files from their file system.\n * @default false\n */\n readonly hasDragArea = input(false, { transform: booleanAttribute });\n\n /**\n * Makes files in the upload list clickable, emitting itemClick events.\n * @default false\n */\n readonly isItemsClickable = input(false, { transform: booleanAttribute });\n\n /**\n * Label text for the browse button.\n * @default 'Choose file'\n */\n readonly browseLabel = input('Choose file');\n\n /**\n * Label text for the drag area hint.\n * @default 'or drag and drop file here'\n */\n readonly dragLabel = input('or drag and drop file here');\n\n /**\n * Label text for the reset button.\n * @default 'Reset list'\n */\n readonly resetLabel = input('Reset list');\n\n /**\n * Label text shown for total size.\n * @default 'total size'\n */\n readonly totalSizeLabel = input('total size');\n\n /**\n * Error message shown for rejected file extensions.\n * @default 'File extension not allowed'\n */\n readonly rejectedFileLabel = input('File extension not allowed');\n\n /**\n * Emitted when files are dropped into the drag-and-drop area.\n */\n readonly fileDrop = output();\n\n /**\n * Emitted when a file in the upload list is clicked (when isItemsClickable is true).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly itemClick = output<Blob | EdsUploadedFile | any>();\n\n /** Internal state for currently selected files. */\n protected internalFiles = signal<File[]>([]);\n\n /** Internal state for pre-existing uploaded files (from writeValue). */\n protected internalUploadedFiles = signal<EdsUploadedFile[]>([]);\n\n /** Internal progress (synced from input via effect). */\n protected internalProgress = signal(0);\n\n /** Drag state indicator. */\n protected dragEntered = signal(false);\n\n /** Rejected file message. */\n protected rejectedFileMessage = signal<string | null>(null);\n\n /** Random id for unique file input element. */\n protected readonly randomNumberId = Math.floor(Math.random() * 10000);\n\n /** References to all file input elements. */\n protected readonly fileInputs = viewChildren<ElementRef<HTMLInputElement>>('input');\n\n /** Custom templates provided by content projection. */\n protected uploadedFileTemplate: TemplateRef<unknown>;\n protected browseButtonTemplate: TemplateRef<unknown>;\n protected resetButtonTemplate: TemplateRef<unknown>;\n protected progressBarTemplate: TemplateRef<unknown>;\n\n /** Computed total file size. */\n protected filesTotalSize = computed(() => {\n return this.internalFiles().reduce((total, f) => total + f.size, 0);\n });\n\n /** Whether to show the reset button. */\n protected showResetBtn = computed(() => {\n return this.hasResetButton() && this.isMultiple() &&\n (this.internalFiles().length > 0 || this.internalUploadedFiles().length > 0);\n });\n\n /** Whether the drop area is disabled. */\n protected isDropAreaDisabled = computed(() => {\n const totalFiles = this.internalUploadedFiles().length + this.internalFiles().length;\n return (!this.isMultiple() && this.internalFiles().length === 1) || totalFiles === this.maxFiles();\n });\n\n /** Effective preview-as-image flag. */\n protected effectiveHasPreviewAsImage = computed(() => {\n if (this.hasPreviewAsIcon()) return false;\n return this.hasPreviewAsImage();\n });\n\n hostClasses = computed(() => {\n return 'eds-file-upload';\n });\n\n constructor() {\n effect(() => {\n this.internalProgress.set(this.progress());\n });\n }\n\n /**\n * Host listener for file input change events.\n */\n @HostListener('change', ['$any($event.target).files'])\n emitFiles(fileList: FileList): void {\n let i = this.internalUploadedFiles().length + this.internalFiles().length;\n const rejectedFiles: string[] = [];\n const newFiles: File[] = [...this.internalFiles()];\n\n for (const property in fileList) {\n const maxFiles = this.maxFiles();\n if (fileList[property] && typeof fileList[property] === 'object' && (!maxFiles || i < maxFiles)) {\n const fileName = fileList[property].name.split('.');\n const fileExtension = fileName[fileName.length - 1];\n\n if (this.accept().indexOf(fileExtension.toLowerCase()) !== -1 || this.accept() === '*') {\n newFiles.push(fileList[property]);\n } else {\n rejectedFiles.push(fileList[property].name);\n }\n\n i++;\n }\n }\n\n this.internalFiles.set(newFiles);\n this.rejectedFileMessage.set(rejectedFiles.length ? rejectedFiles.join(', ') : null);\n\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n\n const fileInputs = this.fileInputs();\n if (fileInputs?.length) {\n fileInputs.at(0)!.nativeElement.value = '';\n if (fileInputs.length > 1) {\n fileInputs.at(-1)!.nativeElement.value = '';\n }\n }\n\n this.dragEntered.set(false);\n this.fileDrop.emit();\n }\n\n // --- ControlValueAccessor ---\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writeValue(value: any): void {\n this.internalUploadedFiles.set(value || []);\n this.internalFiles.set([]);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n protected onDragEnter(): void {\n if (!this.isDropAreaDisabled()) {\n this.dragEntered.set(true);\n }\n }\n\n protected onDragLeave(): void {\n this.dragEntered.set(false);\n }\n\n protected removeFromList(index: number): void {\n this.internalFiles.update(files => files.filter((_, i) => i !== index));\n if (this.internalFiles().length === 0) {\n this.internalProgress.set(0);\n }\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n }\n\n protected removeFromUploadedList(index: number): void {\n this.internalUploadedFiles.update(files => files.filter((_, i) => i !== index));\n if (this.internalFiles().length === 0) {\n this.internalProgress.set(0);\n }\n this._onChange([...this.internalUploadedFiles(), ...this.internalFiles()]);\n }\n\n protected resetList(): void {\n this.internalFiles.set([]);\n this.internalUploadedFiles.set([]);\n this.internalProgress.set(0);\n this._onChange([]);\n }\n\n protected openBrowseWindow(): void {\n this.fileInputs()?.at(0)?.nativeElement.click();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected onItemClick(e: Blob | EdsUploadedFile | any): void {\n this.itemClick.emit(e);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onChange: (value: any) => void = () => {/* noop */};\n private _onTouched: () => void = () => {/* noop */};\n}\n","@if (hasDragArea()) {\n <div\n class=\"eds-file-upload__drop-area\"\n [class.eds-file-upload__drop-area--active]=\"dragEntered()\"\n [class.eds-file-upload__drop-area--disabled]=\"isDropAreaDisabled()\">\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" class=\"eds-file-upload__browse-btn\">{{ browseLabel() }}</button>\n <span class=\"eds-file-upload__drag-hint\">{{ dragLabel() }}</span>\n <input\n #input\n class=\"eds-file-upload__file-input\"\n [attr.aria-label]=\"browseLabel() + ' ' + dragLabel()\"\n type=\"file\"\n [accept]=\"accept()\"\n [attr.disabled]=\"isDropAreaDisabled() ? 'disabled' : null\"\n [multiple]=\"isMultiple()\"\n (dragenter)=\"onDragEnter()\"\n (dragleave)=\"onDragLeave()\" />\n </div>\n} @else {\n <div class=\"eds-file-upload__simple-input\">\n <label [attr.for]=\"'eds-file-' + randomNumberId\">\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" (click)=\"openBrowseWindow()\">{{ browseLabel() }}</button>\n </label>\n @if (isMultiple()) {\n <input\n #input\n [attr.aria-label]=\"'Choose multiple files'\"\n class=\"eds-file-upload__hidden-input\"\n [id]=\"'eds-file-' + randomNumberId\"\n type=\"file\"\n [accept]=\"accept()\"\n multiple />\n } @else {\n <input\n #input\n [attr.aria-label]=\"'Choose a single file'\"\n class=\"eds-file-upload__hidden-input\"\n [id]=\"'eds-file-' + randomNumberId\"\n type=\"file\"\n [accept]=\"accept()\" />\n }\n </div>\n}\n\n@if (hasProgressBar() && internalProgress() > 0) {\n <eds-progress-bar\n class=\"eds-file-upload__progress\"\n [progress]=\"internalProgress()\"\n [label]=\"internalProgress() + '%'\" />\n}\n\n@if (rejectedFileMessage()) {\n <eds-feedback-message edsCritical class=\"eds-file-upload__error\">\n {{ rejectedFileLabel() }}: {{ rejectedFileMessage() }}\n </eds-feedback-message>\n}\n\n@for (uploadedFile of internalUploadedFiles(); let i = $index; track i) {\n <eds-file-upload-preview\n [isItemsClickable]=\"isItemsClickable()\"\n [index]=\"i\"\n [file]=\"uploadedFile\"\n [hasPreview]=\"hasPreview()\"\n [hasPreviewAsImage]=\"effectiveHasPreviewAsImage()\"\n [hasPreviewAsIcon]=\"hasPreviewAsIcon()\"\n [uploadedFileTemplate]=\"uploadedFileTemplate\"\n (itemClick)=\"onItemClick($event)\"\n (removeFromList)=\"removeFromUploadedList($event)\" />\n}\n\n@for (file of internalFiles(); let i = $index; track i) {\n <eds-file-upload-preview\n isFileObject\n [isItemsClickable]=\"isItemsClickable()\"\n [index]=\"i\"\n [file]=\"file\"\n [hasPreview]=\"hasPreview()\"\n [hasPreviewAsImage]=\"effectiveHasPreviewAsImage()\"\n [hasPreviewAsIcon]=\"hasPreviewAsIcon()\"\n [uploadedFileTemplate]=\"uploadedFileTemplate\"\n (itemClick)=\"onItemClick($event)\"\n (removeFromList)=\"removeFromList($event)\" />\n}\n\n@if (filesTotalSize() && hasTotalSizeDisplayed()) {\n <div class=\"eds-file-upload__total-size\">\n {{ filesTotalSize() | edsFilesize }} {{ totalSizeLabel() }}\n </div>\n}\n\n<div class=\"eds-u-flex eds-u-flex-gap-s\">\n <ng-content />\n \n @if (showResetBtn()) {\n <button edsButton edsButtonSecondary edsSizeS type=\"button\" (click)=\"resetList()\">\n {{ resetLabel() }}\n </button>\n }\n</div>\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpResponse } from '@angular/common/http';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { pipe, Observable, UnaryFunction, MonoTypeOperatorFunction } from 'rxjs';\n\n/**\n * Service providing utility methods for file upload operations.\n * Handles sending form data to a backend, tracking upload progress, and extracting response bodies.\n *\n * @usageNotes\n * ```ts\n * this.fileUploadUtils.sendData(formValue, '/api/upload').pipe(\n * this.fileUploadUtils.uploadProgress((progress) => console.log(progress)),\n * this.fileUploadUtils.toResponseBody(),\n * ).subscribe(response => console.log(response));\n * ```\n */\n@Injectable()\nexport class EdsFileUploadUtils {\n private httpClient = inject(HttpClient);\n\n /**\n * Formats data as FormData and sends it to the specified endpoint.\n *\n * @param data - Data to send (will be serialized to FormData).\n * @param apiEndpoint - The URL endpoint to POST to.\n * @returns Observable of HttpEvents for tracking progress.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public sendData(data: any, apiEndpoint: string): Observable<any> {\n return this.httpClient.post(apiEndpoint, this.toFormData(data), {\n reportProgress: true,\n observe: 'events',\n });\n }\n\n /**\n * RxJS operator that emits upload progress via a callback function.\n *\n * @param cb - Callback receiving progress percentage (0–100).\n * @returns MonoTypeOperatorFunction that passes through events while reporting progress.\n */\n public uploadProgress<T>(cb: (progress: number) => void): MonoTypeOperatorFunction<HttpEvent<T>> {\n return tap((event: HttpEvent<T>) => {\n if (event.type === HttpEventType.UploadProgress) {\n cb(Math.round((100 * event.loaded) / event.total));\n }\n });\n }\n\n /**\n * RxJS operator that extracts the response body from HttpEvents.\n *\n * @returns UnaryFunction that filters to only HttpResponse events and maps to the body.\n */\n public toResponseBody<T>(): UnaryFunction<Observable<HttpEvent<T>>, Observable<T>> {\n return pipe(\n filter((event: HttpEvent<T>) => event.type === HttpEventType.Response),\n map((res: HttpResponse<T>) => res.body),\n );\n }\n\n /**\n * Returns the icon name for a given file extension.\n *\n * @param fileExtension - The file extension (without dot).\n * @returns Icon name string.\n */\n public getIconForExtension(fileExtension: string): string {\n const iconConfig: Record<string, string> = {\n avi: 'file-video',\n html: 'file-code',\n htm: 'file-code',\n js: 'file-code',\n json: 'file-code',\n mp3: 'file-audio',\n mp4: 'file-video',\n pdf: 'file',\n png: 'file-image',\n svg: 'file-image',\n txt: 'file-text',\n xml: 'file-code',\n jpeg: 'file-image',\n jpg: 'file-image',\n zip: 'file',\n doc: 'file-text',\n docx: 'file-text',\n xls: 'file',\n xlsx: 'file',\n ppt: 'file',\n csv: 'file',\n rtf: 'file-text',\n };\n\n const f = fileExtension.toLowerCase();\n return iconConfig[f] ?? 'file';\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toFormData(formValue: any): FormData {\n const formData = new FormData();\n\n for (const key of Object.keys(formValue)) {\n if (Array.isArray(formValue[key])) {\n let fileIndex = 0;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n formValue[key].forEach((value: any) => {\n if (value instanceof File) {\n formData.append(key + fileIndex, value);\n fileIndex++;\n }\n });\n\n const a: unknown[] = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n formValue[key].forEach((value: any): void => {\n a.push(value);\n });\n\n formData.append(key, JSON.stringify(a));\n } else {\n if (typeof formValue[key] === 'string') {\n formData.set(key, formValue[key]);\n } else {\n formData.set(key, JSON.stringify(formValue[key]));\n }\n }\n }\n\n return formData;\n }\n}\n","export type MimeType =\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp'\n | 'image/flif'\n | 'image/x-xcf'\n | 'image/x-canon-cr2'\n | 'image/x-canon-cr3'\n | 'image/tiff'\n | 'image/bmp'\n | 'image/icns'\n | 'image/vnd.ms-photo'\n | 'image/vnd.adobe.photoshop'\n | 'application/x-indesign'\n | 'application/epub+zip'\n | 'application/x-xpinstall'\n | 'application/vnd.oasis.opendocument.text'\n | 'application/vnd.oasis.opendocument.spreadsheet'\n | 'application/vnd.oasis.opendocument.presentation'\n | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n | 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n | 'application/zip'\n | 'application/json'\n | 'application/x-tar'\n | 'application/x-rar-compressed'\n | 'application/gzip'\n | 'application/x-bzip2'\n | 'application/x-7z-compressed'\n | 'application/x-apple-diskimage'\n | 'video/mp4'\n | 'audio/midi'\n | 'video/x-matroska'\n | 'video/webm'\n | 'video/quicktime'\n | 'video/vnd.avi'\n | 'audio/vnd.wave'\n | 'audio/qcelp'\n | 'audio/x-ms-asf'\n | 'video/x-ms-asf'\n | 'application/vnd.ms-asf'\n | 'video/mpeg'\n | 'video/3gpp'\n | 'audio/mpeg'\n | 'audio/mp4'\n | 'audio/opus'\n | 'video/ogg'\n | 'audio/ogg'\n | 'application/ogg'\n | 'audio/x-flac'\n | 'audio/ape'\n | 'audio/wavpack'\n | 'audio/amr'\n | 'application/pdf'\n | 'application/x-elf'\n | 'application/x-msdownload'\n | 'application/x-shockwave-flash'\n | 'application/rtf'\n | 'application/wasm'\n | 'font/woff'\n | 'font/woff2'\n | 'application/vnd.ms-fontobject'\n | 'font/ttf'\n | 'font/otf'\n | 'image/x-icon'\n | 'video/x-flv'\n | 'application/postscript'\n | 'application/eps'\n | 'application/x-xz'\n | 'application/x-sqlite3'\n | 'application/x-nintendo-nes-rom'\n | 'application/x-google-chrome-extension'\n | 'application/vnd.ms-cab-compressed'\n | 'application/x-deb'\n | 'application/x-unix-archive'\n | 'application/x-rpm'\n | 'application/x-compress'\n | 'application/x-lzip'\n | 'application/x-cfb'\n | 'application/x-mie'\n | 'application/x-apache-arrow'\n | 'application/mxf'\n | 'video/mp2t'\n | 'application/x-blender'\n | 'image/bpg'\n | 'image/j2c'\n | 'image/jp2'\n | 'image/jpx'\n | 'image/jpm'\n | 'image/mj2'\n | 'audio/aiff'\n | 'application/xml'\n | 'application/x-mobipocket-ebook'\n | 'image/heif'\n | 'image/heif-sequence'\n | 'image/heic'\n | 'image/heic-sequence'\n | 'image/ktx'\n | 'application/dicom'\n | 'audio/x-musepack'\n | 'text/calendar'\n | 'text/vcard'\n | 'model/gltf-binary'\n | 'application/vnd.tcpdump.pcap'\n | 'audio/x-voc'\n | 'audio/vnd.dolby.dd-raw'\n | 'audio/x-m4a'\n | 'image/apng'\n | 'image/x-olympus-orf'\n | 'image/x-sony-arw'\n | 'image/x-adobe-dng'\n | 'image/x-nikon-nef'\n | 'image/x-panasonic-rw2'\n | 'image/x-fujifilm-raf'\n | 'video/x-m4v'\n | 'video/3gpp2'\n | 'application/x-esri-shape'\n | 'audio/aac'\n | 'audio/x-it'\n | 'audio/x-s3m'\n | 'audio/x-xm'\n | 'video/MP1S'\n | 'video/MP2P'\n | 'application/vnd.sketchup.skp'\n | 'image/avif'\n | 'application/x-lzh-compressed'\n | 'application/pgp-encrypted'\n | 'application/x-asar'\n | 'model/stl'\n | 'application/vnd.ms-htmlhelp'\n | 'model/3mf'\n | 'image/jxl'\n | 'application/zstd'\n | 'image/jls'\n | 'application/vnd.ms-outlook'\n | 'image/vnd.dwg'\n | 'application/x-parquet'\n | 'application/java-vm'\n | 'application/x-arj'\n | 'application/x-cpio'\n | 'application/x-ace-compressed'\n | 'application/avro'\n | 'application/vnd.iccprofile';\n\nexport const getMimeType = (header: Uint8Array): MimeType => {\n const hex = uint8ArrayToHexString(header);\n\n if (hex.startsWith('ffd8ff')) return 'image/jpeg';\n if (hex.startsWith('89504e47')) return 'image/png';\n if (hex.startsWith('464c4946')) return 'image/flif';\n if (hex.startsWith('67696d7020786366')) return 'image/x-xcf';\n if (hex.startsWith('49492a00')) return 'image/tiff';\n if (hex.startsWith('424d')) return 'image/bmp';\n if (hex.startsWith('69636e73')) return 'image/icns';\n if (hex.startsWith('49491a0000004845415050')) return 'image/vnd.ms-photo';\n if (hex.startsWith('38425053')) return 'image/vnd.adobe.photoshop';\n if (hex.startsWith('504b0304')) return identifyZipBasedFormat(header);\n if (hex.startsWith('7573746172')) return 'application/x-tar';\n if (hex.startsWith('526172211a0700')) return 'application/x-rar-compressed';\n if (hex.startsWith('1f8b08')) return 'application/gzip';\n if (hex.startsWith('425a68')) return 'application/x-bzip2';\n if (hex.startsWith('377abcaf271c')) return 'application/x-7z-compressed';\n if (hex.startsWith('00000020667479706d70')) return 'video/mp4';\n if (hex.startsWith('4d546864')) return 'audio/midi';\n if (hex.startsWith('1a45dfa3')) return 'video/webm';\n if (hex.startsWith('255044462d312e')) return 'application/pdf';\n if (hex.startsWith('7f454c46')) return 'application/x-elf';\n if (hex.startsWith('4d5a')) return 'application/x-msdownload';\n if (hex.startsWith('7b5c72746631')) return 'application/rtf';\n if (hex.startsWith('0061736d')) return 'application/wasm';\n if (hex.startsWith('774f4646')) return 'font/woff';\n if (hex.startsWith('774f4632')) return 'font/woff2';\n if (hex.startsWith('464c560105')) return 'video/x-flv';\n if (hex.startsWith('25215053')) return 'application/postscript';\n if (hex.startsWith('fd377a585a00')) return 'application/x-xz';\n if (hex.startsWith('53514c69746520666f726d6174203300')) return 'application/x-sqlite3';\n if (hex.startsWith('d0cf11e0a1b11ae1')) return 'application/x-cfb';\n if (hex.startsWith('4f676753')) return 'audio/ogg';\n if (hex.startsWith('664c6143')) return 'audio/x-flac';\n if (hex.startsWith('494433')) return 'audio/mpeg';\n if (hex.startsWith('3c3f786d6c20')) return 'application/xml';\n\n return null;\n};\n\nconst identifyZipBasedFormat = (data: Uint8Array): MimeType => {\n try {\n const fileEntries = extractZipFileList(data);\n\n if (fileEntries.includes('META-INF/container.xml') || fileEntries.includes('mimetype')) {\n return 'application/epub+zip';\n }\n\n if (fileEntries.includes('[Content_Types].xml')) {\n if (fileEntries.includes('ppt/presentation.xml')) return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\n if (fileEntries.includes('xl/workbook.xml')) return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n if (fileEntries.includes('word/document.xml')) return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n }\n\n return 'application/zip';\n } catch {\n return 'application/zip';\n }\n};\n\nconst extractZipFileList = (data: Uint8Array): string[] => {\n const files: string[] = [];\n let offset = 0;\n\n while (offset < data.length - 4) {\n if (data[offset] === 0x50 && data[offset + 1] === 0x4b &&\n data[offset + 2] === 0x03 && data[offset + 3] === 0x04) {\n\n const filenameLength = data[offset + 26] | (data[offset + 27] << 8);\n const extraFieldLength = data[offset + 28] | (data[offset + 29] << 8);\n\n if (filenameLength > 0 && offset + 30 + filenameLength <= data.length) {\n const filename = new TextDecoder().decode(data.slice(offset + 30, offset + 30 + filenameLength));\n files.push(filename);\n }\n\n offset += 30 + filenameLength + extraFieldLength;\n } else {\n offset++;\n }\n }\n\n return files;\n};\n\nconst uint8ArrayToHexString = (uint8Array: Uint8Array): string => {\n return Array.prototype.map.call(uint8Array, (byte: number) => ('00' + byte.toString(16)).slice(-2)).join('');\n};\n","import { AbstractControl, AsyncValidatorFn, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { Observable, of, zip } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { getMimeType, MimeType } from './eds-file-upload.mime-types';\n\n/**\n * Validator that requires the maximum number of files that can be uploaded.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxFilesValidator(3));\n * console.log(fileUpload.errors); // { maxFiles: 3 }\n * ```\n *\n * @param maxFiles - The maximum number of files allowed.\n * @returns A validator function that returns `{ maxFiles }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxFilesValidator =\n (maxFiles: number): ValidatorFn =>\n (control: AbstractControl): { maxFiles: number } | null =>\n control.value && control.value.length > maxFiles ? { maxFiles } : null;\n\n/**\n * Validator that checks the total combined size (in bytes) of the selected files.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxSize: 300000 }\n * ```\n *\n * @param maxSize - Maximum allowed total size in bytes.\n * @returns A validator function that returns `{ maxSize }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxSizeValidator =\n (maxSize: number): ValidatorFn =>\n (control: AbstractControl): { maxSize: number } | null => {\n let totalSize = 0;\n if (control.value) {\n control.value.forEach((file: File) => {\n totalSize += file.size;\n });\n }\n\n return control.value && totalSize > maxSize ? { maxSize } : null;\n };\n\n/**\n * Validator that checks the maximum size per file (in bytes).\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMaxFileSizeValidator(300000));\n * console.log(fileUpload.errors); // { maxFileSize: 300000, indexes: [0, 2] }\n * ```\n *\n * @param maxFileSize - Maximum allowed size per file in bytes.\n * @returns A validator function that returns `{ maxFileSize, indexes }` if the validation fails, otherwise `null`.\n */\nexport const edsMaxFileSizeValidator =\n (maxFileSize: number): ValidatorFn =>\n (control: AbstractControl): { maxFileSize: number; indexes: number[] } | null => {\n const fileIndexes: number[] = [];\n let maxFileExceeded = false;\n if (control.value) {\n control.value.forEach((file: File, index: number) => {\n if (file.size > maxFileSize) {\n fileIndexes.push(index);\n maxFileExceeded = true;\n }\n });\n }\n\n return control.value && maxFileExceeded ? { maxFileSize, indexes: fileIndexes } : null;\n };\n\n/**\n * Validator that checks file extensions against a list of allowed MIME types.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, edsMimeTypeExtensionValidator(['image/jpeg']));\n * console.log(fileUpload.errors); // { invalidFileExtension: ['file.png'] }\n * ```\n *\n * @param mimeTypes - The list of allowed MIME types.\n * @returns A validator function that returns `{ invalidFileExtension }` if the validation fails, otherwise `null`.\n */\nexport const edsMimeTypeExtensionValidator =\n (mimeTypes: string[]): ValidatorFn =>\n (control: AbstractControl): { invalidFileExtension: string[] } | null => {\n const invalidFileExtension: string[] = [];\n if (control.value) {\n control.value.forEach((file: File) => {\n if (mimeTypes.indexOf(file.type) === -1) {\n invalidFileExtension.push(file.name);\n }\n });\n }\n\n return control.value && invalidFileExtension.length > 0 ? { invalidFileExtension } : null;\n };\n\n/**\n * Async validator that checks MIME types by reading file header bytes.\n *\n * @example\n * ```ts\n * const fileUpload = new FormControl(null, { asyncValidators: [edsAsyncMimeTypeValidator(['image/jpeg'])] });\n * console.log(fileUpload.errors); // { invalidMimeFileType: [{ 'file.png': 'image/png' }] }\n * ```\n *\n * @param mimeTypes - The list of allowed MIME types.\n * @returns An async validator function that returns `{ invalidMimeFileType }` if the validation fails, otherwise `null`.\n */\nexport const edsAsyncMimeTypeValidator =\n (mimeTypes: MimeType[]): AsyncValidatorFn =>\n (control: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {\n if (control.value) {\n const fileErrorObservables: Observable<ValidationErrors | null>[] = [];\n control.value.forEach((file: File) => {\n fileErrorObservables.push(validateFileMimeType(file, mimeTypes));\n });\n return zip(...fileErrorObservables).pipe(\n map((fileErrors) => {\n const errors = fileErrors.filter((fileError) => fileError !== null);\n if (errors.length === 0) {\n return null;\n }\n return { invalidMimeFileType: errors };\n }),\n );\n }\n return of(null);\n };\n\nconst validateFileMimeType = (file: File, mimeTypes: MimeType[]): Observable<Record<string, MimeType> | null> => {\n return new Observable<Record<string, MimeType> | null>((subscriber) => {\n const reader = new FileReader();\n reader.onloadend = (): void => {\n const buffer = reader.result as ArrayBuffer;\n const headerBytes = new Uint8Array(buffer).slice(0, Math.min(1024, buffer.byteLength));\n const mime = getMimeType(headerBytes);\n if (mimeTypes.includes(mime)) {\n subscriber.next(null);\n } else {\n subscriber.next({ [file.name]: mime });\n }\n subscriber.complete();\n };\n reader.readAsArrayBuffer(file);\n });\n};\n","import { EdsFileUpload } from './eds-file-upload';\nimport { EdsFileUploadPreview } from './eds-file-upload-preview';\nimport { EdsFilesizePipe } from './eds-filesize.pipe';\n\nexport {\n EdsFileUpload,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n};\n\nexport * from './eds-file-upload.model';\nexport * from './eds-file-upload.utils';\nexport * from './eds-file-upload.validators';\nexport * from './eds-file-upload.mime-types';\n\n/** Convenience array for importing all eds-file-upload components. */\nexport const EDS_FILE_UPLOAD = [\n EdsFileUpload,\n EdsFileUploadPreview,\n EdsFilesizePipe,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
@@ -162,7 +162,7 @@ class EdsGrowl {
|
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EdsGrowl, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
165
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EdsGrowl, isStandalone: true, selector: "eds-growl", inputs: { e2eAttr: { classPropertyName: "e2eAttr", publicName: "e2eAttr", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, life: { classPropertyName: "life", publicName: "life", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, closeAllSticky: { classPropertyName: "closeAllSticky", publicName: "closeAllSticky", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, callback: { classPropertyName: "callback", publicName: "callback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", growlClick: "growlClick", growlClose: "growlClose" }, host: { attributes: { "aria-atomic": "true" }, listeners: { "click": "onClick()" }, properties: { "class": "hostClasses()", "attr.data-e2e": "e2eAttr()", "attr.role": "hostRole()", "attr.aria-live": "ariaLive()", "attr.aria-labelledby": "value().length ? titleId : null", "attr.aria-describedby": "value().length ? contentId : null" } }, ngImport: i0, template: "@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n", styles: [".eui-21 :host{position:fixed;display:flex;flex-direction:column;width:22rem;z-index:9000;gap:var(--eds-sp-xs);pointer-events:none}.eui-21 :host.eds-growl--bottom-left{bottom:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--bottom-center{bottom:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-left{top:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-center{top:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host .eds-growl__item{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info);display:flex;flex-direction:column;position:relative;padding:var(--eds-sp-m);background-color:var(--_surface);color:var(--_on-surface);border-left:var(--eds-bw-m) solid var(--_border-color);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-3);pointer-events:auto;animation:eds-growl-fade-in .2s ease-out}.eui-21 :host .eds-growl__item--info{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info)}.eui-21 :host .eds-growl__item--success{--_surface: var(--eds-c-surface-success-subtler);--_on-surface: var(--eds-c-on-surface-success-subtler);--_border-color: var(--eds-c-border-success)}.eui-21 :host .eds-growl__item--warning{--_surface: var(--eds-c-surface-warning-subtler);--_on-surface: var(--eds-c-on-surface-warning-subtler);--_border-color: var(--eds-c-border-warning)}.eui-21 :host .eds-growl__item--critical{--_surface: var(--eds-c-surface-critical-subtler);--_on-surface: var(--eds-c-on-surface-critical-subtler);--_border-color: var(--eds-c-border-critical)}.eui-21 :host .eds-growl__item--dismiss-all{--_surface: var(--eds-c-surface-neutral-subtler);--_on-surface: var(--eds-c-foreground-default);--_border-color: var(--eds-c-border-divider)}.eui-21 :host .eds-growl__item--slide-up{animation-name:eds-growl-slide-up}.eui-21 :host .eds-growl__item--slide-down{animation-name:eds-growl-slide-down}.eui-21 :host .eds-growl__header{display:flex;align-items:center;gap:var(--eds-sp-xs);padding-right:var(--eds-sp-xl)}.eui-21 :host .eds-growl__title{font:var(--eds-f-label-m-
|
|
165
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EdsGrowl, isStandalone: true, selector: "eds-growl", inputs: { e2eAttr: { classPropertyName: "e2eAttr", publicName: "e2eAttr", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, life: { classPropertyName: "life", publicName: "life", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, closeAllSticky: { classPropertyName: "closeAllSticky", publicName: "closeAllSticky", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, callback: { classPropertyName: "callback", publicName: "callback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", growlClick: "growlClick", growlClose: "growlClose" }, host: { attributes: { "aria-atomic": "true" }, listeners: { "click": "onClick()" }, properties: { "class": "hostClasses()", "attr.data-e2e": "e2eAttr()", "attr.role": "hostRole()", "attr.aria-live": "ariaLive()", "attr.aria-labelledby": "value().length ? titleId : null", "attr.aria-describedby": "value().length ? contentId : null" } }, ngImport: i0, template: "@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n", styles: [".eui-21 :host{position:fixed;display:flex;flex-direction:column;width:22rem;z-index:9000;gap:var(--eds-sp-xs);pointer-events:none}.eui-21 :host.eds-growl--bottom-left{bottom:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--bottom-center{bottom:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-left{top:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-center{top:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host .eds-growl__item{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info);display:flex;flex-direction:column;position:relative;padding:var(--eds-sp-m);background-color:var(--_surface);color:var(--_on-surface);border-left:var(--eds-bw-m) solid var(--_border-color);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-3);pointer-events:auto;animation:eds-growl-fade-in .2s ease-out}.eui-21 :host .eds-growl__item--info{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info)}.eui-21 :host .eds-growl__item--success{--_surface: var(--eds-c-surface-success-subtler);--_on-surface: var(--eds-c-on-surface-success-subtler);--_border-color: var(--eds-c-border-success)}.eui-21 :host .eds-growl__item--warning{--_surface: var(--eds-c-surface-warning-subtler);--_on-surface: var(--eds-c-on-surface-warning-subtler);--_border-color: var(--eds-c-border-warning)}.eui-21 :host .eds-growl__item--critical{--_surface: var(--eds-c-surface-critical-subtler);--_on-surface: var(--eds-c-on-surface-critical-subtler);--_border-color: var(--eds-c-border-critical)}.eui-21 :host .eds-growl__item--dismiss-all{--_surface: var(--eds-c-surface-neutral-subtler);--_on-surface: var(--eds-c-foreground-default);--_border-color: var(--eds-c-border-divider)}.eui-21 :host .eds-growl__item--slide-up{animation-name:eds-growl-slide-up}.eui-21 :host .eds-growl__item--slide-down{animation-name:eds-growl-slide-down}.eui-21 :host .eds-growl__header{display:flex;align-items:center;gap:var(--eds-sp-xs);padding-right:var(--eds-sp-xl)}.eui-21 :host .eds-growl__title{font:var(--eds-f-label-m-semibold);color:var(--_on-surface)}.eui-21 :host .eds-growl__content{margin-top:var(--eds-sp-2xs);padding-left:calc(var(--eds-sp-xs) + 1.25rem);font:var(--eds-f-paragraph-s);color:var(--_on-surface);max-height:60vh;overflow-y:auto;overflow-wrap:break-word}.eui-21 :host .eds-growl__content a{text-decoration:underline}.eui-21 :host .eds-growl__close{position:absolute;top:var(--eds-sp-xs);right:var(--eds-sp-xs)}@keyframes eds-growl-fade-in{0%{opacity:0}to{opacity:1}}@keyframes eds-growl-slide-up{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes eds-growl-slide-down{0%{opacity:0;transform:translateY(-1rem)}to{opacity:1;transform:translateY(0)}}@media screen and (max-width:767px){.eui-21 :host{width:calc(100vw - 2 * var(--eds-sp-m))}.eui-21 :host.eds-growl--bottom-left,.eui-21 :host.eds-growl--bottom-center,.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-m);left:var(--eds-sp-m);right:var(--eds-sp-m);transform:none}.eui-21 :host.eds-growl--top-left,.eui-21 :host.eds-growl--top-center,.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-m);left:var(--eds-sp-m);right:var(--eds-sp-m);transform:none}}\n"], dependencies: [{ kind: "component", type: i1.EdsIconButton, selector: "button[edsIconButton]", inputs: ["icon", "color", "size", "ariaLabel", "rounded", "disabled"], outputs: ["buttonClick"] }, { kind: "component", type: i2.EdsIconState, selector: "eds-icon-state", inputs: ["color", "size", "ariaLabel"] }, { kind: "component", type: i3.EdsIcon, selector: "eds-icon, span[edsIcon]", inputs: ["icon", "set", "color", "size", "ariaLabel", "ariaHidden", "rounded", "isLoading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
166
166
|
}
|
|
167
167
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EdsGrowl, decorators: [{
|
|
168
168
|
type: Component,
|
|
@@ -179,7 +179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
179
179
|
'[attr.aria-labelledby]': 'value().length ? titleId : null',
|
|
180
180
|
'[attr.aria-describedby]': 'value().length ? contentId : null',
|
|
181
181
|
'(click)': 'onClick()',
|
|
182
|
-
}, template: "@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n", styles: [".eui-21 :host{position:fixed;display:flex;flex-direction:column;width:22rem;z-index:9000;gap:var(--eds-sp-xs);pointer-events:none}.eui-21 :host.eds-growl--bottom-left{bottom:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--bottom-center{bottom:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-left{top:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-center{top:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host .eds-growl__item{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info);display:flex;flex-direction:column;position:relative;padding:var(--eds-sp-m);background-color:var(--_surface);color:var(--_on-surface);border-left:var(--eds-bw-m) solid var(--_border-color);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-3);pointer-events:auto;animation:eds-growl-fade-in .2s ease-out}.eui-21 :host .eds-growl__item--info{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info)}.eui-21 :host .eds-growl__item--success{--_surface: var(--eds-c-surface-success-subtler);--_on-surface: var(--eds-c-on-surface-success-subtler);--_border-color: var(--eds-c-border-success)}.eui-21 :host .eds-growl__item--warning{--_surface: var(--eds-c-surface-warning-subtler);--_on-surface: var(--eds-c-on-surface-warning-subtler);--_border-color: var(--eds-c-border-warning)}.eui-21 :host .eds-growl__item--critical{--_surface: var(--eds-c-surface-critical-subtler);--_on-surface: var(--eds-c-on-surface-critical-subtler);--_border-color: var(--eds-c-border-critical)}.eui-21 :host .eds-growl__item--dismiss-all{--_surface: var(--eds-c-surface-neutral-subtler);--_on-surface: var(--eds-c-foreground-default);--_border-color: var(--eds-c-border-divider)}.eui-21 :host .eds-growl__item--slide-up{animation-name:eds-growl-slide-up}.eui-21 :host .eds-growl__item--slide-down{animation-name:eds-growl-slide-down}.eui-21 :host .eds-growl__header{display:flex;align-items:center;gap:var(--eds-sp-xs);padding-right:var(--eds-sp-xl)}.eui-21 :host .eds-growl__title{font:var(--eds-f-label-m-
|
|
182
|
+
}, template: "@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n", styles: [".eui-21 :host{position:fixed;display:flex;flex-direction:column;width:22rem;z-index:9000;gap:var(--eds-sp-xs);pointer-events:none}.eui-21 :host.eds-growl--bottom-left{bottom:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--bottom-center{bottom:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-left{top:var(--eds-sp-l);left:var(--eds-sp-l)}.eui-21 :host.eds-growl--top-center{top:var(--eds-sp-l);left:50%;transform:translate(-50%)}.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-l);right:var(--eds-sp-l)}.eui-21 :host .eds-growl__item{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info);display:flex;flex-direction:column;position:relative;padding:var(--eds-sp-m);background-color:var(--_surface);color:var(--_on-surface);border-left:var(--eds-bw-m) solid var(--_border-color);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-3);pointer-events:auto;animation:eds-growl-fade-in .2s ease-out}.eui-21 :host .eds-growl__item--info{--_surface: var(--eds-c-surface-info-subtler);--_on-surface: var(--eds-c-on-surface-info-subtler);--_border-color: var(--eds-c-border-info)}.eui-21 :host .eds-growl__item--success{--_surface: var(--eds-c-surface-success-subtler);--_on-surface: var(--eds-c-on-surface-success-subtler);--_border-color: var(--eds-c-border-success)}.eui-21 :host .eds-growl__item--warning{--_surface: var(--eds-c-surface-warning-subtler);--_on-surface: var(--eds-c-on-surface-warning-subtler);--_border-color: var(--eds-c-border-warning)}.eui-21 :host .eds-growl__item--critical{--_surface: var(--eds-c-surface-critical-subtler);--_on-surface: var(--eds-c-on-surface-critical-subtler);--_border-color: var(--eds-c-border-critical)}.eui-21 :host .eds-growl__item--dismiss-all{--_surface: var(--eds-c-surface-neutral-subtler);--_on-surface: var(--eds-c-foreground-default);--_border-color: var(--eds-c-border-divider)}.eui-21 :host .eds-growl__item--slide-up{animation-name:eds-growl-slide-up}.eui-21 :host .eds-growl__item--slide-down{animation-name:eds-growl-slide-down}.eui-21 :host .eds-growl__header{display:flex;align-items:center;gap:var(--eds-sp-xs);padding-right:var(--eds-sp-xl)}.eui-21 :host .eds-growl__title{font:var(--eds-f-label-m-semibold);color:var(--_on-surface)}.eui-21 :host .eds-growl__content{margin-top:var(--eds-sp-2xs);padding-left:calc(var(--eds-sp-xs) + 1.25rem);font:var(--eds-f-paragraph-s);color:var(--_on-surface);max-height:60vh;overflow-y:auto;overflow-wrap:break-word}.eui-21 :host .eds-growl__content a{text-decoration:underline}.eui-21 :host .eds-growl__close{position:absolute;top:var(--eds-sp-xs);right:var(--eds-sp-xs)}@keyframes eds-growl-fade-in{0%{opacity:0}to{opacity:1}}@keyframes eds-growl-slide-up{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes eds-growl-slide-down{0%{opacity:0;transform:translateY(-1rem)}to{opacity:1;transform:translateY(0)}}@media screen and (max-width:767px){.eui-21 :host{width:calc(100vw - 2 * var(--eds-sp-m))}.eui-21 :host.eds-growl--bottom-left,.eui-21 :host.eds-growl--bottom-center,.eui-21 :host.eds-growl--bottom-right{bottom:var(--eds-sp-m);left:var(--eds-sp-m);right:var(--eds-sp-m);transform:none}.eui-21 :host.eds-growl--top-left,.eui-21 :host.eds-growl--top-center,.eui-21 :host.eds-growl--top-right{top:var(--eds-sp-m);left:var(--eds-sp-m);right:var(--eds-sp-m);transform:none}}\n"] }]
|
|
183
183
|
}], ctorParameters: () => [], propDecorators: { e2eAttr: [{ type: i0.Input, args: [{ isSignal: true, alias: "e2eAttr", required: false }] }], ariaLive: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLive", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], life: [{ type: i0.Input, args: [{ isSignal: true, alias: "life", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], closeAllSticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeAllSticky", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], callback: [{ type: i0.Input, args: [{ isSignal: true, alias: "callback", required: false }] }], growlClick: [{ type: i0.Output, args: ["growlClick"] }], growlClose: [{ type: i0.Output, args: ["growlClose"] }] } });
|
|
184
184
|
|
|
185
185
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-eds-eds-growl.mjs","sources":["../../eds-growl/eds-growl.ts","../../eds-growl/eds-growl.html","../../eds-growl/eds-growl.service.ts","../../eds-growl/index.ts","../../eds-growl/eui-eds-eds-growl.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n booleanAttribute,\n} from '@angular/core';\n\nimport { EDS_ICON_BUTTON } from '@eui/eds/eds-icon-button';\nimport { EDS_ICON_STATE } from '@eui/eds/utilities/eds-icon-state';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\nimport { EdsColorToken } from '@eui/eds/shared';\n\nimport { EdsGrowlMessage, EdsGrowlSeverity } from './eds-growl-message.model';\nimport { EdsGrowlPosition } from './eds-growl.service';\n\n/**\n * Notification component that displays temporary or persistent messages to users.\n * Supports multiple message types (success, info, warning, critical) with automatic dismissal or sticky behavior.\n * Messages can be positioned in different screen locations and include customizable lifecycle durations.\n * Implements ARIA live regions for accessibility, announcing messages to screen readers.\n *\n * Can be used standalone with direct `[value]` binding, or together with `EdsGrowlService`\n * for centralized application-wide notifications.\n *\n * @usageNotes\n * ### With EdsGrowlService (recommended)\n * ```typescript\n * private growlService = inject(EdsGrowlService);\n *\n * showSuccess() {\n * this.growlService.growlSuccess('Operation completed');\n * }\n * ```\n * ```html\n * <eds-growl [value]=\"growlService.messages()\"\n * [position]=\"growlService.position()\"\n * [sticky]=\"growlService.isSticky()\"\n * [life]=\"growlService.life()\"\n * [ariaLive]=\"growlService.ariaLive()\"\n * [callback]=\"growlService.callback()\" />\n * ```\n *\n * ### Standalone usage\n * ```html\n * <eds-growl [value]=\"messages\" position=\"top-right\" />\n * ```\n */\n@Component({\n selector: 'eds-growl',\n templateUrl: './eds-growl.html',\n styleUrl: './eds-growl.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ...EDS_ICON_BUTTON,\n ...EDS_ICON_STATE,\n ...EDS_ICON,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-e2e]': 'e2eAttr()',\n '[attr.role]': 'hostRole()',\n '[attr.aria-live]': 'ariaLive()',\n 'aria-atomic': 'true',\n '[attr.aria-labelledby]': 'value().length ? titleId : null',\n '[attr.aria-describedby]': 'value().length ? contentId : null',\n '(click)': 'onClick()',\n },\n})\nexport class EdsGrowl {\n protected titleId = `eds-growl-title-${crypto.randomUUID().slice(0, 8)}`;\n protected contentId = `eds-growl-detail-${crypto.randomUUID().slice(0, 8)}`;\n\n /**\n * Data attribute used for end-to-end testing identification.\n * @default 'eds-growl'\n */\n readonly e2eAttr = input('eds-growl');\n\n /**\n * ARIA live region politeness level controlling how screen readers announce messages.\n * @default 'polite'\n */\n readonly ariaLive = input<'off' | 'polite' | 'assertive'>('polite');\n\n /**\n * Prevents automatic dismissal of messages, requiring manual close.\n * @default false\n */\n readonly sticky = input(false, { transform: booleanAttribute });\n\n /**\n * Duration in milliseconds before non-sticky messages automatically dismiss.\n * @default 3000\n */\n readonly life = input(3000);\n\n /**\n * Array of message objects to display.\n */\n readonly value = model<EdsGrowlMessage[]>([]);\n\n /**\n * Enables display of a dismiss-all button when multiple sticky messages are present.\n * @default false\n */\n readonly closeAllSticky = input(false, { transform: booleanAttribute });\n\n /**\n * Screen position where growl messages appear.\n * @default 'bottom-right'\n */\n readonly position = input<EdsGrowlPosition>('bottom-right');\n\n /**\n * Optional callback function executed when a growl message is clicked.\n */\n readonly callback = input<(() => void) | null>(null);\n\n /**\n * Emitted when a growl message is clicked by the user.\n */\n readonly growlClick = output<void>();\n\n /**\n * Emitted when a growl message is closed.\n */\n readonly growlClose = output<void>();\n\n protected hostClasses = computed(() =>\n ['eds-growl', `eds-growl--${this.position()}`].join(' ').trim(),\n );\n\n /**\n * Resolves the ARIA role based on the current aria-live setting.\n * Uses 'alert' for assertive announcements (critical/urgent), 'status' otherwise.\n * Per WAI-ARIA APG: role=\"alert\" has implicit aria-live=\"assertive\" and is for\n * important, time-sensitive messages. role=\"status\" is for advisory info.\n */\n protected hostRole = computed(() =>\n this.ariaLive() === 'assertive' ? 'alert' : 'status',\n );\n\n private previousMessages: EdsGrowlMessage[] = [];\n\n constructor() {\n effect(() => {\n const current = this.value();\n // Clear timeouts for removed messages\n this.previousMessages\n .filter(msg => !current.includes(msg))\n .forEach(msg => clearTimeout(msg?.timeout));\n // Set timeouts for newly added messages\n current\n .filter(msg => !this.previousMessages.includes(msg))\n .forEach(msg => this.createRemovalTimeout(msg));\n this.previousMessages = current;\n });\n }\n\n /** Removes a single message from the stack. */\n remove(msg: EdsGrowlMessage): void {\n msg.dismissed = true;\n clearTimeout(msg.timeout);\n msg.timeout = undefined;\n this.value.update(msgs => {\n const idx = msgs.indexOf(msg);\n if (idx === -1) return msgs;\n const updated = [...msgs];\n updated.splice(idx, 1);\n return updated;\n });\n this.growlClose.emit();\n }\n\n /** Removes all growl messages. */\n removeAll(): void {\n if (this.value()?.length) {\n this.value.set([]);\n }\n }\n\n /** Handles host click — invokes callback and emits event. */\n onClick(): void {\n const cb = this.callback();\n if (cb) {\n cb();\n }\n this.growlClick.emit();\n }\n\n /** Maps severity to the EDS color variant for the icon-state component. */\n protected severityToColor(severity: EdsGrowlSeverity): EdsColorToken {\n return severity === 'critical' ? 'critical' : severity;\n }\n\n /** Whether more than two sticky messages are present (triggers dismiss-all button). */\n protected isMoreThanTwo(): boolean {\n return this.value().filter(m => m.sticky).length > 2;\n }\n\n private createRemovalTimeout(msg: EdsGrowlMessage): void {\n if (!msg.sticky && !msg.timeout) {\n msg.timeout = setTimeout(\n () => this.remove(msg),\n msg.life || this.life(),\n ) as unknown as number;\n }\n }\n}\n","@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n","import { Injectable, signal } from '@angular/core';\n\nimport { EdsGrowlMessage, EdsGrowlSeverity } from './eds-growl-message.model';\n\n/** Position options for the growl notification container. */\nexport type EdsGrowlPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\n/**\n * Centralized service for managing application-wide `eds-growl` notifications.\n * Provides methods to display success, critical, warning, and info messages with configurable behavior.\n * Uses Angular signals for reactive state management.\n * Injected at root level, ensuring a single instance across the entire application.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EdsGrowlService {\n /** Current list of growl messages. */\n readonly messages = signal<EdsGrowlMessage[]>([]);\n\n /** Whether the current batch of messages should be sticky. */\n readonly isSticky = signal(false);\n\n /** Auto-dismiss duration in milliseconds. */\n readonly life = signal(3000);\n\n /** Screen position of the growl container. */\n readonly position = signal<EdsGrowlPosition>('bottom-right');\n\n /** ARIA live region politeness level. */\n readonly ariaLive = signal<'off' | 'polite' | 'assertive'>('polite');\n\n /** Optional callback executed on message click. */\n readonly callback = signal<(() => void) | null>(null);\n\n /**\n * Displays a growl notification message.\n *\n * @param msg - Message object with severity, summary, and detail\n * @param options - Optional configuration overrides\n */\n growl(\n msg: EdsGrowlMessage,\n options?: {\n isSticky?: boolean;\n isMultiple?: boolean;\n life?: number;\n position?: EdsGrowlPosition;\n callback?: () => void;\n ariaLive?: 'off' | 'polite' | 'assertive';\n },\n ): void {\n const validSeverities: EdsGrowlSeverity[] = ['info', 'warning', 'success', 'critical'];\n if (!validSeverities.includes(msg.severity)) {\n throw new Error(\n `EdsGrowlService.growl() ERROR: message severity must be one of: ${validSeverities.join(', ')}`,\n );\n }\n\n const {\n isSticky,\n isMultiple = false,\n life,\n position,\n callback,\n ariaLive,\n } = options ?? {};\n\n // Apply life override to message\n if (life !== undefined && !isNaN(life)) {\n msg.life = life;\n this.life.set(life);\n } else if (msg.severity === 'critical') {\n // Critical messages default to sticky\n msg.sticky = msg.sticky ?? true;\n } else {\n this.life.set(3000);\n }\n\n // Apply sticky\n if (isSticky !== undefined) {\n msg.sticky = isSticky;\n this.isSticky.set(isSticky);\n } else {\n this.isSticky.set(msg.sticky ?? false);\n }\n\n if (position) {\n this.position.set(position);\n }\n\n if (callback) {\n this.callback.set(callback);\n } else {\n this.callback.set(null);\n }\n\n if (ariaLive) {\n this.ariaLive.set(ariaLive);\n }\n\n const base = isMultiple ? this.messages().filter(m => !m.dismissed) : [];\n this.messages.set([...base, msg]);\n }\n\n /** Removes all currently displayed growl messages. */\n clearGrowl(): void {\n this.messages.set([]);\n }\n\n /** Displays a success growl notification. */\n growlSuccess(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'success', summary: 'Success', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays a critical/error growl notification. */\n growlCritical(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'critical', summary: 'Error', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays a warning growl notification. */\n growlWarning(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'warning', summary: 'Warning', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays an informational growl notification. */\n growlInfo(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'info', summary: 'Info', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n}\n","import { EdsGrowl } from './eds-growl';\n\nexport * from './eds-growl';\nexport * from './eds-growl.service';\nexport * from './eds-growl-message.model';\n\n/** Convenience array for importing all eds-growl components. */\nexport const EDS_GROWL = [EdsGrowl] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-eds-eds-growl.mjs","sources":["../../eds-growl/eds-growl.ts","../../eds-growl/eds-growl.html","../../eds-growl/eds-growl.service.ts","../../eds-growl/index.ts","../../eds-growl/eui-eds-eds-growl.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n booleanAttribute,\n} from '@angular/core';\n\nimport { EDS_ICON_BUTTON } from '@eui/eds/eds-icon-button';\nimport { EDS_ICON_STATE } from '@eui/eds/utilities/eds-icon-state';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\nimport { EdsColorToken } from '@eui/eds/shared';\n\nimport { EdsGrowlMessage, EdsGrowlSeverity } from './eds-growl-message.model';\nimport { EdsGrowlPosition } from './eds-growl.service';\n\n/**\n * Notification component that displays temporary or persistent messages to users.\n * Supports multiple message types (success, info, warning, critical) with automatic dismissal or sticky behavior.\n * Messages can be positioned in different screen locations and include customizable lifecycle durations.\n * Implements ARIA live regions for accessibility, announcing messages to screen readers.\n *\n * Can be used standalone with direct `[value]` binding, or together with `EdsGrowlService`\n * for centralized application-wide notifications.\n *\n * @usageNotes\n * ### With EdsGrowlService (recommended)\n * ```typescript\n * private growlService = inject(EdsGrowlService);\n *\n * showSuccess() {\n * this.growlService.growlSuccess('Operation completed');\n * }\n * ```\n * ```html\n * <eds-growl [value]=\"growlService.messages()\"\n * [position]=\"growlService.position()\"\n * [sticky]=\"growlService.isSticky()\"\n * [life]=\"growlService.life()\"\n * [ariaLive]=\"growlService.ariaLive()\"\n * [callback]=\"growlService.callback()\" />\n * ```\n *\n * ### Standalone usage\n * ```html\n * <eds-growl [value]=\"messages\" position=\"top-right\" />\n * ```\n */\n@Component({\n selector: 'eds-growl',\n templateUrl: './eds-growl.html',\n styleUrl: './eds-growl.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ...EDS_ICON_BUTTON,\n ...EDS_ICON_STATE,\n ...EDS_ICON,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-e2e]': 'e2eAttr()',\n '[attr.role]': 'hostRole()',\n '[attr.aria-live]': 'ariaLive()',\n 'aria-atomic': 'true',\n '[attr.aria-labelledby]': 'value().length ? titleId : null',\n '[attr.aria-describedby]': 'value().length ? contentId : null',\n '(click)': 'onClick()',\n },\n})\nexport class EdsGrowl {\n protected titleId = `eds-growl-title-${crypto.randomUUID().slice(0, 8)}`;\n protected contentId = `eds-growl-detail-${crypto.randomUUID().slice(0, 8)}`;\n\n /**\n * Data attribute used for end-to-end testing identification.\n * @default 'eds-growl'\n */\n readonly e2eAttr = input('eds-growl');\n\n /**\n * ARIA live region politeness level controlling how screen readers announce messages.\n * @default 'polite'\n */\n readonly ariaLive = input<'off' | 'polite' | 'assertive'>('polite');\n\n /**\n * Prevents automatic dismissal of messages, requiring manual close.\n * @default false\n */\n readonly sticky = input(false, { transform: booleanAttribute });\n\n /**\n * Duration in milliseconds before non-sticky messages automatically dismiss.\n * @default 3000\n */\n readonly life = input(3000);\n\n /**\n * Array of message objects to display.\n */\n readonly value = model<EdsGrowlMessage[]>([]);\n\n /**\n * Enables display of a dismiss-all button when multiple sticky messages are present.\n * @default false\n */\n readonly closeAllSticky = input(false, { transform: booleanAttribute });\n\n /**\n * Screen position where growl messages appear.\n * @default 'bottom-right'\n */\n readonly position = input<EdsGrowlPosition>('bottom-right');\n\n /**\n * Optional callback function executed when a growl message is clicked.\n */\n readonly callback = input<(() => void) | null>(null);\n\n /**\n * Emitted when a growl message is clicked by the user.\n */\n readonly growlClick = output<void>();\n\n /**\n * Emitted when a growl message is closed.\n */\n readonly growlClose = output<void>();\n\n protected hostClasses = computed(() =>\n ['eds-growl', `eds-growl--${this.position()}`].join(' ').trim(),\n );\n\n /**\n * Resolves the ARIA role based on the current aria-live setting.\n * Uses 'alert' for assertive announcements (critical/urgent), 'status' otherwise.\n * Per WAI-ARIA APG: role=\"alert\" has implicit aria-live=\"assertive\" and is for\n * important, time-sensitive messages. role=\"status\" is for advisory info.\n */\n protected hostRole = computed(() =>\n this.ariaLive() === 'assertive' ? 'alert' : 'status',\n );\n\n private previousMessages: EdsGrowlMessage[] = [];\n\n constructor() {\n effect(() => {\n const current = this.value();\n // Clear timeouts for removed messages\n this.previousMessages\n .filter(msg => !current.includes(msg))\n .forEach(msg => clearTimeout(msg?.timeout));\n // Set timeouts for newly added messages\n current\n .filter(msg => !this.previousMessages.includes(msg))\n .forEach(msg => this.createRemovalTimeout(msg));\n this.previousMessages = current;\n });\n }\n\n /** Removes a single message from the stack. */\n remove(msg: EdsGrowlMessage): void {\n msg.dismissed = true;\n clearTimeout(msg.timeout);\n msg.timeout = undefined;\n this.value.update(msgs => {\n const idx = msgs.indexOf(msg);\n if (idx === -1) return msgs;\n const updated = [...msgs];\n updated.splice(idx, 1);\n return updated;\n });\n this.growlClose.emit();\n }\n\n /** Removes all growl messages. */\n removeAll(): void {\n if (this.value()?.length) {\n this.value.set([]);\n }\n }\n\n /** Handles host click — invokes callback and emits event. */\n onClick(): void {\n const cb = this.callback();\n if (cb) {\n cb();\n }\n this.growlClick.emit();\n }\n\n /** Maps severity to the EDS color variant for the icon-state component. */\n protected severityToColor(severity: EdsGrowlSeverity): EdsColorToken {\n return severity === 'critical' ? 'critical' : severity;\n }\n\n /** Whether more than two sticky messages are present (triggers dismiss-all button). */\n protected isMoreThanTwo(): boolean {\n return this.value().filter(m => m.sticky).length > 2;\n }\n\n private createRemovalTimeout(msg: EdsGrowlMessage): void {\n if (!msg.sticky && !msg.timeout) {\n msg.timeout = setTimeout(\n () => this.remove(msg),\n msg.life || this.life(),\n ) as unknown as number;\n }\n }\n}\n","@for (msg of value(); track msg) {\n <div class=\"eds-growl__item\"\n [class.eds-growl__item--info]=\"msg.severity === 'info'\"\n [class.eds-growl__item--success]=\"msg.severity === 'success'\"\n [class.eds-growl__item--warning]=\"msg.severity === 'warning'\"\n [class.eds-growl__item--critical]=\"msg.severity === 'critical'\"\n [class.eds-growl__item--slide-up]=\"position() === 'bottom-left' || position() === 'bottom-center' || position() === 'bottom-right'\"\n [class.eds-growl__item--slide-down]=\"position() === 'top-left' || position() === 'top-center' || position() === 'top-right'\">\n\n <div class=\"eds-growl__header\">\n <eds-icon-state [color]=\"$any(severityToColor(msg.severity))\" size=\"s\" [ariaLabel]=\"msg.severity\" />\n <span [id]=\"titleId\" class=\"eds-growl__title\">{{ msg.summary }}</span>\n </div>\n\n @if (msg.detail) {\n <div [id]=\"contentId\" class=\"eds-growl__content\" [innerHTML]=\"msg.detail\"></div>\n }\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss notification\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"remove(msg)\"></button>\n </div>\n}\n\n@if (closeAllSticky() && isMoreThanTwo()) {\n <div class=\"eds-growl__item eds-growl__item--dismiss-all\">\n <div class=\"eds-growl__header\">\n <eds-icon icon=\"checks\" />\n <span class=\"eds-growl__title\">Dismiss all</span>\n </div>\n\n <button edsIconButton\n icon=\"x\"\n color=\"neutral\"\n size=\"xs\"\n rounded\n ariaLabel=\"Dismiss all notifications\"\n class=\"eds-growl__close\"\n type=\"button\"\n (buttonClick)=\"removeAll()\"></button>\n </div>\n}\n","import { Injectable, signal } from '@angular/core';\n\nimport { EdsGrowlMessage, EdsGrowlSeverity } from './eds-growl-message.model';\n\n/** Position options for the growl notification container. */\nexport type EdsGrowlPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\n/**\n * Centralized service for managing application-wide `eds-growl` notifications.\n * Provides methods to display success, critical, warning, and info messages with configurable behavior.\n * Uses Angular signals for reactive state management.\n * Injected at root level, ensuring a single instance across the entire application.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EdsGrowlService {\n /** Current list of growl messages. */\n readonly messages = signal<EdsGrowlMessage[]>([]);\n\n /** Whether the current batch of messages should be sticky. */\n readonly isSticky = signal(false);\n\n /** Auto-dismiss duration in milliseconds. */\n readonly life = signal(3000);\n\n /** Screen position of the growl container. */\n readonly position = signal<EdsGrowlPosition>('bottom-right');\n\n /** ARIA live region politeness level. */\n readonly ariaLive = signal<'off' | 'polite' | 'assertive'>('polite');\n\n /** Optional callback executed on message click. */\n readonly callback = signal<(() => void) | null>(null);\n\n /**\n * Displays a growl notification message.\n *\n * @param msg - Message object with severity, summary, and detail\n * @param options - Optional configuration overrides\n */\n growl(\n msg: EdsGrowlMessage,\n options?: {\n isSticky?: boolean;\n isMultiple?: boolean;\n life?: number;\n position?: EdsGrowlPosition;\n callback?: () => void;\n ariaLive?: 'off' | 'polite' | 'assertive';\n },\n ): void {\n const validSeverities: EdsGrowlSeverity[] = ['info', 'warning', 'success', 'critical'];\n if (!validSeverities.includes(msg.severity)) {\n throw new Error(\n `EdsGrowlService.growl() ERROR: message severity must be one of: ${validSeverities.join(', ')}`,\n );\n }\n\n const {\n isSticky,\n isMultiple = false,\n life,\n position,\n callback,\n ariaLive,\n } = options ?? {};\n\n // Apply life override to message\n if (life !== undefined && !isNaN(life)) {\n msg.life = life;\n this.life.set(life);\n } else if (msg.severity === 'critical') {\n // Critical messages default to sticky\n msg.sticky = msg.sticky ?? true;\n } else {\n this.life.set(3000);\n }\n\n // Apply sticky\n if (isSticky !== undefined) {\n msg.sticky = isSticky;\n this.isSticky.set(isSticky);\n } else {\n this.isSticky.set(msg.sticky ?? false);\n }\n\n if (position) {\n this.position.set(position);\n }\n\n if (callback) {\n this.callback.set(callback);\n } else {\n this.callback.set(null);\n }\n\n if (ariaLive) {\n this.ariaLive.set(ariaLive);\n }\n\n const base = isMultiple ? this.messages().filter(m => !m.dismissed) : [];\n this.messages.set([...base, msg]);\n }\n\n /** Removes all currently displayed growl messages. */\n clearGrowl(): void {\n this.messages.set([]);\n }\n\n /** Displays a success growl notification. */\n growlSuccess(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'success', summary: 'Success', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays a critical/error growl notification. */\n growlCritical(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'critical', summary: 'Error', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays a warning growl notification. */\n growlWarning(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'warning', summary: 'Warning', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n\n /** Displays an informational growl notification. */\n growlInfo(msg: string, position?: EdsGrowlPosition): void {\n this.growl(\n { severity: 'info', summary: 'Info', detail: msg },\n { isSticky: false, isMultiple: false, position },\n );\n }\n}\n","import { EdsGrowl } from './eds-growl';\n\nexport * from './eds-growl';\nexport * from './eds-growl.service';\nexport * from './eds-growl-message.model';\n\n/** Convenience array for importing all eds-growl components. */\nexport const EDS_GROWL = [EdsGrowl] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|