@sumaris-net/ngx-components 18.6.11-alpha2 → 18.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +3 -0
- package/esm2022/public_api.mjs +1 -2
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +1 -1
- package/esm2022/src/app/core/account/account.page.mjs +18 -20
- package/esm2022/src/app/core/form/properties/properties.table.mjs +28 -32
- package/esm2022/src/app/core/form/properties/properties.utils.mjs +14 -1
- package/esm2022/src/app/core/home/home.mjs +1 -4
- package/esm2022/src/app/core/services/account.service.mjs +22 -7
- package/esm2022/src/app/core/services/local-settings.service.mjs +9 -2
- package/esm2022/src/app/core/services/model/account.model.mjs +32 -13
- package/esm2022/src/app/core/services/model/entity.model.mjs +1 -1
- package/esm2022/src/app/core/services/platform.service.mjs +4 -3
- 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 +81 -55
- package/esm2022/src/app/shared/markdown/markdown.modal.mjs +10 -17
- package/esm2022/src/app/shared/markdown/markdown.service.mjs +3 -4
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +1 -8
- package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +7 -16
- 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/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 +214 -412
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +0 -1
- package/src/app/admin/services/validator/person.validator.d.ts +1 -1
- package/src/app/core/account/account.page.d.ts +2 -0
- package/src/app/core/form/properties/properties.table.d.ts +4 -10
- package/src/app/core/form/properties/properties.utils.d.ts +4 -0
- package/src/app/core/services/account.service.d.ts +2 -0
- package/src/app/core/services/local-settings.service.d.ts +1 -0
- package/src/app/core/services/model/account.model.d.ts +17 -2
- 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/inputs.d.ts +1 -1
- package/src/app/shared/markdown/markdown.component.d.ts +7 -12
- package/src/app/shared/markdown/markdown.modal.d.ts +2 -9
- package/src/app/shared/markdown/markdown.utils.d.ts +0 -1
- package/src/app/shared/markdown/testing/markdown.test.d.ts +1 -4
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +3 -1
- package/src/app/shared/named-filter/named-filter.model.d.ts +2 -2
- package/src/app/social/user-event/user-event.model.d.ts +2 -2
- package/src/assets/i18n/en-US.json +2 -3
- package/src/assets/i18n/en.json +1 -2
- package/src/assets/i18n/fr.json +1 -2
- package/src/assets/manifest.json +1 -1
- package/esm2022/src/app/shared/print/print.service.mjs +0 -257
- package/src/app/shared/print/print.service.d.ts +0 -60
|
@@ -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,
|
|
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';
|
|
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,6 +7170,19 @@ 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
|
+
}
|
|
7173
7186
|
}
|
|
7174
7187
|
class AppPropertyUtils {
|
|
7175
7188
|
static key(key) {
|
|
@@ -12381,12 +12394,18 @@ class LocalSettingsService extends StartableService {
|
|
|
12381
12394
|
async apply(settings, opts) {
|
|
12382
12395
|
if (!this.started)
|
|
12383
12396
|
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
|
+
}
|
|
12384
12401
|
const data = {
|
|
12385
12402
|
...this._data,
|
|
12386
12403
|
...settings,
|
|
12387
12404
|
};
|
|
12388
12405
|
if (equals(data, this._data))
|
|
12389
12406
|
return; // Skip if no changes
|
|
12407
|
+
// DEBUG
|
|
12408
|
+
//console.debug('[platform] Applying local settings...', settings);
|
|
12390
12409
|
this._data = data;
|
|
12391
12410
|
// Save locally
|
|
12392
12411
|
if (opts && opts.persistImmediate) {
|
|
@@ -12521,7 +12540,7 @@ class LocalSettingsService extends StartableService {
|
|
|
12521
12540
|
const index = this._optionDefs.findIndex((f) => f.key === def.key);
|
|
12522
12541
|
if (index !== -1) {
|
|
12523
12542
|
if (opts?.replaceIfExists !== true) {
|
|
12524
|
-
throw new Error(`Additional
|
|
12543
|
+
throw new Error(`Additional property {${def.key}} already define.`);
|
|
12525
12544
|
}
|
|
12526
12545
|
// Replace existing
|
|
12527
12546
|
if (this._debug)
|
|
@@ -16286,11 +16305,11 @@ class ModalToolbarComponent {
|
|
|
16286
16305
|
this._subscription.unsubscribe();
|
|
16287
16306
|
}
|
|
16288
16307
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalToolbarComponent, deps: [{ token: Hotkeys }], target: i0.ɵɵFactoryTarget.Component });
|
|
16289
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
16308
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.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 <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 <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 });
|
|
16290
16309
|
}
|
|
16291
16310
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalToolbarComponent, decorators: [{
|
|
16292
16311
|
type: Component,
|
|
16293
|
-
args: [{ selector: 'app-modal-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar [color]=\"color\">\n <ion-buttons slot=\"start\">\n
|
|
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 <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\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" }]
|
|
16294
16313
|
}], ctorParameters: () => [{ type: Hotkeys }], propDecorators: { modalName: [{
|
|
16295
16314
|
type: Input
|
|
16296
16315
|
}], title: [{
|
|
@@ -21313,11 +21332,19 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21313
21332
|
}
|
|
21314
21333
|
this.nonce = source.nonce;
|
|
21315
21334
|
}
|
|
21316
|
-
|
|
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) {
|
|
21317
21344
|
if (!source)
|
|
21318
21345
|
return; // Skip
|
|
21319
|
-
// Reset content
|
|
21320
|
-
this.content = {};
|
|
21346
|
+
// Reset or init content
|
|
21347
|
+
this.content = resetContent ? {} : this.content || {};
|
|
21321
21348
|
let hasChanges = false;
|
|
21322
21349
|
// For each property of source object
|
|
21323
21350
|
Object.keys(source).forEach((key) => {
|
|
@@ -21329,13 +21356,14 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21329
21356
|
}
|
|
21330
21357
|
}
|
|
21331
21358
|
// Else, store property into the 'content' map
|
|
21332
|
-
else if (
|
|
21333
|
-
|
|
21334
|
-
|
|
21335
|
-
|
|
21359
|
+
else if (includedProperties && includedProperties.includes(key)) {
|
|
21360
|
+
const sourceValue = source[key];
|
|
21361
|
+
if (!equals(this.content[key], sourceValue)) {
|
|
21362
|
+
if (typeof sourceValue === 'object' && sourceValue !== null) {
|
|
21363
|
+
this.content[key] = { ...this.content[key], ...sourceValue }; // Merge object
|
|
21336
21364
|
}
|
|
21337
21365
|
else {
|
|
21338
|
-
this.content[key] =
|
|
21366
|
+
this.content[key] = sourceValue;
|
|
21339
21367
|
}
|
|
21340
21368
|
hasChanges = true;
|
|
21341
21369
|
}
|
|
@@ -21343,7 +21371,11 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21343
21371
|
});
|
|
21344
21372
|
return hasChanges;
|
|
21345
21373
|
}
|
|
21346
|
-
|
|
21374
|
+
/**
|
|
21375
|
+
* Transform user settings into local settings
|
|
21376
|
+
* @param opts
|
|
21377
|
+
*/
|
|
21378
|
+
asLocalSettings(opts) {
|
|
21347
21379
|
const target = {};
|
|
21348
21380
|
UserSettings_1.SETTINGS_PROPERTIES.forEach((key) => {
|
|
21349
21381
|
target[key] = this[key];
|
|
@@ -21351,9 +21383,14 @@ let UserSettings = class UserSettings extends Entity {
|
|
|
21351
21383
|
Object.keys(this.content).forEach((key) => {
|
|
21352
21384
|
target[key] = this.content[key];
|
|
21353
21385
|
});
|
|
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
|
+
}
|
|
21354
21391
|
// Clear properties if empty, to avoid to reset the existing properties - See issue sumaris-app#897
|
|
21355
|
-
if (Object.keys(target
|
|
21356
|
-
delete target
|
|
21392
|
+
if (Object.keys(target.properties || {}).length === 0) {
|
|
21393
|
+
delete target.properties;
|
|
21357
21394
|
}
|
|
21358
21395
|
return target;
|
|
21359
21396
|
}
|
|
@@ -21664,6 +21701,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
21664
21701
|
department: null,
|
|
21665
21702
|
};
|
|
21666
21703
|
_optionDefs;
|
|
21704
|
+
_remoteLocalSettingsKeys;
|
|
21667
21705
|
_$additionalFields = new BehaviorSubject([]);
|
|
21668
21706
|
_tokenType$ = new BehaviorSubject(undefined);
|
|
21669
21707
|
_apiTokenEnabled = true;
|
|
@@ -21718,6 +21756,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
21718
21756
|
if (this._debug)
|
|
21719
21757
|
console.debug('[account-service] Creating service');
|
|
21720
21758
|
this._optionDefs = Object.values(options?.options || {});
|
|
21759
|
+
this._remoteLocalSettingsKeys = options?.remoteLocalSettingsKeys || [];
|
|
21721
21760
|
this.resetData();
|
|
21722
21761
|
// Send auth token to the graphql layer, when changed
|
|
21723
21762
|
this.onAuthTokenChange.subscribe((token) => this.graphql.setAuthToken(token));
|
|
@@ -21843,9 +21882,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
21843
21882
|
data.account.pubkey = Base58.encode(keypair.publicKey);
|
|
21844
21883
|
// Default values
|
|
21845
21884
|
data.account.settings = data.account.settings || new UserSettings();
|
|
21846
|
-
data.account.settings.
|
|
21847
|
-
data.account.settings.latLongFormat = this.settings.latLongFormat;
|
|
21848
|
-
data.account.settings.content = data.account.settings.content || {};
|
|
21885
|
+
data.account.settings.merge(this.settings.settings, this._remoteLocalSettingsKeys, true);
|
|
21849
21886
|
data.account.department.id = data.account.department.id || this.environment.defaultDepartmentId;
|
|
21850
21887
|
this._cache.keypair = keypair;
|
|
21851
21888
|
const account = await this.saveRemotely(data.account, keypair);
|
|
@@ -22325,6 +22362,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
22325
22362
|
if (!this._cache.pubkey)
|
|
22326
22363
|
throw new Error('User not logged');
|
|
22327
22364
|
this._cache.loaded = false;
|
|
22365
|
+
console.debug('[account-service] Loading account data...');
|
|
22328
22366
|
try {
|
|
22329
22367
|
const account = (await this.load(opts)) || new Account();
|
|
22330
22368
|
// Set defaults
|
|
@@ -22345,8 +22383,21 @@ class AccountService extends BaseGraphqlService {
|
|
|
22345
22383
|
this._cache.loaded = true;
|
|
22346
22384
|
// Apply settings, found in remote account
|
|
22347
22385
|
if (account.settings && this.settings.settings.accountInheritance) {
|
|
22386
|
+
console.debug('[account-service] Copying account settings into local settings...');
|
|
22387
|
+
const localSettings = this.settings.settings;
|
|
22348
22388
|
const accountSettings = account.settings.asLocalSettings();
|
|
22349
|
-
|
|
22389
|
+
const definitions = removeDuplicatesFromArray([...this.optionDefs, ...this.settings.optionDefs], 'key');
|
|
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);
|
|
22350
22401
|
}
|
|
22351
22402
|
return this._data;
|
|
22352
22403
|
}
|
|
@@ -22506,7 +22557,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
22506
22557
|
const account = this.account;
|
|
22507
22558
|
// Merge local settings into account's settings
|
|
22508
22559
|
const settings = UserSettings.fromObject(account.settings) || new UserSettings();
|
|
22509
|
-
const changed = settings.merge(source,
|
|
22560
|
+
const changed = settings.merge(source, this._remoteLocalSettingsKeys);
|
|
22510
22561
|
if (!changed)
|
|
22511
22562
|
return; // Skip if unchanged
|
|
22512
22563
|
// Save remotely
|
|
@@ -23618,10 +23669,11 @@ class PlatformService extends StartableService {
|
|
|
23618
23669
|
}
|
|
23619
23670
|
}));
|
|
23620
23671
|
// Use account's settings, (like locale), when account inheritance enabled
|
|
23621
|
-
this.registerSubscription(this.accountService.onLogin.subscribe((account) => {
|
|
23672
|
+
this.registerSubscription(this.accountService.onLogin.subscribe(async (account) => {
|
|
23622
23673
|
if (account.settings && this.settings.settings.accountInheritance) {
|
|
23674
|
+
console.debug('[platform] Copying account settings into local settings...');
|
|
23623
23675
|
const accountSettings = account.settings.asLocalSettings();
|
|
23624
|
-
this.settings.apply(accountSettings);
|
|
23676
|
+
await this.settings.apply(accountSettings);
|
|
23625
23677
|
}
|
|
23626
23678
|
}));
|
|
23627
23679
|
}
|
|
@@ -27357,15 +27409,8 @@ class MarkdownUtils {
|
|
|
27357
27409
|
return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));
|
|
27358
27410
|
}
|
|
27359
27411
|
static isGitlabUrl(url) {
|
|
27360
|
-
if (!url)
|
|
27361
|
-
return false;
|
|
27362
27412
|
return url.startsWith('https://gitlab.') || url.includes('/-/raw/') || url.includes('/-/blob/');
|
|
27363
27413
|
}
|
|
27364
|
-
static fixGitlabUrlToRaw(url) {
|
|
27365
|
-
if (!this.isGitlabUrl(url))
|
|
27366
|
-
return url;
|
|
27367
|
-
return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');
|
|
27368
|
-
}
|
|
27369
27414
|
static getRootUrl(url) {
|
|
27370
27415
|
if (this.isGitlabUrl(url)) {
|
|
27371
27416
|
console.debug('[markdown] Gitlab URL detected: ' + url);
|
|
@@ -27484,11 +27529,10 @@ class MarkdownService {
|
|
|
27484
27529
|
}
|
|
27485
27530
|
async click(event, containerElement) {
|
|
27486
27531
|
console.debug('[markdown-service] Processing click event...', event);
|
|
27487
|
-
|
|
27488
|
-
|
|
27532
|
+
const element = event.target;
|
|
27533
|
+
if (!(element instanceof HTMLAnchorElement)) {
|
|
27489
27534
|
return;
|
|
27490
27535
|
}
|
|
27491
|
-
const element = event.target;
|
|
27492
27536
|
let href = element.getAttribute('href');
|
|
27493
27537
|
const fragment = UrlUtils.getFragment(href);
|
|
27494
27538
|
// Fragment
|
|
@@ -27603,266 +27647,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
27603
27647
|
args: ['ready']
|
|
27604
27648
|
}] } });
|
|
27605
27649
|
|
|
27606
|
-
const PRINT_LOADING_STORAGE_KEY_PREFIX = 'print-loading-';
|
|
27607
|
-
class PrintService {
|
|
27608
|
-
toastController;
|
|
27609
|
-
translate;
|
|
27610
|
-
storage;
|
|
27611
|
-
document;
|
|
27612
|
-
printId = 0;
|
|
27613
|
-
constructor(toastController, translate, storage, document) {
|
|
27614
|
-
this.toastController = toastController;
|
|
27615
|
-
this.translate = translate;
|
|
27616
|
-
this.storage = storage;
|
|
27617
|
-
this.document = document;
|
|
27618
|
-
}
|
|
27619
|
-
nextJobId() {
|
|
27620
|
-
return ++this.printId;
|
|
27621
|
-
}
|
|
27622
|
-
async printElement(element, opts) {
|
|
27623
|
-
if (!element)
|
|
27624
|
-
throw new Error("Missing required 'element' argument");
|
|
27625
|
-
return this.printHTML(element.innerHTML, opts);
|
|
27626
|
-
}
|
|
27627
|
-
async printHTML(html, opts) {
|
|
27628
|
-
if (!html)
|
|
27629
|
-
throw new Error("Missing required 'html' argument");
|
|
27630
|
-
// Create iframe
|
|
27631
|
-
const iframe = this.createPrintIframeByHtml(html, opts);
|
|
27632
|
-
return this.printIframe(iframe, opts);
|
|
27633
|
-
}
|
|
27634
|
-
async printUrl(url, opts) {
|
|
27635
|
-
if (!url)
|
|
27636
|
-
throw new Error("Missing required 'url' argument");
|
|
27637
|
-
// Create iframe
|
|
27638
|
-
const iframe = this.createPrintIframeByUrl(url);
|
|
27639
|
-
return this.printIframe(iframe, opts);
|
|
27640
|
-
}
|
|
27641
|
-
async printIframe(iframe, opts) {
|
|
27642
|
-
if (!iframe)
|
|
27643
|
-
throw new Error("Missing required 'iframe' argument");
|
|
27644
|
-
const printId = opts?.id ?? this.printId++;
|
|
27645
|
-
const toastId = `printing-${printId}`;
|
|
27646
|
-
const showLoadingToast = opts?.showToast !== false;
|
|
27647
|
-
if (showLoadingToast)
|
|
27648
|
-
await this.showToast({
|
|
27649
|
-
id: toastId,
|
|
27650
|
-
message: opts?.toastMessage || 'COMMON.PLEASE_WAIT',
|
|
27651
|
-
duration: 0,
|
|
27652
|
-
});
|
|
27653
|
-
try {
|
|
27654
|
-
// Wait end of iframe load
|
|
27655
|
-
await this.waitIdle(iframe, { id: printId });
|
|
27656
|
-
// Print (and wait end of print)
|
|
27657
|
-
await this.print(iframe);
|
|
27658
|
-
}
|
|
27659
|
-
catch (err) {
|
|
27660
|
-
console.error('[print-service] Failed to create hidden iframe', err);
|
|
27661
|
-
}
|
|
27662
|
-
finally {
|
|
27663
|
-
iframe.remove();
|
|
27664
|
-
if (showLoadingToast)
|
|
27665
|
-
await this.toastController.dismiss(null, null, toastId);
|
|
27666
|
-
}
|
|
27667
|
-
}
|
|
27668
|
-
async markAsLoading(id) {
|
|
27669
|
-
console.debug(`[print-service] Mark print job #${id} as loading`);
|
|
27670
|
-
await this.storage.set(PRINT_LOADING_STORAGE_KEY_PREFIX + id, '1');
|
|
27671
|
-
}
|
|
27672
|
-
async markAsLoaded(id) {
|
|
27673
|
-
console.debug(`[print-service] Mark print job #${id} as loaded`);
|
|
27674
|
-
await this.storage.remove(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
|
|
27675
|
-
}
|
|
27676
|
-
async isLoaded(id) {
|
|
27677
|
-
const result = await this.storage.get(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
|
|
27678
|
-
return isNil(result);
|
|
27679
|
-
}
|
|
27680
|
-
async isLoading(id) {
|
|
27681
|
-
return !(await this.isLoaded(id));
|
|
27682
|
-
}
|
|
27683
|
-
/* -- protected functions -- */
|
|
27684
|
-
createPrintIframeByUrl(url) {
|
|
27685
|
-
// Create a iframe with '?print-pdf'
|
|
27686
|
-
const iframe = this.document.createElement('iframe');
|
|
27687
|
-
iframe.classList.add('cdk-visually-hidden');
|
|
27688
|
-
iframe.style.width = '100%';
|
|
27689
|
-
iframe.style.height = '100%';
|
|
27690
|
-
this.document.body.appendChild(iframe);
|
|
27691
|
-
iframe.src = url;
|
|
27692
|
-
return iframe;
|
|
27693
|
-
}
|
|
27694
|
-
createPrintIframeByHtml(html, opts) {
|
|
27695
|
-
if (!html)
|
|
27696
|
-
throw new Error("Missing required 'html' argument");
|
|
27697
|
-
const lang = this.document.documentElement?.lang || 'en';
|
|
27698
|
-
// Create an empty iframe
|
|
27699
|
-
const iframe = this.document.createElement('iframe');
|
|
27700
|
-
iframe.classList.add('cdk-visually-hidden');
|
|
27701
|
-
iframe.style.width = '100%';
|
|
27702
|
-
iframe.style.height = '100%';
|
|
27703
|
-
this.document.body.appendChild(iframe);
|
|
27704
|
-
// Write iframe content
|
|
27705
|
-
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27706
|
-
if (iframeDocument) {
|
|
27707
|
-
iframeDocument.open();
|
|
27708
|
-
iframeDocument.write(`
|
|
27709
|
-
<!DOCTYPE html>
|
|
27710
|
-
<html lang="${lang}" class="print-pdf">
|
|
27711
|
-
<head>
|
|
27712
|
-
<title>${opts?.title || ''}</title>
|
|
27713
|
-
<style>
|
|
27714
|
-
@media print {
|
|
27715
|
-
body {
|
|
27716
|
-
font-family: 'Roboto', Helvetica, Arial, sans-serif;
|
|
27717
|
-
margin: 0;
|
|
27718
|
-
padding: 0;
|
|
27719
|
-
overflow: hidden;
|
|
27720
|
-
}
|
|
27721
|
-
img {
|
|
27722
|
-
max-width: 100%;
|
|
27723
|
-
height: auto;
|
|
27724
|
-
page-break-inside: avoid;
|
|
27725
|
-
}
|
|
27726
|
-
}
|
|
27727
|
-
${opts?.inlineStyle || ''}
|
|
27728
|
-
</style>
|
|
27729
|
-
</head>
|
|
27730
|
-
<body>
|
|
27731
|
-
${html}
|
|
27732
|
-
</body>
|
|
27733
|
-
</html>
|
|
27734
|
-
`);
|
|
27735
|
-
iframeDocument.close();
|
|
27736
|
-
}
|
|
27737
|
-
// Set iframe style
|
|
27738
|
-
this.applyDocumentStyleToIframe(iframe);
|
|
27739
|
-
return iframe;
|
|
27740
|
-
}
|
|
27741
|
-
/**
|
|
27742
|
-
* Applies the styles from the provided document, including external stylesheets and inline styles,
|
|
27743
|
-
* to the specified iframe's document.
|
|
27744
|
-
*
|
|
27745
|
-
* @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.
|
|
27746
|
-
* @return {void} Does not return a value.
|
|
27747
|
-
*/
|
|
27748
|
-
applyDocumentStyleToIframe(iframe) {
|
|
27749
|
-
// Ignore style injection, if not on Chrome
|
|
27750
|
-
// (There is bug on Firefox: nothing appear in the print dialog)
|
|
27751
|
-
// TODO: Should be tested on Safari
|
|
27752
|
-
if (!isChrome(window))
|
|
27753
|
-
return;
|
|
27754
|
-
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27755
|
-
if (iframeDocument) {
|
|
27756
|
-
// Récupérer tous les styles (liens CSS)
|
|
27757
|
-
const links = Array.from(this.document.querySelectorAll('style,link[rel="stylesheet"]'));
|
|
27758
|
-
links.forEach((element) => {
|
|
27759
|
-
// Insert inline style
|
|
27760
|
-
if (element.tagName === 'STYLE') {
|
|
27761
|
-
const newStyle = iframeDocument.createElement('style');
|
|
27762
|
-
newStyle.innerHTML = element.innerHTML;
|
|
27763
|
-
iframeDocument.head.appendChild(newStyle);
|
|
27764
|
-
console.debug('[print-service] Add style to iframe', newStyle);
|
|
27765
|
-
}
|
|
27766
|
-
// Insert link to stylesheet file
|
|
27767
|
-
else if (element.tagName === 'LINK' && element.getAttribute('href')) {
|
|
27768
|
-
const newLink = iframeDocument.createElement('link');
|
|
27769
|
-
newLink.rel = 'stylesheet';
|
|
27770
|
-
newLink.href = element.getAttribute('href');
|
|
27771
|
-
iframeDocument.head.appendChild(newLink);
|
|
27772
|
-
console.debug('[print-service] Add stylesheet to iframe: ', newLink.href);
|
|
27773
|
-
}
|
|
27774
|
-
});
|
|
27775
|
-
}
|
|
27776
|
-
}
|
|
27777
|
-
async waitIdle(iframe, opts) {
|
|
27778
|
-
// Wait job finished
|
|
27779
|
-
const printId = opts?.id || this.printId;
|
|
27780
|
-
await waitForTrue(timer(500, 500).pipe(mergeMap$1(() => this.isLoaded(printId))), { timeout: opts?.timeout });
|
|
27781
|
-
// Wait end of iframe load
|
|
27782
|
-
await new Promise((resolve, reject) => {
|
|
27783
|
-
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27784
|
-
if (iframeWindow.document.readyState === 'complete') {
|
|
27785
|
-
resolve();
|
|
27786
|
-
}
|
|
27787
|
-
else {
|
|
27788
|
-
// Stop if timeout reached
|
|
27789
|
-
if (opts?.timeout > 0) {
|
|
27790
|
-
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27791
|
-
}
|
|
27792
|
-
const readyListener = () => {
|
|
27793
|
-
if (iframeWindow.document.readyState === 'complete') {
|
|
27794
|
-
resolve();
|
|
27795
|
-
iframeWindow.document.removeEventListener('readystatechange', readyListener);
|
|
27796
|
-
}
|
|
27797
|
-
};
|
|
27798
|
-
iframeWindow.document.addEventListener('readystatechange', readyListener);
|
|
27799
|
-
}
|
|
27800
|
-
});
|
|
27801
|
-
}
|
|
27802
|
-
/**
|
|
27803
|
-
* Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.
|
|
27804
|
-
*
|
|
27805
|
-
* @param {HTMLIFrameElement} iframe - The iframe element to be printed.
|
|
27806
|
-
* @param {{timeout?: number}} [opts] - An optional configuration object.
|
|
27807
|
-
* @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.
|
|
27808
|
-
* @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.
|
|
27809
|
-
*/
|
|
27810
|
-
print(iframe, opts) {
|
|
27811
|
-
return new Promise((resolve, reject) => {
|
|
27812
|
-
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27813
|
-
// Stop if timeout reached
|
|
27814
|
-
if (opts?.timeout > 0) {
|
|
27815
|
-
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27816
|
-
}
|
|
27817
|
-
// On Chrome
|
|
27818
|
-
if (isChrome(window)) {
|
|
27819
|
-
// Wait after print event, to resolve the promise
|
|
27820
|
-
const afterPrintListener = () => {
|
|
27821
|
-
console.debug('[print-service] After print');
|
|
27822
|
-
resolve();
|
|
27823
|
-
// Remove the listener
|
|
27824
|
-
iframeWindow.removeEventListener('afterprint', afterPrintListener);
|
|
27825
|
-
};
|
|
27826
|
-
iframeWindow.addEventListener('afterprint', afterPrintListener);
|
|
27827
|
-
iframe.contentWindow.window.print();
|
|
27828
|
-
}
|
|
27829
|
-
// Otherwise (e.g. Firefox)
|
|
27830
|
-
else {
|
|
27831
|
-
iframe.contentWindow.window.print();
|
|
27832
|
-
resolve();
|
|
27833
|
-
}
|
|
27834
|
-
});
|
|
27835
|
-
}
|
|
27836
|
-
async showToast(opts) {
|
|
27837
|
-
if (!this.toastController)
|
|
27838
|
-
throw new Error("Missing toastController in component's constructor");
|
|
27839
|
-
return await Toasts.show(this.toastController, this.translate, opts);
|
|
27840
|
-
}
|
|
27841
|
-
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 });
|
|
27842
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, providedIn: 'root' });
|
|
27843
|
-
}
|
|
27844
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, decorators: [{
|
|
27845
|
-
type: Injectable,
|
|
27846
|
-
args: [{ providedIn: 'root' }]
|
|
27847
|
-
}], ctorParameters: () => [{ type: i2$1.ToastController }, { type: i1$1.TranslateService }, { type: StorageService }, { type: Document, decorators: [{
|
|
27848
|
-
type: Inject,
|
|
27849
|
-
args: [DOCUMENT]
|
|
27850
|
-
}] }] });
|
|
27851
|
-
|
|
27852
27650
|
class AppMarkdownContent {
|
|
27853
27651
|
cd;
|
|
27854
27652
|
element;
|
|
27855
27653
|
_document;
|
|
27856
27654
|
route;
|
|
27857
|
-
|
|
27655
|
+
_printIframe;
|
|
27858
27656
|
_clickSubscription;
|
|
27859
27657
|
navController = inject(NavController);
|
|
27860
27658
|
settings = inject(LocalSettingsService);
|
|
27861
27659
|
translate = inject(TranslateService);
|
|
27862
27660
|
network = inject(NetworkService);
|
|
27863
27661
|
markdownService = inject(MarkdownService);
|
|
27864
|
-
toastController = inject(ToastController);
|
|
27865
|
-
printService = inject(PrintService);
|
|
27866
27662
|
loading = true;
|
|
27867
27663
|
error = undefined;
|
|
27868
27664
|
baseUrl;
|
|
@@ -27901,8 +27697,6 @@ class AppMarkdownContent {
|
|
|
27901
27697
|
this.element = element;
|
|
27902
27698
|
this._document = _document;
|
|
27903
27699
|
this.route = route;
|
|
27904
|
-
this._printId = this.printService.nextJobId();
|
|
27905
|
-
this.markAsLoading({ emitEvent: false });
|
|
27906
27700
|
// TODO: for DEV only
|
|
27907
27701
|
//this.debug = !environment.production;
|
|
27908
27702
|
}
|
|
@@ -27926,56 +27720,29 @@ class AppMarkdownContent {
|
|
|
27926
27720
|
get canGoBack() {
|
|
27927
27721
|
return isNotEmptyArray(this._navHistory);
|
|
27928
27722
|
}
|
|
27929
|
-
|
|
27930
|
-
|
|
27931
|
-
return; // skip
|
|
27932
|
-
console.debug('[markdown] Print...');
|
|
27723
|
+
print(event) {
|
|
27724
|
+
console.debug('[markdown] Print');
|
|
27933
27725
|
if (!this.element) {
|
|
27934
|
-
console.error('
|
|
27726
|
+
console.error('Erreur : Élément non trouvé.');
|
|
27935
27727
|
return;
|
|
27936
27728
|
}
|
|
27937
|
-
|
|
27938
|
-
|
|
27939
|
-
|
|
27940
|
-
|
|
27941
|
-
|
|
27942
|
-
|
|
27943
|
-
|
|
27944
|
-
|
|
27945
|
-
|
|
27946
|
-
margin: 1.1cm;
|
|
27947
|
-
}
|
|
27948
|
-
markdown hr {
|
|
27949
|
-
page-break-before: always;
|
|
27950
|
-
border: none;
|
|
27951
|
-
margin: 0;
|
|
27952
|
-
padding: 0;
|
|
27953
|
-
}
|
|
27954
|
-
markdown img {
|
|
27955
|
-
max-width: 100%;
|
|
27956
|
-
height: auto;
|
|
27957
|
-
page-break-inside: avoid;
|
|
27958
|
-
}
|
|
27959
|
-
}`,
|
|
27960
|
-
});
|
|
27961
|
-
}
|
|
27962
|
-
finally {
|
|
27963
|
-
this.markAsLoaded({ emitEvent: false });
|
|
27964
|
-
}
|
|
27729
|
+
// Récupérer le contenu HTML depuis le composant
|
|
27730
|
+
const content = this.element.nativeElement.innerHTML;
|
|
27731
|
+
// Créer une iframe pour gérer l'impression
|
|
27732
|
+
this._printIframe = this.createPrintHiddenIframe(content);
|
|
27733
|
+
// Lancer l'impression après un court délai (le temps que l'iframe charge)
|
|
27734
|
+
this._printIframe.contentWindow.addEventListener('load', () => {
|
|
27735
|
+
this._printIframe.contentWindow?.window.print();
|
|
27736
|
+
this._printIframe.remove();
|
|
27737
|
+
});
|
|
27965
27738
|
}
|
|
27966
|
-
markAsLoaded(
|
|
27739
|
+
markAsLoaded() {
|
|
27967
27740
|
this.loading = false;
|
|
27968
|
-
|
|
27969
|
-
this.printService.markAsLoaded(this._printId);
|
|
27970
|
-
this.cd.markForCheck();
|
|
27971
|
-
}
|
|
27741
|
+
this.cd.markForCheck();
|
|
27972
27742
|
}
|
|
27973
|
-
markAsLoading(
|
|
27743
|
+
markAsLoading() {
|
|
27974
27744
|
this.loading = true;
|
|
27975
|
-
|
|
27976
|
-
this.printService.markAsLoading(this._printId);
|
|
27977
|
-
this.cd.markForCheck();
|
|
27978
|
-
}
|
|
27745
|
+
this.cd.markForCheck();
|
|
27979
27746
|
}
|
|
27980
27747
|
setError(error) {
|
|
27981
27748
|
this.error = error?.['message'] || error || null;
|
|
@@ -27986,6 +27753,66 @@ class AppMarkdownContent {
|
|
|
27986
27753
|
this.cd.markForCheck();
|
|
27987
27754
|
}
|
|
27988
27755
|
/* -- 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
|
+
}
|
|
27989
27816
|
setData(value, opts) {
|
|
27990
27817
|
const anchor = opts?.anchor || null;
|
|
27991
27818
|
if (this._data !== value || this._anchor !== anchor) {
|
|
@@ -28017,9 +27844,7 @@ class AppMarkdownContent {
|
|
|
28017
27844
|
// Clean URL (remove fragment and query)
|
|
28018
27845
|
const anchor = opts?.anchor || UrlUtils.getFragment(src);
|
|
28019
27846
|
src = UrlUtils.stripFragmentAndQuery(src);
|
|
28020
|
-
src = MarkdownUtils.isGitlabUrl(src) ? MarkdownUtils.fixGitlabUrlToRaw(src) : src;
|
|
28021
27847
|
let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
|
|
28022
|
-
fallbackSrc = MarkdownUtils.isGitlabUrl(fallbackSrc) ? MarkdownUtils.fixGitlabUrlToRaw(fallbackSrc) : fallbackSrc;
|
|
28023
27848
|
if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
|
|
28024
27849
|
const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
|
|
28025
27850
|
if (url)
|
|
@@ -28113,11 +27938,11 @@ class AppMarkdownContent {
|
|
|
28113
27938
|
}));
|
|
28114
27939
|
}
|
|
28115
27940
|
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 });
|
|
28116
|
-
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{
|
|
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: -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{hr{page-break-before:always;border:none;margin:0}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:20px}}\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 });
|
|
28117
27942
|
}
|
|
28118
27943
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, decorators: [{
|
|
28119
27944
|
type: Component,
|
|
28120
|
-
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{
|
|
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: -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{hr{page-break-before:always;border:none;margin:0}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin:0;padding:20px}}\n"] }]
|
|
28121
27946
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: Document, decorators: [{
|
|
28122
27947
|
type: Inject,
|
|
28123
27948
|
args: [DOCUMENT]
|
|
@@ -28156,13 +27981,12 @@ class AppMarkdownModal {
|
|
|
28156
27981
|
translate;
|
|
28157
27982
|
network;
|
|
28158
27983
|
cd;
|
|
27984
|
+
debug;
|
|
28159
27985
|
title;
|
|
28160
27986
|
showError = true;
|
|
28161
27987
|
canPrint = false;
|
|
28162
27988
|
data;
|
|
28163
27989
|
src;
|
|
28164
|
-
enableNavigationHistory = true;
|
|
28165
|
-
debug;
|
|
28166
27990
|
content;
|
|
28167
27991
|
static async show(modalCtrl, options) {
|
|
28168
27992
|
const modal = await modalCtrl.create({
|
|
@@ -28210,29 +28034,23 @@ class AppMarkdownModal {
|
|
|
28210
28034
|
this.content?.resetError();
|
|
28211
28035
|
}
|
|
28212
28036
|
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 });
|
|
28213
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: {
|
|
28037
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: { debug: "debug", title: "title", showError: "showError", canPrint: "canPrint", data: "data", src: "src" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "@if (title || canPrint) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\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 @if (canPrint) {\n <ion-button slot=\"end\" class=\"back-button\" (click)=\"content.print($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\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 [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.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 });
|
|
28214
28038
|
}
|
|
28215
28039
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, decorators: [{
|
|
28216
28040
|
type: Component,
|
|
28217
|
-
args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n
|
|
28218
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i2$1.ModalController }, { type: PlatformService }, { type: LocalSettingsService }, { type: i1$1.TranslateService }, { type: NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: {
|
|
28041
|
+
args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (title || canPrint) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\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 @if (canPrint) {\n <ion-button slot=\"end\" class=\"back-button\" (click)=\"content.print($event)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\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 [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" }]
|
|
28042
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i2$1.ModalController }, { type: PlatformService }, { type: LocalSettingsService }, { type: i1$1.TranslateService }, { type: NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: { debug: [{
|
|
28043
|
+
type: Input
|
|
28044
|
+
}], title: [{
|
|
28219
28045
|
type: Input
|
|
28220
28046
|
}], showError: [{
|
|
28221
|
-
type: Input
|
|
28222
|
-
args: [{ transform: booleanAttribute }]
|
|
28047
|
+
type: Input
|
|
28223
28048
|
}], canPrint: [{
|
|
28224
|
-
type: Input
|
|
28225
|
-
args: [{ transform: booleanAttribute }]
|
|
28049
|
+
type: Input
|
|
28226
28050
|
}], data: [{
|
|
28227
28051
|
type: Input
|
|
28228
28052
|
}], src: [{
|
|
28229
28053
|
type: Input
|
|
28230
|
-
}], enableNavigationHistory: [{
|
|
28231
|
-
type: Input,
|
|
28232
|
-
args: [{ transform: booleanAttribute }]
|
|
28233
|
-
}], debug: [{
|
|
28234
|
-
type: Input,
|
|
28235
|
-
args: [{ transform: booleanAttribute }]
|
|
28236
28054
|
}], content: [{
|
|
28237
28055
|
type: ViewChild,
|
|
28238
28056
|
args: ['content']
|
|
@@ -30344,10 +30162,10 @@ class AppValidatorService extends ValidatorService {
|
|
|
30344
30162
|
getRowValidator() {
|
|
30345
30163
|
return this.getFormGroup();
|
|
30346
30164
|
}
|
|
30347
|
-
getFormGroup(data) {
|
|
30165
|
+
getFormGroup(data, opts) {
|
|
30348
30166
|
return this.formBuilder.group(this.getFormGroupConfig(data));
|
|
30349
30167
|
}
|
|
30350
|
-
getFormGroupConfig(data) {
|
|
30168
|
+
getFormGroupConfig(data, opts) {
|
|
30351
30169
|
return {};
|
|
30352
30170
|
}
|
|
30353
30171
|
getI18nFormErrors(control) {
|
|
@@ -31329,9 +31147,6 @@ class HomePage extends RxState {
|
|
|
31329
31147
|
await AppMarkdownModal.show(this.modalCtrl, {
|
|
31330
31148
|
title: this.translate.instant(item.title, item.titleArgs),
|
|
31331
31149
|
src: url,
|
|
31332
|
-
enableNavigationHistory: false,
|
|
31333
|
-
// FIXME failed in chrome
|
|
31334
|
-
//canPrint: true,
|
|
31335
31150
|
});
|
|
31336
31151
|
}
|
|
31337
31152
|
else {
|
|
@@ -35002,9 +34817,12 @@ let PropertyEntity = class PropertyEntity extends Entity {
|
|
|
35002
34817
|
static fromObject;
|
|
35003
34818
|
definition = null;
|
|
35004
34819
|
value = null;
|
|
34820
|
+
get key() {
|
|
34821
|
+
return this.definition?.key || this.id;
|
|
34822
|
+
}
|
|
35005
34823
|
fromObject(source) {
|
|
35006
34824
|
super.fromObject(source);
|
|
35007
|
-
this.id = source.definition?.key
|
|
34825
|
+
this.id = source.definition?.key ?? source.key ?? source.id;
|
|
35008
34826
|
this.definition = source.definition;
|
|
35009
34827
|
this.value = source.value;
|
|
35010
34828
|
}
|
|
@@ -35072,15 +34890,13 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35072
34890
|
definitions;
|
|
35073
34891
|
showToolbar = true;
|
|
35074
34892
|
filterExpansionPanel;
|
|
35075
|
-
// availableDefinitions$ = new BehaviorSubject<TranslatedFormFieldDefinition[]>([]);
|
|
35076
34893
|
definitionsMapByKey = {};
|
|
35077
|
-
translationsByKey = {};
|
|
35078
34894
|
filterForm;
|
|
35079
34895
|
filterCriteriaCount = 0;
|
|
35080
34896
|
filterPanelFloating = true;
|
|
35081
34897
|
constructor(injector, formBuilder, validatorService, environment) {
|
|
35082
34898
|
super(injector, [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS], PropertyEntity, new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {
|
|
35083
|
-
sortByReplacement: { definition: 'definition.
|
|
34899
|
+
sortByReplacement: { definition: 'definition.label' },
|
|
35084
34900
|
}), validatorService);
|
|
35085
34901
|
this.injector = injector;
|
|
35086
34902
|
this.formBuilder = formBuilder;
|
|
@@ -35097,11 +34913,14 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35097
34913
|
}
|
|
35098
34914
|
ngOnInit() {
|
|
35099
34915
|
super.ngOnInit();
|
|
35100
|
-
// Fill
|
|
35101
|
-
this.
|
|
35102
|
-
|
|
35103
|
-
|
|
34916
|
+
// Fill definitions map
|
|
34917
|
+
this.definitions = (this.definitions || []).map((def) => {
|
|
34918
|
+
return {
|
|
34919
|
+
...def,
|
|
34920
|
+
label: this.translate.instant(def.label),
|
|
34921
|
+
};
|
|
35104
34922
|
});
|
|
34923
|
+
this.definitionsMapByKey = splitByProperty(this.definitions, 'key');
|
|
35105
34924
|
this.registerCellValueChanges('definition').subscribe((definition) => {
|
|
35106
34925
|
if (isNotNil(definition) && this.editedRow?.id === -1) {
|
|
35107
34926
|
this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });
|
|
@@ -35134,18 +34953,18 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35134
34953
|
}
|
|
35135
34954
|
definitionByRow = (row) => this.definitionsMapByKey[row.currentData.id];
|
|
35136
34955
|
setValue(value, opts) {
|
|
35137
|
-
// Update translations
|
|
35138
|
-
this.translationsByKey = isNotEmptyArray(this.definitions) ? this.translate.instant(this.definitions.map((def) => def.label)) : {};
|
|
35139
34956
|
// Build entities
|
|
35140
|
-
const
|
|
35141
|
-
|
|
35142
|
-
|
|
35143
|
-
|
|
35144
|
-
|
|
35145
|
-
|
|
35146
|
-
|
|
35147
|
-
|
|
35148
|
-
|
|
34957
|
+
const target = this.definitions.map((definition) => {
|
|
34958
|
+
const property = (value || [])?.find((source) => source.key === definition.key);
|
|
34959
|
+
const propertyValue = property?.value ?? definition.defaultValue;
|
|
34960
|
+
// Convert to entity
|
|
34961
|
+
return PropertyEntity.fromObject({
|
|
34962
|
+
id: definition.key,
|
|
34963
|
+
definition,
|
|
34964
|
+
// get user value or default value
|
|
34965
|
+
value: propertyValue,
|
|
34966
|
+
});
|
|
34967
|
+
});
|
|
35149
34968
|
super.setValue(target, opts);
|
|
35150
34969
|
}
|
|
35151
34970
|
clearControlValue(event, formControl) {
|
|
@@ -35196,26 +35015,18 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35196
35015
|
if (this.filterExpansionPanel && this.filterPanelFloating)
|
|
35197
35016
|
this.filterExpansionPanel.close();
|
|
35198
35017
|
}
|
|
35199
|
-
toTranslatedFormFieldDefinition = (definition) => ({
|
|
35200
|
-
...definition,
|
|
35201
|
-
translatedName: this.translationsByKey[definition.label],
|
|
35202
|
-
});
|
|
35203
35018
|
resetProperty(event, row) {
|
|
35204
35019
|
event?.preventDefault();
|
|
35205
35020
|
row.validator.patchValue({ value: row.currentData.definition.defaultValue });
|
|
35206
|
-
|
|
35021
|
+
this.confirmEditCreate();
|
|
35207
35022
|
this.markRowAsDirty();
|
|
35208
35023
|
}
|
|
35209
|
-
toValue(values, definition) {
|
|
35210
|
-
const value = values.find((v) => v.id === definition.key)?.value;
|
|
35211
|
-
return isNotNil(value) ? value : definition.defaultValue;
|
|
35212
|
-
}
|
|
35213
35024
|
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 });
|
|
35214
|
-
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 });
|
|
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 });
|
|
35215
35026
|
}
|
|
35216
35027
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesTable, decorators: [{
|
|
35217
35028
|
type: Component,
|
|
35218
|
-
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)
|
|
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),\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" }]
|
|
35219
35030
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1$3.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: Environment, decorators: [{
|
|
35220
35031
|
type: Inject,
|
|
35221
35032
|
args: [ENVIRONMENT]
|
|
@@ -39509,15 +39320,19 @@ class AccountPage extends AppForm {
|
|
|
39509
39320
|
get valid() {
|
|
39510
39321
|
return super.valid && (this.propertiesTable?.valid || true);
|
|
39511
39322
|
}
|
|
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
|
+
}
|
|
39512
39329
|
showLatLonFormat = true;
|
|
39513
39330
|
canChangePassword = false;
|
|
39514
39331
|
showSecurityDetails = false;
|
|
39515
39332
|
showTechnicalDetails = true;
|
|
39516
39333
|
showApiTokens = false;
|
|
39517
|
-
constructor(injector, formBuilder, accountService, network, navController, validatorService,
|
|
39518
|
-
|
|
39519
|
-
configService, cd, locales) {
|
|
39520
|
-
super(injector, validatorService.getFormGroup(accountService.account));
|
|
39334
|
+
constructor(injector, formBuilder, accountService, network, navController, validatorService, configService, cd, locales) {
|
|
39335
|
+
super(injector, validatorService.getFormGroup(accountService.account, { withSettings: true }));
|
|
39521
39336
|
this.formBuilder = formBuilder;
|
|
39522
39337
|
this.accountService = accountService;
|
|
39523
39338
|
this.network = network;
|
|
@@ -39526,10 +39341,6 @@ class AccountPage extends AppForm {
|
|
|
39526
39341
|
this.configService = configService;
|
|
39527
39342
|
this.cd = cd;
|
|
39528
39343
|
this.locales = locales;
|
|
39529
|
-
// Add settings fo form
|
|
39530
|
-
// this.settingsForm = settingsValidatorService.getFormGroup(accountService.account && accountService.account.settings);
|
|
39531
|
-
// this.settingsContentForm = (this.settingsForm.controls['content'] as UntypedFormGroup);
|
|
39532
|
-
// this.form.addControl('settings', this.settingsForm);
|
|
39533
39344
|
this.mobile = this.settings.mobile;
|
|
39534
39345
|
this.debug = !environment.production;
|
|
39535
39346
|
// By default, disable the form
|
|
@@ -39606,16 +39417,14 @@ class AccountPage extends AppForm {
|
|
|
39606
39417
|
async setValue(data, opts) {
|
|
39607
39418
|
super.setValue(data, opts);
|
|
39608
39419
|
// Set options
|
|
39609
|
-
|
|
39610
|
-
|
|
39611
|
-
|
|
39612
|
-
|
|
39613
|
-
|
|
39614
|
-
|
|
39615
|
-
|
|
39616
|
-
|
|
39617
|
-
}
|
|
39618
|
-
});
|
|
39420
|
+
const { properties } = data?.settings?.asLocalSettings({ definitions: this.optionDefinitions }) || {};
|
|
39421
|
+
const propertiesEntities = this.optionDefinitions
|
|
39422
|
+
.map((definition) => {
|
|
39423
|
+
const value = properties?.[definition.key];
|
|
39424
|
+
return isNotNil(value) ? PropertyEntity.fromObject({ definition, value }) : null;
|
|
39425
|
+
})
|
|
39426
|
+
.filter(isNotNil);
|
|
39427
|
+
if (this.propertiesTable) {
|
|
39619
39428
|
await this.propertiesTable.ready();
|
|
39620
39429
|
this.propertiesTable.value = propertiesEntities;
|
|
39621
39430
|
}
|
|
@@ -39678,7 +39487,7 @@ class AccountPage extends AppForm {
|
|
|
39678
39487
|
...this.form.value,
|
|
39679
39488
|
});
|
|
39680
39489
|
if (isNotEmptyArray(this.optionDefinitions) && this.propertiesTable) {
|
|
39681
|
-
//
|
|
39490
|
+
// Merge properties
|
|
39682
39491
|
await this.propertiesTable.save();
|
|
39683
39492
|
const propertyEntities = this.propertiesTable.value || [];
|
|
39684
39493
|
const properties = propertyEntities.reduce((res, item) => {
|
|
@@ -45584,9 +45393,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
45584
45393
|
class MarkdownTestPage {
|
|
45585
45394
|
modalCtrl;
|
|
45586
45395
|
cd;
|
|
45587
|
-
environment;
|
|
45588
45396
|
markdownModalTitle = 'Markdown modal';
|
|
45589
|
-
debug;
|
|
45590
45397
|
// URL from a starting markdown
|
|
45591
45398
|
//protected markdownUrl = 'http://localhost:3000/user-manual/index.md';
|
|
45592
45399
|
markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/pifil/man/quick_start_guide_fr.md';
|
|
@@ -45595,11 +45402,9 @@ class MarkdownTestPage {
|
|
|
45595
45402
|
//protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/model/administration/index.md';
|
|
45596
45403
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/activity-calendar/spe/collecte_de_donnees.md';
|
|
45597
45404
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/develop/doc/privacy_policy.md';
|
|
45598
|
-
constructor(modalCtrl, cd
|
|
45405
|
+
constructor(modalCtrl, cd) {
|
|
45599
45406
|
this.modalCtrl = modalCtrl;
|
|
45600
45407
|
this.cd = cd;
|
|
45601
|
-
this.environment = environment;
|
|
45602
|
-
this.debug = !environment.production;
|
|
45603
45408
|
}
|
|
45604
45409
|
onSubmit(event, newUrl) {
|
|
45605
45410
|
this.markdownUrl = '' + newUrl;
|
|
@@ -45616,16 +45421,13 @@ class MarkdownTestPage {
|
|
|
45616
45421
|
canPrint: true,
|
|
45617
45422
|
});
|
|
45618
45423
|
}
|
|
45619
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, deps: [{ token: i2$1.ModalController }, { token: i0.ChangeDetectorRef }
|
|
45620
|
-
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
|
|
45424
|
+
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 });
|
|
45425
|
+
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=\"true\"\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 });
|
|
45621
45426
|
}
|
|
45622
45427
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, decorators: [{
|
|
45623
45428
|
type: Component,
|
|
45624
|
-
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
|
|
45625
|
-
}], ctorParameters: () => [{ type: i2$1.ModalController }, { type: i0.ChangeDetectorRef }
|
|
45626
|
-
type: Inject,
|
|
45627
|
-
args: [ENVIRONMENT]
|
|
45628
|
-
}] }] });
|
|
45429
|
+
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=\"true\"\n (markdownUrlChange)=\"updateInputUrl($event)\"\n ></app-markdown-content>\n</ion-content>\n" }]
|
|
45430
|
+
}], ctorParameters: () => [{ type: i2$1.ModalController }, { type: i0.ChangeDetectorRef }] });
|
|
45629
45431
|
|
|
45630
45432
|
const routes$4 = [
|
|
45631
45433
|
{
|
|
@@ -47367,5 +47169,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
47367
47169
|
* Generated bundle index. Do not edit.
|
|
47368
47170
|
*/
|
|
47369
47171
|
|
|
47370
|
-
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 };
|
|
47172
|
+
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 };
|
|
47371
47173
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|