@sumaris-net/ngx-components 18.6.10-beta1 → 18.6.11-alpha1
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/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +1 -1
- package/esm2022/src/app/core/account/account.page.mjs +20 -32
- package/esm2022/src/app/core/form/properties/properties.table.mjs +32 -28
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +1 -14
- package/esm2022/src/app/core/home/home.mjs +4 -1
- package/esm2022/src/app/core/services/account.service.mjs +7 -22
- package/esm2022/src/app/core/services/local-settings.service.mjs +2 -9
- package/esm2022/src/app/core/services/model/account.model.mjs +13 -32
- package/esm2022/src/app/core/services/model/entity.model.mjs +1 -1
- package/esm2022/src/app/core/services/platform.service.mjs +3 -4
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +3 -3
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +1 -1
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +1 -1
- package/esm2022/src/app/shared/markdown/markdown.component.mjs +55 -81
- package/esm2022/src/app/shared/markdown/markdown.modal.mjs +17 -10
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +8 -1
- package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +16 -7
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
- package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
- package/esm2022/src/app/shared/print/print.service.mjs +257 -0
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
- package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +409 -226
- 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/admin/services/validator/person.validator.d.ts +1 -1
- package/src/app/core/account/account.page.d.ts +0 -2
- package/src/app/core/form/properties/properties.table.d.ts +10 -4
- package/src/app/core/form/properties/properties.utils.d.ts +0 -4
- package/src/app/core/services/account.service.d.ts +0 -2
- package/src/app/core/services/local-settings.service.d.ts +0 -1
- package/src/app/core/services/model/account.model.d.ts +2 -17
- package/src/app/core/services/model/entity.model.d.ts +2 -2
- package/src/app/core/services/validator/base.validator.class.d.ts +5 -5
- package/src/app/core/table/entities-async-table-datasource.class.d.ts +2 -2
- package/src/app/core/table/entities-table-datasource.class.d.ts +2 -2
- package/src/app/shared/markdown/markdown.component.d.ts +12 -7
- package/src/app/shared/markdown/markdown.modal.d.ts +9 -2
- package/src/app/shared/markdown/markdown.utils.d.ts +1 -0
- package/src/app/shared/markdown/testing/markdown.test.d.ts +4 -1
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -3
- package/src/app/shared/named-filter/named-filter.model.d.ts +2 -2
- package/src/app/shared/print/print.service.d.ts +60 -0
- package/src/app/social/user-event/user-event.model.d.ts +2 -2
- package/src/assets/i18n/en-US.json +3 -2
- package/src/assets/i18n/en.json +2 -1
- package/src/assets/i18n/fr.json +2 -1
- package/src/assets/manifest.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, Directive, Pipe, Injectable, EventEmitter, Output, Optional, Inject, inject, NgModule, forwardRef, Component, ChangeDetectionStrategy, Input, ViewChildren, HostBinding, HostListener, ElementRef, numberAttribute, booleanAttribute, ViewChild, ANIMATION_MODULE_TYPE, RendererStyleFlags2, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef, Self, ViewEncapsulation, APP_INITIALIZER, SecurityContext, viewChild, signal, input, model, computed, effect, untracked } from '@angular/core';
|
|
3
|
-
import { firstValueFrom, shareReplay, tap, of, timer, Subject, merge, delay, isObservable, from, Subscription, BehaviorSubject, fromEvent, noop as noop$9, Observable, forkJoin, timeout, defer, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, interval, combineLatest, EMPTY, switchMap as switchMap$1 } from 'rxjs';
|
|
3
|
+
import { firstValueFrom, shareReplay, tap, of, timer, Subject, merge, delay, isObservable, from, Subscription, BehaviorSubject, fromEvent, noop as noop$9, Observable, forkJoin, timeout, defer, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, interval, mergeMap as mergeMap$1, combineLatest, EMPTY, switchMap as switchMap$1 } from 'rxjs';
|
|
4
4
|
import { catchError, map, filter, takeUntil, first, switchMap, tap as tap$1, throttleTime, debounceTime, startWith, distinctUntilChanged, mergeMap, skip, finalize, bufferWhen, distinctUntilKeyChanged, take } from 'rxjs/operators';
|
|
5
5
|
import * as i3 from '@angular/common';
|
|
6
6
|
import { CommonModule, DOCUMENT, LocationStrategy, Location, AsyncPipe, JsonPipe } from '@angular/common';
|
|
@@ -7170,19 +7170,6 @@ class AppPropertiesUtils {
|
|
|
7170
7170
|
}
|
|
7171
7171
|
return targets;
|
|
7172
7172
|
}
|
|
7173
|
-
static sanitize(source, opts) {
|
|
7174
|
-
if (!source)
|
|
7175
|
-
return source; // Skip if empty
|
|
7176
|
-
const includedKeys = opts?.includedKeys ?? opts?.definitions.map((def) => def.key);
|
|
7177
|
-
if (Array.isArray(source)) {
|
|
7178
|
-
return source.filter((property) => property && (!includedKeys || includedKeys.includes(property.key)) && isNotNil(property.value));
|
|
7179
|
-
}
|
|
7180
|
-
return (includedKeys || Object.keys(source)).reduce((res, key) => {
|
|
7181
|
-
if (isNotNil(source[key]))
|
|
7182
|
-
res[key] = source[key];
|
|
7183
|
-
return res;
|
|
7184
|
-
}, {});
|
|
7185
|
-
}
|
|
7186
7173
|
}
|
|
7187
7174
|
class AppPropertyUtils {
|
|
7188
7175
|
static key(key) {
|
|
@@ -12394,18 +12381,12 @@ class LocalSettingsService extends StartableService {
|
|
|
12394
12381
|
async apply(settings, opts) {
|
|
12395
12382
|
if (!this.started)
|
|
12396
12383
|
await this.ready();
|
|
12397
|
-
// Sanitize (keep properties that can be set by user
|
|
12398
|
-
if (opts?.sanitize) {
|
|
12399
|
-
settings.properties = AppPropertiesUtils.sanitize(settings.properties, { definitions: this.optionDefs });
|
|
12400
|
-
}
|
|
12401
12384
|
const data = {
|
|
12402
12385
|
...this._data,
|
|
12403
12386
|
...settings,
|
|
12404
12387
|
};
|
|
12405
12388
|
if (equals(data, this._data))
|
|
12406
12389
|
return; // Skip if no changes
|
|
12407
|
-
// DEBUG
|
|
12408
|
-
//console.debug('[platform] Applying local settings...', settings);
|
|
12409
12390
|
this._data = data;
|
|
12410
12391
|
// Save locally
|
|
12411
12392
|
if (opts && opts.persistImmediate) {
|
|
@@ -12540,7 +12521,7 @@ class LocalSettingsService extends StartableService {
|
|
|
12540
12521
|
const index = this._optionDefs.findIndex((f) => f.key === def.key);
|
|
12541
12522
|
if (index !== -1) {
|
|
12542
12523
|
if (opts?.replaceIfExists !== true) {
|
|
12543
|
-
throw new Error(`Additional property {${def.key}} already define.`);
|
|
12524
|
+
throw new Error(`Additional additional property {${def.key}} already define.`);
|
|
12544
12525
|
}
|
|
12545
12526
|
// Replace existing
|
|
12546
12527
|
if (this._debug)
|
|
@@ -16305,11 +16286,11 @@ class ModalToolbarComponent {
|
|
|
16305
16286
|
this._subscription.unsubscribe();
|
|
16306
16287
|
}
|
|
16307
16288
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalToolbarComponent, deps: [{ token: Hotkeys }], target: i0.ɵɵFactoryTarget.Component });
|
|
16308
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
16289
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ModalToolbarComponent, selector: "app-modal-toolbar", inputs: { modalName: "modalName", title: "title", color: "color", showSpinner: "showSpinner", canValidate: "canValidate", validateIcon: "validateIcon" }, outputs: { cancel: "cancel", validate: "validate" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar [color]=\"color\">\n <ion-buttons slot=\"start\">\n @if (cancel.observed) {\n <ion-button visible-xs visible-sm visible-mobile (click)=\"cancel.emit()\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ng-content select=\"[slot=start]\"></ng-content>\n </ion-buttons>\n\n <ion-title [innerHTML]=\"title\"></ion-title>\n\n <ng-content select=\"ion-title\"></ng-content>\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <ng-content select=\"ion-button[slot=end]\"></ng-content>\n\n <ion-spinner *ngIf=\"showSpinner\"></ion-spinner>\n\n <ion-button visible-xs visible-sm visible-mobile *ngIf=\"canValidate\" (click)=\"validate.emit($event)\">\n <ion-icon slot=\"icon-only\" *ngIf=\"validateIcon?.icon\" [name]=\"validateIcon.icon\"></ion-icon>\n <mat-icon slot=\"icon-only\" *ngIf=\"validateIcon?.matIcon\">{{ validateIcon.matIcon }}</mat-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.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.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.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { 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: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
16309
16290
|
}
|
|
16310
16291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalToolbarComponent, decorators: [{
|
|
16311
16292
|
type: Component,
|
|
16312
|
-
args: [{ selector: 'app-modal-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar [color]=\"color\">\n <ion-buttons slot=\"start\">\n <ion-button visible-xs visible-sm visible-mobile (click)=\"cancel.emit()\">\n
|
|
16293
|
+
args: [{ selector: 'app-modal-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar [color]=\"color\">\n <ion-buttons slot=\"start\">\n @if (cancel.observed) {\n <ion-button visible-xs visible-sm visible-mobile (click)=\"cancel.emit()\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ng-content select=\"[slot=start]\"></ng-content>\n </ion-buttons>\n\n <ion-title [innerHTML]=\"title\"></ion-title>\n\n <ng-content select=\"ion-title\"></ng-content>\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <ng-content select=\"ion-button[slot=end]\"></ng-content>\n\n <ion-spinner *ngIf=\"showSpinner\"></ion-spinner>\n\n <ion-button visible-xs visible-sm visible-mobile *ngIf=\"canValidate\" (click)=\"validate.emit($event)\">\n <ion-icon slot=\"icon-only\" *ngIf=\"validateIcon?.icon\" [name]=\"validateIcon.icon\"></ion-icon>\n <mat-icon slot=\"icon-only\" *ngIf=\"validateIcon?.matIcon\">{{ validateIcon.matIcon }}</mat-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n" }]
|
|
16313
16294
|
}], ctorParameters: () => [{ type: Hotkeys }], propDecorators: { modalName: [{
|
|
16314
16295
|
type: Input
|
|
16315
16296
|
}], title: [{
|
|
@@ -21332,19 +21313,11 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21332
21313
|
}
|
|
21333
21314
|
this.nonce = source.nonce;
|
|
21334
21315
|
}
|
|
21335
|
-
|
|
21336
|
-
* Merges the given source object into the current instance.
|
|
21337
|
-
*
|
|
21338
|
-
* @param {S} source - The source object containing properties to merge.
|
|
21339
|
-
* @param {Array<keyof S | string | number>} [includedProperties] - Optional array of property keys to be merged into the content map.
|
|
21340
|
-
* @param {boolean} [resetContent] - Optional flag to reset existing content. False by default
|
|
21341
|
-
* @return {boolean} - Returns true if any changes were made; otherwise, false.
|
|
21342
|
-
*/
|
|
21343
|
-
merge(source, includedProperties, resetContent) {
|
|
21316
|
+
merge(source, includesProperties) {
|
|
21344
21317
|
if (!source)
|
|
21345
21318
|
return; // Skip
|
|
21346
|
-
// Reset
|
|
21347
|
-
this.content =
|
|
21319
|
+
// Reset content
|
|
21320
|
+
this.content = {};
|
|
21348
21321
|
let hasChanges = false;
|
|
21349
21322
|
// For each property of source object
|
|
21350
21323
|
Object.keys(source).forEach((key) => {
|
|
@@ -21356,14 +21329,13 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21356
21329
|
}
|
|
21357
21330
|
}
|
|
21358
21331
|
// Else, store property into the 'content' map
|
|
21359
|
-
else if (
|
|
21360
|
-
|
|
21361
|
-
|
|
21362
|
-
|
|
21363
|
-
this.content[key] = { ...this.content[key], ...sourceValue }; // Merge object
|
|
21332
|
+
else if (includesProperties && includesProperties.includes(key)) {
|
|
21333
|
+
if (!equals(this.content[key], source[key])) {
|
|
21334
|
+
if (typeof source[key] === 'object' && source[key] !== null) {
|
|
21335
|
+
this.content[key] = { ...source[key] }; // Copy object
|
|
21364
21336
|
}
|
|
21365
21337
|
else {
|
|
21366
|
-
this.content[key] =
|
|
21338
|
+
this.content[key] = source[key];
|
|
21367
21339
|
}
|
|
21368
21340
|
hasChanges = true;
|
|
21369
21341
|
}
|
|
@@ -21371,11 +21343,7 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21371
21343
|
});
|
|
21372
21344
|
return hasChanges;
|
|
21373
21345
|
}
|
|
21374
|
-
|
|
21375
|
-
* Transform user settings into local settings
|
|
21376
|
-
* @param opts
|
|
21377
|
-
*/
|
|
21378
|
-
asLocalSettings(opts) {
|
|
21346
|
+
asLocalSettings() {
|
|
21379
21347
|
const target = {};
|
|
21380
21348
|
UserSettings_1.SETTINGS_PROPERTIES.forEach((key) => {
|
|
21381
21349
|
target[key] = this[key];
|
|
@@ -21383,14 +21351,9 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21383
21351
|
Object.keys(this.content).forEach((key) => {
|
|
21384
21352
|
target[key] = this.content[key];
|
|
21385
21353
|
});
|
|
21386
|
-
// Sanitize properties
|
|
21387
|
-
const includedKeys = opts?.definitions?.map((def) => def.key) || [];
|
|
21388
|
-
if (isNotEmptyArray(includedKeys)) {
|
|
21389
|
-
target.properties = AppPropertiesUtils.sanitize(target.properties, { includedKeys });
|
|
21390
|
-
}
|
|
21391
21354
|
// Clear properties if empty, to avoid to reset the existing properties - See issue sumaris-app#897
|
|
21392
|
-
if (Object.keys(target
|
|
21393
|
-
delete target
|
|
21355
|
+
if (Object.keys(target['properties'] || {}).length === 0) {
|
|
21356
|
+
delete target['properties'];
|
|
21394
21357
|
}
|
|
21395
21358
|
return target;
|
|
21396
21359
|
}
|
|
@@ -21701,7 +21664,6 @@ class AccountService extends BaseGraphqlService {
|
|
|
21701
21664
|
department: null,
|
|
21702
21665
|
};
|
|
21703
21666
|
_optionDefs;
|
|
21704
|
-
_remoteLocalSettingsKeys;
|
|
21705
21667
|
_$additionalFields = new BehaviorSubject([]);
|
|
21706
21668
|
_tokenType$ = new BehaviorSubject(undefined);
|
|
21707
21669
|
_apiTokenEnabled = true;
|
|
@@ -21756,7 +21718,6 @@ class AccountService extends BaseGraphqlService {
|
|
|
21756
21718
|
if (this._debug)
|
|
21757
21719
|
console.debug('[account-service] Creating service');
|
|
21758
21720
|
this._optionDefs = Object.values(options?.options || {});
|
|
21759
|
-
this._remoteLocalSettingsKeys = options?.remoteLocalSettingsKeys || [];
|
|
21760
21721
|
this.resetData();
|
|
21761
21722
|
// Send auth token to the graphql layer, when changed
|
|
21762
21723
|
this.onAuthTokenChange.subscribe((token) => this.graphql.setAuthToken(token));
|
|
@@ -21882,7 +21843,9 @@ class AccountService extends BaseGraphqlService {
|
|
|
21882
21843
|
data.account.pubkey = Base58.encode(keypair.publicKey);
|
|
21883
21844
|
// Default values
|
|
21884
21845
|
data.account.settings = data.account.settings || new UserSettings();
|
|
21885
|
-
data.account.settings.
|
|
21846
|
+
data.account.settings.locale = this.settings.locale;
|
|
21847
|
+
data.account.settings.latLongFormat = this.settings.latLongFormat;
|
|
21848
|
+
data.account.settings.content = data.account.settings.content || {};
|
|
21886
21849
|
data.account.department.id = data.account.department.id || this.environment.defaultDepartmentId;
|
|
21887
21850
|
this._cache.keypair = keypair;
|
|
21888
21851
|
const account = await this.saveRemotely(data.account, keypair);
|
|
@@ -22362,7 +22325,6 @@ class AccountService extends BaseGraphqlService {
|
|
|
22362
22325
|
if (!this._cache.pubkey)
|
|
22363
22326
|
throw new Error('User not logged');
|
|
22364
22327
|
this._cache.loaded = false;
|
|
22365
|
-
console.debug('[account-service] Loading account data...');
|
|
22366
22328
|
try {
|
|
22367
22329
|
const account = (await this.load(opts)) || new Account();
|
|
22368
22330
|
// Set defaults
|
|
@@ -22383,21 +22345,8 @@ class AccountService extends BaseGraphqlService {
|
|
|
22383
22345
|
this._cache.loaded = true;
|
|
22384
22346
|
// Apply settings, found in remote account
|
|
22385
22347
|
if (account.settings && this.settings.settings.accountInheritance) {
|
|
22386
|
-
console.debug('[account-service] Copying account settings into local settings...');
|
|
22387
|
-
const localSettings = this.settings.settings;
|
|
22388
22348
|
const accountSettings = account.settings.asLocalSettings();
|
|
22389
|
-
|
|
22390
|
-
const mergedProperties = AppPropertiesUtils.sanitize({
|
|
22391
|
-
...localSettings.properties,
|
|
22392
|
-
...accountSettings.properties,
|
|
22393
|
-
}, { definitions });
|
|
22394
|
-
// Merge local/account settings
|
|
22395
|
-
const settings = {
|
|
22396
|
-
...localSettings,
|
|
22397
|
-
...accountSettings,
|
|
22398
|
-
properties: mergedProperties,
|
|
22399
|
-
};
|
|
22400
|
-
await this.settings.apply(settings);
|
|
22349
|
+
await this.settings.apply(accountSettings);
|
|
22401
22350
|
}
|
|
22402
22351
|
return this._data;
|
|
22403
22352
|
}
|
|
@@ -22557,7 +22506,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
22557
22506
|
const account = this.account;
|
|
22558
22507
|
// Merge local settings into account's settings
|
|
22559
22508
|
const settings = UserSettings.fromObject(account.settings) || new UserSettings();
|
|
22560
|
-
const changed = settings.merge(source,
|
|
22509
|
+
const changed = settings.merge(source, ['locale', 'latLongFormat', 'properties']);
|
|
22561
22510
|
if (!changed)
|
|
22562
22511
|
return; // Skip if unchanged
|
|
22563
22512
|
// Save remotely
|
|
@@ -23669,11 +23618,10 @@ class PlatformService extends StartableService {
|
|
|
23669
23618
|
}
|
|
23670
23619
|
}));
|
|
23671
23620
|
// Use account's settings, (like locale), when account inheritance enabled
|
|
23672
|
-
this.registerSubscription(this.accountService.onLogin.subscribe(
|
|
23621
|
+
this.registerSubscription(this.accountService.onLogin.subscribe((account) => {
|
|
23673
23622
|
if (account.settings && this.settings.settings.accountInheritance) {
|
|
23674
|
-
console.debug('[platform] Copying account settings into local settings...');
|
|
23675
23623
|
const accountSettings = account.settings.asLocalSettings();
|
|
23676
|
-
|
|
23624
|
+
this.settings.apply(accountSettings);
|
|
23677
23625
|
}
|
|
23678
23626
|
}));
|
|
23679
23627
|
}
|
|
@@ -27409,8 +27357,15 @@ class MarkdownUtils {
|
|
|
27409
27357
|
return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));
|
|
27410
27358
|
}
|
|
27411
27359
|
static isGitlabUrl(url) {
|
|
27360
|
+
if (!url)
|
|
27361
|
+
return false;
|
|
27412
27362
|
return url.startsWith('https://gitlab.') || url.includes('/-/raw/') || url.includes('/-/blob/');
|
|
27413
27363
|
}
|
|
27364
|
+
static fixGitlabUrlToRaw(url) {
|
|
27365
|
+
if (!this.isGitlabUrl(url))
|
|
27366
|
+
return url;
|
|
27367
|
+
return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');
|
|
27368
|
+
}
|
|
27414
27369
|
static getRootUrl(url) {
|
|
27415
27370
|
if (this.isGitlabUrl(url)) {
|
|
27416
27371
|
console.debug('[markdown] Gitlab URL detected: ' + url);
|
|
@@ -27647,18 +27602,266 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
27647
27602
|
args: ['ready']
|
|
27648
27603
|
}] } });
|
|
27649
27604
|
|
|
27605
|
+
const PRINT_LOADING_STORAGE_KEY_PREFIX = 'print-loading-';
|
|
27606
|
+
class PrintService {
|
|
27607
|
+
toastController;
|
|
27608
|
+
translate;
|
|
27609
|
+
storage;
|
|
27610
|
+
document;
|
|
27611
|
+
printId = 0;
|
|
27612
|
+
constructor(toastController, translate, storage, document) {
|
|
27613
|
+
this.toastController = toastController;
|
|
27614
|
+
this.translate = translate;
|
|
27615
|
+
this.storage = storage;
|
|
27616
|
+
this.document = document;
|
|
27617
|
+
}
|
|
27618
|
+
nextJobId() {
|
|
27619
|
+
return ++this.printId;
|
|
27620
|
+
}
|
|
27621
|
+
async printElement(element, opts) {
|
|
27622
|
+
if (!element)
|
|
27623
|
+
throw new Error("Missing required 'element' argument");
|
|
27624
|
+
return this.printHTML(element.innerHTML, opts);
|
|
27625
|
+
}
|
|
27626
|
+
async printHTML(html, opts) {
|
|
27627
|
+
if (!html)
|
|
27628
|
+
throw new Error("Missing required 'html' argument");
|
|
27629
|
+
// Create iframe
|
|
27630
|
+
const iframe = this.createPrintIframeByHtml(html, opts);
|
|
27631
|
+
return this.printIframe(iframe, opts);
|
|
27632
|
+
}
|
|
27633
|
+
async printUrl(url, opts) {
|
|
27634
|
+
if (!url)
|
|
27635
|
+
throw new Error("Missing required 'url' argument");
|
|
27636
|
+
// Create iframe
|
|
27637
|
+
const iframe = this.createPrintIframeByUrl(url);
|
|
27638
|
+
return this.printIframe(iframe, opts);
|
|
27639
|
+
}
|
|
27640
|
+
async printIframe(iframe, opts) {
|
|
27641
|
+
if (!iframe)
|
|
27642
|
+
throw new Error("Missing required 'iframe' argument");
|
|
27643
|
+
const printId = opts?.id ?? this.printId++;
|
|
27644
|
+
const toastId = `printing-${printId}`;
|
|
27645
|
+
const showLoadingToast = opts?.showToast !== false;
|
|
27646
|
+
if (showLoadingToast)
|
|
27647
|
+
await this.showToast({
|
|
27648
|
+
id: toastId,
|
|
27649
|
+
message: opts?.toastMessage || 'COMMON.PLEASE_WAIT',
|
|
27650
|
+
duration: 0,
|
|
27651
|
+
});
|
|
27652
|
+
try {
|
|
27653
|
+
// Wait end of iframe load
|
|
27654
|
+
await this.waitIdle(iframe, { id: printId });
|
|
27655
|
+
// Print (and wait end of print)
|
|
27656
|
+
await this.print(iframe);
|
|
27657
|
+
}
|
|
27658
|
+
catch (err) {
|
|
27659
|
+
console.error('[print-service] Failed to create hidden iframe', err);
|
|
27660
|
+
}
|
|
27661
|
+
finally {
|
|
27662
|
+
iframe.remove();
|
|
27663
|
+
if (showLoadingToast)
|
|
27664
|
+
await this.toastController.dismiss(null, null, toastId);
|
|
27665
|
+
}
|
|
27666
|
+
}
|
|
27667
|
+
async markAsLoading(id) {
|
|
27668
|
+
console.debug(`[print-service] Mark print job #${id} as loading`);
|
|
27669
|
+
await this.storage.set(PRINT_LOADING_STORAGE_KEY_PREFIX + id, '1');
|
|
27670
|
+
}
|
|
27671
|
+
async markAsLoaded(id) {
|
|
27672
|
+
console.debug(`[print-service] Mark print job #${id} as loaded`);
|
|
27673
|
+
await this.storage.remove(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
|
|
27674
|
+
}
|
|
27675
|
+
async isLoaded(id) {
|
|
27676
|
+
const result = await this.storage.get(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
|
|
27677
|
+
return isNil(result);
|
|
27678
|
+
}
|
|
27679
|
+
async isLoading(id) {
|
|
27680
|
+
return !(await this.isLoaded(id));
|
|
27681
|
+
}
|
|
27682
|
+
/* -- protected functions -- */
|
|
27683
|
+
createPrintIframeByUrl(url) {
|
|
27684
|
+
// Create a iframe with '?print-pdf'
|
|
27685
|
+
const iframe = this.document.createElement('iframe');
|
|
27686
|
+
iframe.classList.add('cdk-visually-hidden');
|
|
27687
|
+
iframe.style.width = '100%';
|
|
27688
|
+
iframe.style.height = '100%';
|
|
27689
|
+
this.document.body.appendChild(iframe);
|
|
27690
|
+
iframe.src = url;
|
|
27691
|
+
return iframe;
|
|
27692
|
+
}
|
|
27693
|
+
createPrintIframeByHtml(html, opts) {
|
|
27694
|
+
if (!html)
|
|
27695
|
+
throw new Error("Missing required 'html' argument");
|
|
27696
|
+
const lang = this.document.documentElement?.lang || 'en';
|
|
27697
|
+
// Create an empty iframe
|
|
27698
|
+
const iframe = this.document.createElement('iframe');
|
|
27699
|
+
iframe.classList.add('cdk-visually-hidden');
|
|
27700
|
+
iframe.style.width = '100%';
|
|
27701
|
+
iframe.style.height = '100%';
|
|
27702
|
+
this.document.body.appendChild(iframe);
|
|
27703
|
+
// Write iframe content
|
|
27704
|
+
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27705
|
+
if (iframeDocument) {
|
|
27706
|
+
iframeDocument.open();
|
|
27707
|
+
iframeDocument.write(`
|
|
27708
|
+
<!DOCTYPE html>
|
|
27709
|
+
<html lang="${lang}" class="print-pdf">
|
|
27710
|
+
<head>
|
|
27711
|
+
<title>${opts?.title || ''}</title>
|
|
27712
|
+
<style>
|
|
27713
|
+
@media print {
|
|
27714
|
+
body {
|
|
27715
|
+
font-family: 'Roboto', Helvetica, Arial, sans-serif;
|
|
27716
|
+
margin: 0;
|
|
27717
|
+
padding: 0;
|
|
27718
|
+
overflow: hidden;
|
|
27719
|
+
}
|
|
27720
|
+
img {
|
|
27721
|
+
max-width: 100%;
|
|
27722
|
+
height: auto;
|
|
27723
|
+
page-break-inside: avoid;
|
|
27724
|
+
}
|
|
27725
|
+
}
|
|
27726
|
+
${opts?.inlineStyle || ''}
|
|
27727
|
+
</style>
|
|
27728
|
+
</head>
|
|
27729
|
+
<body>
|
|
27730
|
+
${html}
|
|
27731
|
+
</body>
|
|
27732
|
+
</html>
|
|
27733
|
+
`);
|
|
27734
|
+
iframeDocument.close();
|
|
27735
|
+
}
|
|
27736
|
+
// Set iframe style
|
|
27737
|
+
this.applyDocumentStyleToIframe(iframe);
|
|
27738
|
+
return iframe;
|
|
27739
|
+
}
|
|
27740
|
+
/**
|
|
27741
|
+
* Applies the styles from the provided document, including external stylesheets and inline styles,
|
|
27742
|
+
* to the specified iframe's document.
|
|
27743
|
+
*
|
|
27744
|
+
* @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.
|
|
27745
|
+
* @return {void} Does not return a value.
|
|
27746
|
+
*/
|
|
27747
|
+
applyDocumentStyleToIframe(iframe) {
|
|
27748
|
+
// Ignore style injection, if not on Chrome
|
|
27749
|
+
// (There is bug on Firefox: nothing appear in the print dialog)
|
|
27750
|
+
// TODO: Should be tested on Safari
|
|
27751
|
+
if (!isChrome(window))
|
|
27752
|
+
return;
|
|
27753
|
+
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27754
|
+
if (iframeDocument) {
|
|
27755
|
+
// Récupérer tous les styles (liens CSS)
|
|
27756
|
+
const links = Array.from(this.document.querySelectorAll('style,link[rel="stylesheet"]'));
|
|
27757
|
+
links.forEach((element) => {
|
|
27758
|
+
// Insert inline style
|
|
27759
|
+
if (element.tagName === 'STYLE') {
|
|
27760
|
+
const newStyle = iframeDocument.createElement('style');
|
|
27761
|
+
newStyle.innerHTML = element.innerHTML;
|
|
27762
|
+
iframeDocument.head.appendChild(newStyle);
|
|
27763
|
+
console.debug('[print-service] Add style to iframe', newStyle);
|
|
27764
|
+
}
|
|
27765
|
+
// Insert link to stylesheet file
|
|
27766
|
+
else if (element.tagName === 'LINK' && element.getAttribute('href')) {
|
|
27767
|
+
const newLink = iframeDocument.createElement('link');
|
|
27768
|
+
newLink.rel = 'stylesheet';
|
|
27769
|
+
newLink.href = element.getAttribute('href');
|
|
27770
|
+
iframeDocument.head.appendChild(newLink);
|
|
27771
|
+
console.debug('[print-service] Add stylesheet to iframe: ', newLink.href);
|
|
27772
|
+
}
|
|
27773
|
+
});
|
|
27774
|
+
}
|
|
27775
|
+
}
|
|
27776
|
+
async waitIdle(iframe, opts) {
|
|
27777
|
+
// Wait job finished
|
|
27778
|
+
const printId = opts?.id || this.printId;
|
|
27779
|
+
await waitForTrue(timer(500, 500).pipe(mergeMap$1(() => this.isLoaded(printId))), { timeout: opts?.timeout });
|
|
27780
|
+
// Wait end of iframe load
|
|
27781
|
+
await new Promise((resolve, reject) => {
|
|
27782
|
+
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27783
|
+
if (iframeWindow.document.readyState === 'complete') {
|
|
27784
|
+
resolve();
|
|
27785
|
+
}
|
|
27786
|
+
else {
|
|
27787
|
+
// Stop if timeout reached
|
|
27788
|
+
if (opts?.timeout > 0) {
|
|
27789
|
+
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27790
|
+
}
|
|
27791
|
+
const readyListener = () => {
|
|
27792
|
+
if (iframeWindow.document.readyState === 'complete') {
|
|
27793
|
+
resolve();
|
|
27794
|
+
iframeWindow.document.removeEventListener('readystatechange', readyListener);
|
|
27795
|
+
}
|
|
27796
|
+
};
|
|
27797
|
+
iframeWindow.document.addEventListener('readystatechange', readyListener);
|
|
27798
|
+
}
|
|
27799
|
+
});
|
|
27800
|
+
}
|
|
27801
|
+
/**
|
|
27802
|
+
* Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.
|
|
27803
|
+
*
|
|
27804
|
+
* @param {HTMLIFrameElement} iframe - The iframe element to be printed.
|
|
27805
|
+
* @param {{timeout?: number}} [opts] - An optional configuration object.
|
|
27806
|
+
* @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.
|
|
27807
|
+
* @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.
|
|
27808
|
+
*/
|
|
27809
|
+
print(iframe, opts) {
|
|
27810
|
+
return new Promise((resolve, reject) => {
|
|
27811
|
+
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27812
|
+
// Stop if timeout reached
|
|
27813
|
+
if (opts?.timeout > 0) {
|
|
27814
|
+
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27815
|
+
}
|
|
27816
|
+
// On Chrome
|
|
27817
|
+
if (isChrome(window)) {
|
|
27818
|
+
// Wait after print event, to resolve the promise
|
|
27819
|
+
const afterPrintListener = () => {
|
|
27820
|
+
console.debug('[print-service] After print');
|
|
27821
|
+
resolve();
|
|
27822
|
+
// Remove the listener
|
|
27823
|
+
iframeWindow.removeEventListener('afterprint', afterPrintListener);
|
|
27824
|
+
};
|
|
27825
|
+
iframeWindow.addEventListener('afterprint', afterPrintListener);
|
|
27826
|
+
iframe.contentWindow.window.print();
|
|
27827
|
+
}
|
|
27828
|
+
// Otherwise (e.g. Firefox)
|
|
27829
|
+
else {
|
|
27830
|
+
iframe.contentWindow.window.print();
|
|
27831
|
+
resolve();
|
|
27832
|
+
}
|
|
27833
|
+
});
|
|
27834
|
+
}
|
|
27835
|
+
async showToast(opts) {
|
|
27836
|
+
if (!this.toastController)
|
|
27837
|
+
throw new Error("Missing toastController in component's constructor");
|
|
27838
|
+
return await Toasts.show(this.toastController, this.translate, opts);
|
|
27839
|
+
}
|
|
27840
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, deps: [{ token: i2$1.ToastController }, { token: i1$1.TranslateService }, { token: StorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
27841
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, providedIn: 'root' });
|
|
27842
|
+
}
|
|
27843
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, decorators: [{
|
|
27844
|
+
type: Injectable,
|
|
27845
|
+
args: [{ providedIn: 'root' }]
|
|
27846
|
+
}], ctorParameters: () => [{ type: i2$1.ToastController }, { type: i1$1.TranslateService }, { type: StorageService }, { type: Document, decorators: [{
|
|
27847
|
+
type: Inject,
|
|
27848
|
+
args: [DOCUMENT]
|
|
27849
|
+
}] }] });
|
|
27850
|
+
|
|
27650
27851
|
class AppMarkdownContent {
|
|
27651
27852
|
cd;
|
|
27652
27853
|
element;
|
|
27653
27854
|
_document;
|
|
27654
27855
|
route;
|
|
27655
|
-
|
|
27856
|
+
_printId;
|
|
27656
27857
|
_clickSubscription;
|
|
27657
27858
|
navController = inject(NavController);
|
|
27658
27859
|
settings = inject(LocalSettingsService);
|
|
27659
27860
|
translate = inject(TranslateService);
|
|
27660
27861
|
network = inject(NetworkService);
|
|
27661
27862
|
markdownService = inject(MarkdownService);
|
|
27863
|
+
toastController = inject(ToastController);
|
|
27864
|
+
printService = inject(PrintService);
|
|
27662
27865
|
loading = true;
|
|
27663
27866
|
error = undefined;
|
|
27664
27867
|
baseUrl;
|
|
@@ -27697,6 +27900,8 @@ class AppMarkdownContent {
|
|
|
27697
27900
|
this.element = element;
|
|
27698
27901
|
this._document = _document;
|
|
27699
27902
|
this.route = route;
|
|
27903
|
+
this._printId = this.printService.nextJobId();
|
|
27904
|
+
this.markAsLoading({ emitEvent: false });
|
|
27700
27905
|
// TODO: for DEV only
|
|
27701
27906
|
//this.debug = !environment.production;
|
|
27702
27907
|
}
|
|
@@ -27720,29 +27925,56 @@ class AppMarkdownContent {
|
|
|
27720
27925
|
get canGoBack() {
|
|
27721
27926
|
return isNotEmptyArray(this._navHistory);
|
|
27722
27927
|
}
|
|
27723
|
-
print(
|
|
27724
|
-
|
|
27928
|
+
async print() {
|
|
27929
|
+
if (this.loading)
|
|
27930
|
+
return; // skip
|
|
27931
|
+
console.debug('[markdown] Print...');
|
|
27725
27932
|
if (!this.element) {
|
|
27726
|
-
console.error('
|
|
27933
|
+
console.error('Element to print not found. Please check the HTML template.');
|
|
27727
27934
|
return;
|
|
27728
27935
|
}
|
|
27729
|
-
|
|
27730
|
-
|
|
27731
|
-
|
|
27732
|
-
|
|
27733
|
-
|
|
27734
|
-
|
|
27735
|
-
|
|
27736
|
-
|
|
27737
|
-
|
|
27936
|
+
this.markAsLoading({ emitEvent: false });
|
|
27937
|
+
try {
|
|
27938
|
+
// Print
|
|
27939
|
+
await this.printService.printElement(this.element.nativeElement, {
|
|
27940
|
+
id: this._printId,
|
|
27941
|
+
// Print as portrait, by default
|
|
27942
|
+
style: `@media print {
|
|
27943
|
+
@page {
|
|
27944
|
+
size: portrait;
|
|
27945
|
+
margin: 1.1cm;
|
|
27946
|
+
}
|
|
27947
|
+
markdown hr {
|
|
27948
|
+
page-break-before: always;
|
|
27949
|
+
border: none;
|
|
27950
|
+
margin: 0;
|
|
27951
|
+
padding: 0;
|
|
27952
|
+
}
|
|
27953
|
+
markdown img {
|
|
27954
|
+
max-width: 100%;
|
|
27955
|
+
height: auto;
|
|
27956
|
+
page-break-inside: avoid;
|
|
27957
|
+
}
|
|
27958
|
+
}`,
|
|
27959
|
+
});
|
|
27960
|
+
}
|
|
27961
|
+
finally {
|
|
27962
|
+
this.markAsLoaded({ emitEvent: false });
|
|
27963
|
+
}
|
|
27738
27964
|
}
|
|
27739
|
-
markAsLoaded() {
|
|
27965
|
+
markAsLoaded(opts) {
|
|
27740
27966
|
this.loading = false;
|
|
27741
|
-
|
|
27967
|
+
if (opts?.emitEvent !== false) {
|
|
27968
|
+
this.printService.markAsLoaded(this._printId);
|
|
27969
|
+
this.cd.markForCheck();
|
|
27970
|
+
}
|
|
27742
27971
|
}
|
|
27743
|
-
markAsLoading() {
|
|
27972
|
+
markAsLoading(opts) {
|
|
27744
27973
|
this.loading = true;
|
|
27745
|
-
|
|
27974
|
+
if (opts?.emitEvent !== false) {
|
|
27975
|
+
this.printService.markAsLoading(this._printId);
|
|
27976
|
+
this.cd.markForCheck();
|
|
27977
|
+
}
|
|
27746
27978
|
}
|
|
27747
27979
|
setError(error) {
|
|
27748
27980
|
this.error = error?.['message'] || error || null;
|
|
@@ -27753,66 +27985,6 @@ class AppMarkdownContent {
|
|
|
27753
27985
|
this.cd.markForCheck();
|
|
27754
27986
|
}
|
|
27755
27987
|
/* -- protected functions -- */
|
|
27756
|
-
createPrintHiddenIframe(html, style) {
|
|
27757
|
-
// Create a iframe with '?print-pdf'
|
|
27758
|
-
const iframe = this._document.createElement('iframe');
|
|
27759
|
-
iframe.classList.add('cdk-visually-hidden');
|
|
27760
|
-
iframe.style.width = '100%';
|
|
27761
|
-
iframe.style.height = '100%';
|
|
27762
|
-
this._document.body.appendChild(iframe);
|
|
27763
|
-
// Charger le contenu HTML dans l'iframe
|
|
27764
|
-
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27765
|
-
if (iframeDocument) {
|
|
27766
|
-
iframeDocument.open();
|
|
27767
|
-
iframeDocument.write(`
|
|
27768
|
-
<html>
|
|
27769
|
-
<head>
|
|
27770
|
-
<title>${this._document.title}</title>
|
|
27771
|
-
<style>
|
|
27772
|
-
hr {
|
|
27773
|
-
page-break-before: always;
|
|
27774
|
-
border: 0 !important;
|
|
27775
|
-
padding: 0 !important;
|
|
27776
|
-
}
|
|
27777
|
-
body {
|
|
27778
|
-
font-family: 'Roboto', Helvetica, Arial, sans-serif;
|
|
27779
|
-
margin: 0;
|
|
27780
|
-
padding: 20px;
|
|
27781
|
-
}
|
|
27782
|
-
</style>
|
|
27783
|
-
</head>
|
|
27784
|
-
<body>
|
|
27785
|
-
${html}
|
|
27786
|
-
</body>
|
|
27787
|
-
</html>
|
|
27788
|
-
`);
|
|
27789
|
-
iframeDocument.close();
|
|
27790
|
-
}
|
|
27791
|
-
// Inject App style
|
|
27792
|
-
this.injectAppStylesIntoIframe(iframe);
|
|
27793
|
-
return iframe;
|
|
27794
|
-
}
|
|
27795
|
-
injectAppStylesIntoIframe(iframe) {
|
|
27796
|
-
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27797
|
-
if (iframeDocument) {
|
|
27798
|
-
// Récupérer tous les styles (liens CSS)
|
|
27799
|
-
const links = Array.from(this._document.querySelectorAll('link[rel="stylesheet"]'));
|
|
27800
|
-
links.forEach((link) => {
|
|
27801
|
-
const newLink = iframeDocument.createElement('link');
|
|
27802
|
-
newLink.rel = 'stylesheet';
|
|
27803
|
-
newLink.href = link.getAttribute('href');
|
|
27804
|
-
if (newLink.href)
|
|
27805
|
-
iframeDocument.head.appendChild(newLink);
|
|
27806
|
-
});
|
|
27807
|
-
// Récupérer tous les `styles` en ligne
|
|
27808
|
-
const inlineStyles = Array.from(this._document.querySelectorAll('style'));
|
|
27809
|
-
inlineStyles.forEach((style) => {
|
|
27810
|
-
const newStyle = iframeDocument.createElement('style');
|
|
27811
|
-
newStyle.innerHTML = style.innerHTML;
|
|
27812
|
-
iframeDocument.head.appendChild(newStyle);
|
|
27813
|
-
});
|
|
27814
|
-
}
|
|
27815
|
-
}
|
|
27816
27988
|
setData(value, opts) {
|
|
27817
27989
|
const anchor = opts?.anchor || null;
|
|
27818
27990
|
if (this._data !== value || this._anchor !== anchor) {
|
|
@@ -27844,7 +28016,9 @@ class AppMarkdownContent {
|
|
|
27844
28016
|
// Clean URL (remove fragment and query)
|
|
27845
28017
|
const anchor = opts?.anchor || UrlUtils.getFragment(src);
|
|
27846
28018
|
src = UrlUtils.stripFragmentAndQuery(src);
|
|
28019
|
+
src = MarkdownUtils.isGitlabUrl(src) ? MarkdownUtils.fixGitlabUrlToRaw(src) : src;
|
|
27847
28020
|
let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
|
|
28021
|
+
fallbackSrc = MarkdownUtils.isGitlabUrl(fallbackSrc) ? MarkdownUtils.fixGitlabUrlToRaw(fallbackSrc) : fallbackSrc;
|
|
27848
28022
|
if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
|
|
27849
28023
|
const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
|
|
27850
28024
|
if (url)
|
|
@@ -27938,11 +28112,11 @@ class AppMarkdownContent {
|
|
|
27938
28112
|
}));
|
|
27939
28113
|
}
|
|
27940
28114
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: DOCUMENT }, { token: i1$5.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
27941
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownContent, selector: "app-markdown-content", inputs: { data: "data", src: "src", anchor: "anchor", debug: ["debug", "debug", booleanAttribute], showError: ["showError", "showError", booleanAttribute], animated: ["animated", "animated", booleanAttribute], enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], updateRouteLocation: ["updateRouteLocation", "updateRouteLocation", booleanAttribute] }, outputs: { markdownUrlChange: "markdownUrlChange" }, ngImport: i0, template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow:
|
|
28115
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownContent, selector: "app-markdown-content", inputs: { data: "data", src: "src", anchor: "anchor", debug: ["debug", "debug", booleanAttribute], showError: ["showError", "showError", booleanAttribute], animated: ["animated", "animated", booleanAttribute], enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], updateRouteLocation: ["updateRouteLocation", "updateRouteLocation", booleanAttribute] }, outputs: { markdownUrlChange: "markdownUrlChange" }, ngImport: i0, template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{@page{size:portrait;margin:1.1cm}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:0;overflow:hidden}markdown hr{page-break-before:always;border:none;margin:0;padding:0}markdown img{max-width:100%;height:auto;page-break-inside:avoid}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { 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.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4$1.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: DebugComponent, selector: "app-debug", inputs: ["titlePrefix", "title", "enable", "expanded"] }, { kind: "directive", type: MarkdownDirective, selector: "markdown,[markdown]" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], animations: [slideDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
27942
28116
|
}
|
|
27943
28117
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, decorators: [{
|
|
27944
28118
|
type: Component,
|
|
27945
|
-
args: [{ selector: 'app-markdown-content', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideDownAnimation], template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow:
|
|
28119
|
+
args: [{ selector: 'app-markdown-content', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideDownAnimation], template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown hr{border-top:1px solid var(--ion-color-medium-tint, #dcdcde);margin:10px 0}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: -4px 0px 0px rgba(var(--ion-text-color-rgb), .4);--ion-padding: 4px;display:block;position:relative;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}@media print{@page{size:portrait;margin:1.1cm}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:0;overflow:hidden}markdown hr{page-break-before:always;border:none;margin:0;padding:0}markdown img{max-width:100%;height:auto;page-break-inside:avoid}}\n"] }]
|
|
27946
28120
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: Document, decorators: [{
|
|
27947
28121
|
type: Inject,
|
|
27948
28122
|
args: [DOCUMENT]
|
|
@@ -27981,12 +28155,13 @@ class AppMarkdownModal {
|
|
|
27981
28155
|
translate;
|
|
27982
28156
|
network;
|
|
27983
28157
|
cd;
|
|
27984
|
-
debug;
|
|
27985
28158
|
title;
|
|
27986
28159
|
showError = true;
|
|
27987
28160
|
canPrint = false;
|
|
27988
28161
|
data;
|
|
27989
28162
|
src;
|
|
28163
|
+
enableNavigationHistory = true;
|
|
28164
|
+
debug;
|
|
27990
28165
|
content;
|
|
27991
28166
|
static async show(modalCtrl, options) {
|
|
27992
28167
|
const modal = await modalCtrl.create({
|
|
@@ -28034,23 +28209,29 @@ class AppMarkdownModal {
|
|
|
28034
28209
|
this.content?.resetError();
|
|
28035
28210
|
}
|
|
28036
28211
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, deps: [{ token: i0.Injector }, { token: i2$1.ModalController }, { token: PlatformService }, { token: LocalSettingsService }, { token: i1$1.TranslateService }, { token: NetworkService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
28037
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: {
|
|
28212
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: { title: "title", showError: ["showError", "showError", booleanAttribute], canPrint: ["canPrint", "canPrint", booleanAttribute], data: "data", src: "src", enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], debug: ["debug", "debug", booleanAttribute] }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ion-buttons slot=\"end\">\n @if (canPrint) {\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n</app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [enableNavigationHistory]=\"enableNavigationHistory\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\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", 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.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.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "component", type: AppMarkdownContent, selector: "app-markdown-content", inputs: ["data", "src", "anchor", "debug", "showError", "animated", "enableNavigationHistory", "updateRouteLocation"], outputs: ["markdownUrlChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
28038
28213
|
}
|
|
28039
28214
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, decorators: [{
|
|
28040
28215
|
type: Component,
|
|
28041
|
-
args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "
|
|
28042
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i2$1.ModalController }, { type: PlatformService }, { type: LocalSettingsService }, { type: i1$1.TranslateService }, { type: NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: {
|
|
28043
|
-
type: Input
|
|
28044
|
-
}], title: [{
|
|
28216
|
+
args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n\n <ion-buttons slot=\"end\">\n @if (canPrint) {\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n</app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"src\"\n [data]=\"data\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [enableNavigationHistory]=\"enableNavigationHistory\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\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" }]
|
|
28217
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i2$1.ModalController }, { type: PlatformService }, { type: LocalSettingsService }, { type: i1$1.TranslateService }, { type: NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: { title: [{
|
|
28045
28218
|
type: Input
|
|
28046
28219
|
}], showError: [{
|
|
28047
|
-
type: Input
|
|
28220
|
+
type: Input,
|
|
28221
|
+
args: [{ transform: booleanAttribute }]
|
|
28048
28222
|
}], canPrint: [{
|
|
28049
|
-
type: Input
|
|
28223
|
+
type: Input,
|
|
28224
|
+
args: [{ transform: booleanAttribute }]
|
|
28050
28225
|
}], data: [{
|
|
28051
28226
|
type: Input
|
|
28052
28227
|
}], src: [{
|
|
28053
28228
|
type: Input
|
|
28229
|
+
}], enableNavigationHistory: [{
|
|
28230
|
+
type: Input,
|
|
28231
|
+
args: [{ transform: booleanAttribute }]
|
|
28232
|
+
}], debug: [{
|
|
28233
|
+
type: Input,
|
|
28234
|
+
args: [{ transform: booleanAttribute }]
|
|
28054
28235
|
}], content: [{
|
|
28055
28236
|
type: ViewChild,
|
|
28056
28237
|
args: ['content']
|
|
@@ -30162,10 +30343,10 @@ class AppValidatorService extends ValidatorService {
|
|
|
30162
30343
|
getRowValidator() {
|
|
30163
30344
|
return this.getFormGroup();
|
|
30164
30345
|
}
|
|
30165
|
-
getFormGroup(data
|
|
30346
|
+
getFormGroup(data) {
|
|
30166
30347
|
return this.formBuilder.group(this.getFormGroupConfig(data));
|
|
30167
30348
|
}
|
|
30168
|
-
getFormGroupConfig(data
|
|
30349
|
+
getFormGroupConfig(data) {
|
|
30169
30350
|
return {};
|
|
30170
30351
|
}
|
|
30171
30352
|
getI18nFormErrors(control) {
|
|
@@ -31147,6 +31328,9 @@ class HomePage extends RxState {
|
|
|
31147
31328
|
await AppMarkdownModal.show(this.modalCtrl, {
|
|
31148
31329
|
title: this.translate.instant(item.title, item.titleArgs),
|
|
31149
31330
|
src: url,
|
|
31331
|
+
enableNavigationHistory: false,
|
|
31332
|
+
// FIXME failed in chrome
|
|
31333
|
+
//canPrint: true,
|
|
31150
31334
|
});
|
|
31151
31335
|
}
|
|
31152
31336
|
else {
|
|
@@ -34817,12 +35001,9 @@ let PropertyEntity = class PropertyEntity extends Entity {
|
|
|
34817
35001
|
static fromObject;
|
|
34818
35002
|
definition = null;
|
|
34819
35003
|
value = null;
|
|
34820
|
-
get key() {
|
|
34821
|
-
return this.definition?.key || this.id;
|
|
34822
|
-
}
|
|
34823
35004
|
fromObject(source) {
|
|
34824
35005
|
super.fromObject(source);
|
|
34825
|
-
this.id = source.definition?.key
|
|
35006
|
+
this.id = source.definition?.key || source.id;
|
|
34826
35007
|
this.definition = source.definition;
|
|
34827
35008
|
this.value = source.value;
|
|
34828
35009
|
}
|
|
@@ -34890,13 +35071,15 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
34890
35071
|
definitions;
|
|
34891
35072
|
showToolbar = true;
|
|
34892
35073
|
filterExpansionPanel;
|
|
35074
|
+
// availableDefinitions$ = new BehaviorSubject<TranslatedFormFieldDefinition[]>([]);
|
|
34893
35075
|
definitionsMapByKey = {};
|
|
35076
|
+
translationsByKey = {};
|
|
34894
35077
|
filterForm;
|
|
34895
35078
|
filterCriteriaCount = 0;
|
|
34896
35079
|
filterPanelFloating = true;
|
|
34897
35080
|
constructor(injector, formBuilder, validatorService, environment) {
|
|
34898
35081
|
super(injector, [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS], PropertyEntity, new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {
|
|
34899
|
-
sortByReplacement: { definition: 'definition.
|
|
35082
|
+
sortByReplacement: { definition: 'definition.translatedName' },
|
|
34900
35083
|
}), validatorService);
|
|
34901
35084
|
this.injector = injector;
|
|
34902
35085
|
this.formBuilder = formBuilder;
|
|
@@ -34913,14 +35096,11 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
34913
35096
|
}
|
|
34914
35097
|
ngOnInit() {
|
|
34915
35098
|
super.ngOnInit();
|
|
34916
|
-
// Fill
|
|
34917
|
-
this.
|
|
34918
|
-
|
|
34919
|
-
|
|
34920
|
-
label: this.translate.instant(def.label),
|
|
34921
|
-
};
|
|
35099
|
+
// Fill options map
|
|
35100
|
+
this.definitionsMapByKey = {};
|
|
35101
|
+
this.definitions?.forEach((o) => {
|
|
35102
|
+
this.definitionsMapByKey[o.key] = o;
|
|
34922
35103
|
});
|
|
34923
|
-
this.definitionsMapByKey = splitByProperty(this.definitions, 'key');
|
|
34924
35104
|
this.registerCellValueChanges('definition').subscribe((definition) => {
|
|
34925
35105
|
if (isNotNil(definition) && this.editedRow?.id === -1) {
|
|
34926
35106
|
this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });
|
|
@@ -34953,18 +35133,18 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
34953
35133
|
}
|
|
34954
35134
|
definitionByRow = (row) => this.definitionsMapByKey[row.currentData.id];
|
|
34955
35135
|
setValue(value, opts) {
|
|
35136
|
+
// Update translations
|
|
35137
|
+
this.translationsByKey = isNotEmptyArray(this.definitions) ? this.translate.instant(this.definitions.map((def) => def.label)) : {};
|
|
34956
35138
|
// Build entities
|
|
34957
|
-
const
|
|
34958
|
-
|
|
34959
|
-
|
|
34960
|
-
|
|
34961
|
-
|
|
34962
|
-
|
|
34963
|
-
|
|
34964
|
-
|
|
34965
|
-
|
|
34966
|
-
});
|
|
34967
|
-
});
|
|
35139
|
+
const source = (value || []).slice();
|
|
35140
|
+
const target = [];
|
|
35141
|
+
target.push(...this.definitions.map((definition) => PropertyEntity.fromObject({
|
|
35142
|
+
id: definition.key,
|
|
35143
|
+
// translate definition label
|
|
35144
|
+
definition: this.toTranslatedFormFieldDefinition(definition),
|
|
35145
|
+
// get user value or default value
|
|
35146
|
+
value: this.toValue(source, definition),
|
|
35147
|
+
})));
|
|
34968
35148
|
super.setValue(target, opts);
|
|
34969
35149
|
}
|
|
34970
35150
|
clearControlValue(event, formControl) {
|
|
@@ -35015,18 +35195,26 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35015
35195
|
if (this.filterExpansionPanel && this.filterPanelFloating)
|
|
35016
35196
|
this.filterExpansionPanel.close();
|
|
35017
35197
|
}
|
|
35198
|
+
toTranslatedFormFieldDefinition = (definition) => ({
|
|
35199
|
+
...definition,
|
|
35200
|
+
translatedName: this.translationsByKey[definition.label],
|
|
35201
|
+
});
|
|
35018
35202
|
resetProperty(event, row) {
|
|
35019
35203
|
event?.preventDefault();
|
|
35020
35204
|
row.validator.patchValue({ value: row.currentData.definition.defaultValue });
|
|
35021
|
-
|
|
35205
|
+
row.confirmEditCreate();
|
|
35022
35206
|
this.markRowAsDirty();
|
|
35023
35207
|
}
|
|
35208
|
+
toValue(values, definition) {
|
|
35209
|
+
const value = values.find((v) => v.id === definition.key)?.value;
|
|
35210
|
+
return isNotNil(value) ? value : definition.defaultValue;
|
|
35211
|
+
}
|
|
35024
35212
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesTable, deps: [{ token: i0.Injector }, { token: i1$3.UntypedFormBuilder }, { token: PropertyEntityValidator }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
35025
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '»' : '«' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.label' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'SETTINGS.BTN_RESET_PROPERTY' | translate\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.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.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.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { 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.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i2$1.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i8$2.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8$2.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13$2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i13$2.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i11$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i1$4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "required", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
35213
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat)\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '»' : '«' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.translatedName' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'SETTINGS.BTN_RESET_PROPERTY' | translate\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.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.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.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { 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.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i2$1.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i2$1.IonRow, selector: "ion-row" }, { kind: "component", type: i2$1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i8$2.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8$2.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13$2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i13$2.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i11$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i1$4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "required", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
35026
35214
|
}
|
|
35027
35215
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesTable, decorators: [{
|
|
35028
35216
|
type: Component,
|
|
35029
|
-
args: [{ selector: 'app-properties-table', providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat)
|
|
35217
|
+
args: [{ selector: 'app-properties-table', providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat)\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '»' : '«' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.translatedName' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'SETTINGS.BTN_RESET_PROPERTY' | translate\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n" }]
|
|
35030
35218
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1$3.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: Environment, decorators: [{
|
|
35031
35219
|
type: Inject,
|
|
35032
35220
|
args: [ENVIRONMENT]
|
|
@@ -39320,19 +39508,15 @@ class AccountPage extends AppForm {
|
|
|
39320
39508
|
get valid() {
|
|
39321
39509
|
return super.valid && (this.propertiesTable?.valid || true);
|
|
39322
39510
|
}
|
|
39323
|
-
get invalid() {
|
|
39324
|
-
return super.invalid && (this.propertiesTable ? this.propertiesTable.invalid : false);
|
|
39325
|
-
}
|
|
39326
|
-
get dirty() {
|
|
39327
|
-
return super.dirty || this.propertiesTable?.dirty || false;
|
|
39328
|
-
}
|
|
39329
39511
|
showLatLonFormat = true;
|
|
39330
39512
|
canChangePassword = false;
|
|
39331
39513
|
showSecurityDetails = false;
|
|
39332
39514
|
showTechnicalDetails = true;
|
|
39333
39515
|
showApiTokens = false;
|
|
39334
|
-
constructor(injector, formBuilder, accountService, network, navController, validatorService,
|
|
39335
|
-
|
|
39516
|
+
constructor(injector, formBuilder, accountService, network, navController, validatorService,
|
|
39517
|
+
// protected settingsValidatorService: UserSettingsValidatorService,
|
|
39518
|
+
configService, cd, locales) {
|
|
39519
|
+
super(injector, validatorService.getFormGroup(accountService.account));
|
|
39336
39520
|
this.formBuilder = formBuilder;
|
|
39337
39521
|
this.accountService = accountService;
|
|
39338
39522
|
this.network = network;
|
|
@@ -39341,6 +39525,10 @@ class AccountPage extends AppForm {
|
|
|
39341
39525
|
this.configService = configService;
|
|
39342
39526
|
this.cd = cd;
|
|
39343
39527
|
this.locales = locales;
|
|
39528
|
+
// Add settings fo form
|
|
39529
|
+
// this.settingsForm = settingsValidatorService.getFormGroup(accountService.account && accountService.account.settings);
|
|
39530
|
+
// this.settingsContentForm = (this.settingsForm.controls['content'] as UntypedFormGroup);
|
|
39531
|
+
// this.form.addControl('settings', this.settingsForm);
|
|
39344
39532
|
this.mobile = this.settings.mobile;
|
|
39345
39533
|
this.debug = !environment.production;
|
|
39346
39534
|
// By default, disable the form
|
|
@@ -39417,28 +39605,16 @@ class AccountPage extends AppForm {
|
|
|
39417
39605
|
async setValue(data, opts) {
|
|
39418
39606
|
super.setValue(data, opts);
|
|
39419
39607
|
// Set options
|
|
39420
|
-
|
|
39421
|
-
|
|
39422
|
-
|
|
39423
|
-
|
|
39424
|
-
|
|
39425
|
-
|
|
39426
|
-
|
|
39427
|
-
|
|
39428
|
-
|
|
39429
|
-
|
|
39430
|
-
// await this.propertiesTable.ready();
|
|
39431
|
-
// this.propertiesTable.value = propertiesEntities;
|
|
39432
|
-
// }
|
|
39433
|
-
// Set options
|
|
39434
|
-
const { properties } = data?.settings?.asLocalSettings({ definitions: this.optionDefinitions }) || {};
|
|
39435
|
-
const propertiesEntities = this.optionDefinitions
|
|
39436
|
-
.map((definition) => {
|
|
39437
|
-
const value = properties?.[definition.key];
|
|
39438
|
-
return isNotNil(value) ? PropertyEntity.fromObject({ definition, value }) : null;
|
|
39439
|
-
})
|
|
39440
|
-
.filter(isNotNil);
|
|
39441
|
-
if (this.propertiesTable) {
|
|
39608
|
+
if (isNotEmptyArray(this.optionDefinitions) && this.propertiesTable) {
|
|
39609
|
+
const properties = data?.settings?.asLocalSettings()?.properties || {};
|
|
39610
|
+
const propertiesEntities = [];
|
|
39611
|
+
this.optionDefinitions
|
|
39612
|
+
.map((definition) => definition.key)
|
|
39613
|
+
.forEach((key) => {
|
|
39614
|
+
if (isNotNil(properties[key])) {
|
|
39615
|
+
propertiesEntities.push(PropertyEntity.fromObject({ id: key, value: properties[key] }));
|
|
39616
|
+
}
|
|
39617
|
+
});
|
|
39442
39618
|
await this.propertiesTable.ready();
|
|
39443
39619
|
this.propertiesTable.value = propertiesEntities;
|
|
39444
39620
|
}
|
|
@@ -39501,7 +39677,7 @@ class AccountPage extends AppForm {
|
|
|
39501
39677
|
...this.form.value,
|
|
39502
39678
|
});
|
|
39503
39679
|
if (isNotEmptyArray(this.optionDefinitions) && this.propertiesTable) {
|
|
39504
|
-
//
|
|
39680
|
+
// merge properties
|
|
39505
39681
|
await this.propertiesTable.save();
|
|
39506
39682
|
const propertyEntities = this.propertiesTable.value || [];
|
|
39507
39683
|
const properties = propertyEntities.reduce((res, item) => {
|
|
@@ -45407,7 +45583,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
45407
45583
|
class MarkdownTestPage {
|
|
45408
45584
|
modalCtrl;
|
|
45409
45585
|
cd;
|
|
45586
|
+
environment;
|
|
45410
45587
|
markdownModalTitle = 'Markdown modal';
|
|
45588
|
+
debug;
|
|
45411
45589
|
// URL from a starting markdown
|
|
45412
45590
|
//protected markdownUrl = 'http://localhost:3000/user-manual/index.md';
|
|
45413
45591
|
markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/pifil/man/quick_start_guide_fr.md';
|
|
@@ -45416,9 +45594,11 @@ class MarkdownTestPage {
|
|
|
45416
45594
|
//protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/model/administration/index.md';
|
|
45417
45595
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/activity-calendar/spe/collecte_de_donnees.md';
|
|
45418
45596
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/develop/doc/privacy_policy.md';
|
|
45419
|
-
constructor(modalCtrl, cd) {
|
|
45597
|
+
constructor(modalCtrl, cd, environment) {
|
|
45420
45598
|
this.modalCtrl = modalCtrl;
|
|
45421
45599
|
this.cd = cd;
|
|
45600
|
+
this.environment = environment;
|
|
45601
|
+
this.debug = !environment.production;
|
|
45422
45602
|
}
|
|
45423
45603
|
onSubmit(event, newUrl) {
|
|
45424
45604
|
this.markdownUrl = '' + newUrl;
|
|
@@ -45435,13 +45615,16 @@ class MarkdownTestPage {
|
|
|
45435
45615
|
canPrint: true,
|
|
45436
45616
|
});
|
|
45437
45617
|
}
|
|
45438
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, deps: [{ token: i2$1.ModalController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
45439
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MarkdownTestPage, selector: "app-markdown-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n @if (content.canGoBack) {\n <ion-button class=\"back-button\" (click)=\"content.goBack($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n } @else {\n <ion-back-button></ion-back-button>\n }\n </ion-buttons>\n\n <ion-title>Markdown test page</ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"openHelpModal($event)\">Open in modal</ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-input\n #input\n fill=\"outline\"\n [ngModel]=\"markdownUrl\"\n placeholder=\"Markdown URL\"\n label=\"URL: \"\n (keyup.enter)=\"onSubmit($event, input.value)\"\n >\n <ion-button\n slot=\"end\"\n [fill]=\"markdownUrl !== input.value ? 'solid' : 'clear'\"\n (click)=\"onSubmit($event, input.value)\"\n >\n {{ 'COMMON.BTN_OK' | translate }}\n </ion-button>\n </ion-input>\n\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n enableNavigationHistory=\"true\"\n debug=\"
|
|
45618
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, deps: [{ token: i2$1.ModalController }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
45619
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MarkdownTestPage, selector: "app-markdown-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n @if (content.canGoBack) {\n <ion-button class=\"back-button\" (click)=\"content.goBack($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n } @else {\n <ion-back-button></ion-back-button>\n }\n </ion-buttons>\n\n <ion-title>Markdown test page</ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n\n <ion-button (click)=\"openHelpModal($event)\">Open in modal</ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-input\n #input\n fill=\"outline\"\n [ngModel]=\"markdownUrl\"\n placeholder=\"Markdown URL\"\n label=\"URL: \"\n (keyup.enter)=\"onSubmit($event, input.value)\"\n >\n <ion-button\n slot=\"end\"\n [fill]=\"markdownUrl !== input.value ? 'solid' : 'clear'\"\n (click)=\"onSubmit($event, input.value)\"\n >\n {{ 'COMMON.BTN_OK' | translate }}\n </ion-button>\n </ion-input>\n\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n enableNavigationHistory=\"true\"\n [debug]=\"debug\"\n (markdownUrlChange)=\"updateInputUrl($event)\"\n ></app-markdown-content>\n</ion-content>\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.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2$1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { 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.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "legacy", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { 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: i2$1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar,ion-range" }, { kind: "component", type: i2$1.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AppMarkdownContent, selector: "app-markdown-content", inputs: ["data", "src", "anchor", "debug", "showError", "animated", "enableNavigationHistory", "updateRouteLocation"], outputs: ["markdownUrlChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
45440
45620
|
}
|
|
45441
45621
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, decorators: [{
|
|
45442
45622
|
type: Component,
|
|
45443
|
-
args: [{ selector: 'app-markdown-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n @if (content.canGoBack) {\n <ion-button class=\"back-button\" (click)=\"content.goBack($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n } @else {\n <ion-back-button></ion-back-button>\n }\n </ion-buttons>\n\n <ion-title>Markdown test page</ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"openHelpModal($event)\">Open in modal</ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-input\n #input\n fill=\"outline\"\n [ngModel]=\"markdownUrl\"\n placeholder=\"Markdown URL\"\n label=\"URL: \"\n (keyup.enter)=\"onSubmit($event, input.value)\"\n >\n <ion-button\n slot=\"end\"\n [fill]=\"markdownUrl !== input.value ? 'solid' : 'clear'\"\n (click)=\"onSubmit($event, input.value)\"\n >\n {{ 'COMMON.BTN_OK' | translate }}\n </ion-button>\n </ion-input>\n\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n enableNavigationHistory=\"true\"\n debug=\"
|
|
45444
|
-
}], ctorParameters: () => [{ type: i2$1.ModalController }, { type: i0.ChangeDetectorRef }
|
|
45623
|
+
args: [{ selector: 'app-markdown-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n @if (content.canGoBack) {\n <ion-button class=\"back-button\" (click)=\"content.goBack($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n } @else {\n <ion-back-button></ion-back-button>\n }\n </ion-buttons>\n\n <ion-title>Markdown test page</ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button slot=\"end\" (click)=\"content.print()\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n\n <ion-button (click)=\"openHelpModal($event)\">Open in modal</ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-input\n #input\n fill=\"outline\"\n [ngModel]=\"markdownUrl\"\n placeholder=\"Markdown URL\"\n label=\"URL: \"\n (keyup.enter)=\"onSubmit($event, input.value)\"\n >\n <ion-button\n slot=\"end\"\n [fill]=\"markdownUrl !== input.value ? 'solid' : 'clear'\"\n (click)=\"onSubmit($event, input.value)\"\n >\n {{ 'COMMON.BTN_OK' | translate }}\n </ion-button>\n </ion-input>\n\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n enableNavigationHistory=\"true\"\n [debug]=\"debug\"\n (markdownUrlChange)=\"updateInputUrl($event)\"\n ></app-markdown-content>\n</ion-content>\n" }]
|
|
45624
|
+
}], ctorParameters: () => [{ type: i2$1.ModalController }, { type: i0.ChangeDetectorRef }, { type: Environment, decorators: [{
|
|
45625
|
+
type: Inject,
|
|
45626
|
+
args: [ENVIRONMENT]
|
|
45627
|
+
}] }] });
|
|
45445
45628
|
|
|
45446
45629
|
const routes$4 = [
|
|
45447
45630
|
{
|
|
@@ -47183,5 +47366,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
47183
47366
|
* Generated bundle index. Do not edit.
|
|
47184
47367
|
*/
|
|
47185
47368
|
|
|
47186
|
-
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_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_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, 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, 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, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, ArrayFilterPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayPluckPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellValueChangeListener, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, 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, 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, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, 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, 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, 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, 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, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertiesFormTestPage, PropertiesFormTestingModule, PropertyEntity, PropertyEntityFilter, PropertyEntityValidator, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialToStringPipe, ReferentialUtils, ReferentialValidatorService, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RxStateModule, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, 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_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, SafeHtmlPipe, 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, SharedTextFormModule, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, compareVersionNumbers, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProduction, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isFirefox, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlsEnabled, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
47369
|
+
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_DEBUG_DATA_SERVICE, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_FRAGMENTS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_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_PROGRESS_BAR_SERVICE, APP_SETTINGS_MENU_ITEMS, 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, 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, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, AppMarkdownContent, AppMarkdownModal, AppMenuModule, AppNullForm, AppPropertiesForm, AppPropertiesFormModule, AppPropertiesTable, AppPropertiesUtils, AppPropertyUtils, AppRegisterModule, AppResetPasswordModal, AppRowField, AppSelectPeerModule, AppSettingsPageModule, AppTabEditor, AppTabEditorOptions, AppTable, AppTableModule, AppTableUtils, AppTextPopoverModule, AppUpdateOfflineModeCard, AppUpdateOfflineModeCardModule, AppValidatorService, ArrayFilterPipe, ArrayFirstPipe, ArrayFormTestPage, ArrayIncludesPipe, ArrayJoinPipe, ArrayLastPipe, ArrayLengthPipe, ArrayPluckPipe, AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe, AudioProvider, AudioTestingModule, AudioTestingPage, AuthGuardService, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, BadgeDirective, BadgeNumberPipe, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, BooleanFormatPipe, BooleanTestPage, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CapitalizePipe, CellValueChangeListener, ChangePasswordForm, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigFragments, ConfigService, Configuration, CoreModule, CorePipesModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, 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, 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, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormArrayTestModule, FormButtonsBarComponent, FormButtonsBarToken, FormErrorPipe, FormErrorTranslatePipe, FormErrorTranslator, FormFieldDefinitionUtils, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, GalleryTestPage, GeolocationUtils, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, IPosition, 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, 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, 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, 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, NetworkService, NetworkUtils, NewTokenForm, NewTokenModal, NgInitDirective, NgVarDirective, NoHtmlPipe, NotEmptyArrayPipe, NumberFormatPipe, ObservableTestPage, OddPipe, OtherMenuTestingPage, PEER_URL_REGEXP, PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, PRINT_LOADING_STORAGE_KEY_PREFIX, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, 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, RegExpUtils, RegisterConfirmPage, RegisterForm, RegisterModal, ResizableComponent, ResizableDirective, ResizableModule, RxStateModule, RxStateProperty, RxStateRegister, RxStateSelect, SCRYPT_PARAMS, 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_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, SafeHtmlPipe, 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, SharedTextFormModule, SharedToolbarModule, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StorageDrivers, StorageExplorerComponent, StorageExplorerModule, StorageExplorerTestingModule, StorageExplorerTestingRoutingModule, StorageService, StrIncludesPipe, StrLengthPipe, StrReplacePipe, SubMenuTabDirective, SwipeTestPage, Table2TestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TableValidatorService, TextForm, TextFormTestingPage, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ThrottledClickDirective, ToStringPipe, ToastTestingModule, ToastTestingPage, Toasts, TokenScope, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, TreeItemEntityUtils, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UrlUtils, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, ValueFormatPipe, VersionUtils, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, compareVersionNumbers, computeDecimalDegrees, computeDecimalPart, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableAndClearControl, disableAndClearControls, disableControl, disableControls, emitPromiseEvent, enableControl, enableControls, enableRxStateProduction, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, fadeInSlowAnimation, filterFalse, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, filterNotNil, filterNumberInput, filterTrue, findParentWithClass, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatLong, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, getRandomImageWithCredit, getUserAgent, hexToRgb, hexToRgbArray, initArrayControlsFromValues, intersectArrays, isAndroid, isBlankString, isCapacitor, isChrome, isControlHasInput, isEdge, isEmptyArray, isFirefox, isIOS, isInputElement, isInstanceOf, isInt, isIpad, isMacOS, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isOnFieldMode, isProgressEvent, isPromise, isResponseEvent, isSafari, isSameVersion, isStartableService, isTouchUi, isVersionCompatible, isWindows, joinProperties, joinPropertiesPath, lastArrayValue, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, maskitoAutoSelectByMaskPattern, maskitoPrefixPlugin, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, newArray, noHtml, noTrailingSlash, notNilOrDefault, nullIfNilOrBlank, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputContentFromEvent, selectInputRange, setCalculatedValue, setControlEnabled, setControlsEnabled, setPropertyByPath, setTabIndex, sleep, slideDownAnimation, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
47187
47370
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|