@sumaris-net/ngx-components 18.6.11 → 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 -3
- 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 -408
- 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 -254
- 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,263 +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
|
-
// FIXME - Ignore style injection, because it failed in Firefox (e.g. on user manual) and Chrome (e.g. in privacy policy)
|
|
27739
|
-
// Nothing appear in the print dialog
|
|
27740
|
-
//this.applyDocumentStyleToIframe(iframe);
|
|
27741
|
-
return iframe;
|
|
27742
|
-
}
|
|
27743
|
-
/**
|
|
27744
|
-
* Applies the styles from the provided document, including external stylesheets and inline styles,
|
|
27745
|
-
* to the specified iframe's document.
|
|
27746
|
-
*
|
|
27747
|
-
* @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.
|
|
27748
|
-
* @return {void} Does not return a value.
|
|
27749
|
-
*/
|
|
27750
|
-
applyDocumentStyleToIframe(iframe) {
|
|
27751
|
-
const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
|
|
27752
|
-
if (iframeDocument) {
|
|
27753
|
-
// Récupérer tous les styles (liens CSS)
|
|
27754
|
-
const links = Array.from(this.document.querySelectorAll('style,link[rel="stylesheet"]'));
|
|
27755
|
-
links.forEach((element) => {
|
|
27756
|
-
// Insert inline style
|
|
27757
|
-
if (element.tagName === 'STYLE') {
|
|
27758
|
-
const newStyle = iframeDocument.createElement('style');
|
|
27759
|
-
newStyle.innerHTML = element.innerHTML;
|
|
27760
|
-
iframeDocument.head.appendChild(newStyle);
|
|
27761
|
-
console.debug('[print-service] Add style to iframe', newStyle);
|
|
27762
|
-
}
|
|
27763
|
-
// Insert link to stylesheet file
|
|
27764
|
-
else if (element.tagName === 'LINK' && element.getAttribute('href')) {
|
|
27765
|
-
const newLink = iframeDocument.createElement('link');
|
|
27766
|
-
newLink.rel = 'stylesheet';
|
|
27767
|
-
newLink.href = element.getAttribute('href');
|
|
27768
|
-
iframeDocument.head.appendChild(newLink);
|
|
27769
|
-
console.debug('[print-service] Add stylesheet to iframe: ', newLink.href);
|
|
27770
|
-
}
|
|
27771
|
-
});
|
|
27772
|
-
}
|
|
27773
|
-
}
|
|
27774
|
-
async waitIdle(iframe, opts) {
|
|
27775
|
-
// Wait job finished
|
|
27776
|
-
const printId = opts?.id || this.printId;
|
|
27777
|
-
await waitForTrue(timer(500, 500).pipe(mergeMap$1(() => this.isLoaded(printId))), { timeout: opts?.timeout });
|
|
27778
|
-
// Wait end of iframe load
|
|
27779
|
-
await new Promise((resolve, reject) => {
|
|
27780
|
-
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27781
|
-
if (iframeWindow.document.readyState === 'complete') {
|
|
27782
|
-
resolve();
|
|
27783
|
-
}
|
|
27784
|
-
else {
|
|
27785
|
-
// Stop if timeout reached
|
|
27786
|
-
if (opts?.timeout > 0) {
|
|
27787
|
-
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27788
|
-
}
|
|
27789
|
-
const readyListener = () => {
|
|
27790
|
-
if (iframeWindow.document.readyState === 'complete') {
|
|
27791
|
-
resolve();
|
|
27792
|
-
iframeWindow.document.removeEventListener('readystatechange', readyListener);
|
|
27793
|
-
}
|
|
27794
|
-
};
|
|
27795
|
-
iframeWindow.document.addEventListener('readystatechange', readyListener);
|
|
27796
|
-
}
|
|
27797
|
-
});
|
|
27798
|
-
}
|
|
27799
|
-
/**
|
|
27800
|
-
* Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.
|
|
27801
|
-
*
|
|
27802
|
-
* @param {HTMLIFrameElement} iframe - The iframe element to be printed.
|
|
27803
|
-
* @param {{timeout?: number}} [opts] - An optional configuration object.
|
|
27804
|
-
* @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.
|
|
27805
|
-
* @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.
|
|
27806
|
-
*/
|
|
27807
|
-
print(iframe, opts) {
|
|
27808
|
-
return new Promise((resolve, reject) => {
|
|
27809
|
-
const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
|
|
27810
|
-
// Stop if timeout reached
|
|
27811
|
-
if (opts?.timeout > 0) {
|
|
27812
|
-
setTimeout(() => reject('timeout'), opts.timeout);
|
|
27813
|
-
}
|
|
27814
|
-
// On Chrome
|
|
27815
|
-
if (isChrome(window)) {
|
|
27816
|
-
// Wait after print event, to resolve the promise
|
|
27817
|
-
const afterPrintListener = () => {
|
|
27818
|
-
console.debug('[print-service] After print');
|
|
27819
|
-
resolve();
|
|
27820
|
-
// Remove the listener
|
|
27821
|
-
iframeWindow.removeEventListener('afterprint', afterPrintListener);
|
|
27822
|
-
};
|
|
27823
|
-
iframeWindow.addEventListener('afterprint', afterPrintListener);
|
|
27824
|
-
iframe.contentWindow.window.print();
|
|
27825
|
-
}
|
|
27826
|
-
// Otherwise (e.g. Firefox)
|
|
27827
|
-
else {
|
|
27828
|
-
iframe.contentWindow.window.print();
|
|
27829
|
-
resolve();
|
|
27830
|
-
}
|
|
27831
|
-
});
|
|
27832
|
-
}
|
|
27833
|
-
async showToast(opts) {
|
|
27834
|
-
if (!this.toastController)
|
|
27835
|
-
throw new Error("Missing toastController in component's constructor");
|
|
27836
|
-
return await Toasts.show(this.toastController, this.translate, opts);
|
|
27837
|
-
}
|
|
27838
|
-
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 });
|
|
27839
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, providedIn: 'root' });
|
|
27840
|
-
}
|
|
27841
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, decorators: [{
|
|
27842
|
-
type: Injectable,
|
|
27843
|
-
args: [{ providedIn: 'root' }]
|
|
27844
|
-
}], ctorParameters: () => [{ type: i2$1.ToastController }, { type: i1$1.TranslateService }, { type: StorageService }, { type: Document, decorators: [{
|
|
27845
|
-
type: Inject,
|
|
27846
|
-
args: [DOCUMENT]
|
|
27847
|
-
}] }] });
|
|
27848
|
-
|
|
27849
27650
|
class AppMarkdownContent {
|
|
27850
27651
|
cd;
|
|
27851
27652
|
element;
|
|
27852
27653
|
_document;
|
|
27853
27654
|
route;
|
|
27854
|
-
|
|
27655
|
+
_printIframe;
|
|
27855
27656
|
_clickSubscription;
|
|
27856
27657
|
navController = inject(NavController);
|
|
27857
27658
|
settings = inject(LocalSettingsService);
|
|
27858
27659
|
translate = inject(TranslateService);
|
|
27859
27660
|
network = inject(NetworkService);
|
|
27860
27661
|
markdownService = inject(MarkdownService);
|
|
27861
|
-
toastController = inject(ToastController);
|
|
27862
|
-
printService = inject(PrintService);
|
|
27863
27662
|
loading = true;
|
|
27864
27663
|
error = undefined;
|
|
27865
27664
|
baseUrl;
|
|
@@ -27898,8 +27697,6 @@ class AppMarkdownContent {
|
|
|
27898
27697
|
this.element = element;
|
|
27899
27698
|
this._document = _document;
|
|
27900
27699
|
this.route = route;
|
|
27901
|
-
this._printId = this.printService.nextJobId();
|
|
27902
|
-
this.markAsLoading({ emitEvent: false });
|
|
27903
27700
|
// TODO: for DEV only
|
|
27904
27701
|
//this.debug = !environment.production;
|
|
27905
27702
|
}
|
|
@@ -27923,56 +27720,29 @@ class AppMarkdownContent {
|
|
|
27923
27720
|
get canGoBack() {
|
|
27924
27721
|
return isNotEmptyArray(this._navHistory);
|
|
27925
27722
|
}
|
|
27926
|
-
|
|
27927
|
-
|
|
27928
|
-
return; // skip
|
|
27929
|
-
console.debug('[markdown] Print...');
|
|
27723
|
+
print(event) {
|
|
27724
|
+
console.debug('[markdown] Print');
|
|
27930
27725
|
if (!this.element) {
|
|
27931
|
-
console.error('
|
|
27726
|
+
console.error('Erreur : Élément non trouvé.');
|
|
27932
27727
|
return;
|
|
27933
27728
|
}
|
|
27934
|
-
|
|
27935
|
-
|
|
27936
|
-
|
|
27937
|
-
|
|
27938
|
-
|
|
27939
|
-
|
|
27940
|
-
|
|
27941
|
-
|
|
27942
|
-
|
|
27943
|
-
margin: 1.1cm;
|
|
27944
|
-
}
|
|
27945
|
-
markdown hr {
|
|
27946
|
-
page-break-before: always;
|
|
27947
|
-
border: none;
|
|
27948
|
-
margin: 0;
|
|
27949
|
-
padding: 0;
|
|
27950
|
-
}
|
|
27951
|
-
markdown img {
|
|
27952
|
-
max-width: 100%;
|
|
27953
|
-
height: auto;
|
|
27954
|
-
page-break-inside: avoid;
|
|
27955
|
-
}
|
|
27956
|
-
}`,
|
|
27957
|
-
});
|
|
27958
|
-
}
|
|
27959
|
-
finally {
|
|
27960
|
-
this.markAsLoaded({ emitEvent: false });
|
|
27961
|
-
}
|
|
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
|
+
});
|
|
27962
27738
|
}
|
|
27963
|
-
markAsLoaded(
|
|
27739
|
+
markAsLoaded() {
|
|
27964
27740
|
this.loading = false;
|
|
27965
|
-
|
|
27966
|
-
this.printService.markAsLoaded(this._printId);
|
|
27967
|
-
this.cd.markForCheck();
|
|
27968
|
-
}
|
|
27741
|
+
this.cd.markForCheck();
|
|
27969
27742
|
}
|
|
27970
|
-
markAsLoading(
|
|
27743
|
+
markAsLoading() {
|
|
27971
27744
|
this.loading = true;
|
|
27972
|
-
|
|
27973
|
-
this.printService.markAsLoading(this._printId);
|
|
27974
|
-
this.cd.markForCheck();
|
|
27975
|
-
}
|
|
27745
|
+
this.cd.markForCheck();
|
|
27976
27746
|
}
|
|
27977
27747
|
setError(error) {
|
|
27978
27748
|
this.error = error?.['message'] || error || null;
|
|
@@ -27983,6 +27753,66 @@ class AppMarkdownContent {
|
|
|
27983
27753
|
this.cd.markForCheck();
|
|
27984
27754
|
}
|
|
27985
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
|
+
}
|
|
27986
27816
|
setData(value, opts) {
|
|
27987
27817
|
const anchor = opts?.anchor || null;
|
|
27988
27818
|
if (this._data !== value || this._anchor !== anchor) {
|
|
@@ -28014,9 +27844,7 @@ class AppMarkdownContent {
|
|
|
28014
27844
|
// Clean URL (remove fragment and query)
|
|
28015
27845
|
const anchor = opts?.anchor || UrlUtils.getFragment(src);
|
|
28016
27846
|
src = UrlUtils.stripFragmentAndQuery(src);
|
|
28017
|
-
src = MarkdownUtils.isGitlabUrl(src) ? MarkdownUtils.fixGitlabUrlToRaw(src) : src;
|
|
28018
27847
|
let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
|
|
28019
|
-
fallbackSrc = MarkdownUtils.isGitlabUrl(fallbackSrc) ? MarkdownUtils.fixGitlabUrlToRaw(fallbackSrc) : fallbackSrc;
|
|
28020
27848
|
if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
|
|
28021
27849
|
const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
|
|
28022
27850
|
if (url)
|
|
@@ -28110,11 +27938,11 @@ class AppMarkdownContent {
|
|
|
28110
27938
|
}));
|
|
28111
27939
|
}
|
|
28112
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 });
|
|
28113
|
-
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 });
|
|
28114
27942
|
}
|
|
28115
27943
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, decorators: [{
|
|
28116
27944
|
type: Component,
|
|
28117
|
-
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"] }]
|
|
28118
27946
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: Document, decorators: [{
|
|
28119
27947
|
type: Inject,
|
|
28120
27948
|
args: [DOCUMENT]
|
|
@@ -28153,13 +27981,12 @@ class AppMarkdownModal {
|
|
|
28153
27981
|
translate;
|
|
28154
27982
|
network;
|
|
28155
27983
|
cd;
|
|
27984
|
+
debug;
|
|
28156
27985
|
title;
|
|
28157
27986
|
showError = true;
|
|
28158
27987
|
canPrint = false;
|
|
28159
27988
|
data;
|
|
28160
27989
|
src;
|
|
28161
|
-
enableNavigationHistory = true;
|
|
28162
|
-
debug;
|
|
28163
27990
|
content;
|
|
28164
27991
|
static async show(modalCtrl, options) {
|
|
28165
27992
|
const modal = await modalCtrl.create({
|
|
@@ -28207,29 +28034,23 @@ class AppMarkdownModal {
|
|
|
28207
28034
|
this.content?.resetError();
|
|
28208
28035
|
}
|
|
28209
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 });
|
|
28210
|
-
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 });
|
|
28211
28038
|
}
|
|
28212
28039
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, decorators: [{
|
|
28213
28040
|
type: Component,
|
|
28214
|
-
args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n
|
|
28215
|
-
}], 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: [{
|
|
28216
28045
|
type: Input
|
|
28217
28046
|
}], showError: [{
|
|
28218
|
-
type: Input
|
|
28219
|
-
args: [{ transform: booleanAttribute }]
|
|
28047
|
+
type: Input
|
|
28220
28048
|
}], canPrint: [{
|
|
28221
|
-
type: Input
|
|
28222
|
-
args: [{ transform: booleanAttribute }]
|
|
28049
|
+
type: Input
|
|
28223
28050
|
}], data: [{
|
|
28224
28051
|
type: Input
|
|
28225
28052
|
}], src: [{
|
|
28226
28053
|
type: Input
|
|
28227
|
-
}], enableNavigationHistory: [{
|
|
28228
|
-
type: Input,
|
|
28229
|
-
args: [{ transform: booleanAttribute }]
|
|
28230
|
-
}], debug: [{
|
|
28231
|
-
type: Input,
|
|
28232
|
-
args: [{ transform: booleanAttribute }]
|
|
28233
28054
|
}], content: [{
|
|
28234
28055
|
type: ViewChild,
|
|
28235
28056
|
args: ['content']
|
|
@@ -30341,10 +30162,10 @@ class AppValidatorService extends ValidatorService {
|
|
|
30341
30162
|
getRowValidator() {
|
|
30342
30163
|
return this.getFormGroup();
|
|
30343
30164
|
}
|
|
30344
|
-
getFormGroup(data) {
|
|
30165
|
+
getFormGroup(data, opts) {
|
|
30345
30166
|
return this.formBuilder.group(this.getFormGroupConfig(data));
|
|
30346
30167
|
}
|
|
30347
|
-
getFormGroupConfig(data) {
|
|
30168
|
+
getFormGroupConfig(data, opts) {
|
|
30348
30169
|
return {};
|
|
30349
30170
|
}
|
|
30350
30171
|
getI18nFormErrors(control) {
|
|
@@ -31326,8 +31147,6 @@ class HomePage extends RxState {
|
|
|
31326
31147
|
await AppMarkdownModal.show(this.modalCtrl, {
|
|
31327
31148
|
title: this.translate.instant(item.title, item.titleArgs),
|
|
31328
31149
|
src: url,
|
|
31329
|
-
enableNavigationHistory: false,
|
|
31330
|
-
//canPrint: true,
|
|
31331
31150
|
});
|
|
31332
31151
|
}
|
|
31333
31152
|
else {
|
|
@@ -34998,9 +34817,12 @@ let PropertyEntity = class PropertyEntity extends Entity {
|
|
|
34998
34817
|
static fromObject;
|
|
34999
34818
|
definition = null;
|
|
35000
34819
|
value = null;
|
|
34820
|
+
get key() {
|
|
34821
|
+
return this.definition?.key || this.id;
|
|
34822
|
+
}
|
|
35001
34823
|
fromObject(source) {
|
|
35002
34824
|
super.fromObject(source);
|
|
35003
|
-
this.id = source.definition?.key
|
|
34825
|
+
this.id = source.definition?.key ?? source.key ?? source.id;
|
|
35004
34826
|
this.definition = source.definition;
|
|
35005
34827
|
this.value = source.value;
|
|
35006
34828
|
}
|
|
@@ -35068,15 +34890,13 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35068
34890
|
definitions;
|
|
35069
34891
|
showToolbar = true;
|
|
35070
34892
|
filterExpansionPanel;
|
|
35071
|
-
// availableDefinitions$ = new BehaviorSubject<TranslatedFormFieldDefinition[]>([]);
|
|
35072
34893
|
definitionsMapByKey = {};
|
|
35073
|
-
translationsByKey = {};
|
|
35074
34894
|
filterForm;
|
|
35075
34895
|
filterCriteriaCount = 0;
|
|
35076
34896
|
filterPanelFloating = true;
|
|
35077
34897
|
constructor(injector, formBuilder, validatorService, environment) {
|
|
35078
34898
|
super(injector, [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS], PropertyEntity, new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {
|
|
35079
|
-
sortByReplacement: { definition: 'definition.
|
|
34899
|
+
sortByReplacement: { definition: 'definition.label' },
|
|
35080
34900
|
}), validatorService);
|
|
35081
34901
|
this.injector = injector;
|
|
35082
34902
|
this.formBuilder = formBuilder;
|
|
@@ -35093,11 +34913,14 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35093
34913
|
}
|
|
35094
34914
|
ngOnInit() {
|
|
35095
34915
|
super.ngOnInit();
|
|
35096
|
-
// Fill
|
|
35097
|
-
this.
|
|
35098
|
-
|
|
35099
|
-
|
|
34916
|
+
// Fill definitions map
|
|
34917
|
+
this.definitions = (this.definitions || []).map((def) => {
|
|
34918
|
+
return {
|
|
34919
|
+
...def,
|
|
34920
|
+
label: this.translate.instant(def.label),
|
|
34921
|
+
};
|
|
35100
34922
|
});
|
|
34923
|
+
this.definitionsMapByKey = splitByProperty(this.definitions, 'key');
|
|
35101
34924
|
this.registerCellValueChanges('definition').subscribe((definition) => {
|
|
35102
34925
|
if (isNotNil(definition) && this.editedRow?.id === -1) {
|
|
35103
34926
|
this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });
|
|
@@ -35130,18 +34953,18 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35130
34953
|
}
|
|
35131
34954
|
definitionByRow = (row) => this.definitionsMapByKey[row.currentData.id];
|
|
35132
34955
|
setValue(value, opts) {
|
|
35133
|
-
// Update translations
|
|
35134
|
-
this.translationsByKey = isNotEmptyArray(this.definitions) ? this.translate.instant(this.definitions.map((def) => def.label)) : {};
|
|
35135
34956
|
// Build entities
|
|
35136
|
-
const
|
|
35137
|
-
|
|
35138
|
-
|
|
35139
|
-
|
|
35140
|
-
|
|
35141
|
-
|
|
35142
|
-
|
|
35143
|
-
|
|
35144
|
-
|
|
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
|
+
});
|
|
35145
34968
|
super.setValue(target, opts);
|
|
35146
34969
|
}
|
|
35147
34970
|
clearControlValue(event, formControl) {
|
|
@@ -35192,26 +35015,18 @@ class AppPropertiesTable extends AppInMemoryTable {
|
|
|
35192
35015
|
if (this.filterExpansionPanel && this.filterPanelFloating)
|
|
35193
35016
|
this.filterExpansionPanel.close();
|
|
35194
35017
|
}
|
|
35195
|
-
toTranslatedFormFieldDefinition = (definition) => ({
|
|
35196
|
-
...definition,
|
|
35197
|
-
translatedName: this.translationsByKey[definition.label],
|
|
35198
|
-
});
|
|
35199
35018
|
resetProperty(event, row) {
|
|
35200
35019
|
event?.preventDefault();
|
|
35201
35020
|
row.validator.patchValue({ value: row.currentData.definition.defaultValue });
|
|
35202
|
-
|
|
35021
|
+
this.confirmEditCreate();
|
|
35203
35022
|
this.markRowAsDirty();
|
|
35204
35023
|
}
|
|
35205
|
-
toValue(values, definition) {
|
|
35206
|
-
const value = values.find((v) => v.id === definition.key)?.value;
|
|
35207
|
-
return isNotNil(value) ? value : definition.defaultValue;
|
|
35208
|
-
}
|
|
35209
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 });
|
|
35210
|
-
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 });
|
|
35211
35026
|
}
|
|
35212
35027
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesTable, decorators: [{
|
|
35213
35028
|
type: Component,
|
|
35214
|
-
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" }]
|
|
35215
35030
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1$3.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: Environment, decorators: [{
|
|
35216
35031
|
type: Inject,
|
|
35217
35032
|
args: [ENVIRONMENT]
|
|
@@ -39505,15 +39320,19 @@ class AccountPage extends AppForm {
|
|
|
39505
39320
|
get valid() {
|
|
39506
39321
|
return super.valid && (this.propertiesTable?.valid || true);
|
|
39507
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
|
+
}
|
|
39508
39329
|
showLatLonFormat = true;
|
|
39509
39330
|
canChangePassword = false;
|
|
39510
39331
|
showSecurityDetails = false;
|
|
39511
39332
|
showTechnicalDetails = true;
|
|
39512
39333
|
showApiTokens = false;
|
|
39513
|
-
constructor(injector, formBuilder, accountService, network, navController, validatorService,
|
|
39514
|
-
|
|
39515
|
-
configService, cd, locales) {
|
|
39516
|
-
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 }));
|
|
39517
39336
|
this.formBuilder = formBuilder;
|
|
39518
39337
|
this.accountService = accountService;
|
|
39519
39338
|
this.network = network;
|
|
@@ -39522,10 +39341,6 @@ class AccountPage extends AppForm {
|
|
|
39522
39341
|
this.configService = configService;
|
|
39523
39342
|
this.cd = cd;
|
|
39524
39343
|
this.locales = locales;
|
|
39525
|
-
// Add settings fo form
|
|
39526
|
-
// this.settingsForm = settingsValidatorService.getFormGroup(accountService.account && accountService.account.settings);
|
|
39527
|
-
// this.settingsContentForm = (this.settingsForm.controls['content'] as UntypedFormGroup);
|
|
39528
|
-
// this.form.addControl('settings', this.settingsForm);
|
|
39529
39344
|
this.mobile = this.settings.mobile;
|
|
39530
39345
|
this.debug = !environment.production;
|
|
39531
39346
|
// By default, disable the form
|
|
@@ -39602,16 +39417,14 @@ class AccountPage extends AppForm {
|
|
|
39602
39417
|
async setValue(data, opts) {
|
|
39603
39418
|
super.setValue(data, opts);
|
|
39604
39419
|
// Set options
|
|
39605
|
-
|
|
39606
|
-
|
|
39607
|
-
|
|
39608
|
-
|
|
39609
|
-
|
|
39610
|
-
|
|
39611
|
-
|
|
39612
|
-
|
|
39613
|
-
}
|
|
39614
|
-
});
|
|
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) {
|
|
39615
39428
|
await this.propertiesTable.ready();
|
|
39616
39429
|
this.propertiesTable.value = propertiesEntities;
|
|
39617
39430
|
}
|
|
@@ -39674,7 +39487,7 @@ class AccountPage extends AppForm {
|
|
|
39674
39487
|
...this.form.value,
|
|
39675
39488
|
});
|
|
39676
39489
|
if (isNotEmptyArray(this.optionDefinitions) && this.propertiesTable) {
|
|
39677
|
-
//
|
|
39490
|
+
// Merge properties
|
|
39678
39491
|
await this.propertiesTable.save();
|
|
39679
39492
|
const propertyEntities = this.propertiesTable.value || [];
|
|
39680
39493
|
const properties = propertyEntities.reduce((res, item) => {
|
|
@@ -45580,9 +45393,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
45580
45393
|
class MarkdownTestPage {
|
|
45581
45394
|
modalCtrl;
|
|
45582
45395
|
cd;
|
|
45583
|
-
environment;
|
|
45584
45396
|
markdownModalTitle = 'Markdown modal';
|
|
45585
|
-
debug;
|
|
45586
45397
|
// URL from a starting markdown
|
|
45587
45398
|
//protected markdownUrl = 'http://localhost:3000/user-manual/index.md';
|
|
45588
45399
|
markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/pifil/man/quick_start_guide_fr.md';
|
|
@@ -45591,11 +45402,9 @@ class MarkdownTestPage {
|
|
|
45591
45402
|
//protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/model/administration/index.md';
|
|
45592
45403
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/activity-calendar/spe/collecte_de_donnees.md';
|
|
45593
45404
|
//protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/develop/doc/privacy_policy.md';
|
|
45594
|
-
constructor(modalCtrl, cd
|
|
45405
|
+
constructor(modalCtrl, cd) {
|
|
45595
45406
|
this.modalCtrl = modalCtrl;
|
|
45596
45407
|
this.cd = cd;
|
|
45597
|
-
this.environment = environment;
|
|
45598
|
-
this.debug = !environment.production;
|
|
45599
45408
|
}
|
|
45600
45409
|
onSubmit(event, newUrl) {
|
|
45601
45410
|
this.markdownUrl = '' + newUrl;
|
|
@@ -45612,16 +45421,13 @@ class MarkdownTestPage {
|
|
|
45612
45421
|
canPrint: true,
|
|
45613
45422
|
});
|
|
45614
45423
|
}
|
|
45615
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, deps: [{ token: i2$1.ModalController }, { token: i0.ChangeDetectorRef }
|
|
45616
|
-
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 });
|
|
45617
45426
|
}
|
|
45618
45427
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownTestPage, decorators: [{
|
|
45619
45428
|
type: Component,
|
|
45620
|
-
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
|
|
45621
|
-
}], ctorParameters: () => [{ type: i2$1.ModalController }, { type: i0.ChangeDetectorRef }
|
|
45622
|
-
type: Inject,
|
|
45623
|
-
args: [ENVIRONMENT]
|
|
45624
|
-
}] }] });
|
|
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 }] });
|
|
45625
45431
|
|
|
45626
45432
|
const routes$4 = [
|
|
45627
45433
|
{
|
|
@@ -47363,5 +47169,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
47363
47169
|
* Generated bundle index. Do not edit.
|
|
47364
47170
|
*/
|
|
47365
47171
|
|
|
47366
|
-
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 };
|
|
47367
47173
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|