@siemens/element-ng 48.1.0 → 48.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/card/index.d.ts +68 -29
- package/common/index.d.ts +11 -0
- package/dashboard/index.d.ts +1 -0
- package/datepicker/index.d.ts +30 -34
- package/fesm2022/siemens-element-ng-breadcrumb.mjs +2 -2
- package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-card.mjs +103 -37
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-common.mjs +6 -0
- package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-connection-strength.mjs +2 -2
- package/fesm2022/siemens-element-ng-connection-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-content-action-bar.mjs +2 -2
- package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-dashboard.mjs +10 -8
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datatable.mjs +5 -0
- package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-date-range-filter.mjs +1 -1
- package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datepicker.mjs +173 -151
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +2 -2
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filter-bar.mjs +5 -5
- package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +15 -3
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-form.mjs +7 -1
- package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-formly.mjs +2 -2
- package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs +13 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +62 -28
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-language-switcher.mjs +1 -1
- package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-list-details.mjs +2 -2
- package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-pagination.mjs +2 -2
- package/fesm2022/siemens-element-ng-pagination.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-photo-upload.mjs +1 -1
- package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-search-bar.mjs +14 -4
- package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-side-panel.mjs +2 -2
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-bar.mjs +2 -2
- package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs +2 -2
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs.mjs +5 -5
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tooltip.mjs +5 -6
- package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +4 -4
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-typeahead.mjs +329 -257
- package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
- package/filter-bar/index.d.ts +9 -3
- package/header-dropdown/index.d.ts +7 -0
- package/ip-input/index.d.ts +42 -5
- package/package.json +23 -19
- package/schematics/collection.json +34 -0
- package/schematics/migrations/action-modal-migration/action-modal-migration.js +121 -0
- package/schematics/migrations/action-modal-migration/action-modal.mappings.js +98 -0
- package/schematics/migrations/action-modal-migration/index.js +5 -0
- package/schematics/migrations/index.js +13 -0
- package/schematics/migrations/schema.json +16 -0
- package/schematics/migrations/to-legacy-migration/to-legacy-migration.js +55 -0
- package/schematics/migrations/to-legacy-migration/to-legacy-replacement.js +35 -0
- package/schematics/ng-add/index.js +16 -0
- package/schematics/ng-add/schema.json +16 -0
- package/schematics/scss-import-to-siemens-migration/index.js +101 -0
- package/schematics/scss-import-to-siemens-migration/schema.json +16 -0
- package/schematics/scss-import-to-siemens-migration/style-mappings.js +46 -0
- package/schematics/simpl-siemens-migration/index.js +18 -0
- package/schematics/simpl-siemens-migration/schema.json +16 -0
- package/schematics/ts-import-to-siemens-migration/index.js +118 -0
- package/schematics/ts-import-to-siemens-migration/mappings/charts-ng-mappings.js +70 -0
- package/schematics/ts-import-to-siemens-migration/mappings/dashboards-ng-mappings.js +52 -0
- package/schematics/ts-import-to-siemens-migration/mappings/element-ng-mappings.js +651 -0
- package/schematics/ts-import-to-siemens-migration/mappings/element-translate-ng-mappings.js +21 -0
- package/schematics/ts-import-to-siemens-migration/mappings/index.js +9 -0
- package/schematics/ts-import-to-siemens-migration/mappings/maps-ng-mappings.js +46 -0
- package/schematics/ts-import-to-siemens-migration/model.js +4 -0
- package/schematics/ts-import-to-siemens-migration/schema.json +16 -0
- package/schematics/utils/html-utils.js +72 -0
- package/schematics/utils/index.js +10 -0
- package/schematics/utils/project-utils.js +75 -0
- package/schematics/utils/schematics-file-system.js +22 -0
- package/schematics/utils/template-utils.js +114 -0
- package/schematics/utils/testing.js +41 -0
- package/schematics/utils/ts-utils.js +195 -0
- package/search-bar/index.d.ts +11 -1
- package/template-i18n.json +7 -0
- package/tooltip/index.d.ts +1 -1
- package/translate/index.d.ts +7 -0
- package/typeahead/index.d.ts +85 -4
|
@@ -712,7 +712,7 @@ class SiFileUploaderComponent {
|
|
|
712
712
|
return this.files.reduce((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);
|
|
713
713
|
}
|
|
714
714
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
715
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFileUploaderComponent, isStandalone: true, selector: "si-file-uploader", inputs: { uploadTextFileSelect: { classPropertyName: "uploadTextFileSelect", publicName: "uploadTextFileSelect", isSignal: true, isRequired: false, transformFunction: null }, uploadDropText: { classPropertyName: "uploadDropText", publicName: "uploadDropText", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeText: { classPropertyName: "maxFileSizeText", publicName: "maxFileSizeText", isSignal: true, isRequired: false, transformFunction: null }, maxFilesReachedText: { classPropertyName: "maxFilesReachedText", publicName: "maxFilesReachedText", isSignal: true, isRequired: false, transformFunction: null }, acceptText: { classPropertyName: "acceptText", publicName: "acceptText", isSignal: true, isRequired: false, transformFunction: null }, uploadButtonText: { classPropertyName: "uploadButtonText", publicName: "uploadButtonText", isSignal: true, isRequired: false, transformFunction: null }, clearButtonText: { classPropertyName: "clearButtonText", publicName: "clearButtonText", isSignal: true, isRequired: false, transformFunction: null }, uploadingText: { classPropertyName: "uploadingText", publicName: "uploadingText", isSignal: true, isRequired: false, transformFunction: null }, removeButtonText: { classPropertyName: "removeButtonText", publicName: "removeButtonText", isSignal: true, isRequired: false, transformFunction: null }, cancelButtonText: { classPropertyName: "cancelButtonText", publicName: "cancelButtonText", isSignal: true, isRequired: false, transformFunction: null }, successTextTitle: { classPropertyName: "successTextTitle", publicName: "successTextTitle", isSignal: true, isRequired: false, transformFunction: null }, errorUploadFailed: { classPropertyName: "errorUploadFailed", publicName: "errorUploadFailed", isSignal: true, isRequired: false, transformFunction: null }, showHttpError: { classPropertyName: "showHttpError", publicName: "showHttpError", isSignal: true, isRequired: false, transformFunction: null }, errorTextFileType: { classPropertyName: "errorTextFileType", publicName: "errorTextFileType", isSignal: true, isRequired: false, transformFunction: null }, errorTextFileMaxSize: { classPropertyName: "errorTextFileMaxSize", publicName: "errorTextFileMaxSize", isSignal: true, isRequired: false, transformFunction: null }, uploadConfig: { classPropertyName: "uploadConfig", publicName: "uploadConfig", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, maxConcurrentUploads: { classPropertyName: "maxConcurrentUploads", publicName: "maxConcurrentUploads", isSignal: true, isRequired: false, transformFunction: null }, retries: { classPropertyName: "retries", publicName: "retries", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, disableUpload: { classPropertyName: "disableUpload", publicName: "disableUpload", isSignal: true, isRequired: false, transformFunction: null }, directoryUpload: { classPropertyName: "directoryUpload", publicName: "directoryUpload", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { uploadCanceled: "uploadCanceled", uploadCompleted: "uploadCompleted", filesChanges: "filesChanges" }, viewQueries: [{ propertyName: "dropZone", first: true, predicate: ["dropZone"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n }
|
|
715
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFileUploaderComponent, isStandalone: true, selector: "si-file-uploader", inputs: { uploadTextFileSelect: { classPropertyName: "uploadTextFileSelect", publicName: "uploadTextFileSelect", isSignal: true, isRequired: false, transformFunction: null }, uploadDropText: { classPropertyName: "uploadDropText", publicName: "uploadDropText", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeText: { classPropertyName: "maxFileSizeText", publicName: "maxFileSizeText", isSignal: true, isRequired: false, transformFunction: null }, maxFilesReachedText: { classPropertyName: "maxFilesReachedText", publicName: "maxFilesReachedText", isSignal: true, isRequired: false, transformFunction: null }, acceptText: { classPropertyName: "acceptText", publicName: "acceptText", isSignal: true, isRequired: false, transformFunction: null }, uploadButtonText: { classPropertyName: "uploadButtonText", publicName: "uploadButtonText", isSignal: true, isRequired: false, transformFunction: null }, clearButtonText: { classPropertyName: "clearButtonText", publicName: "clearButtonText", isSignal: true, isRequired: false, transformFunction: null }, uploadingText: { classPropertyName: "uploadingText", publicName: "uploadingText", isSignal: true, isRequired: false, transformFunction: null }, removeButtonText: { classPropertyName: "removeButtonText", publicName: "removeButtonText", isSignal: true, isRequired: false, transformFunction: null }, cancelButtonText: { classPropertyName: "cancelButtonText", publicName: "cancelButtonText", isSignal: true, isRequired: false, transformFunction: null }, successTextTitle: { classPropertyName: "successTextTitle", publicName: "successTextTitle", isSignal: true, isRequired: false, transformFunction: null }, errorUploadFailed: { classPropertyName: "errorUploadFailed", publicName: "errorUploadFailed", isSignal: true, isRequired: false, transformFunction: null }, showHttpError: { classPropertyName: "showHttpError", publicName: "showHttpError", isSignal: true, isRequired: false, transformFunction: null }, errorTextFileType: { classPropertyName: "errorTextFileType", publicName: "errorTextFileType", isSignal: true, isRequired: false, transformFunction: null }, errorTextFileMaxSize: { classPropertyName: "errorTextFileMaxSize", publicName: "errorTextFileMaxSize", isSignal: true, isRequired: false, transformFunction: null }, uploadConfig: { classPropertyName: "uploadConfig", publicName: "uploadConfig", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, maxConcurrentUploads: { classPropertyName: "maxConcurrentUploads", publicName: "maxConcurrentUploads", isSignal: true, isRequired: false, transformFunction: null }, retries: { classPropertyName: "retries", publicName: "retries", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, disableUpload: { classPropertyName: "disableUpload", publicName: "disableUpload", isSignal: true, isRequired: false, transformFunction: null }, directoryUpload: { classPropertyName: "directoryUpload", publicName: "directoryUpload", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { uploadCanceled: "uploadCanceled", uploadCompleted: "uploadCompleted", filesChanges: "filesChanges" }, viewQueries: [{ propertyName: "dropZone", first: true, predicate: ["dropZone"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column;justify-content:center;align-items:stretch}:host>*{min-inline-size:320px;max-inline-size:680px;inline-size:100%;align-self:center}.file-list{overflow-y:auto}.file-info{display:flex;justify-content:center;flex-direction:column;block-size:56px}.file{min-block-size:72px;transition:opacity calc(.5s * var(--element-animations-enabled, 1))}.fade-out{opacity:0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiStatusIconComponent, selector: "si-status-icon", inputs: ["status"] }, { kind: "component", type: SiFileDropzoneComponent, selector: "si-file-dropzone", inputs: ["uploadTextFileSelect", "uploadDropText", "maxFileSizeText", "acceptText", "errorTextFileType", "errorTextFileMaxSize", "accept", "maxFileSize", "multiple", "directoryUpload"], outputs: ["filesAdded"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiInlineNotificationComponent, selector: "si-inline-notification", inputs: ["severity", "heading", "message", "action", "translationParams", "embedded"] }, { kind: "component", type: SiProgressbarComponent, selector: "si-progressbar", inputs: ["ariaLabel", "max", "value", "heading", "progress", "height"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
716
716
|
}
|
|
717
717
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFileUploaderComponent, decorators: [{
|
|
718
718
|
type: Component,
|
|
@@ -724,7 +724,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
724
724
|
SiInlineNotificationComponent,
|
|
725
725
|
SiProgressbarComponent,
|
|
726
726
|
SiTranslatePipe
|
|
727
|
-
], template: "<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n }
|
|
727
|
+
], template: "<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n", styles: [":host{display:flex;flex-direction:column;justify-content:center;align-items:stretch}:host>*{min-inline-size:320px;max-inline-size:680px;inline-size:100%;align-self:center}.file-list{overflow-y:auto}.file-info{display:flex;justify-content:center;flex-direction:column;block-size:56px}.file{min-block-size:72px;transition:opacity calc(.5s * var(--element-animations-enabled, 1))}.fade-out{opacity:0}\n"] }]
|
|
728
728
|
}] });
|
|
729
729
|
|
|
730
730
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n output,\n viewChild\n} from '@angular/core';\nimport { addIcons, elementUpload, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when files are added.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileInput = viewChild.required<ElementRef>('fileInput');\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.handleItems(event.dataTransfer!.items);\n } else {\n this.handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileInput().nativeElement.click();\n }\n\n protected inputHandler(event: Event): void {\n this.handleFiles((event.target as HTMLInputElement).files);\n }\n\n protected handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n newFiles.push(this.makeUploadFile(files[i]));\n }\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileInput().nativeElement.value = '';\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace('.', '.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n private fileSizeToString(num: number): string {\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n }\n if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return this.numberFormat.format(num) + suffix;\n }\n\n private handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n newFiles.push(this.makeUploadFile(file));\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n \n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n [attr.webkitdirectory]=\"directoryUpload() ? true : null\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n (change)=\"inputHandler($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate }}: {{ maxFileSizeString() }}.\n }\n @if (accept()) {\n {{ acceptText() | translate }}: {{ accept() }}.\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n addIcons,\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo,\n SiIconComponent,\n SiStatusIconComponent\n} from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n NgClass,\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n protected uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n }\n @if (!file.errorText) {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-file-uploader.mjs","sources":["../../../../projects/element-ng/file-uploader/si-file-uploader.model.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.ts","../../../../projects/element-ng/file-uploader/si-file-dropzone.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.component.ts","../../../../projects/element-ng/file-uploader/si-file-uploader.component.html","../../../../projects/element-ng/file-uploader/si-file-uploader.module.ts","../../../../projects/element-ng/file-uploader/index.ts","../../../../projects/element-ng/file-uploader/siemens-element-ng-file-uploader.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\n\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\n/** */\nexport interface UploadFile {\n status: 'added' | 'invalid' | 'queued' | 'uploading' | 'success' | 'error';\n file: File;\n fileName: string;\n size: string;\n errorText?: TranslatableString;\n progress: number;\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n output,\n viewChild\n} from '@angular/core';\nimport { addIcons, elementUpload, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { UploadFile } from './si-file-uploader.model';\n\n@Component({\n selector: 'si-file-dropzone',\n imports: [SiIconComponent, SiTranslatePipe],\n templateUrl: './si-file-dropzone.component.html',\n styleUrl: './si-file-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiFileDropzoneComponent {\n /**\n * Text or translation key of the input file selector (is combined with the `uploadTextRest`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text or translation key of the drag&drop field (is combined with the `uploadTextFileSelect`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text or translation key for max file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Text or translation key for accepted types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text or translation key of message title if incorrect file type is dragged / dropped.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n */\n readonly maxFileSize = input<number>();\n /**\n * Defines whether the file input allows selecting multiple files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n *\n * @defaultValue false\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Event emitted when files are added.\n */\n readonly filesAdded = output<UploadFile[]>();\n\n /**\n * Enable directory upload.\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n protected readonly maxFileSizeString = computed(() => {\n const maxFileSize = this.maxFileSize();\n return maxFileSize ? this.fileSizeToString(maxFileSize) : '';\n });\n\n protected readonly icons = addIcons({ elementUpload });\n\n protected dragOver = false;\n\n private readonly fileInput = viewChild.required<ElementRef>('fileInput');\n private locale = inject(LOCALE_ID).toString();\n private numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 2 });\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n if (this.directoryUpload()) {\n this.handleItems(event.dataTransfer!.items);\n } else {\n this.handleFiles(event.dataTransfer!.files);\n }\n this.dragOver = false;\n }\n\n protected dragOverHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n protected inputEnterHandler(): void {\n this.fileInput().nativeElement.click();\n }\n\n protected inputHandler(event: Event): void {\n this.handleFiles((event.target as HTMLInputElement).files);\n }\n\n protected handleFiles(files: FileList | null): void {\n if (!files?.length) {\n return;\n }\n\n const newFiles: UploadFile[] = [];\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < files.length; i++) {\n newFiles.push(this.makeUploadFile(files[i]));\n }\n newFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n\n /**\n * Reset all the files inside the native file input (and therefore the dropzone).\n */\n reset(): void {\n this.fileInput().nativeElement.value = '';\n }\n\n private makeUploadFile(file: File): UploadFile {\n const uploadFile: UploadFile = {\n fileName: file.name,\n file,\n size: this.fileSizeToString(file.size),\n progress: 0,\n status: 'added'\n };\n // use MIME type of file if set. Otherwise fall back to file name ending\n const ext = '.' + uploadFile.file.name.split('.').pop();\n if (!this.verifyFileType(uploadFile.file.type, ext)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileType();\n } else if (!this.verifyFileSize(uploadFile.file.size)) {\n uploadFile.status = 'invalid';\n uploadFile.errorText = this.errorTextFileMaxSize();\n }\n return uploadFile;\n }\n\n private verifyFileSize(size: number): boolean {\n const maxFileSize = this.maxFileSize();\n return !maxFileSize || size <= maxFileSize;\n }\n\n private verifyFileType(fileType: string | undefined, ext: string | undefined): boolean {\n const accept = this.accept();\n if (!accept) {\n return true;\n }\n if (fileType === undefined && ext === undefined) {\n return false;\n }\n // Spec says that comma is the delimiter for filetypes. Also allow pipe for compatibility\n return accept.split(/,|\\|/).some(acceptedType => {\n // convert accept glob into regex (example: images/* --> images/.*)\n const acceptedRegexStr = acceptedType.replace('.', '.').replace('*', '.*').trim();\n const acceptedRegex = new RegExp(acceptedRegexStr, 'i');\n\n // if fileType is set and accepted type looks like a MIME type, match that otherwise extension\n if (fileType && acceptedType.includes('/')) {\n return !!fileType.match(acceptedRegex);\n }\n return !!ext?.match(acceptedRegex);\n });\n }\n\n private fileSizeToString(num: number): string {\n let suffix = 'B';\n if (num >= 1_073_741_824) {\n num /= 1_073_741_824;\n suffix = 'GB';\n }\n if (num >= 1_048_576) {\n num /= 1_048_576;\n suffix = 'MB';\n } else if (num >= 1_024) {\n num /= 1_024;\n suffix = 'KB';\n }\n return this.numberFormat.format(num) + suffix;\n }\n\n private handleItems(items: DataTransferItemList): void {\n const newFiles: UploadFile[] = [];\n let pendingEntries = 0;\n\n const traverseFileTree = (item: FileSystemEntry): void => {\n if (item.isFile) {\n (item as FileSystemFileEntry).file(file => {\n newFiles.push(this.makeUploadFile(file));\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n } else if (item.isDirectory) {\n const dirReader = (item as FileSystemDirectoryEntry).createReader();\n dirReader.readEntries(entries => {\n for (const entry of entries) {\n pendingEntries++;\n traverseFileTree(entry);\n }\n if (--pendingEntries === 0) {\n this.filesAdded.emit(newFiles);\n this.reset();\n }\n });\n }\n };\n\n // items is not an array but of type DataTransferItemList\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i++) {\n const item = items[i].webkitGetAsEntry();\n if (item) {\n pendingEntries++;\n traverseFileTree(item);\n }\n }\n }\n}\n","<div\n class=\"drag-and-drop rounded p-6\"\n [class.drag-over]=\"dragOver\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n <si-icon class=\"mb-6 si-display-bold\" [icon]=\"icons.elementUpload\" />\n <span class=\"drag-and-drop-description si-h5 d-flex\">\n <span>{{ uploadDropText() | translate }}</span>\n \n <label class=\"select-file si-h5 mb-0\">\n <span tabindex=\"0\" (keydown.enter)=\"inputEnterHandler()\">{{\n uploadTextFileSelect() | translate\n }}</span>\n <input\n #fileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"d-none\"\n [attr.webkitdirectory]=\"directoryUpload() ? true : null\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n (change)=\"inputHandler($event)\"\n (cancel)=\"$event.stopPropagation()\"\n />\n </label>\n </span>\n @if (maxFileSize() || accept()) {\n <div class=\"allowed si-caption mt-6\">\n @if (maxFileSize()) {\n {{ maxFileSizeText() | translate }}: {{ maxFileSizeString() }}.\n }\n @if (accept()) {\n {{ acceptText() | translate }}: {{ accept() }}.\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpRequest,\n HttpResponse\n} from '@angular/common/http';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n numberAttribute,\n OnChanges,\n output,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n addIcons,\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo,\n SiIconComponent,\n SiStatusIconComponent\n} from '@siemens/element-ng/icon';\nimport { SiInlineNotificationComponent } from '@siemens/element-ng/inline-notification';\nimport { SiProgressbarComponent } from '@siemens/element-ng/progressbar';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\nimport { Observable, Subscription } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { UploadFile } from './si-file-uploader.model';\n\n/**\n * The FileUploadResult is emitted at completion of the file uploading\n * via the `uploadCompleted` emitter. On success the Http `response` from\n * the backend is provided and on failure, the `error` object is available.\n */\nexport interface FileUploadResult {\n file: string;\n response?: HttpResponse<unknown>;\n error?: Error;\n}\n\nexport interface FileUploadConfig {\n headers: HttpHeaders | string | Record<string, string | number | (string | number)[]> | Headers;\n method: 'POST' | 'PUT' | 'PATCH';\n url: string;\n /** Form field name for the uploaded file. */\n fieldName: string;\n /**\n * Additional form fields added in the HTTP request.\n *\n * @example\n * ```json\n * { upload_user: 'Reiner Zufall', expiry_date: ' 21.12.2012' }\n * ```\n */\n additionalFields?: Record<string, string>;\n /** Specify the server response type */\n responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n /** A function to modify the HTTP request sent on the consumer side. */\n handler?: (req: HttpRequest<unknown>) => Observable<HttpEvent<unknown>>;\n /**\n * When `true`, the file will be sent directly w/o the use of `FormData`.\n * You will also need to set the `Content-Type` header when sending binary. See: {@link headers}\n */\n sendBinary?: boolean;\n}\n\ninterface ExtUploadFile extends UploadFile {\n httpErrorText?: string;\n subscription?: Subscription;\n successResponse?: HttpResponse<unknown>;\n fadeOut?: boolean;\n}\n\n@Component({\n selector: 'si-file-uploader',\n imports: [\n NgClass,\n SiStatusIconComponent,\n SiFileDropzoneComponent,\n SiIconComponent,\n SiInlineNotificationComponent,\n SiProgressbarComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-file-uploader.component.html',\n styleUrl: './si-file-uploader.component.scss'\n})\nexport class SiFileUploaderComponent implements OnChanges {\n /**\n * Text of the link to open the file select dialog (follows `uploadDropText`).\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n * ```\n */\n readonly uploadTextFileSelect = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.FILE_SELECT:click to upload`)\n );\n /**\n * Text instructing a user to drop the files inside the dropzone.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`)\n * ```\n */\n readonly uploadDropText = input(t(() => $localize`:@@SI_FILE_UPLOADER.DROP:Drop files here or`));\n /**\n * Text to describe the maximum file size.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n * ```\n */\n readonly maxFileSizeText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_SIZE:Maximum upload size`)\n );\n /**\n * Error message shown when the maximum number of files are reached.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n * ```\n */\n readonly maxFilesReachedText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.MAX_FILE_REACHED:Maximum number of files reached`)\n );\n /**\n * Text for the accepted file types.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n * ```\n */\n readonly acceptText = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ACCEPTED_FILE_TYPES:Accepted file types`)\n );\n /**\n * Text used inside the upload button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`)\n * ```\n */\n readonly uploadButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD:Upload`));\n /**\n * Text used inside the clear button.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`)\n * ```\n */\n readonly clearButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CLEAR:Clear`));\n /**\n * Text shown during the file upload.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`)\n * ```\n */\n readonly uploadingText = input(t(() => $localize`:@@SI_FILE_UPLOADER.UPLOADING:Uploading`));\n /**\n * Text shown to remove a file from the file list. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`)\n * ```\n */\n readonly removeButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.REMOVE:Remove`));\n /**\n * Text of cancel button. Shown during upload. Required for a11y.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`)\n * ```\n */\n readonly cancelButtonText = input(t(() => $localize`:@@SI_FILE_UPLOADER.CANCEL:Cancel`));\n /**\n * Text shown if the upload was successful.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n * ```\n */\n readonly successTextTitle = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_COMPLETED:Upload completed`)\n );\n /**\n * Text shown if the upload failed.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n * ```\n */\n readonly errorUploadFailed = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.UPLOAD_FAILED:Upload failed`)\n );\n /**\n * On failed upload, show the error received from the server.\n *\n * @defaultValue false\n */\n readonly showHttpError = input(false, { transform: booleanAttribute });\n /**\n * Text shown to indicate that an incorrect file type was added to file list.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n * ```\n */\n readonly errorTextFileType = input(\n t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_TYPE:Incorrect file type selected`)\n );\n /**\n * Message or translation key if file exceeds the maximum file size limit.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`)\n * ```\n */\n readonly errorTextFileMaxSize = input(\n t(\n () =>\n $localize`:@@SI_FILE_UPLOADER.ERROR_FILE_SIZE_EXCEEDED:File exceeds allowed maximum size`\n )\n );\n /**\n * Config for HTTP request to upload file.\n *\n * @defaultValue\n * ```\n * {\n * headers: new HttpHeaders({ 'Accept': 'application/json' }),\n * method: 'POST',\n * url: '',\n * fieldName: 'upload_file',\n * responseType: 'json'\n * }\n * ```\n */\n readonly uploadConfig = input<FileUploadConfig>({\n headers: new HttpHeaders({ 'Accept': 'application/json' }),\n method: 'POST',\n url: '',\n fieldName: 'upload_file',\n responseType: 'json'\n });\n /**\n * Define which file types are suggested in file browser.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept\n */\n readonly accept = input<string>();\n /**\n * Define maximal allowed file size in bytes.\n *\n * @defaultValue undefined\n */\n readonly maxFileSize = input<number | undefined, unknown>(undefined, {\n transform: numberAttribute\n });\n /**\n * Define maximal allowed number of files.\n * When {@link directoryUpload} is enabled, this will have no effect.\n * @defaultValue 10\n */\n readonly maxFiles = input(10, { transform: numberAttribute });\n /**\n * Maximum number of concurrent uploads.\n *\n * @defaultValue 3\n */\n readonly maxConcurrentUploads = input(3, { transform: numberAttribute });\n /**\n * Numbers of retries for failed uploads.\n *\n * @defaultValue 0\n */\n readonly retries = input(0, { transform: numberAttribute });\n /**\n * Auto-upload mode - automatically start upload once files are added.\n *\n * @defaultValue false\n */\n readonly autoUpload = input(false, { transform: booleanAttribute });\n /**\n * Disable the upload button.\n *\n * @defaultValue false\n */\n readonly disableUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Enable directory upload mode.\n * When enabled, the file input will accept directories and upload all files within as a flat list.\n * The hierarchy of the directory will not be preserved.\n * The `maxFiles` property will have no effect when `directoryUpload` is enabled.\n *\n * **Note:** This feature is not yet available for safari (iOS)\n *\n * @defaultValue false\n */\n readonly directoryUpload = input(false, { transform: booleanAttribute });\n\n /**\n * Emits when a user press cancel during upload. The event provides the file details.\n */\n readonly uploadCanceled = output<UploadFile>();\n\n /**\n * Output callback event will provide you if upload is finished. If an error\n * occurred it will be emitted.\n */\n readonly uploadCompleted = output<FileUploadResult>();\n\n /**\n * Output which fires whenever new files are added to or removed from the uploader.\n */\n readonly filesChanges = output<UploadFile[]>();\n\n protected readonly icons = addIcons({\n elementCancel,\n elementDelete,\n elementDocument,\n elementRedo\n });\n protected files: ExtUploadFile[] = [];\n protected pending = 0;\n protected uploading = 0;\n protected uploadEnabled = false;\n protected maxFilesReached = false;\n\n private readonly dropZone = viewChild.required<SiFileDropzoneComponent>('dropZone');\n private cdRef = inject(ChangeDetectorRef);\n private http? = inject(HttpClient, { optional: true });\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.maxFiles || changes.disableUpload) {\n this.updateStates();\n }\n }\n\n protected handleFiles(files: UploadFile[]): void {\n if (!files?.length) {\n return;\n }\n\n const maxFiles = this.maxFiles();\n // for single-file case, replace exiting file if any\n if (maxFiles === 1 && this.files.length) {\n this.reset(false);\n }\n\n let numValid = this.countValid();\n for (const file of files) {\n const duplicate = this.isDuplicate(file);\n if (duplicate) {\n // in case this is duplicated: reset if already uploaded or not handled yet\n if (duplicate.status !== 'uploading' && duplicate.status !== 'queued') {\n Object.assign(duplicate, file);\n }\n continue;\n }\n\n const canAdd = numValid + 1 <= maxFiles;\n const valid = file.status === 'added';\n if (valid && !canAdd) {\n this.maxFilesReached = true;\n break;\n } else if (valid) {\n numValid++;\n }\n this.files.push(file);\n }\n\n this.files.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n this.filesChanges.emit(this.files.slice());\n\n this.updateStates();\n\n // needed for drag drop of directory\n this.cdRef.markForCheck();\n\n if (this.autoUpload()) {\n // allow concurrent uploads for auto upload mode.\n this.uploadEnabled = true;\n this.fileUpload(false);\n }\n }\n\n protected removeFile(index: number): void {\n if (index >= 0) {\n this.files.splice(index, 1);\n this.filesChanges.emit(this.files.slice());\n this.dropZone().reset();\n this.updateStates();\n }\n }\n\n protected cancelUpload(file: ExtUploadFile): void {\n if (file.subscription) {\n file.subscription.unsubscribe();\n file.subscription = undefined;\n this.uploading--;\n }\n this.pending--;\n file.status = 'added';\n file.progress = 0;\n this.updateStates();\n\n const { status, fileName, size, progress } = file;\n this.uploadCanceled.emit({\n status,\n fileName,\n size,\n progress,\n file: file.file\n });\n }\n\n protected retryUpload(file: UploadFile): void {\n file.status = 'added';\n this.doUpload([file], true);\n }\n\n /**\n * Reset the state.\n */\n reset(emit = true): void {\n this.files.forEach(f => f.subscription?.unsubscribe());\n this.files = [];\n this.dropZone().reset();\n this.updateStates();\n if (emit) {\n this.filesChanges.emit([]);\n }\n }\n\n /**\n * Uploads the file\n */\n fileUpload(doRetry = true): void {\n if (!this.uploadEnabled) {\n return;\n }\n this.uploadEnabled = false;\n this.doUpload(this.files, doRetry);\n }\n\n private doUpload(files: UploadFile[], doRetry: boolean): void {\n for (const file of files) {\n if (file.status !== 'added' && (!doRetry || file.status !== 'error')) {\n continue;\n }\n this.pending++;\n file.status = 'queued';\n }\n this.processQueue();\n }\n\n private processQueue(): void {\n for (let i = 0; i < this.files.length && this.uploading < this.maxConcurrentUploads(); i++) {\n const file = this.files[i];\n if (file.status === 'queued') {\n this.uploading++;\n this.uploadOneFile(file);\n }\n }\n }\n\n private uploadOneFile(file: ExtUploadFile): void {\n let formData: FormData | undefined;\n const config = this.uploadConfig();\n if (!config.sendBinary) {\n formData = new FormData();\n\n if (config.additionalFields) {\n Object.keys(config.additionalFields).forEach(key => {\n formData!.append(key, config.additionalFields![key]);\n });\n }\n // this needs to be last for AWS\n formData.append(config.fieldName, file.file, file.fileName);\n }\n const headers =\n config.headers instanceof HttpHeaders ? config.headers : new HttpHeaders(config.headers);\n\n const req = new HttpRequest(config.method, config.url, formData ?? file.file, {\n headers,\n responseType: config.responseType,\n reportProgress: true\n });\n\n file.status = 'uploading';\n file.errorText = undefined;\n file.httpErrorText = undefined;\n\n const requestHandler =\n config.handler ??\n (this.http ? (r: HttpRequest<unknown>) => this.http!.request(r) : undefined);\n if (!requestHandler) {\n return;\n }\n\n file.subscription = requestHandler(req)\n .pipe(retry(this.retries()))\n .subscribe({\n next: event => this.handleUploadEvent(file, event),\n error: (error: HttpErrorResponse) => this.handleUploadError(file, error),\n complete: () => this.handleUploadComplete(file)\n });\n }\n\n // this is a light check for duplicate file - name and size only, not content!\n private isDuplicate(file: UploadFile): UploadFile | null {\n for (const uploadFile of this.files) {\n if (uploadFile.file.name === file.file.name && uploadFile.file.size === file.file.size) {\n return uploadFile;\n }\n }\n return null;\n }\n\n private handleUploadEvent(file: ExtUploadFile, httpEvent: HttpEvent<unknown>): void {\n if (httpEvent instanceof HttpResponse) {\n file.successResponse = httpEvent as HttpResponse<unknown>;\n } else if (httpEvent.type === HttpEventType.UploadProgress && httpEvent.total) {\n file.progress = Math.floor((100 * httpEvent.loaded) / httpEvent.total);\n this.cdRef.markForCheck();\n }\n }\n\n private handleUploadError(file: ExtUploadFile, error: HttpErrorResponse): void {\n this.uploadCompleted.emit({ file: file.fileName, error });\n file.status = 'error';\n file.errorText = this.errorUploadFailed();\n if (this.showHttpError() && error.status && error.statusText) {\n file.httpErrorText = `${error.status}: ${error.statusText}`;\n }\n this.oneUploadDone(file);\n }\n\n private handleUploadComplete(file: ExtUploadFile): void {\n this.uploadCompleted.emit({ file: file.fileName, response: file.successResponse });\n file.status = 'success';\n file.progress = 100;\n file.successResponse = undefined;\n if (this.autoUpload()) {\n this.fadeOut(file);\n }\n this.oneUploadDone(file);\n }\n\n private oneUploadDone(file: ExtUploadFile): void {\n file.subscription = undefined;\n this.pending--;\n this.uploading--;\n this.updateStates();\n this.processQueue();\n }\n\n private fadeOut(file: ExtUploadFile): void {\n setTimeout(() => {\n file.fadeOut = true;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.removeFile(this.files.indexOf(file));\n this.cdRef.markForCheck();\n }, 500);\n this.cdRef.markForCheck();\n }, 3500);\n }\n\n private updateStates(): void {\n this.uploadEnabled =\n !this.disableUpload() &&\n !this.pending &&\n this.files.some(f => f.status === 'added' || f.status === 'error');\n if (this.maxFilesReached && this.countValid() < this.maxFiles()) {\n this.maxFilesReached = false;\n }\n }\n\n private countValid(): number {\n return this.files.reduce<number>((acc, f) => acc + (f.status !== 'invalid' ? 1 : 0), 0);\n }\n}\n","<si-file-dropzone\n #dropZone\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [uploadTextFileSelect]=\"uploadTextFileSelect()\"\n [uploadDropText]=\"uploadDropText()\"\n [multiple]=\"maxFiles() > 1\"\n [directoryUpload]=\"directoryUpload()\"\n [maxFileSizeText]=\"maxFileSizeText()\"\n [acceptText]=\"acceptText()\"\n [errorTextFileType]=\"errorTextFileType()\"\n [errorTextFileMaxSize]=\"errorTextFileMaxSize()\"\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n (filesAdded)=\"handleFiles($event)\"\n/>\n\n@if (maxFilesReached) {\n <si-inline-notification class=\"mb-4\" severity=\"info\" [message]=\"maxFilesReachedText()\" />\n}\n\n<div class=\"file-list\">\n @for (file of files; track file) {\n <div\n class=\"file d-flex\"\n [ngClass]=\"autoUpload() ? 'mb-8' : 'mb-4'\"\n [class.fade-out]=\"file.fadeOut\"\n >\n <si-icon class=\"icon align-self-center ms-6 me-4\" [icon]=\"icons.elementDocument\" />\n <div class=\"flex-fill overflow-hidden\">\n <div class=\"file-info\">\n <div class=\"file-name text-truncate si-h5\">{{ file.fileName }}</div>\n <div class=\"file-size text-secondary\">{{ file.size }}</div>\n </div>\n @if (file.errorText) {\n <div\n class=\"error text-truncate d-flex align-items-center\"\n [class.text-warning]=\"file.status === 'invalid'\"\n [class.text-danger]=\"file.status === 'error'\"\n >\n <si-status-icon\n class=\"icon-small my-n2 me-2\"\n [status]=\"file.status === 'invalid' ? 'warning' : 'danger'\"\n />\n {{ file.errorText | translate }}\n @if (file.httpErrorText) {\n : {{ file.httpErrorText }}\n }\n </div>\n } @else {\n <div class=\"position-relative\">\n <div class=\"position-absolute si-caption end-0 mt-n8\">{{ file.progress }} %</div>\n <si-progressbar\n height=\"small\"\n [value]=\"file.progress\"\n [ariaLabel]=\"uploadingText() | translate\"\n />\n </div>\n }\n </div>\n <div class=\"status align-self-center text-nowrap ps-4 pe-6\">\n @if (file.status === 'error') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary me-4\"\n [disabled]=\"!uploadEnabled\"\n [title]=\"uploadButtonText() | translate\"\n [attr.aria-label]=\"uploadButtonText() | translate\"\n (click)=\"retryUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementRedo\" />\n </button>\n }\n @if (file.status === 'added' || file.status === 'error' || file.status === 'invalid') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost\"\n [title]=\"removeButtonText() | translate\"\n [attr.aria-label]=\"removeButtonText() | translate\"\n (click)=\"removeFile($index)\"\n >\n <si-icon [icon]=\"icons.elementDelete\" />\n </button>\n }\n @if (file.status === 'uploading' || file.status === 'queued') {\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-tertiary\"\n [title]=\"cancelButtonText() | translate\"\n [attr.aria-label]=\"cancelButtonText() | translate\"\n (click)=\"cancelUpload(file)\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n }\n @if (file.status === 'success') {\n <si-status-icon class=\"icon mx-2\" status=\"success\" />\n }\n </div>\n </div>\n }\n</div>\n\n@if (!autoUpload()) {\n <div class=\"buttons text-end\">\n <button\n type=\"button\"\n class=\"btn btn-secondary me-4\"\n [disabled]=\"pending || !files.length\"\n (click)=\"reset()\"\n >{{ clearButtonText() | translate }}</button\n >\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!uploadEnabled\"\n (click)=\"fileUpload()\"\n >{{ uploadButtonText() | translate }}</button\n >\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFileDropzoneComponent } from './si-file-dropzone.component';\nimport { SiFileUploaderComponent } from './si-file-uploader.component';\n\n@NgModule({\n imports: [SiFileDropzoneComponent, SiFileUploaderComponent],\n exports: [SiFileDropzoneComponent, SiFileUploaderComponent]\n})\nexport class SiFileUploaderModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-file-uploader.model';\nexport * from './si-file-dropzone.component';\nexport * from './si-file-uploader.component';\nexport * from './si-file-uploader.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { input, booleanAttribute, output, Component, model, viewChild, NgModule } from '@angular/core';
|
|
3
3
|
import { SiAutoCollapsableListDirective, SiAutoCollapsableListItemDirective, SiAutoCollapsableListOverflowItemDirective, SiAutoCollapsableListAdditionalContentDirective } from '@siemens/element-ng/auto-collapsable-list';
|
|
4
4
|
import { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';
|
|
5
|
-
import {
|
|
5
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Copyright (c) Siemens 2016 - 2025
|
|
@@ -26,11 +26,11 @@ class SiFilterPillComponent {
|
|
|
26
26
|
this.deleteFilters.emit(this.filter());
|
|
27
27
|
}
|
|
28
28
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilterPillComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
29
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilterPillComponent, isStandalone: true, selector: "si-filter-pill", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, totalPills: { classPropertyName: "totalPills", publicName: "totalPills", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { deleteFilters: "deleteFilters" }, ngImport: i0, template: "<div\n class=\"pill responsive\"\n [class.pe-0]=\"!disabled()\"\n [class.disabled]=\"disabled()\"\n [
|
|
29
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilterPillComponent, isStandalone: true, selector: "si-filter-pill", inputs: { filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, totalPills: { classPropertyName: "totalPills", publicName: "totalPills", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { deleteFilters: "deleteFilters" }, ngImport: i0, template: "<div\n class=\"pill responsive\"\n [class.pe-0]=\"!disabled()\"\n [class.disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <div class=\"wrapper\">\n @if (filter().title) {\n <div class=\"name\">{{ filter().title | translate }}</div>\n }\n @if (filter().title && filter().description) {\n <span class=\"name pe-4\">:</span>\n }\n <div class=\"value\">{{ filter().description | translate }}</div>\n </div>\n @if (!disabled()) {\n <ng-container *ngTemplateOutlet=\"remove\" />\n }\n</div>\n<ng-template #remove>\n <button\n type=\"button\"\n class=\"btn-remove element-cancel btn btn-circle btn-ghost focus-inside ms-0 btn-xs\"\n role=\"button\"\n aria-label=\"Remove\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"deleteClicked()\"\n (click)=\"deleteClicked()\"\n >\n </button>\n</ng-template>\n", styles: [":host{--filter-pill-background-color: var(--element-base-1)}:host.dark-background{--filter-pill-background-color: var(--element-base-0)}.pill{margin-inline-start:8px;background:var(--filter-pill-background-color)}.wrapper{display:flex;flex-direction:column}.pill.responsive .wrapper{flex-direction:row}.pill.responsive .name{font-weight:600;white-space:nowrap}.pill.responsive .value{color:var(--element-text-primary);white-space:nowrap;margin-inline-end:4px}.pill.responsive.disabled,.pill.responsive.disabled .value{padding-inline-end:2px;color:var(--element-text-disabled)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
30
30
|
}
|
|
31
31
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilterPillComponent, decorators: [{
|
|
32
32
|
type: Component,
|
|
33
|
-
args: [{ selector: 'si-filter-pill', imports: [
|
|
33
|
+
args: [{ selector: 'si-filter-pill', imports: [NgTemplateOutlet, SiTranslatePipe], template: "<div\n class=\"pill responsive\"\n [class.pe-0]=\"!disabled()\"\n [class.disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <div class=\"wrapper\">\n @if (filter().title) {\n <div class=\"name\">{{ filter().title | translate }}</div>\n }\n @if (filter().title && filter().description) {\n <span class=\"name pe-4\">:</span>\n }\n <div class=\"value\">{{ filter().description | translate }}</div>\n </div>\n @if (!disabled()) {\n <ng-container *ngTemplateOutlet=\"remove\" />\n }\n</div>\n<ng-template #remove>\n <button\n type=\"button\"\n class=\"btn-remove element-cancel btn btn-circle btn-ghost focus-inside ms-0 btn-xs\"\n role=\"button\"\n aria-label=\"Remove\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"deleteClicked()\"\n (click)=\"deleteClicked()\"\n >\n </button>\n</ng-template>\n", styles: [":host{--filter-pill-background-color: var(--element-base-1)}:host.dark-background{--filter-pill-background-color: var(--element-base-0)}.pill{margin-inline-start:8px;background:var(--filter-pill-background-color)}.wrapper{display:flex;flex-direction:column}.pill.responsive .wrapper{flex-direction:row}.pill.responsive .name{font-weight:600;white-space:nowrap}.pill.responsive .value{color:var(--element-text-primary);white-space:nowrap;margin-inline-end:4px}.pill.responsive.disabled,.pill.responsive.disabled .value{padding-inline-end:2px;color:var(--element-text-disabled)}\n"] }]
|
|
34
34
|
}] });
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -106,7 +106,7 @@ class SiFilterBarComponent {
|
|
|
106
106
|
.findIndex(item => !item.isVisible())));
|
|
107
107
|
}
|
|
108
108
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilterBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
109
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilterBarComponent, isStandalone: true, selector: "si-filter-bar", inputs: { filterDefaultText: { classPropertyName: "filterDefaultText", publicName: "filterDefaultText", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, resetText: { classPropertyName: "resetText", publicName: "resetText", isSignal: true, isRequired: false, transformFunction: null }, allowReset: { classPropertyName: "allowReset", publicName: "allowReset", isSignal: true, isRequired: false, transformFunction: null }, colorVariant: { classPropertyName: "colorVariant", publicName: "colorVariant", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, collapsedFiltersDescription: { classPropertyName: "collapsedFiltersDescription", publicName: "collapsedFiltersDescription", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filters: "filtersChange", resetFilters: "resetFilters" }, host: { properties: { "class.reset": "allowReset()" } }, viewQueries: [{ propertyName: "collapsableListDirective", first: true, predicate: SiAutoCollapsableListDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n
|
|
109
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: SiFilterBarComponent, isStandalone: true, selector: "si-filter-bar", inputs: { filterDefaultText: { classPropertyName: "filterDefaultText", publicName: "filterDefaultText", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, resetText: { classPropertyName: "resetText", publicName: "resetText", isSignal: true, isRequired: false, transformFunction: null }, allowReset: { classPropertyName: "allowReset", publicName: "allowReset", isSignal: true, isRequired: false, transformFunction: null }, colorVariant: { classPropertyName: "colorVariant", publicName: "colorVariant", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, collapsedFiltersDescription: { classPropertyName: "collapsedFiltersDescription", publicName: "collapsedFiltersDescription", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filters: "filtersChange", resetFilters: "resetFilters" }, host: { properties: { "class.reset": "allowReset()" } }, viewQueries: [{ propertyName: "collapsableListDirective", first: true, predicate: SiAutoCollapsableListDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n filterName: ''\n }\"\n (deleteFilters)=\"deleteOverflowFilter()\"\n />\n @if (allowReset() && this.filters().length) {\n <button\n siAutoCollapsableListAdditionalContent\n type=\"button\"\n class=\"text-nowrap btn btn-tertiary\"\n [disabled]=\"disabled()\"\n (click)=\"onResetFilters()\"\n >\n {{ resetText() | translate }}\n </button>\n }\n</div>\n", styles: [":host.reset .responsive .list-text{line-height:calc(1rem + 16px)}.list-text{line-height:24px}.pill-wrapper{display:inline-block;vertical-align:middle}.responsive{overflow:hidden;display:flex;align-items:center;gap:8px}.responsive .list-text{color:var(--element-text-disabled)}.responsive .invisible{position:absolute}.responsive si-filter-pill::ng-deep .pill{margin-inline-start:0}\n"], dependencies: [{ kind: "directive", type: SiAutoCollapsableListDirective, selector: "[siAutoCollapsableList]", inputs: ["siAutoCollapsableList", "gap", "siAutoCollapsableListContainerElement"], exportAs: ["siAutoCollapsableList"] }, { kind: "directive", type: SiAutoCollapsableListItemDirective, selector: "[siAutoCollapsableListItem]", inputs: ["forceHide"], exportAs: ["siAutoCollapsableListItem"] }, { kind: "directive", type: SiAutoCollapsableListOverflowItemDirective, selector: "[siAutoCollapsableListOverflowItem]", exportAs: ["siAutoCollapsableListOverflowItem"] }, { kind: "directive", type: SiAutoCollapsableListAdditionalContentDirective, selector: "[siAutoCollapsableListAdditionalContent]" }, { kind: "component", type: SiFilterPillComponent, selector: "si-filter-pill", inputs: ["filter", "disabled", "totalPills"], outputs: ["deleteFilters"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
110
110
|
}
|
|
111
111
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiFilterBarComponent, decorators: [{
|
|
112
112
|
type: Component,
|
|
@@ -119,7 +119,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
119
119
|
SiTranslatePipe
|
|
120
120
|
], host: {
|
|
121
121
|
'[class.reset]': 'allowReset()'
|
|
122
|
-
}, template: "<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n
|
|
122
|
+
}, template: "<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n filterName: ''\n }\"\n (deleteFilters)=\"deleteOverflowFilter()\"\n />\n @if (allowReset() && this.filters().length) {\n <button\n siAutoCollapsableListAdditionalContent\n type=\"button\"\n class=\"text-nowrap btn btn-tertiary\"\n [disabled]=\"disabled()\"\n (click)=\"onResetFilters()\"\n >\n {{ resetText() | translate }}\n </button>\n }\n</div>\n", styles: [":host.reset .responsive .list-text{line-height:calc(1rem + 16px)}.list-text{line-height:24px}.pill-wrapper{display:inline-block;vertical-align:middle}.responsive{overflow:hidden;display:flex;align-items:center;gap:8px}.responsive .list-text{color:var(--element-text-disabled)}.responsive .invisible{position:absolute}.responsive si-filter-pill::ng-deep .pill{margin-inline-start:0}\n"] }]
|
|
123
123
|
}] });
|
|
124
124
|
|
|
125
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-filter-bar.mjs","sources":["../../../../projects/element-ng/filter-bar/si-filter-pill.component.ts","../../../../projects/element-ng/filter-bar/si-filter-pill.component.html","../../../../projects/element-ng/filter-bar/si-filter-bar.component.ts","../../../../projects/element-ng/filter-bar/si-filter-bar.component.html","../../../../projects/element-ng/filter-bar/si-filter-bar.module.ts","../../../../projects/element-ng/filter-bar/index.ts","../../../../projects/element-ng/filter-bar/siemens-element-ng-filter-bar.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, input, output } from '@angular/core';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\n\nimport { Filter } from './filter';\n\n@Component({\n selector: 'si-filter-pill',\n imports: [NgClass, NgTemplateOutlet, SiTranslatePipe],\n templateUrl: './si-filter-pill.component.html',\n styleUrl: './si-filter-pill.component.scss'\n})\nexport class SiFilterPillComponent {\n /**\n * Settings of the filter pill.\n */\n readonly filter = input.required<Filter>();\n\n /** @defaultValue false */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** @defaultValue 0 */\n readonly totalPills = input(0);\n\n /**\n * Output callback event which will provide you the name of the deleted filter\n * pill if a filter was deleted.\n */\n readonly deleteFilters = output<Filter>();\n\n protected deleteClicked(): void {\n this.deleteFilters.emit(this.filter());\n }\n}\n","<div\n class=\"pill responsive\"\n [class.pe-0]=\"!disabled()\"\n [class.disabled]=\"disabled()\"\n [ngClass]=\"filter().status ? 'pill-' + filter().status : ''\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <div class=\"wrapper\">\n @if (filter().title) {\n <div class=\"name\">{{ filter().title | translate }}</div>\n }\n @if (filter().title && filter().description) {\n <span class=\"name pe-4\">:</span>\n }\n <div class=\"value\">{{ filter().description | translate }}</div>\n </div>\n @if (!disabled()) {\n <ng-container *ngTemplateOutlet=\"remove\" />\n }\n</div>\n<ng-template #remove>\n <button\n type=\"button\"\n class=\"btn-remove element-cancel btn btn-circle btn-ghost focus-inside ms-0 btn-xs\"\n role=\"button\"\n aria-label=\"Remove\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"deleteClicked()\"\n (click)=\"deleteClicked()\"\n >\n </button>\n</ng-template>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input, model, output, viewChild } from '@angular/core';\nimport {\n SiAutoCollapsableListAdditionalContentDirective,\n SiAutoCollapsableListDirective,\n SiAutoCollapsableListItemDirective,\n SiAutoCollapsableListOverflowItemDirective\n} from '@siemens/element-ng/auto-collapsable-list';\nimport { BackgroundColorVariant } from '@siemens/element-ng/common';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { Filter } from './filter';\nimport { SiFilterPillComponent } from './si-filter-pill.component';\n\n@Component({\n selector: 'si-filter-bar',\n imports: [\n SiAutoCollapsableListDirective,\n SiAutoCollapsableListItemDirective,\n SiAutoCollapsableListOverflowItemDirective,\n SiAutoCollapsableListAdditionalContentDirective,\n SiFilterPillComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-filter-bar.component.html',\n styleUrl: './si-filter-bar.component.scss',\n host: {\n '[class.reset]': 'allowReset()'\n }\n})\nexport class SiFilterBarComponent {\n /**\n * Custom text if no filters are selected.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.NO_FILTERS:No filters applied`)\n * ```\n */\n readonly filterDefaultText = input(\n t(() => $localize`:@@SI_FILTER_BAR.NO_FILTERS:No filters applied`)\n );\n /**\n * Array of filter items to show\n *\n * @defaultValue []\n */\n readonly filters = model<Filter[]>([]);\n /**\n * Text for reset button\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.RESET_FILTERS:Reset filters`)\n * ```\n */\n readonly resetText = input(t(() => $localize`:@@SI_FILTER_BAR.RESET_FILTERS:Reset filters`));\n /**\n * Set false to hide reset filters button\n *\n * @defaultValue true\n */\n readonly allowReset = input(true, { transform: booleanAttribute });\n /**\n * Color to use for component background\n *\n * @defaultValue 'base-1'\n */\n readonly colorVariant = input<BackgroundColorVariant>('base-1');\n\n /**\n * Set to true to disable component\n *\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Custom text for the collapsed filters.\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.COLLAPSED_FILTERS_DESCRIPTION:+ {{count}} filters`)\n * ```\n */\n readonly collapsedFiltersDescription = input(\n t(() => $localize`:@@SI_FILTER_BAR.COLLAPSED_FILTERS_DESCRIPTION:+ {{count}} filters`)\n );\n\n /**\n * Output callback to be executed when the reset filter is clicked\n */\n readonly resetFilters = output<void>();\n\n private readonly collapsableListDirective = viewChild.required(SiAutoCollapsableListDirective);\n\n protected deleteFilters(deletedPill: Filter): void {\n this.filters.set(this.filters().filter(filter => filter !== deletedPill));\n }\n\n protected onResetFilters(): void {\n this.filters.set([]);\n this.resetFilters.emit();\n }\n\n protected deleteOverflowFilter(): void {\n this.filters.update(filters =>\n filters.slice(\n 0,\n this.collapsableListDirective()\n .items()\n .findIndex(item => !item.isVisible())\n )\n );\n }\n}\n","<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n status: 'default',\n filterName: ''\n }\"\n (deleteFilters)=\"deleteOverflowFilter()\"\n />\n @if (allowReset() && this.filters().length) {\n <button\n siAutoCollapsableListAdditionalContent\n type=\"button\"\n class=\"text-nowrap btn btn-tertiary\"\n [disabled]=\"disabled()\"\n (click)=\"onResetFilters()\"\n >\n {{ resetText() | translate }}\n </button>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFilterBarComponent } from './si-filter-bar.component';\n\n@NgModule({\n imports: [SiFilterBarComponent],\n exports: [SiFilterBarComponent]\n})\nexport class SiFilterBarModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './filter';\nexport * from './si-filter-bar.component';\nexport * from './si-filter-bar.module';\nexport * from './si-filter-pill.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-filter-bar.mjs","sources":["../../../../projects/element-ng/filter-bar/si-filter-pill.component.ts","../../../../projects/element-ng/filter-bar/si-filter-pill.component.html","../../../../projects/element-ng/filter-bar/si-filter-bar.component.ts","../../../../projects/element-ng/filter-bar/si-filter-bar.component.html","../../../../projects/element-ng/filter-bar/si-filter-bar.module.ts","../../../../projects/element-ng/filter-bar/index.ts","../../../../projects/element-ng/filter-bar/siemens-element-ng-filter-bar.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, input, output } from '@angular/core';\nimport { SiTranslatePipe } from '@siemens/element-translate-ng/translate';\n\nimport { Filter } from './filter';\n\n@Component({\n selector: 'si-filter-pill',\n imports: [NgTemplateOutlet, SiTranslatePipe],\n templateUrl: './si-filter-pill.component.html',\n styleUrl: './si-filter-pill.component.scss'\n})\nexport class SiFilterPillComponent {\n /**\n * Settings of the filter pill.\n */\n readonly filter = input.required<Filter>();\n\n /** @defaultValue false */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** @defaultValue 0 */\n readonly totalPills = input(0);\n\n /**\n * Output callback event which will provide you the name of the deleted filter\n * pill if a filter was deleted.\n */\n readonly deleteFilters = output<Filter>();\n\n protected deleteClicked(): void {\n this.deleteFilters.emit(this.filter());\n }\n}\n","<div\n class=\"pill responsive\"\n [class.pe-0]=\"!disabled()\"\n [class.disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <div class=\"wrapper\">\n @if (filter().title) {\n <div class=\"name\">{{ filter().title | translate }}</div>\n }\n @if (filter().title && filter().description) {\n <span class=\"name pe-4\">:</span>\n }\n <div class=\"value\">{{ filter().description | translate }}</div>\n </div>\n @if (!disabled()) {\n <ng-container *ngTemplateOutlet=\"remove\" />\n }\n</div>\n<ng-template #remove>\n <button\n type=\"button\"\n class=\"btn-remove element-cancel btn btn-circle btn-ghost focus-inside ms-0 btn-xs\"\n role=\"button\"\n aria-label=\"Remove\"\n [disabled]=\"disabled()\"\n (keydown.enter)=\"deleteClicked()\"\n (click)=\"deleteClicked()\"\n >\n </button>\n</ng-template>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input, model, output, viewChild } from '@angular/core';\nimport {\n SiAutoCollapsableListAdditionalContentDirective,\n SiAutoCollapsableListDirective,\n SiAutoCollapsableListItemDirective,\n SiAutoCollapsableListOverflowItemDirective\n} from '@siemens/element-ng/auto-collapsable-list';\nimport { BackgroundColorVariant } from '@siemens/element-ng/common';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { Filter } from './filter';\nimport { SiFilterPillComponent } from './si-filter-pill.component';\n\n@Component({\n selector: 'si-filter-bar',\n imports: [\n SiAutoCollapsableListDirective,\n SiAutoCollapsableListItemDirective,\n SiAutoCollapsableListOverflowItemDirective,\n SiAutoCollapsableListAdditionalContentDirective,\n SiFilterPillComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-filter-bar.component.html',\n styleUrl: './si-filter-bar.component.scss',\n host: {\n '[class.reset]': 'allowReset()'\n }\n})\nexport class SiFilterBarComponent {\n /**\n * Custom text if no filters are selected.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.NO_FILTERS:No filters applied`)\n * ```\n */\n readonly filterDefaultText = input(\n t(() => $localize`:@@SI_FILTER_BAR.NO_FILTERS:No filters applied`)\n );\n /**\n * Array of filter items to show\n *\n * @defaultValue []\n */\n readonly filters = model<Filter[]>([]);\n /**\n * Text for reset button\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.RESET_FILTERS:Reset filters`)\n * ```\n */\n readonly resetText = input(t(() => $localize`:@@SI_FILTER_BAR.RESET_FILTERS:Reset filters`));\n /**\n * Set false to hide reset filters button\n *\n * @defaultValue true\n */\n readonly allowReset = input(true, { transform: booleanAttribute });\n /**\n * Color to use for component background\n *\n * @defaultValue 'base-1'\n */\n readonly colorVariant = input<BackgroundColorVariant>('base-1');\n\n /**\n * Set to true to disable component\n *\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Custom text for the collapsed filters.\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_FILTER_BAR.COLLAPSED_FILTERS_DESCRIPTION:+ {{count}} filters`)\n * ```\n */\n readonly collapsedFiltersDescription = input(\n t(() => $localize`:@@SI_FILTER_BAR.COLLAPSED_FILTERS_DESCRIPTION:+ {{count}} filters`)\n );\n\n /**\n * Output callback to be executed when the reset filter is clicked\n */\n readonly resetFilters = output<void>();\n\n private readonly collapsableListDirective = viewChild.required(SiAutoCollapsableListDirective);\n\n protected deleteFilters(deletedPill: Filter): void {\n this.filters.set(this.filters().filter(filter => filter !== deletedPill));\n }\n\n protected onResetFilters(): void {\n this.filters.set([]);\n this.resetFilters.emit();\n }\n\n protected deleteOverflowFilter(): void {\n this.filters.update(filters =>\n filters.slice(\n 0,\n this.collapsableListDirective()\n .items()\n .findIndex(item => !item.isVisible())\n )\n );\n }\n}\n","<div class=\"responsive py-2\" siAutoCollapsableList>\n @for (filter of filters(); track $index) {\n <div class=\"pill-wrapper\" siAutoCollapsableListItem>\n <si-filter-pill\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [totalPills]=\"$count\"\n [filter]=\"filter\"\n [disabled]=\"disabled()\"\n (deleteFilters)=\"deleteFilters($event)\"\n />\n </div>\n } @empty {\n <span class=\"list-text\">{{ filterDefaultText() | translate }}</span>\n }\n <si-filter-pill\n #overflowItem=\"siAutoCollapsableListOverflowItem\"\n siAutoCollapsableListOverflowItem\n [class.dark-background]=\"colorVariant() === 'base-0'\"\n [disabled]=\"disabled()\"\n [filter]=\"{\n description:\n collapsedFiltersDescription()\n | translate\n : {\n count: overflowItem.hiddenItemCount\n },\n title: '',\n filterName: ''\n }\"\n (deleteFilters)=\"deleteOverflowFilter()\"\n />\n @if (allowReset() && this.filters().length) {\n <button\n siAutoCollapsableListAdditionalContent\n type=\"button\"\n class=\"text-nowrap btn btn-tertiary\"\n [disabled]=\"disabled()\"\n (click)=\"onResetFilters()\"\n >\n {{ resetText() | translate }}\n </button>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiFilterBarComponent } from './si-filter-bar.component';\n\n@NgModule({\n imports: [SiFilterBarComponent],\n exports: [SiFilterBarComponent]\n})\nexport class SiFilterBarModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './filter';\nexport * from './si-filter-bar.component';\nexport * from './si-filter-bar.module';\nexport * from './si-filter-pill.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|