@sumaris-net/ngx-components 18.24.8 → 18.24.9

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.
@@ -17,6 +17,8 @@ export class UploadFilePopover {
17
17
  deleteFn;
18
18
  maxParallelUpload;
19
19
  autoHideDropArea = false;
20
+ okButtonText = 'COMMON.BTN_IMPORT';
21
+ cancelButtonText = 'COMMON.BTN_CANCEL';
20
22
  importing = false;
21
23
  error;
22
24
  get files() {
@@ -80,11 +82,11 @@ export class UploadFilePopover {
80
82
  }
81
83
  }
82
84
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFilePopover, deps: [{ token: i1.PopoverController }, { token: i2.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
83
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFilePopover, selector: "app-upload-file-popover", inputs: { fileExtension: "fileExtension", title: "title", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", autoHideDropArea: "autoHideDropArea" }, viewQueries: [{ propertyName: "uploader", first: true, predicate: ["uploader"], descendants: true, static: true }], ngImport: i0, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label translate>COMMON.BTN_IMPORT</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.UploadFileComponent, selector: "app-upload-file", inputs: ["fileExtension", "uniqueFile", "instantUpload", "uploadFn", "deleteFn", "maxParallelUpload", "autoHideDropArea"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
85
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFilePopover, selector: "app-upload-file-popover", inputs: { fileExtension: "fileExtension", title: "title", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", autoHideDropArea: "autoHideDropArea", okButtonText: "okButtonText", cancelButtonText: "cancelButtonText" }, viewQueries: [{ propertyName: "uploader", first: true, predicate: ["uploader"], descendants: true, static: true }], ngImport: i0, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label [innerHTML]=\"cancelButtonText | translate\"></ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label [innerHTML]=\"okButtonText | translate\"></ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.UploadFileComponent, selector: "app-upload-file", inputs: ["fileExtension", "uniqueFile", "instantUpload", "uploadFn", "deleteFn", "maxParallelUpload", "autoHideDropArea"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
84
86
  }
85
87
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFilePopover, decorators: [{
86
88
  type: Component,
87
- args: [{ selector: 'app-upload-file-popover', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label translate>COMMON.BTN_IMPORT</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"] }]
89
+ args: [{ selector: 'app-upload-file-popover', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label [innerHTML]=\"cancelButtonText | translate\"></ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label [innerHTML]=\"okButtonText | translate\"></ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"] }]
88
90
  }], ctorParameters: () => [{ type: i1.PopoverController }, { type: i2.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { uploader: [{
89
91
  type: ViewChild,
90
92
  args: ['uploader', { static: true }]
@@ -104,5 +106,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
104
106
  type: Input
105
107
  }], autoHideDropArea: [{
106
108
  type: Input
109
+ }], okButtonText: [{
110
+ type: Input
111
+ }], cancelButtonText: [{
112
+ type: Input
107
113
  }] } });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUtcG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC91cGxvYWQtZmlsZS91cGxvYWQtZmlsZS1wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3VwbG9hZC1maWxlL3VwbG9hZC1maWxlLXBvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBdUI5RSxNQUFNLE9BQU8saUJBQWlCO0lBNEJoQjtJQUNBO0lBQ0E7SUE3QjZCLFFBQVEsQ0FBc0I7SUFFOUQsYUFBYSxDQUFTO0lBQ3RCLEtBQUssQ0FBUztJQUNkLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixRQUFRLENBQW9CO0lBQzVCLFFBQVEsQ0FBb0I7SUFDNUIsaUJBQWlCLENBQVM7SUFDMUIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBRWxDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxDQUFTO0lBRWQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJ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OUIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFVwbG9hZEZpbGVDb21wb25lbnQgfSBmcm9tICcuL3VwbG9hZC1maWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlRGVsZXRlRm4sIEZpbGVVcGxvYWRGbiwgVXBsb2FkRmlsZSB9IGZyb20gJy4vdXBsb2FkLWZpbGUubW9kZWwnO1xuaW1wb3J0IHsgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkRmlsZVBvcG92ZXJPcHRpb25zPFQ+IHtcbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgdXBsb2FkRm46IEZpbGVVcGxvYWRGbjxUPjtcbiAgZGVsZXRlRm4/OiBGaWxlRGVsZXRlRm48YW55PjtcblxuICBpbnN0YW50VXBsb2FkPzogYm9vbGVhbjtcbiAgdW5pcXVlRmlsZT86IGJvb2xlYW47XG4gIGZpbGVFeHRlbnNpb24/OiBzdHJpbmc7XG4gIG1heFBhcmFsbGVsVXBsb2FkPzogbnVtYmVyO1xuICBhdXRvSGlkZURyb3BBcmVhPzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVwbG9hZC1maWxlLXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWZpbGUtcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC1maWxlLXBvcG92ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZEZpbGVQb3BvdmVyIGltcGxlbWVudHMgVXBsb2FkRmlsZVBvcG92ZXJPcHRpb25zPGFueT4ge1xuICBAVmlld0NoaWxkKCd1cGxvYWRlcicsIHsgc3RhdGljOiB0cnVlIH0pIHVwbG9hZGVyOiBVcGxvYWRGaWxlQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpIGZpbGVFeHRlbnNpb246IHN0cmluZztcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgdW5pcXVlRmlsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnN0YW50VXBsb2FkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHVwbG9hZEZuOiBGaWxlVXBsb2FkRm48YW55PjtcbiAgQElucHV0KCkgZGVsZXRlRm46IEZpbGVEZWxldGVGbjxhbnk+O1xuICBASW5wdXQoKSBtYXhQYXJhbGxlbFVwbG9hZDogbnVtYmVyO1xuICBASW5wdXQoKSBhdXRvSGlkZURyb3BBcmVhID0gZmFsc2U7XG5cbiAgaW1wb3J0aW5nID0gZmFsc2U7XG4gIGVycm9yOiBzdHJpbmc7XG5cbiAgZ2V0IGZpbGVzKCk6IFVwbG9hZEZpbGU8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy51cGxvYWRlci5maWxlcztcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRpbmcgfHwgaXNFbXB0eUFycmF5KHRoaXMuZmlsZXMpO1xuICB9XG5cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiBpc05vdEVtcHR5QXJyYXkodGhpcy5maWxlcyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgYXN5bmMgb25WYWxpZGF0ZShldmVudDogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgaWYgKHRoaXMuaW1wb3J0aW5nKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbdXBsb2FkLWZpbGUtcG9wb3Zlcl0gVmFsaWRhdGUgZm9ybTogd2lsbCB1cGxvYWQgYWxsIGZpbGVzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5pbXBvcnRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFdhaXQgcHJvY2Vzc2luZyBmaWxlcyBmaW5pc2hlZFxuICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZGVyLndhaXRJZGxlKCk7XG5cbiAgICAgICAgLy8gdXBsb2FkIGFsbCBmaWxlc1xuICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZGVyLnVwbG9hZEZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXM6IFVwbG9hZEZpbGU8YW55PltdID0gKHRoaXMudXBsb2FkZXIucHJvY2Vzc2VkRmlsZXMgfHwgW10pLmZpbHRlcigoZmlsZSkgPT4gIWZpbGUuZGVsZXRpbmcpOyAvLyBSZW1vdmUgZGVsZXRpbmcgZmlsZSAoZGVsZXRpb24gaW4gcHJvZ3Jlc3MpXG5cbiAgICAgICAgLy8gTm90aGluZyB0byB1cGxvYWQ6IGNsb3NlIHBvcG92ZXJcbiAgICAgICAgaWYgKGlzRW1wdHlBcnJheShmaWxlcykpIHJldHVybiB0aGlzLmNhbmNlbCgpO1xuXG4gICAgICAgIC8vIGNoZWNrIGVycm9yc1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IGZpbGUuZXJyb3IpLmZpbHRlcihpc05vdE5pbE9yQmxhbmspO1xuXG4gICAgICAgIC8vIElmIGVycm9yOiBzdG9wXG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG4gICAgICAgICAgdGhyb3cgeyBtZXNzYWdlOiAnRklMRS5VUExPQUQuRVJST1InIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXR1cm4gZmlsZXNcbiAgICAgICAgYXdhaXQgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5kaXNtaXNzKGZpbGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmVycm9yID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuZGlzbWlzcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0RXJyb3IoKSB7XG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgc2Nyb2xsWT1cImZhbHNlXCI+XG4gIDxhcHAtdXBsb2FkLWZpbGVcbiAgICAjdXBsb2FkZXJcbiAgICBbdXBsb2FkRm5dPVwidXBsb2FkRm5cIlxuICAgIFtkZWxldGVGbl09XCJkZWxldGVGblwiXG4gICAgW2ZpbGVFeHRlbnNpb25dPVwiZmlsZUV4dGVuc2lvblwiXG4gICAgW2luc3RhbnRVcGxvYWRdPVwiaW5zdGFudFVwbG9hZFwiXG4gICAgW3VuaXF1ZUZpbGVdPVwidW5pcXVlRmlsZVwiXG4gICAgW21heFBhcmFsbGVsVXBsb2FkXT1cIm1heFBhcmFsbGVsVXBsb2FkXCJcbiAgICBbYXV0b0hpZGVEcm9wQXJlYV09XCJhdXRvSGlkZURyb3BBcmVhXCJcbiAgPjwvYXBwLXVwbG9hZC1maWxlPlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXI+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1ub3dyYXBcIiA+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgQGlmIChpbXBvcnRpbmcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1wb3J0aW5nLWluZm9cIj5cbiAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPjxzbWFsbCB0cmFuc2xhdGU+RklMRS5VUExPQUQuSU1QT1JUSU5HPC9zbWFsbD48L2lvbi10ZXh0PlxuICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImRvdHNcIiBjb2xvcj1cImFjY2VudFwiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChlcnJvcikge1xuICAgICAgICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBjb2xvcj1cInRyYW5zcGFyZW50XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgICAgICAgPHNtYWxsIFtpbm5lckhUTUxdPVwiZXJyb3IgfCB0cmFuc2xhdGVcIj48L3NtYWxsPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgfVxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIFtmaWxsXT1cImRpc2FibGVkID8gJ2NsZWFyJyA6ICdzb2xpZCdcIlxuICAgICAgICAgIChjbGljayk9XCJvblZhbGlkYXRlKCRldmVudClcIlxuICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvblZhbGlkYXRlKCRldmVudClcIlxuICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0lNUE9SVDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24tZm9vdGVyPlxuIl19
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUtcG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC91cGxvYWQtZmlsZS91cGxvYWQtZmlsZS1wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3VwbG9hZC1maWxlL3VwbG9hZC1maWxlLXBvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBMEI5RSxNQUFNLE9BQU8saUJBQWlCO0lBOEJoQjtJQUNBO0lBQ0E7SUEvQjZCLFFBQVEsQ0FBc0I7SUFFOUQsYUFBYSxDQUFTO0lBQ3RCLEtBQUssQ0FBUztJQUNkLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixRQUFRLENBQW9CO0lBQzVCLFFBQVEsQ0FBb0I7SUFDNUIsaUJBQWlCLENBQVM7SUFDMUIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztJQUNuQyxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQztJQUVoRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLEtBQUssQ0FBUztJQUVkLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFF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O3NCQUFoRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTlCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBVcGxvYWRGaWxlQ29tcG9uZW50IH0gZnJvbSAnLi91cGxvYWQtZmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZURlbGV0ZUZuLCBGaWxlVXBsb2FkRm4sIFVwbG9hZEZpbGUgfSBmcm9tICcuL3VwbG9hZC1maWxlLm1vZGVsJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGVQb3BvdmVyT3B0aW9uczxUPiB7XG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIHVwbG9hZEZuOiBGaWxlVXBsb2FkRm48VD47XG4gIGRlbGV0ZUZuPzogRmlsZURlbGV0ZUZuPGFueT47XG5cbiAgaW5zdGFudFVwbG9hZD86IGJvb2xlYW47XG4gIHVuaXF1ZUZpbGU/OiBib29sZWFuO1xuICBmaWxlRXh0ZW5zaW9uPzogc3RyaW5nO1xuICBtYXhQYXJhbGxlbFVwbG9hZD86IG51bWJlcjtcbiAgYXV0b0hpZGVEcm9wQXJlYT86IGJvb2xlYW47XG5cbiAgaW1wb3J0QnV0dG9uVGV4dD86IHN0cmluZztcbiAgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVwbG9hZC1maWxlLXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWZpbGUtcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC1maWxlLXBvcG92ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZEZpbGVQb3BvdmVyIGltcGxlbWVudHMgVXBsb2FkRmlsZVBvcG92ZXJPcHRpb25zPGFueT4ge1xuICBAVmlld0NoaWxkKCd1cGxvYWRlcicsIHsgc3RhdGljOiB0cnVlIH0pIHVwbG9hZGVyOiBVcGxvYWRGaWxlQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpIGZpbGVFeHRlbnNpb246IHN0cmluZztcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgdW5pcXVlRmlsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnN0YW50VXBsb2FkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHVwbG9hZEZuOiBGaWxlVXBsb2FkRm48YW55PjtcbiAgQElucHV0KCkgZGVsZXRlRm46IEZpbGVEZWxldGVGbjxhbnk+O1xuICBASW5wdXQoKSBtYXhQYXJhbGxlbFVwbG9hZDogbnVtYmVyO1xuICBASW5wdXQoKSBhdXRvSGlkZURyb3BBcmVhID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9rQnV0dG9uVGV4dCA9ICdDT01NT04uQlROX0lNUE9SVCc7XG4gIEBJbnB1dCgpIGNhbmNlbEJ1dHRvblRleHQgPSAnQ09NTU9OLkJUTl9DQU5DRUwnO1xuXG4gIGltcG9ydGluZyA9IGZhbHNlO1xuICBlcnJvcjogc3RyaW5nO1xuXG4gIGdldCBmaWxlcygpOiBVcGxvYWRGaWxlPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkZXIuZmlsZXM7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1wb3J0aW5nIHx8IGlzRW1wdHlBcnJheSh0aGlzLmZpbGVzKTtcbiAgfVxuXG4gIGdldCB2YWxpZCgpIHtcbiAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KHRoaXMuZmlsZXMpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBvcG92ZXJDb250cm9sbGVyOiBQb3BvdmVyQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIGFzeW5jIG9uVmFsaWRhdGUoZXZlbnQ6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGlmICh0aGlzLmltcG9ydGluZykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW3VwbG9hZC1maWxlLXBvcG92ZXJdIFZhbGlkYXRlIGZvcm06IHdpbGwgdXBsb2FkIGFsbCBmaWxlcy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaW1wb3J0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBXYWl0IHByb2Nlc3NpbmcgZmlsZXMgZmluaXNoZWRcbiAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRlci53YWl0SWRsZSgpO1xuXG4gICAgICAgIC8vIHVwbG9hZCBhbGwgZmlsZXNcbiAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRlci51cGxvYWRGaWxlcygpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVzOiBVcGxvYWRGaWxlPGFueT5bXSA9ICh0aGlzLnVwbG9hZGVyLnByb2Nlc3NlZEZpbGVzIHx8IFtdKS5maWx0ZXIoKGZpbGUpID0+ICFmaWxlLmRlbGV0aW5nKTsgLy8gUmVtb3ZlIGRlbGV0aW5nIGZpbGUgKGRlbGV0aW9uIGluIHByb2dyZXNzKVxuXG4gICAgICAgIC8vIE5vdGhpbmcgdG8gdXBsb2FkOiBjbG9zZSBwb3BvdmVyXG4gICAgICAgIGlmIChpc0VtcHR5QXJyYXkoZmlsZXMpKSByZXR1cm4gdGhpcy5jYW5jZWwoKTtcblxuICAgICAgICAvLyBjaGVjayBlcnJvcnNcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLmVycm9yKS5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKTtcblxuICAgICAgICAvLyBJZiBlcnJvcjogc3RvcFxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGVycm9ycy5mb3JFYWNoKChlcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogJ0ZJTEUuVVBMT0FELkVSUk9SJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIGZpbGVzXG4gICAgICAgIGF3YWl0IHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuZGlzbWlzcyhmaWxlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5lcnJvciA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycjtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbXBvcnRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHJldHVybiB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKCkge1xuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCI8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIHNjcm9sbFk9XCJmYWxzZVwiPlxuICA8YXBwLXVwbG9hZC1maWxlXG4gICAgI3VwbG9hZGVyXG4gICAgW3VwbG9hZEZuXT1cInVwbG9hZEZuXCJcbiAgICBbZGVsZXRlRm5dPVwiZGVsZXRlRm5cIlxuICAgIFtmaWxlRXh0ZW5zaW9uXT1cImZpbGVFeHRlbnNpb25cIlxuICAgIFtpbnN0YW50VXBsb2FkXT1cImluc3RhbnRVcGxvYWRcIlxuICAgIFt1bmlxdWVGaWxlXT1cInVuaXF1ZUZpbGVcIlxuICAgIFttYXhQYXJhbGxlbFVwbG9hZF09XCJtYXhQYXJhbGxlbFVwbG9hZFwiXG4gICAgW2F1dG9IaWRlRHJvcEFyZWFdPVwiYXV0b0hpZGVEcm9wQXJlYVwiXG4gID48L2FwcC11cGxvYWQtZmlsZT5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tbm93cmFwXCIgPlxuICAgICAgPGlvbi1jb2w+XG4gICAgICAgIEBpZiAoaW1wb3J0aW5nKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImltcG9ydGluZy1pbmZvXCI+XG4gICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj48c21hbGwgdHJhbnNsYXRlPkZJTEUuVVBMT0FELklNUE9SVElORzwvc21hbGw+PC9pb24tdGV4dD5cbiAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJkb3RzXCIgY29sb3I9XCJhY2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoZXJyb3IpIHtcbiAgICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCIgY29sb3I9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICAgIDxzbWFsbCBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9zbWFsbD5cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgIDxpb24tbGFiZWwgW2lubmVySFRNTF09XCJjYW5jZWxCdXR0b25UZXh0IHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBbZmlsbF09XCJkaXNhYmxlZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAoY2xpY2spPVwib25WYWxpZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25WYWxpZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICBjb2xvcj1cInRlcnRpYXJ5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1sYWJlbCBbaW5uZXJIVE1MXT1cIm9rQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24tZm9vdGVyPlxuIl19
@@ -1,74 +1,73 @@
1
- const regexp = {
2
- POSITIVE_INTEGER: /^\d+$/,
3
- VERSION_PART_REGEXP: /^[0-9]+|alpha[0-9]+|beta[0-9]+|rc[0-9]+|[0-9]+-SNAPSHOT$/,
4
- };
1
+ // Parse version string on standard "Semantic Versioning 2.0.0"
2
+ const SEMVER_2_REGEXP = /^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<build>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
5
3
  export class VersionUtils {
6
4
  static compare = compareVersionNumbers;
7
5
  static isCompatible = isVersionCompatible;
8
6
  static isSame = isSameVersion;
9
7
  }
10
8
  /**
11
- * Compare two software version numbers (e.g. 1.7.1)
12
- * Returns:
13
- *
14
- * 0 if they're identical
15
- * negative if v1 < v2
16
- * positive if v1 > v2
17
- * Nan if they in the wrong format
18
- *
19
- * E.g.:
20
- *
21
- * assert(version_number_compare("1.7.1", "1.6.10") > 0);
22
- * assert(version_number_compare("1.7.1", "1.7.10") < 0);
23
- *
24
- * "Unit tests": http://jsfiddle.net/ripper234/Xv9WL/28/
25
- *
26
- * Taken from http://stackoverflow.com/a/6832721/11236
9
+ * Compares two Semantic Versioning 2.0.0 strings
10
+ * @param {string} v1 - First version string
11
+ * @param {string} v2 - Second version string
12
+ * @returns {number} -1 if v1 < v2, 0 if equal, 1 if v1 > v2
27
13
  */
28
- export function compareVersionNumbers(v1, v2) {
29
- const v1parts = v1.split('.');
30
- const v2parts = v2.split('.');
31
- // First, validate both numbers are true version numbers
32
- if (!validateParts(v1parts) || !validateParts(v2parts)) {
14
+ export function compareVersionNumbers(v1, v2, comparePrerelease = false) {
15
+ const m1 = v1.match(SEMVER_2_REGEXP);
16
+ const m2 = v2.match(SEMVER_2_REGEXP);
17
+ if (!m1 || !m2) {
33
18
  return NaN;
34
19
  }
35
- for (let i = 0; i < v1parts.length; ++i) {
36
- if (v2parts.length === i) {
20
+ const [p1, p2] = [m1.groups, m2.groups];
21
+ // 1. Compare major.minor.patch numerically
22
+ for (const key of ['major', 'minor', 'patch']) {
23
+ const n1 = Number(p1[key]);
24
+ const n2 = Number(p2[key]);
25
+ if (n1 !== n2)
26
+ return n1 > n2 ? 1 : -1;
27
+ }
28
+ // If do not compare pre-release part return equals version on same major.minor.patch
29
+ if (!comparePrerelease)
30
+ return 0;
31
+ // 2. Extract prerelease identifiers (build metadata is ignored)
32
+ const pre1 = p1.prerelease ? p1.prerelease.split('.') : [];
33
+ const pre2 = p2.prerelease ? p2.prerelease.split('.') : [];
34
+ // If both have no prerelease, they are equal
35
+ if (pre1.length === 0 && pre2.length === 0)
36
+ return 0;
37
+ // A version without prerelease has higher precedence than one with prerelease
38
+ if (pre1.length === 0)
39
+ return 1; // v1 stable, v2 pre-release → v1 > v2
40
+ if (pre2.length === 0)
41
+ return -1; // v1 pre-release, v2 stable → v1 < v2
42
+ // 3. Compare identifier by identifier
43
+ const maxLen = Math.max(pre1.length, pre2.length);
44
+ for (let i = 0; i < maxLen; i++) {
45
+ const id1 = pre1[i];
46
+ const id2 = pre2[i];
47
+ // If one has more fields, it has higher precedence if previous fields were equal
48
+ if (id1 === undefined)
49
+ return -1;
50
+ if (id2 === undefined)
37
51
  return 1;
52
+ const isNum1 = /^\d+$/.test(id1);
53
+ const isNum2 = /^\d+$/.test(id2);
54
+ if (isNum1 && isNum2) {
55
+ // Numeric comparison
56
+ const n1 = Number(id1), n2 = Number(id2);
57
+ if (n1 !== n2)
58
+ return n1 > n2 ? 1 : -1;
38
59
  }
39
- if (v1parts[i] === v2parts[i]) {
40
- continue;
41
- }
42
- if (v1parts[i] > v2parts[i]) {
43
- return 1;
60
+ else if (!isNum1 && !isNum2) {
61
+ // Lexicographic comparison (ASCII order)
62
+ if (id1 !== id2)
63
+ return id1 > id2 ? 1 : -1;
44
64
  }
45
- return -1;
46
- }
47
- if (v1parts.length !== v2parts.length) {
48
- return -1;
49
- }
50
- return 0;
51
- }
52
- function validateParts(parts) {
53
- for (let i = 0; i < parts.length; i++) {
54
- let isNumber = regexp.POSITIVE_INTEGER.test(parts[i]);
55
- // First part MUST be an integer
56
- if (i === 0 && !isNumber)
57
- return false;
58
- // If not integer, should be 'alpha', 'beta', etc.
59
- if (!isNumber) {
60
- if (!regexp.VERSION_PART_REGEXP.test(parts[i]))
61
- return false;
62
- // Remove '-SNAPSHOT', as it should never be in prod
63
- parts[i] = parts[i].replace('-SNAPSHOT', '');
64
- // Check again if numeric
65
- isNumber = regexp.POSITIVE_INTEGER.test(parts[i]);
65
+ else {
66
+ // Numeric identifiers always have lower precedence than alphanumeric
67
+ return isNum1 ? -1 : 1;
66
68
  }
67
- // Convert string to int (need by compare operators)
68
- if (isNumber)
69
- parts[i] = parseInt(parts[i]);
70
69
  }
71
- return true;
70
+ return 0; // Same version
72
71
  }
73
72
  export function isVersionCompatible(minVersion, actualVersion) {
74
73
  // DEV ONLY
@@ -78,4 +77,4 @@ export function isVersionCompatible(minVersion, actualVersion) {
78
77
  export function isSameVersion(v1, v2) {
79
78
  return compareVersionNumbers(v1, v2) === 0;
80
79
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sTUFBTSxHQUFHO0lBQ2IsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixtQkFBbUIsRUFBRSwwREFBMEQ7Q0FDaEYsQ0FBQztBQUVGLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUM7SUFDdkMsTUFBTSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztJQUMxQyxNQUFNLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQzs7QUFHaEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix3REFBd0Q7SUFFeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN2QyxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdELG9EQUFvRDtZQUNwRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MseUJBQXlCO1lBQ3pCLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxhQUFhO0lBQzNELFdBQVc7SUFDWCw2SEFBNkg7SUFDN0gsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQ2xDLE9BQU8scUJBQXFCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVnZXhwID0ge1xuICBQT1NJVElWRV9JTlRFR0VSOiAvXlxcZCskLyxcbiAgVkVSU0lPTl9QQVJUX1JFR0VYUDogL15bMC05XSt8YWxwaGFbMC05XSt8YmV0YVswLTldK3xyY1swLTldK3xbMC05XSstU05BUFNIT1QkLyxcbn07XG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uVXRpbHMge1xuICBzdGF0aWMgY29tcGFyZSA9IGNvbXBhcmVWZXJzaW9uTnVtYmVycztcbiAgc3RhdGljIGlzQ29tcGF0aWJsZSA9IGlzVmVyc2lvbkNvbXBhdGlibGU7XG4gIHN0YXRpYyBpc1NhbWUgPSBpc1NhbWVWZXJzaW9uO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNvZnR3YXJlIHZlcnNpb24gbnVtYmVycyAoZS5nLiAxLjcuMSlcbiAqIFJldHVybnM6XG4gKlxuICogIDAgaWYgdGhleSdyZSBpZGVudGljYWxcbiAqICBuZWdhdGl2ZSBpZiB2MSA8IHYyXG4gKiAgcG9zaXRpdmUgaWYgdjEgPiB2MlxuICogIE5hbiBpZiB0aGV5IGluIHRoZSB3cm9uZyBmb3JtYXRcbiAqXG4gKiAgRS5nLjpcbiAqXG4gKiAgYXNzZXJ0KHZlcnNpb25fbnVtYmVyX2NvbXBhcmUoXCIxLjcuMVwiLCBcIjEuNi4xMFwiKSA+IDApO1xuICogIGFzc2VydCh2ZXJzaW9uX251bWJlcl9jb21wYXJlKFwiMS43LjFcIiwgXCIxLjcuMTBcIikgPCAwKTtcbiAqXG4gKiAgXCJVbml0IHRlc3RzXCI6IGh0dHA6Ly9qc2ZpZGRsZS5uZXQvcmlwcGVyMjM0L1h2OVdMLzI4L1xuICpcbiAqICBUYWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY4MzI3MjEvMTEyMzZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uTnVtYmVycyh2MSwgdjIpIHtcbiAgY29uc3QgdjFwYXJ0cyA9IHYxLnNwbGl0KCcuJyk7XG4gIGNvbnN0IHYycGFydHMgPSB2Mi5zcGxpdCgnLicpO1xuXG4gIC8vIEZpcnN0LCB2YWxpZGF0ZSBib3RoIG51bWJlcnMgYXJlIHRydWUgdmVyc2lvbiBudW1iZXJzXG5cbiAgaWYgKCF2YWxpZGF0ZVBhcnRzKHYxcGFydHMpIHx8ICF2YWxpZGF0ZVBhcnRzKHYycGFydHMpKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdjFwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh2MnBhcnRzLmxlbmd0aCA9PT0gaSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgaWYgKHYxcGFydHNbaV0gPT09IHYycGFydHNbaV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodjFwYXJ0c1tpXSA+IHYycGFydHNbaV0pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBpZiAodjFwYXJ0cy5sZW5ndGggIT09IHYycGFydHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGFydHMocGFydHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc051bWJlciA9IHJlZ2V4cC5QT1NJVElWRV9JTlRFR0VSLnRlc3QocGFydHNbaV0pO1xuICAgIC8vIEZpcnN0IHBhcnQgTVVTVCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKGkgPT09IDAgJiYgIWlzTnVtYmVyKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gSWYgbm90IGludGVnZXIsIHNob3VsZCBiZSAnYWxwaGEnLCAnYmV0YScsIGV0Yy5cbiAgICBpZiAoIWlzTnVtYmVyKSB7XG4gICAgICBpZiAoIXJlZ2V4cC5WRVJTSU9OX1BBUlRfUkVHRVhQLnRlc3QocGFydHNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBSZW1vdmUgJy1TTkFQU0hPVCcsIGFzIGl0IHNob3VsZCBuZXZlciBiZSBpbiBwcm9kXG4gICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2UoJy1TTkFQU0hPVCcsICcnKTtcbiAgICAgIC8vIENoZWNrIGFnYWluIGlmIG51bWVyaWNcbiAgICAgIGlzTnVtYmVyID0gcmVnZXhwLlBPU0lUSVZFX0lOVEVHRVIudGVzdChwYXJ0c1tpXSk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBzdHJpbmcgdG8gaW50IChuZWVkIGJ5IGNvbXBhcmUgb3BlcmF0b3JzKVxuICAgIGlmIChpc051bWJlcikgcGFydHNbaV0gPSBwYXJzZUludChwYXJ0c1tpXSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb25Db21wYXRpYmxlKG1pblZlcnNpb24sIGFjdHVhbFZlcnNpb24pOiBib29sZWFuIHtcbiAgLy8gREVWIE9OTFlcbiAgLy9jb25zb2xlLmRlYnVnKGBbaHR0cF0gQ2hlY2tpbmcgYWN0dWFsIHZlcnNpb24geyR7YWN0dWFsVmVyc2lvbn19IGlzIGNvbXBhdGlibGUgd2l0aCBtaW4gZXhwZWN0ZWQgdmVyc2lvbiB7JHttaW5WZXJzaW9ufX1gKTtcbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uTnVtYmVycyhtaW5WZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSA8PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lVmVyc2lvbih2MSwgdjIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uTnVtYmVycyh2MSwgdjIpID09PSAwO1xufVxuIl19
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxNQUFNLGVBQWUsR0FDbkIsa09BQWtPLENBQUM7QUFFck8sTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztJQUN2QyxNQUFNLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBQzFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDOztBQUdoQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLGlCQUFpQixHQUFHLEtBQUs7SUFDckYsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV4QywyQ0FBMkM7SUFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksRUFBRSxL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YUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQ2xDLE9BQU8scUJBQXFCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUGFyc2UgdmVyc2lvbiBzdHJpbmcgb24gc3RhbmRhcmQgXCJTZW1hbnRpYyBWZXJzaW9uaW5nIDIuMC4wXCJcbmNvbnN0IFNFTVZFUl8yX1JFR0VYUCA9XG4gIC9eKD88bWFqb3I+MHxbMS05XVxcZCopXFwuKD88bWlub3I+MHxbMS05XVxcZCopXFwuKD88cGF0Y2g+MHxbMS05XVxcZCopKD86LSg/PHByZXJlbGVhc2U+KD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcXCsoPzxidWlsZD5bMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKSk/JC87XG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uVXRpbHMge1xuICBzdGF0aWMgY29tcGFyZSA9IGNvbXBhcmVWZXJzaW9uTnVtYmVycztcbiAgc3RhdGljIGlzQ29tcGF0aWJsZSA9IGlzVmVyc2lvbkNvbXBhdGlibGU7XG4gIHN0YXRpYyBpc1NhbWUgPSBpc1NhbWVWZXJzaW9uO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBTZW1hbnRpYyBWZXJzaW9uaW5nIDIuMC4wIHN0cmluZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSB2MSAtIEZpcnN0IHZlcnNpb24gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gdjIgLSBTZWNvbmQgdmVyc2lvbiBzdHJpbmdcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0xIGlmIHYxIDwgdjIsIDAgaWYgZXF1YWwsIDEgaWYgdjEgPiB2MlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25OdW1iZXJzKHYxOiBzdHJpbmcsIHYyOiBzdHJpbmcsIGNvbXBhcmVQcmVyZWxlYXNlID0gZmFsc2UpOiBudW1iZXIge1xuICBjb25zdCBtMSA9IHYxLm1hdGNoKFNFTVZFUl8yX1JFR0VYUCk7XG4gIGNvbnN0IG0yID0gdjIubWF0Y2goU0VNVkVSXzJfUkVHRVhQKTtcblxuICBpZiAoIW0xIHx8ICFtMikge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICBjb25zdCBbcDEsIHAyXSA9IFttMS5ncm91cHMsIG0yLmdyb3Vwc107XG5cbiAgLy8gMS4gQ29tcGFyZSBtYWpvci5taW5vci5wYXRjaCBudW1lcmljYWxseVxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ21ham9yJywgJ21pbm9yJywgJ3BhdGNoJ10pIHtcbiAgICBjb25zdCBuMSA9IE51bWJlcihwMVtrZXldKTtcbiAgICBjb25zdCBuMiA9IE51bWJlcihwMltrZXldKTtcbiAgICBpZiAobjEgIT09IG4yKSByZXR1cm4gbjEgPiBuMiA/IDEgOiAtMTtcbiAgfVxuXG4gIC8vIElmIGRvIG5vdCBjb21wYXJlIHByZS1yZWxlYXNlIHBhcnQgcmV0dXJuIGVxdWFscyB2ZXJzaW9uIG9uIHNhbWUgbWFqb3IubWlub3IucGF0Y2hcbiAgaWYgKCFjb21wYXJlUHJlcmVsZWFzZSkgcmV0dXJuIDA7XG5cbiAgLy8gMi4gRXh0cmFjdCBwcmVyZWxlYXNlIGlkZW50aWZpZXJzIChidWlsZCBtZXRhZGF0YSBpcyBpZ25vcmVkKVxuICBjb25zdCBwcmUxID0gcDEucHJlcmVsZWFzZSA/IHAxLnByZXJlbGVhc2Uuc3BsaXQoJy4nKSA6IFtdO1xuICBjb25zdCBwcmUyID0gcDIucHJlcmVsZWFzZSA/IHAyLnByZXJlbGVhc2Uuc3BsaXQoJy4nKSA6IFtdO1xuXG4gIC8vIElmIGJvdGggaGF2ZSBubyBwcmVyZWxlYXNlLCB0aGV5IGFyZSBlcXVhbFxuICBpZiAocHJlMS5sZW5ndGggPT09IDAgJiYgcHJlMi5sZW5ndGggPT09IDApIHJldHVybiAwO1xuXG4gIC8vIEEgdmVyc2lvbiB3aXRob3V0IHByZXJlbGVhc2UgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gb25lIHdpdGggcHJlcmVsZWFzZVxuICBpZiAocHJlMS5sZW5ndGggPT09IDApIHJldHVybiAxOyAvLyB2MSBzdGFibGUsIHYyIHByZS1yZWxlYXNlIOKGkiB2MSA+IHYyXG4gIGlmIChwcmUyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xOyAvLyB2MSBwcmUtcmVsZWFzZSwgdjIgc3RhYmxlIOKGkiB2MSA8IHYyXG5cbiAgLy8gMy4gQ29tcGFyZSBpZGVudGlmaWVyIGJ5IGlkZW50aWZpZXJcbiAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgocHJlMS5sZW5ndGgsIHByZTIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMZW47IGkrKykge1xuICAgIGNvbnN0IGlkMSA9IHByZTFbaV07XG4gICAgY29uc3QgaWQyID0gcHJlMltpXTtcblxuICAgIC8vIElmIG9uZSBoYXMgbW9yZSBmaWVsZHMsIGl0IGhhcyBoaWdoZXIgcHJlY2VkZW5jZSBpZiBwcmV2aW91cyBmaWVsZHMgd2VyZSBlcXVhbFxuICAgIGlmIChpZDEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmIChpZDIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG5cbiAgICBjb25zdCBpc051bTEgPSAvXlxcZCskLy50ZXN0KGlkMSk7XG4gICAgY29uc3QgaXNOdW0yID0gL15cXGQrJC8udGVzdChpZDIpO1xuXG4gICAgaWYgKGlzTnVtMSAmJiBpc051bTIpIHtcbiAgICAgIC8vIE51bWVyaWMgY29tcGFyaXNvblxuICAgICAgY29uc3QgbjEgPSBOdW1iZXIoaWQxKSxcbiAgICAgICAgbjIgPSBOdW1iZXIoaWQyKTtcbiAgICAgIGlmIChuMSAhPT0gbjIpIHJldHVybiBuMSA+IG4yID8gMSA6IC0xO1xuICAgIH0gZWxzZSBpZiAoIWlzTnVtMSAmJiAhaXNOdW0yKSB7XG4gICAgICAvLyBMZXhpY29ncmFwaGljIGNvbXBhcmlzb24gKEFTQ0lJIG9yZGVyKVxuICAgICAgaWYgKGlkMSAhPT0gaWQyKSByZXR1cm4gaWQxID4gaWQyID8gMSA6IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOdW1lcmljIGlkZW50aWZpZXJzIGFsd2F5cyBoYXZlIGxvd2VyIHByZWNlZGVuY2UgdGhhbiBhbHBoYW51bWVyaWNcbiAgICAgIHJldHVybiBpc051bTEgPyAtMSA6IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7IC8vIFNhbWUgdmVyc2lvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uQ29tcGF0aWJsZShtaW5WZXJzaW9uLCBhY3R1YWxWZXJzaW9uKTogYm9vbGVhbiB7XG4gIC8vIERFViBPTkxZXG4gIC8vY29uc29sZS5kZWJ1ZyhgW2h0dHBdIENoZWNraW5nIGFjdHVhbCB2ZXJzaW9uIHske2FjdHVhbFZlcnNpb259fSBpcyBjb21wYXRpYmxlIHdpdGggbWluIGV4cGVjdGVkIHZlcnNpb24geyR7bWluVmVyc2lvbn19YCk7XG4gIHJldHVybiBjb21wYXJlVmVyc2lvbk51bWJlcnMobWluVmVyc2lvbiwgYWN0dWFsVmVyc2lvbikgPD0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVZlcnNpb24odjEsIHYyKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wYXJlVmVyc2lvbk51bWJlcnModjEsIHYyKSA9PT0gMDtcbn1cbiJdfQ==
@@ -4,7 +4,7 @@ import { firstValueFrom, shareReplay, tap, of, timer, Subject, merge, delay, isO
4
4
  import { catchError, map, filter, takeUntil, first, switchMap, tap as tap$1, throttleTime, debounceTime, startWith, distinctUntilChanged, mergeMap, skip, finalize, distinctUntilKeyChanged, take } from 'rxjs/operators';
5
5
  import * as cloneImported from 'clone';
6
6
  import * as i3$1 from '@angular/common';
7
- import { CommonModule, DOCUMENT, LocationStrategy, APP_BASE_HREF, Location, NgIf, AsyncPipe, JsonPipe } from '@angular/common';
7
+ import { CommonModule, DOCUMENT, APP_BASE_HREF, LocationStrategy, Location, NgIf, AsyncPipe, JsonPipe } from '@angular/common';
8
8
  import { CdkTableModule } from '@angular/cdk/table';
9
9
  import * as i1$6 from '@angular/cdk/a11y';
10
10
  import { A11yModule, FocusMonitor } from '@angular/cdk/a11y';
@@ -16221,6 +16221,8 @@ class UploadFilePopover {
16221
16221
  deleteFn;
16222
16222
  maxParallelUpload;
16223
16223
  autoHideDropArea = false;
16224
+ okButtonText = 'COMMON.BTN_IMPORT';
16225
+ cancelButtonText = 'COMMON.BTN_CANCEL';
16224
16226
  importing = false;
16225
16227
  error;
16226
16228
  get files() {
@@ -16284,11 +16286,11 @@ class UploadFilePopover {
16284
16286
  }
16285
16287
  }
16286
16288
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFilePopover, deps: [{ token: i2$1.PopoverController }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
16287
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFilePopover, selector: "app-upload-file-popover", inputs: { fileExtension: "fileExtension", title: "title", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", autoHideDropArea: "autoHideDropArea" }, viewQueries: [{ propertyName: "uploader", first: true, predicate: ["uploader"], descendants: true, static: true }], ngImport: i0, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label translate>COMMON.BTN_IMPORT</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"], dependencies: [{ kind: "component", type: i2$1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2$1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2$1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2$1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2$1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2$1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2$1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: UploadFileComponent, selector: "app-upload-file", inputs: ["fileExtension", "uniqueFile", "instantUpload", "uploadFn", "deleteFn", "maxParallelUpload", "autoHideDropArea"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
16289
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFilePopover, selector: "app-upload-file-popover", inputs: { fileExtension: "fileExtension", title: "title", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", autoHideDropArea: "autoHideDropArea", okButtonText: "okButtonText", cancelButtonText: "cancelButtonText" }, viewQueries: [{ propertyName: "uploader", first: true, predicate: ["uploader"], descendants: true, static: true }], ngImport: i0, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label [innerHTML]=\"cancelButtonText | translate\"></ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label [innerHTML]=\"okButtonText | translate\"></ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"], dependencies: [{ kind: "component", type: i2$1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2$1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2$1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2$1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2$1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2$1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2$1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: UploadFileComponent, selector: "app-upload-file", inputs: ["fileExtension", "uniqueFile", "instantUpload", "uploadFn", "deleteFn", "maxParallelUpload", "autoHideDropArea"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
16288
16290
  }
16289
16291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFilePopover, decorators: [{
16290
16292
  type: Component,
16291
- args: [{ selector: 'app-upload-file-popover', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label translate>COMMON.BTN_IMPORT</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"] }]
16293
+ args: [{ selector: 'app-upload-file-popover', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n <app-upload-file\n #uploader\n [uploadFn]=\"uploadFn\"\n [deleteFn]=\"deleteFn\"\n [fileExtension]=\"fileExtension\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [autoHideDropArea]=\"autoHideDropArea\"\n ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding ion-nowrap\" >\n <ion-col>\n @if (importing) {\n <div class=\"importing-info\">\n <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n &nbsp;\n <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n </div>\n }\n @if (error) {\n <ion-item lines=\"none\" color=\"transparent\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"ion-text-wrap\">\n <small [innerHTML]=\"error | translate\"></small>\n </ion-label>\n </ion-item>\n }\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n <ion-label [innerHTML]=\"cancelButtonText | translate\"></ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onValidate($event)\"\n (keyup.enter)=\"onValidate($event)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n >\n <ion-label [innerHTML]=\"okButtonText | translate\"></ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".importing-info{padding-inline-start:var(--ion-padding);display:inline-flex;flex-wrap:nowrap;padding-top:8px}\n"] }]
16292
16294
  }], ctorParameters: () => [{ type: i2$1.PopoverController }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { uploader: [{
16293
16295
  type: ViewChild,
16294
16296
  args: ['uploader', { static: true }]
@@ -16308,6 +16310,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16308
16310
  type: Input
16309
16311
  }], autoHideDropArea: [{
16310
16312
  type: Input
16313
+ }], okButtonText: [{
16314
+ type: Input
16315
+ }], cancelButtonText: [{
16316
+ type: Input
16311
16317
  }] } });
16312
16318
 
16313
16319
  const APP_TESTING_PAGES = new InjectionToken('testingPages');
@@ -19353,77 +19359,76 @@ class NetworkUtils {
19353
19359
  }
19354
19360
  }
19355
19361
 
19356
- const regexp = {
19357
- POSITIVE_INTEGER: /^\d+$/,
19358
- VERSION_PART_REGEXP: /^[0-9]+|alpha[0-9]+|beta[0-9]+|rc[0-9]+|[0-9]+-SNAPSHOT$/,
19359
- };
19362
+ // Parse version string on standard "Semantic Versioning 2.0.0"
19363
+ const SEMVER_2_REGEXP = /^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<build>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
19360
19364
  class VersionUtils {
19361
19365
  static compare = compareVersionNumbers;
19362
19366
  static isCompatible = isVersionCompatible;
19363
19367
  static isSame = isSameVersion;
19364
19368
  }
19365
19369
  /**
19366
- * Compare two software version numbers (e.g. 1.7.1)
19367
- * Returns:
19368
- *
19369
- * 0 if they're identical
19370
- * negative if v1 < v2
19371
- * positive if v1 > v2
19372
- * Nan if they in the wrong format
19373
- *
19374
- * E.g.:
19375
- *
19376
- * assert(version_number_compare("1.7.1", "1.6.10") > 0);
19377
- * assert(version_number_compare("1.7.1", "1.7.10") < 0);
19378
- *
19379
- * "Unit tests": http://jsfiddle.net/ripper234/Xv9WL/28/
19380
- *
19381
- * Taken from http://stackoverflow.com/a/6832721/11236
19370
+ * Compares two Semantic Versioning 2.0.0 strings
19371
+ * @param {string} v1 - First version string
19372
+ * @param {string} v2 - Second version string
19373
+ * @returns {number} -1 if v1 < v2, 0 if equal, 1 if v1 > v2
19382
19374
  */
19383
- function compareVersionNumbers(v1, v2) {
19384
- const v1parts = v1.split('.');
19385
- const v2parts = v2.split('.');
19386
- // First, validate both numbers are true version numbers
19387
- if (!validateParts(v1parts) || !validateParts(v2parts)) {
19375
+ function compareVersionNumbers(v1, v2, comparePrerelease = false) {
19376
+ const m1 = v1.match(SEMVER_2_REGEXP);
19377
+ const m2 = v2.match(SEMVER_2_REGEXP);
19378
+ if (!m1 || !m2) {
19388
19379
  return NaN;
19389
19380
  }
19390
- for (let i = 0; i < v1parts.length; ++i) {
19391
- if (v2parts.length === i) {
19392
- return 1;
19393
- }
19394
- if (v1parts[i] === v2parts[i]) {
19395
- continue;
19396
- }
19397
- if (v1parts[i] > v2parts[i]) {
19381
+ const [p1, p2] = [m1.groups, m2.groups];
19382
+ // 1. Compare major.minor.patch numerically
19383
+ for (const key of ['major', 'minor', 'patch']) {
19384
+ const n1 = Number(p1[key]);
19385
+ const n2 = Number(p2[key]);
19386
+ if (n1 !== n2)
19387
+ return n1 > n2 ? 1 : -1;
19388
+ }
19389
+ // If do not compare pre-release part return equals version on same major.minor.patch
19390
+ if (!comparePrerelease)
19391
+ return 0;
19392
+ // 2. Extract prerelease identifiers (build metadata is ignored)
19393
+ const pre1 = p1.prerelease ? p1.prerelease.split('.') : [];
19394
+ const pre2 = p2.prerelease ? p2.prerelease.split('.') : [];
19395
+ // If both have no prerelease, they are equal
19396
+ if (pre1.length === 0 && pre2.length === 0)
19397
+ return 0;
19398
+ // A version without prerelease has higher precedence than one with prerelease
19399
+ if (pre1.length === 0)
19400
+ return 1; // v1 stable, v2 pre-release → v1 > v2
19401
+ if (pre2.length === 0)
19402
+ return -1; // v1 pre-release, v2 stable → v1 < v2
19403
+ // 3. Compare identifier by identifier
19404
+ const maxLen = Math.max(pre1.length, pre2.length);
19405
+ for (let i = 0; i < maxLen; i++) {
19406
+ const id1 = pre1[i];
19407
+ const id2 = pre2[i];
19408
+ // If one has more fields, it has higher precedence if previous fields were equal
19409
+ if (id1 === undefined)
19410
+ return -1;
19411
+ if (id2 === undefined)
19398
19412
  return 1;
19413
+ const isNum1 = /^\d+$/.test(id1);
19414
+ const isNum2 = /^\d+$/.test(id2);
19415
+ if (isNum1 && isNum2) {
19416
+ // Numeric comparison
19417
+ const n1 = Number(id1), n2 = Number(id2);
19418
+ if (n1 !== n2)
19419
+ return n1 > n2 ? 1 : -1;
19420
+ }
19421
+ else if (!isNum1 && !isNum2) {
19422
+ // Lexicographic comparison (ASCII order)
19423
+ if (id1 !== id2)
19424
+ return id1 > id2 ? 1 : -1;
19399
19425
  }
19400
- return -1;
19401
- }
19402
- if (v1parts.length !== v2parts.length) {
19403
- return -1;
19404
- }
19405
- return 0;
19406
- }
19407
- function validateParts(parts) {
19408
- for (let i = 0; i < parts.length; i++) {
19409
- let isNumber = regexp.POSITIVE_INTEGER.test(parts[i]);
19410
- // First part MUST be an integer
19411
- if (i === 0 && !isNumber)
19412
- return false;
19413
- // If not integer, should be 'alpha', 'beta', etc.
19414
- if (!isNumber) {
19415
- if (!regexp.VERSION_PART_REGEXP.test(parts[i]))
19416
- return false;
19417
- // Remove '-SNAPSHOT', as it should never be in prod
19418
- parts[i] = parts[i].replace('-SNAPSHOT', '');
19419
- // Check again if numeric
19420
- isNumber = regexp.POSITIVE_INTEGER.test(parts[i]);
19426
+ else {
19427
+ // Numeric identifiers always have lower precedence than alphanumeric
19428
+ return isNum1 ? -1 : 1;
19421
19429
  }
19422
- // Convert string to int (need by compare operators)
19423
- if (isNumber)
19424
- parts[i] = parseInt(parts[i]);
19425
19430
  }
19426
- return true;
19431
+ return 0; // Same version
19427
19432
  }
19428
19433
  function isVersionCompatible(minVersion, actualVersion) {
19429
19434
  // DEV ONLY
@@ -25672,6 +25677,7 @@ class PlatformService extends StartableService {
25672
25677
  audioProvider;
25673
25678
  environment;
25674
25679
  downloader;
25680
+ appBaseHref;
25675
25681
  _logger;
25676
25682
  _mobile;
25677
25683
  _desktop;
@@ -25680,7 +25686,7 @@ class PlatformService extends StartableService {
25680
25686
  _android;
25681
25687
  _ios;
25682
25688
  busySubject = new BehaviorSubject(false);
25683
- constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
25689
+ constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader, appBaseHref) {
25684
25690
  super(ionicPlatform);
25685
25691
  this.ionicPlatform = ionicPlatform;
25686
25692
  this.cdkPlatform = cdkPlatform;
@@ -25697,6 +25703,7 @@ class PlatformService extends StartableService {
25697
25703
  this.audioProvider = audioProvider;
25698
25704
  this.environment = environment;
25699
25705
  this.downloader = downloader;
25706
+ this.appBaseHref = appBaseHref;
25700
25707
  this._logger = loggingService?.getLogger('platform');
25701
25708
  this._debug = !environment.production;
25702
25709
  if (this._debug)
@@ -26094,7 +26101,7 @@ class PlatformService extends StartableService {
26094
26101
  * Handle deep links (Android App Links / iOS Universal Links)
26095
26102
  */
26096
26103
  async addDeepLinkListener(listenerFn) {
26097
- if (!this.isApp() || (typeof listenerFn !== 'function'))
26104
+ if (!this.isApp() || typeof listenerFn !== 'function')
26098
26105
  return; // Skip
26099
26106
  // Handle deep links (Android App Links / iOS Universal Links)
26100
26107
  try {
@@ -26267,7 +26274,7 @@ class PlatformService extends StartableService {
26267
26274
  this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
26268
26275
  return; // Skip
26269
26276
  }
26270
- const remoteVersion = await this.networkService.getAppVersion();
26277
+ const remoteVersion = (await this.networkService.getAppVersion(this.appBaseHref)).trim();
26271
26278
  if (isNilOrBlank(remoteVersion)) {
26272
26279
  if (production && !silent)
26273
26280
  console.error('[platform] Cannot load remote app version. Skipping version check');
@@ -26363,7 +26370,7 @@ class PlatformService extends StartableService {
26363
26370
  console.error('cause', err.details);
26364
26371
  }
26365
26372
  }
26366
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, deps: [{ token: i2$1.Platform }, { token: i2$6.Platform }, { token: i3$5.Clipboard }, { token: i2$1.ToastController }, { token: i1$1.TranslateService }, { token: i1.MomentDateAdapter }, { token: EntitiesStorage }, { token: LocalSettingsService }, { token: NetworkService }, { token: AccountService }, { token: ConfigService }, { token: i4$1.CacheService }, { token: AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13$2.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
26373
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, deps: [{ token: i2$1.Platform }, { token: i2$6.Platform }, { token: i3$5.Clipboard }, { token: i2$1.ToastController }, { token: i1$1.TranslateService }, { token: i1.MomentDateAdapter }, { token: EntitiesStorage }, { token: LocalSettingsService }, { token: NetworkService }, { token: AccountService }, { token: ConfigService }, { token: i4$1.CacheService }, { token: AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13$2.Downloader, optional: true }, { token: APP_BASE_HREF, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
26367
26374
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, providedIn: 'root' });
26368
26375
  }
26369
26376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, decorators: [{
@@ -26379,6 +26386,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26379
26386
  args: [APP_LOGGING_SERVICE]
26380
26387
  }] }, { type: i13$2.Downloader, decorators: [{
26381
26388
  type: Optional
26389
+ }] }, { type: undefined, decorators: [{
26390
+ type: Optional
26391
+ }, {
26392
+ type: Inject,
26393
+ args: [APP_BASE_HREF]
26382
26394
  }] }] });
26383
26395
 
26384
26396
  // @dynamic
@@ -39845,7 +39857,7 @@ class AppTable {
39845
39857
  setFilter(filter, opts) {
39846
39858
  opts = opts || { emitEvent: true };
39847
39859
  // Prevent permanent selection change events
39848
- this.permanentSelectionChangedPrevented = toBoolean(opts.permanentSelectionChangedPrevented, this.permanentSelectionChangedPrevented);
39860
+ this.permanentSelectionChangedPrevented = opts.permanentSelectionChangedPrevented ?? this.permanentSelectionChangedPrevented;
39849
39861
  if (this.saveBeforeFilter) {
39850
39862
  // if a dirty table is to be saved before filter
39851
39863
  if (this.dirty) {