@sumaris-net/ngx-components 18.27.2 → 18.27.3
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/doc/changelog.md +11 -0
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/about/about.modal.mjs +61 -17
- package/esm2022/src/app/core/table/async-table.class.mjs +7 -1
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +1 -1
- package/esm2022/src/app/shared/alerts.mjs +42 -8
- package/esm2022/src/app/shared/gitlab/gitlab.utils.mjs +170 -0
- package/esm2022/src/app/shared/markdown/markdown.component.mjs +4 -3
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +3 -12
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +10 -4
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +41 -4
- package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +316 -35
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/about/about.modal.d.ts +8 -3
- package/src/app/shared/alerts.d.ts +39 -4
- package/src/app/shared/gitlab/gitlab.utils.d.ts +109 -0
- package/src/app/shared/markdown/markdown.utils.d.ts +0 -2
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +5 -1
- package/src/app/shared/upload-file/upload-file.component.d.ts +6 -2
- package/src/app/shared/upload-file/upload-file.model.d.ts +7 -0
- package/src/assets/i18n/en-US.json +2 -0
- package/src/assets/i18n/en.json +2 -0
- package/src/assets/i18n/fr.json +2 -0
- package/src/assets/manifest.json +1 -1
- package/testing/package.json +0 -3
|
@@ -16172,14 +16172,32 @@ class UploadFileComponent {
|
|
|
16172
16172
|
translate;
|
|
16173
16173
|
fileDropEl;
|
|
16174
16174
|
fileExtension;
|
|
16175
|
+
fileExtensionsExcluded = [];
|
|
16175
16176
|
uniqueFile = false;
|
|
16176
16177
|
instantUpload = false;
|
|
16177
16178
|
uploadFn;
|
|
16178
16179
|
deleteFn;
|
|
16179
16180
|
maxParallelUpload;
|
|
16181
|
+
maxFileSizeMb;
|
|
16180
16182
|
autoHideDropArea = false;
|
|
16181
16183
|
files = [];
|
|
16182
16184
|
uploading = false;
|
|
16185
|
+
checks = [
|
|
16186
|
+
// Check blacklisted extensions
|
|
16187
|
+
{
|
|
16188
|
+
isEnabled: () => !isEmptyArray(this.fileExtensionsExcluded),
|
|
16189
|
+
hasError: (file) => this.fileExtensionsExcluded
|
|
16190
|
+
.map((ext) => ext.toLowerCase())
|
|
16191
|
+
.some((ext) => file.name.toLowerCase().endsWith(ext)),
|
|
16192
|
+
error: 'FILE.UPLOAD.EXTENSION_NOT_ALLOWED_ERROR',
|
|
16193
|
+
},
|
|
16194
|
+
// Check max file size
|
|
16195
|
+
{
|
|
16196
|
+
isEnabled: () => isNotNil(this.maxFileSizeMb) && this.maxFileSizeMb > 0,
|
|
16197
|
+
hasError: (file) => file.size > this.maxFileSizeMb * 1024 * 1024,
|
|
16198
|
+
error: 'FILE.UPLOAD.MAX_FILE_SIZE_ERROR',
|
|
16199
|
+
},
|
|
16200
|
+
];
|
|
16183
16201
|
get processingFiles() {
|
|
16184
16202
|
return this.files.filter((f) => !f.deleting && isNotNil(f.progress) && f.progress < 1);
|
|
16185
16203
|
}
|
|
@@ -16260,6 +16278,7 @@ class UploadFileComponent {
|
|
|
16260
16278
|
items = files;
|
|
16261
16279
|
}
|
|
16262
16280
|
this.files.push(...items);
|
|
16281
|
+
this.checkFiles();
|
|
16263
16282
|
this.fileDropEl.nativeElement.value = '';
|
|
16264
16283
|
this.cd.markForCheck();
|
|
16265
16284
|
// Start upload
|
|
@@ -16267,6 +16286,20 @@ class UploadFileComponent {
|
|
|
16267
16286
|
this.uploadFiles(items);
|
|
16268
16287
|
}
|
|
16269
16288
|
}
|
|
16289
|
+
checkFiles() {
|
|
16290
|
+
const noCheckToDo = isEmptyArray(this.checks) || this.checks.every((check) => !check.isEnabled()) || isEmptyArray(this.files);
|
|
16291
|
+
if (noCheckToDo) {
|
|
16292
|
+
return;
|
|
16293
|
+
}
|
|
16294
|
+
this.checks
|
|
16295
|
+
.filter((check) => check.isEnabled())
|
|
16296
|
+
.flatMap((check) => this.files.map((file) => file).map((file) => ({ file, check })))
|
|
16297
|
+
.forEach((c) => {
|
|
16298
|
+
if (!c.file.error && c.check.hasError(c.file)) {
|
|
16299
|
+
c.file.error = c.check.error;
|
|
16300
|
+
}
|
|
16301
|
+
});
|
|
16302
|
+
}
|
|
16270
16303
|
/**
|
|
16271
16304
|
* Execute upload
|
|
16272
16305
|
*/
|
|
@@ -16345,16 +16378,18 @@ class UploadFileComponent {
|
|
|
16345
16378
|
return waitFor(() => this.processingFilesCount === 0, opts);
|
|
16346
16379
|
}
|
|
16347
16380
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFileComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
16348
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFileComponent, selector: "app-upload-file", inputs: { fileExtension: "fileExtension", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", autoHideDropArea: "autoHideDropArea" }, viewQueries: [{ propertyName: "fileDropEl", first: true, predicate: ["fileDropRef"], descendants: true }], ngImport: i0, template: "@if ((!uniqueFile && !autoHideDropArea) || files.length === 0) {\n <div class=\"container\" appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n <input\n type=\"file\"\n #fileDropRef\n id=\"fileDropRef\"\n [multiple]=\"!uniqueFile\"\n [accept]=\"fileExtension\"\n (change)=\"fileBrowseHandler($any($event.target).files)\"\n />\n <mat-icon style=\"font-size: xx-large\" color=\"accent\" class=\"text-size\">upload</mat-icon>\n <ion-label\n [innerHTML]=\"\n 'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n \"\n ></ion-label>\n <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n </div>\n}\n<div class=\"files-list\">\n <ion-list>\n @for (file of files; track file; let i = $index) {\n <ion-item>\n <mat-icon slot=\"start\">description</mat-icon>\n <div class=\"single-file\">\n <ion-label>\n <h4 class=\"name\" [class.deleting]=\"file.deleting\">\n {{ file.name }}\n </h4>\n <p>\n {{ file.size | fileSize }}\n </p>\n </ion-label>\n <ion-progress-bar\n *ngIf=\"uploading && !file.error\"\n [value]=\"file.progress || 0\"\n [type]=\"file.deleting || file.progress === -1 ? 'indeterminate' : 'determinate'\"\n ></ion-progress-bar>\n <ion-label
|
|
16381
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFileComponent, selector: "app-upload-file", inputs: { fileExtension: "fileExtension", fileExtensionsExcluded: "fileExtensionsExcluded", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", maxFileSizeMb: "maxFileSizeMb", autoHideDropArea: "autoHideDropArea" }, viewQueries: [{ propertyName: "fileDropEl", first: true, predicate: ["fileDropRef"], descendants: true }], ngImport: i0, template: "@if ((!uniqueFile && !autoHideDropArea) || files.length === 0) {\n <div class=\"container\" appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n <input\n type=\"file\"\n #fileDropRef\n id=\"fileDropRef\"\n [multiple]=\"!uniqueFile\"\n [accept]=\"fileExtension\"\n (change)=\"fileBrowseHandler($any($event.target).files)\"\n />\n <mat-icon style=\"font-size: xx-large\" color=\"accent\" class=\"text-size\">upload</mat-icon>\n <ion-label\n [innerHTML]=\"\n 'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n \"\n ></ion-label>\n <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n </div>\n}\n<div class=\"files-list\">\n <ion-list>\n @for (file of files; track file; let i = $index) {\n <ion-item>\n <mat-icon slot=\"start\">description</mat-icon>\n <div class=\"single-file\">\n <ion-label>\n <h4 class=\"name\" [class.deleting]=\"file.deleting\">\n {{ file.name }}\n </h4>\n <p>\n {{ file.size | fileSize }}\n </p>\n </ion-label>\n <ion-progress-bar\n *ngIf=\"uploading && !file.error\"\n [value]=\"file.progress || 0\"\n [type]=\"file.deleting || file.progress === -1 ? 'indeterminate' : 'determinate'\"\n ></ion-progress-bar>\n <ion-label\n *ngIf=\"file.error\"\n color=\"danger\"\n [innerHTML]=\"file.error| translate: { fileExtensionsExcluded: fileExtensionsExcluded.join(', '), maxFileSizeMb: maxFileSizeMb }\"\n ></ion-label>\n </div>\n <!-- remote from list (before importation) -->\n <button *ngIf=\"!file.progress || file.error\" mat-icon-button slot=\"end\" (click)=\"deleteFile(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n <!-- delete file (remotely - after importation) -->\n <button\n *ngIf=\"file.progress === 1 && !!deleteFn && !file.deleting\"\n mat-icon-button\n slot=\"end\"\n (click)=\"deleteFile(i)\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </ion-item>\n }\n </ion-list>\n</div>\n", styles: [".container{width:calc(100% - 3rem);min-height:200px;padding:2rem;text-align:center;border:dashed 1px #979797;position:relative;margin:1.5rem}.container input{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.container ion-label{display:block;font-size:20px;font-weight:600;color:#38424c}.container label{display:inline-block;color:#fff;width:183px;height:44px;border-radius:21.5px;background-color:#db202f;padding:8px 16px}.fileover{border:solid 1px var(--ion-color-accent)}.files-list{max-height:300px;overflow:auto}.files-list .single-file{display:flex;flex-direction:column}.files-list .single-file .name{word-break:break-all}.files-list .single-file .name.deleting{color:gray!important;font-style:italic!important}\n"], dependencies: [{ kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.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.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2$1.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: DragAndDropDirective, selector: "[appDragAndDrop]", outputs: ["fileDropped"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: FileSizePipe, name: "fileSize" }] });
|
|
16349
16382
|
}
|
|
16350
16383
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFileComponent, decorators: [{
|
|
16351
16384
|
type: Component,
|
|
16352
|
-
args: [{ selector: 'app-upload-file', template: "@if ((!uniqueFile && !autoHideDropArea) || files.length === 0) {\n <div class=\"container\" appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n <input\n type=\"file\"\n #fileDropRef\n id=\"fileDropRef\"\n [multiple]=\"!uniqueFile\"\n [accept]=\"fileExtension\"\n (change)=\"fileBrowseHandler($any($event.target).files)\"\n />\n <mat-icon style=\"font-size: xx-large\" color=\"accent\" class=\"text-size\">upload</mat-icon>\n <ion-label\n [innerHTML]=\"\n 'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n \"\n ></ion-label>\n <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n </div>\n}\n<div class=\"files-list\">\n <ion-list>\n @for (file of files; track file; let i = $index) {\n <ion-item>\n <mat-icon slot=\"start\">description</mat-icon>\n <div class=\"single-file\">\n <ion-label>\n <h4 class=\"name\" [class.deleting]=\"file.deleting\">\n {{ file.name }}\n </h4>\n <p>\n {{ file.size | fileSize }}\n </p>\n </ion-label>\n <ion-progress-bar\n *ngIf=\"uploading && !file.error\"\n [value]=\"file.progress || 0\"\n [type]=\"file.deleting || file.progress === -1 ? 'indeterminate' : 'determinate'\"\n ></ion-progress-bar>\n <ion-label
|
|
16385
|
+
args: [{ selector: 'app-upload-file', template: "@if ((!uniqueFile && !autoHideDropArea) || files.length === 0) {\n <div class=\"container\" appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n <input\n type=\"file\"\n #fileDropRef\n id=\"fileDropRef\"\n [multiple]=\"!uniqueFile\"\n [accept]=\"fileExtension\"\n (change)=\"fileBrowseHandler($any($event.target).files)\"\n />\n <mat-icon style=\"font-size: xx-large\" color=\"accent\" class=\"text-size\">upload</mat-icon>\n <ion-label\n [innerHTML]=\"\n 'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n \"\n ></ion-label>\n <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n </div>\n}\n<div class=\"files-list\">\n <ion-list>\n @for (file of files; track file; let i = $index) {\n <ion-item>\n <mat-icon slot=\"start\">description</mat-icon>\n <div class=\"single-file\">\n <ion-label>\n <h4 class=\"name\" [class.deleting]=\"file.deleting\">\n {{ file.name }}\n </h4>\n <p>\n {{ file.size | fileSize }}\n </p>\n </ion-label>\n <ion-progress-bar\n *ngIf=\"uploading && !file.error\"\n [value]=\"file.progress || 0\"\n [type]=\"file.deleting || file.progress === -1 ? 'indeterminate' : 'determinate'\"\n ></ion-progress-bar>\n <ion-label\n *ngIf=\"file.error\"\n color=\"danger\"\n [innerHTML]=\"file.error| translate: { fileExtensionsExcluded: fileExtensionsExcluded.join(', '), maxFileSizeMb: maxFileSizeMb }\"\n ></ion-label>\n </div>\n <!-- remote from list (before importation) -->\n <button *ngIf=\"!file.progress || file.error\" mat-icon-button slot=\"end\" (click)=\"deleteFile(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n <!-- delete file (remotely - after importation) -->\n <button\n *ngIf=\"file.progress === 1 && !!deleteFn && !file.deleting\"\n mat-icon-button\n slot=\"end\"\n (click)=\"deleteFile(i)\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </ion-item>\n }\n </ion-list>\n</div>\n", styles: [".container{width:calc(100% - 3rem);min-height:200px;padding:2rem;text-align:center;border:dashed 1px #979797;position:relative;margin:1.5rem}.container input{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.container ion-label{display:block;font-size:20px;font-weight:600;color:#38424c}.container label{display:inline-block;color:#fff;width:183px;height:44px;border-radius:21.5px;background-color:#db202f;padding:8px 16px}.fileover{border:solid 1px var(--ion-color-accent)}.files-list{max-height:300px;overflow:auto}.files-list .single-file{display:flex;flex-direction:column}.files-list .single-file .name{word-break:break-all}.files-list .single-file .name.deleting{color:gray!important;font-style:italic!important}\n"] }]
|
|
16353
16386
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { fileDropEl: [{
|
|
16354
16387
|
type: ViewChild,
|
|
16355
16388
|
args: ['fileDropRef', { static: false }]
|
|
16356
16389
|
}], fileExtension: [{
|
|
16357
16390
|
type: Input
|
|
16391
|
+
}], fileExtensionsExcluded: [{
|
|
16392
|
+
type: Input
|
|
16358
16393
|
}], uniqueFile: [{
|
|
16359
16394
|
type: Input
|
|
16360
16395
|
}], instantUpload: [{
|
|
@@ -16365,6 +16400,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16365
16400
|
type: Input
|
|
16366
16401
|
}], maxParallelUpload: [{
|
|
16367
16402
|
type: Input
|
|
16403
|
+
}], maxFileSizeMb: [{
|
|
16404
|
+
type: Input
|
|
16368
16405
|
}], autoHideDropArea: [{
|
|
16369
16406
|
type: Input
|
|
16370
16407
|
}] } });
|
|
@@ -16375,12 +16412,14 @@ class UploadFilePopover {
|
|
|
16375
16412
|
cd;
|
|
16376
16413
|
uploader;
|
|
16377
16414
|
fileExtension;
|
|
16415
|
+
fileExtensionsExcluded = [];
|
|
16378
16416
|
title;
|
|
16379
16417
|
uniqueFile = false;
|
|
16380
16418
|
instantUpload = false;
|
|
16381
16419
|
uploadFn;
|
|
16382
16420
|
deleteFn;
|
|
16383
16421
|
maxParallelUpload;
|
|
16422
|
+
maxFileSizeMb;
|
|
16384
16423
|
autoHideDropArea = false;
|
|
16385
16424
|
okButtonText = 'COMMON.BTN_IMPORT';
|
|
16386
16425
|
cancelButtonText = 'COMMON.BTN_CANCEL';
|
|
@@ -16390,7 +16429,7 @@ class UploadFilePopover {
|
|
|
16390
16429
|
return this.uploader.files;
|
|
16391
16430
|
}
|
|
16392
16431
|
get disabled() {
|
|
16393
|
-
return this.importing || isEmptyArray(this.files);
|
|
16432
|
+
return this.importing || isEmptyArray(this.files) || this.files.every((file) => file.error);
|
|
16394
16433
|
}
|
|
16395
16434
|
get valid() {
|
|
16396
16435
|
return isNotEmptyArray(this.files);
|
|
@@ -16447,16 +16486,18 @@ class UploadFilePopover {
|
|
|
16447
16486
|
}
|
|
16448
16487
|
}
|
|
16449
16488
|
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 });
|
|
16450
|
-
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 \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 });
|
|
16489
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UploadFilePopover, selector: "app-upload-file-popover", inputs: { fileExtension: "fileExtension", fileExtensionsExcluded: "fileExtensionsExcluded", title: "title", uniqueFile: "uniqueFile", instantUpload: "instantUpload", uploadFn: "uploadFn", deleteFn: "deleteFn", maxParallelUpload: "maxParallelUpload", maxFileSizeMb: "maxFileSizeMb", 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 [fileExtensionsExcluded]=\"fileExtensionsExcluded\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\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 \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", "fileExtensionsExcluded", "uniqueFile", "instantUpload", "uploadFn", "deleteFn", "maxParallelUpload", "maxFileSizeMb", "autoHideDropArea"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
16451
16490
|
}
|
|
16452
16491
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UploadFilePopover, decorators: [{
|
|
16453
16492
|
type: Component,
|
|
16454
|
-
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 \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"] }]
|
|
16493
|
+
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 [fileExtensionsExcluded]=\"fileExtensionsExcluded\"\n [instantUpload]=\"instantUpload\"\n [uniqueFile]=\"uniqueFile\"\n [maxParallelUpload]=\"maxParallelUpload\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\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 \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"] }]
|
|
16455
16494
|
}], ctorParameters: () => [{ type: i2$1.PopoverController }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { uploader: [{
|
|
16456
16495
|
type: ViewChild,
|
|
16457
16496
|
args: ['uploader', { static: true }]
|
|
16458
16497
|
}], fileExtension: [{
|
|
16459
16498
|
type: Input
|
|
16499
|
+
}], fileExtensionsExcluded: [{
|
|
16500
|
+
type: Input
|
|
16460
16501
|
}], title: [{
|
|
16461
16502
|
type: Input
|
|
16462
16503
|
}], uniqueFile: [{
|
|
@@ -16469,6 +16510,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16469
16510
|
type: Input
|
|
16470
16511
|
}], maxParallelUpload: [{
|
|
16471
16512
|
type: Input
|
|
16513
|
+
}], maxFileSizeMb: [{
|
|
16514
|
+
type: Input
|
|
16472
16515
|
}], autoHideDropArea: [{
|
|
16473
16516
|
type: Input
|
|
16474
16517
|
}], okButtonText: [{
|
|
@@ -27819,8 +27862,11 @@ class Alerts {
|
|
|
27819
27862
|
* @param alertCtrl
|
|
27820
27863
|
* @param translate
|
|
27821
27864
|
* @param event
|
|
27865
|
+
* @param opts
|
|
27866
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
27867
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
27822
27868
|
*/
|
|
27823
|
-
static async askSaveBeforeLeave(alertCtrl, translate, event) {
|
|
27869
|
+
static async askSaveBeforeLeave(alertCtrl, translate, event, opts) {
|
|
27824
27870
|
let confirm = false;
|
|
27825
27871
|
let cancel = false;
|
|
27826
27872
|
const translations = translate.instant([
|
|
@@ -27854,6 +27900,8 @@ class Alerts {
|
|
|
27854
27900
|
},
|
|
27855
27901
|
},
|
|
27856
27902
|
],
|
|
27903
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
27904
|
+
keyboardClose: opts?.keyboardClose,
|
|
27857
27905
|
});
|
|
27858
27906
|
await alert.present();
|
|
27859
27907
|
await alert.onDidDismiss();
|
|
@@ -27875,10 +27923,13 @@ class Alerts {
|
|
|
27875
27923
|
* @param immediate is action has an immediate effect ?
|
|
27876
27924
|
* @param event
|
|
27877
27925
|
* @param interpolateParams
|
|
27926
|
+
* @param opts
|
|
27927
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
27928
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
27878
27929
|
*/
|
|
27879
|
-
static async askActionConfirmation(alertCtrl, translate, immediate, event, interpolateParams) {
|
|
27930
|
+
static async askActionConfirmation(alertCtrl, translate, immediate, event, opts, interpolateParams) {
|
|
27880
27931
|
const messageKey = immediate === true ? 'CONFIRM.ACTION_IMMEDIATE' : 'CONFIRM.ACTION';
|
|
27881
|
-
return Alerts.askConfirmation(messageKey, alertCtrl, translate, event, interpolateParams);
|
|
27932
|
+
return Alerts.askConfirmation(messageKey, alertCtrl, translate, event, opts, interpolateParams);
|
|
27882
27933
|
}
|
|
27883
27934
|
/**
|
|
27884
27935
|
* Ask the user to confirm. If return undefined: user has cancelled
|
|
@@ -27889,13 +27940,21 @@ class Alerts {
|
|
|
27889
27940
|
* @param translate
|
|
27890
27941
|
* @param event
|
|
27891
27942
|
* @param interpolateParams
|
|
27943
|
+
* @param opts
|
|
27944
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
27945
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
27946
|
+
*
|
|
27947
|
+
* Note: interpolateParams and opts are merged for translation for compatibility
|
|
27892
27948
|
*/
|
|
27893
|
-
static async askConfirmation(messageKey, alertCtrl, translate, event, interpolateParams) {
|
|
27949
|
+
static async askConfirmation(messageKey, alertCtrl, translate, event, opts, interpolateParams) {
|
|
27894
27950
|
if (!alertCtrl || !translate)
|
|
27895
27951
|
throw new Error("Missing required argument 'alertCtrl' or 'translate'");
|
|
27896
27952
|
let confirm = false;
|
|
27897
27953
|
let cancel = false;
|
|
27898
|
-
const translations = translate.instant(['COMMON.BTN_YES_CONTINUE', 'COMMON.BTN_CANCEL', messageKey, 'CONFIRM.ALERT_HEADER'],
|
|
27954
|
+
const translations = translate.instant(['COMMON.BTN_YES_CONTINUE', 'COMMON.BTN_CANCEL', messageKey, 'CONFIRM.ALERT_HEADER'], {
|
|
27955
|
+
...interpolateParams,
|
|
27956
|
+
...opts,
|
|
27957
|
+
});
|
|
27899
27958
|
const alert = await alertCtrl.create({
|
|
27900
27959
|
header: translations['CONFIRM.ALERT_HEADER'],
|
|
27901
27960
|
message: translations[messageKey],
|
|
@@ -27915,6 +27974,8 @@ class Alerts {
|
|
|
27915
27974
|
},
|
|
27916
27975
|
},
|
|
27917
27976
|
],
|
|
27977
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
27978
|
+
keyboardClose: opts?.keyboardClose,
|
|
27918
27979
|
});
|
|
27919
27980
|
await alert.present();
|
|
27920
27981
|
await alert.onDidDismiss();
|
|
@@ -27935,11 +27996,19 @@ class Alerts {
|
|
|
27935
27996
|
* @param translate
|
|
27936
27997
|
* @param event
|
|
27937
27998
|
* @param interpolateParams
|
|
27999
|
+
* @param opts
|
|
28000
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
28001
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
28002
|
+
*
|
|
28003
|
+
* Note: interpolateParams and opts are merged for translation for compatibility
|
|
27938
28004
|
*/
|
|
27939
|
-
static async askDeleteConfirmation(alertCtrl, translate, event, interpolateParams) {
|
|
28005
|
+
static async askDeleteConfirmation(alertCtrl, translate, event, opts, interpolateParams) {
|
|
27940
28006
|
let confirm = false;
|
|
27941
28007
|
let cancel = false;
|
|
27942
|
-
const translations = translate.instant(['COMMON.BTN_YES_DELETE', 'COMMON.BTN_CANCEL', 'CONFIRM.DELETE', 'CONFIRM.ALERT_HEADER'],
|
|
28008
|
+
const translations = translate.instant(['COMMON.BTN_YES_DELETE', 'COMMON.BTN_CANCEL', 'CONFIRM.DELETE', 'CONFIRM.ALERT_HEADER'], {
|
|
28009
|
+
...interpolateParams,
|
|
28010
|
+
...opts,
|
|
28011
|
+
});
|
|
27943
28012
|
const alert = await alertCtrl.create({
|
|
27944
28013
|
header: translations['CONFIRM.ALERT_HEADER'],
|
|
27945
28014
|
message: translations['CONFIRM.DELETE'],
|
|
@@ -27959,6 +28028,8 @@ class Alerts {
|
|
|
27959
28028
|
},
|
|
27960
28029
|
},
|
|
27961
28030
|
],
|
|
28031
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
28032
|
+
keyboardClose: opts?.keyboardClose,
|
|
27962
28033
|
});
|
|
27963
28034
|
await alert.present();
|
|
27964
28035
|
await alert.onDidDismiss();
|
|
@@ -28006,6 +28077,8 @@ class Alerts {
|
|
|
28006
28077
|
},
|
|
28007
28078
|
},
|
|
28008
28079
|
],
|
|
28080
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
28081
|
+
keyboardClose: opts?.keyboardClose,
|
|
28009
28082
|
});
|
|
28010
28083
|
}
|
|
28011
28084
|
else {
|
|
@@ -28027,6 +28100,8 @@ class Alerts {
|
|
|
28027
28100
|
handler: () => { },
|
|
28028
28101
|
},
|
|
28029
28102
|
],
|
|
28103
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
28104
|
+
keyboardClose: opts?.keyboardClose,
|
|
28030
28105
|
});
|
|
28031
28106
|
}
|
|
28032
28107
|
await alert.present();
|
|
@@ -28047,6 +28122,8 @@ class Alerts {
|
|
|
28047
28122
|
role: 'cancel',
|
|
28048
28123
|
},
|
|
28049
28124
|
],
|
|
28125
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
28126
|
+
keyboardClose: opts?.keyboardClose,
|
|
28050
28127
|
});
|
|
28051
28128
|
await alert.present();
|
|
28052
28129
|
await alert.onDidDismiss();
|
|
@@ -32131,6 +32208,174 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
32131
32208
|
}]
|
|
32132
32209
|
}] });
|
|
32133
32210
|
|
|
32211
|
+
class GitlabUtils {
|
|
32212
|
+
static API_V4_PATH = '/api/v4/';
|
|
32213
|
+
static API_V4_PROJECTS_PATH = '/api/v4/projects/';
|
|
32214
|
+
/**
|
|
32215
|
+
* Checks whether a URL points to a Gitlab instance.
|
|
32216
|
+
*
|
|
32217
|
+
* A URL is considered a Gitlab URL either when its host starts with 'gitlab.'
|
|
32218
|
+
* (e.g. 'https://gitlab.ifremer.fr/...'), or when it is a repository file URL
|
|
32219
|
+
* (see {@link isRepoFileUrl}) - in which case the host is NOT checked, since
|
|
32220
|
+
* a self-hosted Gitlab instance may use a custom domain name.
|
|
32221
|
+
*
|
|
32222
|
+
* @example
|
|
32223
|
+
* GitlabUtils.isGitlabUrl('https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app'); // true
|
|
32224
|
+
* GitlabUtils.isGitlabUrl('https://my-custom-domain.com/foo/-/raw/master/README.md'); // true (repo file URL)
|
|
32225
|
+
* GitlabUtils.isGitlabUrl('https://github.com/foo/bar'); // false
|
|
32226
|
+
*/
|
|
32227
|
+
static isGitlabUrl(url) {
|
|
32228
|
+
if (!url)
|
|
32229
|
+
return false;
|
|
32230
|
+
return url.startsWith('https://gitlab.') || GitlabUtils.isRepoFileUrl(url);
|
|
32231
|
+
}
|
|
32232
|
+
/**
|
|
32233
|
+
* Checks whether a URL is a Gitlab repository file URL, i.e. a URL used to
|
|
32234
|
+
* view a single file in a repository ('/-/blob/') or to download its raw
|
|
32235
|
+
* content ('/-/raw/').
|
|
32236
|
+
*
|
|
32237
|
+
* @example
|
|
32238
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/raw/master/README.md'); // true
|
|
32239
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/blob/master/README.md'); // true
|
|
32240
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/api/v4/projects/a%2Fb'); // false
|
|
32241
|
+
*/
|
|
32242
|
+
static isRepoFileUrl(url) {
|
|
32243
|
+
if (!url)
|
|
32244
|
+
return false;
|
|
32245
|
+
return url.includes('/-/raw/') || url.includes('/-/blob/');
|
|
32246
|
+
}
|
|
32247
|
+
/**
|
|
32248
|
+
* Converts a repository file URL into its 'raw content' equivalent, by
|
|
32249
|
+
* replacing the '/-/blob/' (file viewer) or '/-/tree/' (directory viewer)
|
|
32250
|
+
* segment with '/-/raw/'.
|
|
32251
|
+
*
|
|
32252
|
+
* If the URL is not a repository file URL (see {@link isRepoFileUrl}), it is
|
|
32253
|
+
* returned unchanged.
|
|
32254
|
+
*
|
|
32255
|
+
* @example
|
|
32256
|
+
* GitlabUtils.getRawRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/blob/master/README.md');
|
|
32257
|
+
* // 'https://gitlab.ifremer.fr/a/b/-/raw/master/README.md'
|
|
32258
|
+
*/
|
|
32259
|
+
static getRawRepoFileUrl(url) {
|
|
32260
|
+
if (!GitlabUtils.isRepoFileUrl(url))
|
|
32261
|
+
return url;
|
|
32262
|
+
return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');
|
|
32263
|
+
}
|
|
32264
|
+
/**
|
|
32265
|
+
* Checks whether a URL targets the Gitlab REST API (any endpoint under
|
|
32266
|
+
* '/api/v4/'). Repository file URLs (see {@link isRepoFileUrl}) are always
|
|
32267
|
+
* excluded, even if they happen to contain '/api/v4/' somewhere in their path.
|
|
32268
|
+
*/
|
|
32269
|
+
static isApiUrl(url) {
|
|
32270
|
+
if (!url || GitlabUtils.isRepoFileUrl(url))
|
|
32271
|
+
return false;
|
|
32272
|
+
return url.includes(GitlabUtils.API_V4_PATH);
|
|
32273
|
+
}
|
|
32274
|
+
/**
|
|
32275
|
+
* Checks whether a URL targets the Gitlab 'projects' REST API (any endpoint
|
|
32276
|
+
* under '/api/v4/projects/'), e.g. project releases, branches, etc.
|
|
32277
|
+
*/
|
|
32278
|
+
static isApiProjectsUrl(url) {
|
|
32279
|
+
if (!url || GitlabUtils.isRepoFileUrl(url))
|
|
32280
|
+
return false;
|
|
32281
|
+
return url.includes(GitlabUtils.API_V4_PROJECTS_PATH);
|
|
32282
|
+
}
|
|
32283
|
+
/**
|
|
32284
|
+
* Checks whether a URL targets the Gitlab project releases REST API, e.g.
|
|
32285
|
+
* 'https://gitlab.ifremer.fr/api/v4/projects/{id}/releases' (all releases)
|
|
32286
|
+
* or 'https://gitlab.ifremer.fr/api/v4/projects/{id}/releases/{tag_name}'
|
|
32287
|
+
* (a single release).
|
|
32288
|
+
*/
|
|
32289
|
+
static isProjectReleasesApiUrl(url) {
|
|
32290
|
+
return GitlabUtils.isApiProjectsUrl(url) && url.includes('/releases');
|
|
32291
|
+
}
|
|
32292
|
+
/**
|
|
32293
|
+
* Fetches releases from the Gitlab project releases REST API.
|
|
32294
|
+
*
|
|
32295
|
+
* The given URL can either target the collection endpoint
|
|
32296
|
+
* ('.../releases', returning all releases), or a single release endpoint
|
|
32297
|
+
* ('.../releases/{tag_name}', returning one release, wrapped into an array).
|
|
32298
|
+
*
|
|
32299
|
+
* @return the list of releases, an empty array if the API call failed for a
|
|
32300
|
+
* single release, or `null` if the URL is not a project releases API URL.
|
|
32301
|
+
*/
|
|
32302
|
+
static async getProjectReleases(http, url) {
|
|
32303
|
+
if (!GitlabUtils.isProjectReleasesApiUrl(url))
|
|
32304
|
+
return null;
|
|
32305
|
+
// Many releases API urls end with /releases
|
|
32306
|
+
if (url.trim().endsWith('/releases')) {
|
|
32307
|
+
return await HttpUtils.getJson(http, url);
|
|
32308
|
+
}
|
|
32309
|
+
// One release API url
|
|
32310
|
+
try {
|
|
32311
|
+
const release = await HttpUtils.getJson(http, url);
|
|
32312
|
+
return release ? [release] : [];
|
|
32313
|
+
}
|
|
32314
|
+
catch (err) {
|
|
32315
|
+
console.error('Failed to fetch release from the Gitlab API ' + url, err);
|
|
32316
|
+
return null;
|
|
32317
|
+
}
|
|
32318
|
+
}
|
|
32319
|
+
/**
|
|
32320
|
+
* Extracts the URL-encoded project path (e.g. 'group%2Fsubgroup%2Fproject')
|
|
32321
|
+
* from a Gitlab 'projects' API URL. The returned value is NOT decoded, so it
|
|
32322
|
+
* still contains '%2F' in place of '/'.
|
|
32323
|
+
*
|
|
32324
|
+
* @example
|
|
32325
|
+
* GitlabUtils.getProjectNameFromApiUrl('https://gitlab.ifremer.fr/api/v4/projects/sih-public%2Fsumaris%2Fsumaris-app/releases');
|
|
32326
|
+
* // 'sih-public%2Fsumaris%2Fsumaris-app'
|
|
32327
|
+
*/
|
|
32328
|
+
static getProjectNameFromApiUrl(url) {
|
|
32329
|
+
if (!url?.includes(GitlabUtils.API_V4_PROJECTS_PATH))
|
|
32330
|
+
return null;
|
|
32331
|
+
return url.slice(url.indexOf(GitlabUtils.API_V4_PROJECTS_PATH) + GitlabUtils.API_V4_PROJECTS_PATH.length)
|
|
32332
|
+
.split('/', 2)[0];
|
|
32333
|
+
}
|
|
32334
|
+
/**
|
|
32335
|
+
* Resolves the Gitlab web page associated to a URL:
|
|
32336
|
+
* - for an API 'projects' URL (see {@link isApiUrl}), this is the project's
|
|
32337
|
+
* home page, e.g. 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app';
|
|
32338
|
+
* - for a repository file URL (see {@link isRepoFileUrl}), this is the
|
|
32339
|
+
* project's raw content base path (e.g. '.../my-project/-/raw/'), since
|
|
32340
|
+
* the project path cannot be reliably distinguished from the file path
|
|
32341
|
+
* once slashes are un-encoded.
|
|
32342
|
+
*
|
|
32343
|
+
* @return `null` if the project page cannot be resolved from the given URL.
|
|
32344
|
+
*/
|
|
32345
|
+
static getProjectPage(url) {
|
|
32346
|
+
if (GitlabUtils.isRepoFileUrl(url)) {
|
|
32347
|
+
const fixUrl = GitlabUtils.getRawRepoFileUrl(url);
|
|
32348
|
+
const index = fixUrl.indexOf('/-/raw/');
|
|
32349
|
+
if (index >= 0)
|
|
32350
|
+
return fixUrl.slice(0, index + '/-/raw/'.length);
|
|
32351
|
+
}
|
|
32352
|
+
else if (GitlabUtils.isApiUrl(url)) {
|
|
32353
|
+
const index = url.indexOf(GitlabUtils.API_V4_PROJECTS_PATH);
|
|
32354
|
+
if (index >= 0) {
|
|
32355
|
+
const baseUrl = url.slice(0, index);
|
|
32356
|
+
const projectName = GitlabUtils.getProjectNameFromApiUrl(url);
|
|
32357
|
+
return UrlUtils.concat(baseUrl, projectName.replace(/%2F/g, '/'));
|
|
32358
|
+
}
|
|
32359
|
+
}
|
|
32360
|
+
return null;
|
|
32361
|
+
}
|
|
32362
|
+
/**
|
|
32363
|
+
* Builds the URL of the Gitlab web page listing a project's releases (e.g.
|
|
32364
|
+
* 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/releases'),
|
|
32365
|
+
* optionally anchored on a specific version/tag.
|
|
32366
|
+
*
|
|
32367
|
+
* @param url any URL from which the project page can be resolved (see {@link getProjectPage})
|
|
32368
|
+
* @param version optional tag name (e.g. '2.16.2') appended to the releases page
|
|
32369
|
+
* @return `null` if the project page cannot be resolved from the given URL.
|
|
32370
|
+
*/
|
|
32371
|
+
static getProjectReleasePage(url, version) {
|
|
32372
|
+
const basePath = GitlabUtils.getProjectPage(url);
|
|
32373
|
+
if (!basePath)
|
|
32374
|
+
return null;
|
|
32375
|
+
return UrlUtils.concat(UrlUtils.concat(basePath, '/-/releases'), version);
|
|
32376
|
+
}
|
|
32377
|
+
}
|
|
32378
|
+
|
|
32134
32379
|
class MarkdownUtils {
|
|
32135
32380
|
static HTML_ENTITIES_MAP = {
|
|
32136
32381
|
''': "'", // Single quote
|
|
@@ -32191,18 +32436,8 @@ class MarkdownUtils {
|
|
|
32191
32436
|
}
|
|
32192
32437
|
return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));
|
|
32193
32438
|
}
|
|
32194
|
-
static isGitlabUrl(url) {
|
|
32195
|
-
if (!url)
|
|
32196
|
-
return false;
|
|
32197
|
-
return url.startsWith('https://gitlab.') || url.includes('/-/raw/') || url.includes('/-/blob/');
|
|
32198
|
-
}
|
|
32199
|
-
static fixGitlabUrlToRaw(url) {
|
|
32200
|
-
if (!this.isGitlabUrl(url))
|
|
32201
|
-
return url;
|
|
32202
|
-
return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');
|
|
32203
|
-
}
|
|
32204
32439
|
static getRootUrl(url) {
|
|
32205
|
-
if (
|
|
32440
|
+
if (GitlabUtils.isRepoFileUrl(url)) {
|
|
32206
32441
|
console.debug('[markdown] Gitlab URL detected: ' + url);
|
|
32207
32442
|
url = url.replace('/-/blob/', '/-/raw/');
|
|
32208
32443
|
if (url.includes('/-/raw/')) {
|
|
@@ -32901,9 +33136,9 @@ class AppMarkdownContent {
|
|
|
32901
33136
|
// Clean URL (remove fragment and query)
|
|
32902
33137
|
const anchor = opts?.anchor || UrlUtils.getFragment(src);
|
|
32903
33138
|
src = UrlUtils.stripFragmentAndQuery(src);
|
|
32904
|
-
src =
|
|
33139
|
+
src = GitlabUtils.isRepoFileUrl(src) ? GitlabUtils.getRawRepoFileUrl(src) : src;
|
|
32905
33140
|
let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
|
|
32906
|
-
fallbackSrc =
|
|
33141
|
+
fallbackSrc = GitlabUtils.isRepoFileUrl(fallbackSrc) ? GitlabUtils.getRawRepoFileUrl(fallbackSrc) : fallbackSrc;
|
|
32907
33142
|
if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
|
|
32908
33143
|
const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
|
|
32909
33144
|
if (url)
|
|
@@ -33212,6 +33447,8 @@ class AboutModal {
|
|
|
33212
33447
|
modalController;
|
|
33213
33448
|
configService;
|
|
33214
33449
|
networkService;
|
|
33450
|
+
platformService;
|
|
33451
|
+
http;
|
|
33215
33452
|
cd;
|
|
33216
33453
|
environment;
|
|
33217
33454
|
developers;
|
|
@@ -33232,11 +33469,13 @@ class AboutModal {
|
|
|
33232
33469
|
get allowVersionDetails() {
|
|
33233
33470
|
return !!this.buildDate || !!this.nodeInfo?.softwareVersion;
|
|
33234
33471
|
}
|
|
33235
|
-
constructor(translate, modalController, configService, networkService, cd, environment, developers, partners) {
|
|
33472
|
+
constructor(translate, modalController, configService, networkService, platformService, http, cd, environment, developers, partners) {
|
|
33236
33473
|
this.translate = translate;
|
|
33237
33474
|
this.modalController = modalController;
|
|
33238
33475
|
this.configService = configService;
|
|
33239
33476
|
this.networkService = networkService;
|
|
33477
|
+
this.platformService = platformService;
|
|
33478
|
+
this.http = http;
|
|
33240
33479
|
this.cd = cd;
|
|
33241
33480
|
this.environment = environment;
|
|
33242
33481
|
this.developers = developers;
|
|
@@ -33270,20 +33509,56 @@ class AboutModal {
|
|
|
33270
33509
|
this.forumUrl = config?.getProperty(CORE_CONFIG_OPTIONS.FORUM_URL) || this.environment?.forumUrl;
|
|
33271
33510
|
this.helpUrl = config?.getProperty(CORE_CONFIG_OPTIONS.HELP_URL) || this.environment?.helpUrl;
|
|
33272
33511
|
this.reportIssueUrl = config?.getProperty(CORE_CONFIG_OPTIONS.REPORT_ISSUE_URL) || this.environment?.reportIssueUrl;
|
|
33273
|
-
this.changelogUrl = config
|
|
33274
|
-
if (isNotNilOrBlank(this.changelogUrl)) {
|
|
33275
|
-
// Replace version placeholder
|
|
33276
|
-
this.changelogUrl = this.changelogUrl.replace('{version}', this.environment?.version);
|
|
33277
|
-
}
|
|
33512
|
+
this.changelogUrl = this.getChangelogUrl(config);
|
|
33278
33513
|
this.buildDate = this.environment?.buildDate;
|
|
33279
33514
|
}
|
|
33515
|
+
getChangelogUrl(config) {
|
|
33516
|
+
let changelogUrl = config?.getProperty(CORE_CONFIG_OPTIONS.CHANGELOG_URL) || this.environment?.changelogUrl;
|
|
33517
|
+
// Replace {version} placeholder
|
|
33518
|
+
if (isNotNilOrBlank(changelogUrl) && isNotNilOrBlank(this.environment?.version)) {
|
|
33519
|
+
changelogUrl = changelogUrl.replace('{version}', this.environment.version);
|
|
33520
|
+
}
|
|
33521
|
+
return changelogUrl;
|
|
33522
|
+
}
|
|
33280
33523
|
async openChangelog(event) {
|
|
33281
33524
|
event.preventDefault();
|
|
33525
|
+
event.stopPropagation();
|
|
33282
33526
|
if (!this.changelogUrl)
|
|
33283
33527
|
return;
|
|
33528
|
+
const title = this.translate.instant('ABOUT.BTN_CHANGELOG');
|
|
33529
|
+
const canPrint = !this.platformService.mobile;
|
|
33530
|
+
const version = this.environment?.version;
|
|
33531
|
+
// Detect gitlab API
|
|
33532
|
+
if (GitlabUtils.isProjectReleasesApiUrl(this.changelogUrl)) {
|
|
33533
|
+
let releases = await GitlabUtils.getProjectReleases(this.http, this.changelogUrl);
|
|
33534
|
+
// Filter releases by version compatibility
|
|
33535
|
+
if (isNotNilOrBlank(version)) {
|
|
33536
|
+
const index = releases.findIndex(r => r.tag_name == version);
|
|
33537
|
+
if (index >= 0)
|
|
33538
|
+
releases = releases.slice(index);
|
|
33539
|
+
releases = releases.filter(r => VersionUtils.isCompatible(r.tag_name, version));
|
|
33540
|
+
}
|
|
33541
|
+
const content = releases.map(r => `### ${r.name ?? r.tag_name}\n\n${r.description}`)
|
|
33542
|
+
.join('\n\n---\n');
|
|
33543
|
+
if (isNotNilOrBlank(content)) {
|
|
33544
|
+
return await AppMarkdownModal.show(this.modalController, {
|
|
33545
|
+
title,
|
|
33546
|
+
data: content,
|
|
33547
|
+
canPrint
|
|
33548
|
+
});
|
|
33549
|
+
}
|
|
33550
|
+
console.warn(`[about] No compatible release found, from the Gitlab release API: ${this.changelogUrl}`);
|
|
33551
|
+
// Open the gitlab release page
|
|
33552
|
+
const releasePage = GitlabUtils.getProjectReleasePage(this.changelogUrl, version);
|
|
33553
|
+
if (isNotNilOrBlank(releasePage)) {
|
|
33554
|
+
console.info(`[about] Redirecting to the page ${releasePage}`);
|
|
33555
|
+
return this.platformService.open(releasePage);
|
|
33556
|
+
}
|
|
33557
|
+
}
|
|
33284
33558
|
await AppMarkdownModal.show(this.modalController, {
|
|
33285
|
-
title
|
|
33559
|
+
title,
|
|
33286
33560
|
src: this.changelogUrl,
|
|
33561
|
+
canPrint
|
|
33287
33562
|
});
|
|
33288
33563
|
}
|
|
33289
33564
|
async loadNodeInfo() {
|
|
@@ -33301,13 +33576,13 @@ class AboutModal {
|
|
|
33301
33576
|
return null;
|
|
33302
33577
|
}
|
|
33303
33578
|
}
|
|
33304
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AboutModal, deps: [{ token: i1$1.TranslateService }, { token: i2$1.ModalController }, { token: ConfigService }, { token: NetworkService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }, { token: APP_ABOUT_DEVELOPERS, optional: true }, { token: APP_ABOUT_PARTNERS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
33579
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AboutModal, deps: [{ token: i1$1.TranslateService }, { token: i2$1.ModalController }, { token: ConfigService }, { token: NetworkService }, { token: PlatformService }, { token: i2$3.HttpClient }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }, { token: APP_ABOUT_DEVELOPERS, optional: true }, { token: APP_ABOUT_PARTNERS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
33305
33580
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AboutModal, selector: "app-about-modal", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n @if (config$ | async; as config) {\n <ion-item>\n <span slot=\"start\"> </span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label | capitalize }}</b>\n @if (config.name) {\n -\n <span [innerHTML]=\"config.name\"></span>\n }\n </h2>\n\n @if (config.description) {\n <p>\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n }\n </ion-label>\n </ion-item>\n }\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\"> </span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n @if (name) {\n <small>{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n }\n @if (version) {\n <span [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n }\n @if(allowVersionDetails) {\n \n <small>\n <a (click)=\"showVersionDetails=!showVersionDetails\" tappable>\n {{'COMMON.BTN_SHOW_MORE' | translate}}\n <ion-icon [name]=\"!showVersionDetails ? 'chevron-down' : 'chevron-up'\"></ion-icon>\n </a>\n @if (changelogUrl) {\n \n <a (click)=\"openChangelog($event)\"\n [href]=\"changelogUrl\"\n tappable translate>ABOUT.BTN_CHANGELOG</a>\n }\n </small>\n }\n </h2>\n\n <!-- version details -->\n @if (showVersionDetails) {\n <p class=\"version-details\">\n <!-- App version -->\n @if (buildDate) {\n <small>\n <ion-icon name=\"logo-angular\"></ion-icon>\n <span [innerHTML]=\"'ABOUT.APP_VERSION' | translate: { version: version }\"></span>\n \n <ion-icon name=\"time-outline\"></ion-icon>\n {{ buildDate | dateFormat: { time: true, seconds: false } }}\n </small>\n <br/>\n }\n <!-- Pod version -->\n @if (nodeInfo?.softwareVersion && nodeInfo.buildDate) {\n <small>\n <ion-icon name=\"server\"></ion-icon>\n <span [innerHTML]=\"'ABOUT.POD_VERSION' | translate: { version: nodeInfo.softwareVersion }\"></span>\n \n <ion-icon name=\"time-outline\"></ion-icon>\n {{ nodeInfo.buildDate | dateFormat: { time: true, seconds: false } }}\n </small>\n }\n </p>\n }\n\n <!-- license-->\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"], dependencies: [{ kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { 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.IonHeader, selector: "ion-header", 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.IonImg, selector: "ion-img", inputs: ["alt", "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.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { 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: i4$2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: CapitalizePipe, name: "capitalize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
33306
33581
|
}
|
|
33307
33582
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AboutModal, decorators: [{
|
|
33308
33583
|
type: Component,
|
|
33309
33584
|
args: [{ selector: 'app-about-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n @if (config$ | async; as config) {\n <ion-item>\n <span slot=\"start\"> </span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label | capitalize }}</b>\n @if (config.name) {\n -\n <span [innerHTML]=\"config.name\"></span>\n }\n </h2>\n\n @if (config.description) {\n <p>\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n }\n </ion-label>\n </ion-item>\n }\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\"> </span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n @if (name) {\n <small>{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n }\n @if (version) {\n <span [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n }\n @if(allowVersionDetails) {\n \n <small>\n <a (click)=\"showVersionDetails=!showVersionDetails\" tappable>\n {{'COMMON.BTN_SHOW_MORE' | translate}}\n <ion-icon [name]=\"!showVersionDetails ? 'chevron-down' : 'chevron-up'\"></ion-icon>\n </a>\n @if (changelogUrl) {\n \n <a (click)=\"openChangelog($event)\"\n [href]=\"changelogUrl\"\n tappable translate>ABOUT.BTN_CHANGELOG</a>\n }\n </small>\n }\n </h2>\n\n <!-- version details -->\n @if (showVersionDetails) {\n <p class=\"version-details\">\n <!-- App version -->\n @if (buildDate) {\n <small>\n <ion-icon name=\"logo-angular\"></ion-icon>\n <span [innerHTML]=\"'ABOUT.APP_VERSION' | translate: { version: version }\"></span>\n \n <ion-icon name=\"time-outline\"></ion-icon>\n {{ buildDate | dateFormat: { time: true, seconds: false } }}\n </small>\n <br/>\n }\n <!-- Pod version -->\n @if (nodeInfo?.softwareVersion && nodeInfo.buildDate) {\n <small>\n <ion-icon name=\"server\"></ion-icon>\n <span [innerHTML]=\"'ABOUT.POD_VERSION' | translate: { version: nodeInfo.softwareVersion }\"></span>\n \n <ion-icon name=\"time-outline\"></ion-icon>\n {{ nodeInfo.buildDate | dateFormat: { time: true, seconds: false } }}\n </small>\n }\n </p>\n }\n\n <!-- license-->\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"] }]
|
|
33310
|
-
}], ctorParameters: () => [{ type: i1$1.TranslateService }, { type: i2$1.ModalController }, { type: ConfigService }, { type: NetworkService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
33585
|
+
}], ctorParameters: () => [{ type: i1$1.TranslateService }, { type: i2$1.ModalController }, { type: ConfigService }, { type: NetworkService }, { type: PlatformService }, { type: i2$3.HttpClient }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
33311
33586
|
type: Optional
|
|
33312
33587
|
}, {
|
|
33313
33588
|
type: Inject,
|
|
@@ -44352,6 +44627,12 @@ class AppAsyncTable {
|
|
|
44352
44627
|
return true; // no row to confirm
|
|
44353
44628
|
// Stop event
|
|
44354
44629
|
event?.stopPropagation();
|
|
44630
|
+
// Wait for async validation to complete (with timeout safety net).
|
|
44631
|
+
// This prevents the internal waitWhilePending() in AsyncTableElementReactiveForms.isValid()
|
|
44632
|
+
// (from @e-is/ngx-material-table) from hanging indefinitely if statusChanges never emits.
|
|
44633
|
+
if (row.validator?.pending) {
|
|
44634
|
+
await AppFormUtils.waitWhilePending(row.validator, { timeout: 10000 });
|
|
44635
|
+
}
|
|
44355
44636
|
// Confirmation edition or creation
|
|
44356
44637
|
const confirmed = await row.confirmEditCreate();
|
|
44357
44638
|
if (confirmed) {
|
|
@@ -55240,5 +55521,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
55240
55521
|
* Generated bundle index. Do not edit.
|
|
55241
55522
|
*/
|
|
55242
55523
|
|
|
55243
|
-
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_ACCOUNT_SERVICE, APP_ACCOUNT_SERVICE_OPTIONS, APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, APP_CELL_SELECTION_SERVICE_TOKEN, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FEED_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_HOME_CONFIG, APP_HOME_TOOLBAR_BUTTONS, APP_HOTKEYS_CONFIG, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_LOGGING_SERVICE, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_NAMED_FILTER_SERVICE, APP_PERSON_SERVICE, APP_PERSON_SERVICE_OPTIONS, APP_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, APP_SHOW_TOOLTIP, APP_STORAGE, APP_STORAGE_EXPLORER_PROTECTED_KEYS, APP_TESTING_PAGES, APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD, APP_USER_EVENT_SERVICE, APP_USER_SETTINGS_OPTIONS, APP_USER_TOKEN_SCOPES, AboutModal, AbstractNamedFilterService, AbstractPersonService, AbstractSelectionModelPipe, AbstractTableSelectionPipe, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, AccountUtils, ActionsColumnComponent, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AppAboutModalModule, AppAccountModule, AppAsyncTable, AppAuthForm, AppAuthModal, AppAuthModule, AppChangePasswordModule, AppChangePasswordPage, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppEntityFormModule, AppForm, AppFormArray, AppFormButtonsBarModule, AppFormContainer, AppFormField, AppFormModule, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHomePageModule, AppIconComponent, AppIconModule, AppIconSelectorField, AppIconSelectorModal, AppIconSelectorModule, AppImageGalleryComponent, AppImageGallerySlideshowComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSelectUsersModal, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextFormModule, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, AppendQueryParamsPipePipe, ArrayDistinctPipe, ArrayFilterPipe, ArrayFindByPropertyPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayMapPipe, ArrayPluckPipe, ArraySlicePipe, ArraySortPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoResizeDirective, AutoTitleDirective, AutoTooltipDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellIdentifierDirective, CellSelectionDirective, CellSelectionService, CellValueChangeListener, ChangeCaseToUnderscorePipe, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_ISO_PATTERNS, DATE_MATCH_REGEXP, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR, DEFAULT_JOIN_PROPERTIES_SEPARATOR, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFormatService, DateFromNowPipe, DateFromPipe, DateShortTestPage, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DisplayWithPipe, DragAndDropDirective, DurationPipe, DurationTestPage, ED25519_SEED_LENGTH, EMPTY_PLACEHOLDER_CHAR, EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesAsyncTableDataSource, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EnvironmentHttpLoader, EnvironmentLoader, ErrorCodes, EvenPipe, FeedDirective, FeedModule, FeedPage, FeedService, FeedsComponent, FileResponse, FileService, FileSizePipe, FilesUtils, FirstFalsePipe, FirstPipe, FirstTruePipe, FormArrayAtControlPipe, FormArrayAtGroupPipe, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetNamePipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, IconSelectorService, IconSelectorTestPage, IconSelectorTestingModule, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, IsAllSelectedPipe, IsEmptySelectionPipe, IsLoginAccountPipe, IsMultipleSelectionPipe, IsNilOrBlankPipe, IsNilOrNaNPipe, IsNilPipe, IsNotAllSelectedPipe, IsNotEmptySelectionPipe, IsNotNilOrBlankPipe, IsNotNilOrNaNPipe, IsNotNilPipe, IsOnDeskPipe, IsOnFieldPipe, IsSelectedPipe, IsSingleSelectionPipe, IsValidDatePipe, JobModule, JobProgression, JobProgressionComponent, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, JsonFeedUtils, JsonUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_PATTERNS, LAT_LONG_PATTERN_MAX_DECIMALS, LAT_LONG_VALUE_MAX_DECIMALS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LogLevel, LogUtils, Logger, LoggingService, LoggingServiceModule, LongitudeFormatPipe, MASKS, MASK_RANGES, MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapPipe, MapToPipe, MapValuesPipe, MarkdownDirective, MarkdownService, MarkdownTestPage, MarkdownTestingModule, MarkdownUtils, MaskitoPlaceholderPipe, MaskitoTestPage, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBadgeTestPage, MatBooleanField, MatChipsField, MatColorPipe, MatCommonTestPage, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatLatLongFieldInput, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialAutocompleteFooterDirective, MaterialAutocompleteHeaderDirective, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItem, MenuItems, MenuOptions, MenuService, MenuTestingModule, MenuTestingPage, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NETWORK_DEFAULT_CONNECTION_TIMEOUT, NamedFilter, NamedFilterFilter, NamedFilterSelector, NamedFilterSelectorTestingModule, NamedFilterSelectorTestingPage, NavActionsColumnComponent, NestedTableTestPage, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRINT_ID_QUERY_PARAM, PRINT_LOADING_STORAGE_KEY_PREFIX, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFilterAdditionalFields, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, PrintService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyEntity, PropertyEntityFilter, PropertyEntityValidator, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialToStringPipe, ReferentialUtils, ReferentialValidatorService, ReferentialsToStringPipe, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RoundPipe, RxStateComputed, RxStateModule, RxStateOutput, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, SETTINGS_COMPACT_ROWS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_STORAGE_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_CONFIG_OPTIONS, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, STARTUP_DATA_STORAGE_KEY, SafeHtmlPipe, SafeStylePipe, SelectPeerModal, SelectionLengthPipe, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMarkdownModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedNamedFilterModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, SplitArrayInChunksPipe, StartableService, StartupService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, TABLE_SETTINGS_ENUM, TOOLBAR_HEADER_ID, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingModule, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, TruncHtmlPipe, TruncTextPipe, TruncateHtmlPipe, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventNotificationModal, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, UsersUtils, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, assignSkipUndefined, base64ArrayBuffer, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, collectByPropertyPath, compareValues, compareValuesDesc, compareVersionNumbers, composeComparators, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createAppStartupInitializer, createPromiseEvent, createPromiseEventEmitter, decorateWithTakeUntil, deepMergeSkipUndefined, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProdMode, entityToString, equals, equalsOrNil, escapeRegExp, expansionAnimation, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorLuminance, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, interpolateString, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isEntityService, isFirefox, isFocusableElement, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isLightColor, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isPrint, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWebAnimationsSupported, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mergeObjectsWithoutUndefined, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, numberOrNilAttribute, numberToString, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, provideAccountService, providePersonService, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlRequired, setControlsEnabled, setFormErrors, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitArrayInChunks, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toLoadData, toLoadResult, toNotNil, toNumber, trimEmptyToNull, truncateHtml, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
55524
|
+
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_ACCOUNT_SERVICE, APP_ACCOUNT_SERVICE_OPTIONS, APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, APP_CELL_SELECTION_SERVICE_TOKEN, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FEED_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_HOME_CONFIG, APP_HOME_TOOLBAR_BUTTONS, APP_HOTKEYS_CONFIG, APP_JOB_PROGRESSION_SERVICE, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_LOGGING_SERVICE, APP_MENU_ITEMS, APP_MENU_OPTIONS, APP_NAMED_FILTER_SERVICE, APP_PERSON_SERVICE, APP_PERSON_SERVICE_OPTIONS, APP_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, APP_SHOW_TOOLTIP, APP_STORAGE, APP_STORAGE_EXPLORER_PROTECTED_KEYS, APP_TESTING_PAGES, APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD, APP_USER_EVENT_SERVICE, APP_USER_SETTINGS_OPTIONS, APP_USER_TOKEN_SCOPES, AboutModal, AbstractNamedFilterService, AbstractPersonService, AbstractSelectionModelPipe, AbstractTableSelectionPipe, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, AccountUtils, ActionsColumnComponent, AdminModule, AdminRoutingModule, AdminUsersModule, Alerts, AndroidOsEnvironment, AppAboutModalModule, AppAccountModule, AppAsyncTable, AppAuthForm, AppAuthModal, AppAuthModule, AppChangePasswordModule, AppChangePasswordPage, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppEntityFormModule, AppForm, AppFormArray, AppFormButtonsBarModule, AppFormContainer, AppFormField, AppFormModule, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHomePageModule, AppIconComponent, AppIconModule, AppIconSelectorField, AppIconSelectorModal, AppIconSelectorModule, AppImageGalleryComponent, AppImageGallerySlideshowComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSelectUsersModal, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextFormModule, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, AppendQueryParamsPipePipe, ArrayDistinctPipe, ArrayFilterPipe, ArrayFindByPropertyPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayMapPipe, ArrayPluckPipe, ArraySlicePipe, ArraySortPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoResizeDirective, AutoTitleDirective, AutoTooltipDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellIdentifierDirective, CellSelectionDirective, CellSelectionService, CellValueChangeListener, ChangeCaseToUnderscorePipe, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_ISO_PATTERNS, DATE_MATCH_REGEXP, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR, DEFAULT_JOIN_PROPERTIES_SEPARATOR, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFormatService, DateFromNowPipe, DateFromPipe, DateShortTestPage, DateTestPage, DateTimeTestPage, DateUtils, DebugComponent, Department, DepartmentToStringPipe, DisplayWithPipe, DragAndDropDirective, DurationPipe, DurationTestPage, ED25519_SEED_LENGTH, EMPTY_PLACEHOLDER_CHAR, EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesAsyncTableDataSource, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EnvironmentHttpLoader, EnvironmentLoader, ErrorCodes, EvenPipe, FeedDirective, FeedModule, FeedPage, FeedService, FeedsComponent, FileResponse, FileService, FileSizePipe, FilesUtils, FirstFalsePipe, FirstPipe, FirstTruePipe, FormArrayAtControlPipe, FormArrayAtGroupPipe, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetNamePipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GitlabUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, IconSelectorService, IconSelectorTestPage, IconSelectorTestingModule, ImageAttachment, ImageAttachmentFilter, ImageAttachmentService, ImageGalleryModule, ImageGalleryTestingModule, ImageModule, ImageService, ImagesUtils, InMemoryEntitiesService, IsAllSelectedPipe, IsEmptySelectionPipe, IsLoginAccountPipe, IsMultipleSelectionPipe, IsNilOrBlankPipe, IsNilOrNaNPipe, IsNilPipe, IsNotAllSelectedPipe, IsNotEmptySelectionPipe, IsNotNilOrBlankPipe, IsNotNilOrNaNPipe, IsNotNilPipe, IsOnDeskPipe, IsOnFieldPipe, IsSelectedPipe, IsSingleSelectionPipe, IsValidDatePipe, JobModule, JobProgression, JobProgressionComponent, JobProgressionIcon, JobProgressionList, JobProgressionService, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, JobUtils, JsonFeedUtils, JsonUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_PATTERNS, LAT_LONG_PATTERN_MAX_DECIMALS, LAT_LONG_VALUE_MAX_DECIMALS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LogLevel, LogUtils, Logger, LoggingService, LoggingServiceModule, LongitudeFormatPipe, MASKS, MASK_RANGES, MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapPipe, MapToPipe, MapValuesPipe, MarkdownDirective, MarkdownService, MarkdownTestPage, MarkdownTestingModule, MarkdownUtils, MaskitoPlaceholderPipe, MaskitoTestPage, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBadgeTestPage, MatBooleanField, MatChipsField, MatColorPipe, MatCommonTestPage, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatLatLongFieldInput, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialAutocompleteFooterDirective, MaterialAutocompleteHeaderDirective, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItem, MenuItems, MenuOptions, MenuService, MenuTestingModule, MenuTestingPage, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NETWORK_DEFAULT_CONNECTION_TIMEOUT, NamedFilter, NamedFilterFilter, NamedFilterSelector, NamedFilterSelectorTestingModule, NamedFilterSelectorTestingPage, NavActionsColumnComponent, NestedTableTestPage, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRINT_ID_QUERY_PARAM, PRINT_LOADING_STORAGE_KEY_PREFIX, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFilterAdditionalFields, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, PrintService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyEntity, PropertyEntityFilter, PropertyEntityValidator, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialToStringPipe, ReferentialUtils, ReferentialValidatorService, ReferentialsToStringPipe, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RoundPipe, RxStateComputed, RxStateModule, RxStateOutput, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, SETTINGS_COMPACT_ROWS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_STORAGE_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_CONFIG_OPTIONS, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, STARTUP_DATA_STORAGE_KEY, SafeHtmlPipe, SafeStylePipe, SelectPeerModal, SelectionLengthPipe, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedBadgeModule, SharedDebugModule, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMarkdownModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedNamedFilterModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, SplitArrayInChunksPipe, StartableService, StartupService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, TABLE_SETTINGS_ENUM, TOOLBAR_HEADER_ID, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingModule, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, TruncHtmlPipe, TruncTextPipe, TruncateHtmlPipe, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventNotificationModal, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, UsersUtils, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, assignSkipUndefined, base64ArrayBuffer, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, collectByPropertyPath, compareValues, compareValuesDesc, compareVersionNumbers, composeComparators, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createAppStartupInitializer, createPromiseEvent, createPromiseEventEmitter, decorateWithTakeUntil, deepMergeSkipUndefined, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProdMode, entityToString, equals, equalsOrNil, escapeRegExp, expansionAnimation, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorLuminance, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, interpolateString, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isEntityService, isFirefox, isFocusableElement, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isLightColor, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isPrint, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWebAnimationsSupported, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mergeObjectsWithoutUndefined, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, numberOrNilAttribute, numberToString, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, provideAccountService, providePersonService, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlRequired, setControlsEnabled, setFormErrors, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitArrayInChunks, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toLoadData, toLoadResult, toNotNil, toNumber, trimEmptyToNull, truncateHtml, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
55244
55525
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|