@sumaris-net/ngx-components 18.3.28 → 18.3.30-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
- package/esm2022/src/app/shared/forms.mjs +11 -2
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +4 -1
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +359 -0
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +105 -396
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +6 -5
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +1 -1
- package/esm2022/src/app/shared/material/material.module.mjs +2 -2
- package/esm2022/src/app/shared/material/material.testing.module.mjs +25 -3
- package/esm2022/src/app/shared/material/test/test-component.mjs +240 -0
- package/fesm2022/sumaris-net.ngx-components.mjs +970 -649
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/app/shared/material/latlong/latlong.utils.d.ts +9 -0
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +80 -0
- package/src/app/shared/material/latlong/material.latlong.d.ts +21 -66
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +15 -14
- package/src/app/shared/material/material.testing.module.d.ts +2 -1
- package/src/app/shared/material/test/test-component.d.ts +75 -0
- package/src/assets/manifest.json +1 -1
- package/src/theme/_material.scss +3 -10
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
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, ViewEncapsulation, APP_INITIALIZER, ChangeDetectorRef } from '@angular/core';
|
|
3
|
-
import { firstValueFrom, shareReplay, tap, of, timer, Subject, merge, delay, isObservable, from, Subscription, BehaviorSubject, fromEvent, noop as noop$
|
|
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, Self, ViewEncapsulation, APP_INITIALIZER, ChangeDetectorRef, 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, defer, timeout, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, fromEventPattern, 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
|
-
import { CommonModule, DOCUMENT, Location } from '@angular/common';
|
|
6
|
+
import { CommonModule, DOCUMENT, Location, AsyncPipe, JsonPipe } from '@angular/common';
|
|
7
7
|
import { CdkTableModule } from '@angular/cdk/table';
|
|
8
8
|
import * as i1$4 from '@angular/cdk/a11y';
|
|
9
|
-
import { A11yModule } from '@angular/cdk/a11y';
|
|
9
|
+
import { A11yModule, FocusMonitor } from '@angular/cdk/a11y';
|
|
10
10
|
import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
|
|
11
11
|
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
12
12
|
import * as i2 from '@angular/material/core';
|
|
@@ -34,12 +34,12 @@ import * as i1 from '@angular/material-moment-adapter';
|
|
|
34
34
|
import { MatMomentDateModule } from '@angular/material-moment-adapter';
|
|
35
35
|
import { isMoment as isMoment$1 } from 'moment/moment';
|
|
36
36
|
import * as i1$3 from '@angular/forms';
|
|
37
|
-
import { AbstractControl, UntypedFormArray, UntypedFormGroup, UntypedFormControl, Validators, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormControl, FormGroup, FormsModule } from '@angular/forms';
|
|
38
|
-
import { maskitoWithPlaceholder, maskitoEventHandler,
|
|
37
|
+
import { AbstractControl, UntypedFormArray, UntypedFormGroup, UntypedFormControl, Validators, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormBuilder, FormControl, FormGroup, FormsModule, NgControl } from '@angular/forms';
|
|
38
|
+
import { maskitoWithPlaceholder, maskitoEventHandler, maskitoDateOptionsGenerator, maskitoTimeOptionsGenerator, maskitoNumberOptionsGenerator } from '@maskito/kit';
|
|
39
39
|
import * as i1$2 from '@angular/platform-browser';
|
|
40
40
|
import { HammerGestureConfig, HammerModule } from '@angular/platform-browser';
|
|
41
41
|
import * as i6 from '@angular/material/form-field';
|
|
42
|
-
import { MatFormFieldModule, MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
|
42
|
+
import { MatFormFieldModule, MAT_FORM_FIELD_DEFAULT_OPTIONS, MAT_FORM_FIELD, MatFormFieldControl } from '@angular/material/form-field';
|
|
43
43
|
import * as i4 from '@angular/material/input';
|
|
44
44
|
import { MatInputModule } from '@angular/material/input';
|
|
45
45
|
import * as i11 from '@maskito/angular';
|
|
@@ -63,7 +63,7 @@ import { MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
|
63
63
|
import * as i8$2 from '@angular/material/menu';
|
|
64
64
|
import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';
|
|
65
65
|
import * as i12 from '@angular/material/select';
|
|
66
|
-
import { MatSelectModule,
|
|
66
|
+
import { MatSelectModule, MAT_SELECT_SCROLL_STRATEGY } from '@angular/material/select';
|
|
67
67
|
import { MatCardModule } from '@angular/material/card';
|
|
68
68
|
import * as i7 from '@angular/material/tabs';
|
|
69
69
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
@@ -100,6 +100,7 @@ import * as LocalForage from 'localforage';
|
|
|
100
100
|
import * as CordovaSQLiteDriver from 'localforage-cordovasqlitedriver';
|
|
101
101
|
import * as i2$2 from '@ionic/storage-angular';
|
|
102
102
|
import { IonicStorageModule } from '@ionic/storage-angular';
|
|
103
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
103
104
|
import * as i5$3 from 'ngx-color-picker';
|
|
104
105
|
import { ColorPickerModule } from 'ngx-color-picker';
|
|
105
106
|
import * as i2$3 from '@ionic-native/audio-management/ngx';
|
|
@@ -153,6 +154,7 @@ import { Geolocation } from '@capacitor/geolocation';
|
|
|
153
154
|
import * as i1$7 from '@e-is/ngx-material-table';
|
|
154
155
|
import { ValidatorService, TableDataSource, AsyncTableDataSource } from '@e-is/ngx-material-table';
|
|
155
156
|
import 'moment-timezone';
|
|
157
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
156
158
|
|
|
157
159
|
const ENVIRONMENT = new InjectionToken('ENV');
|
|
158
160
|
class Environment {
|
|
@@ -1575,6 +1577,9 @@ const DEFAULT_LONGITUDE_OPTIONS = {
|
|
|
1575
1577
|
...DEFAULT_OPTIONS,
|
|
1576
1578
|
longitude: true,
|
|
1577
1579
|
};
|
|
1580
|
+
function computeDecimalPart(value, nbOfDecimals) {
|
|
1581
|
+
return value * 10 ** (nbOfDecimals * -1);
|
|
1582
|
+
}
|
|
1578
1583
|
function formatLatLong(value, type, opts) {
|
|
1579
1584
|
switch (type) {
|
|
1580
1585
|
case 'latitude':
|
|
@@ -3738,10 +3743,19 @@ function disableControl(control, opts) {
|
|
|
3738
3743
|
setControlEnabled(control, false, { required: false, ...opts });
|
|
3739
3744
|
}
|
|
3740
3745
|
function disableAndClearControl(control, opts) {
|
|
3746
|
+
const wasDisabled = control.disabled;
|
|
3747
|
+
// Apply disable
|
|
3741
3748
|
setControlEnabled(control, false, { required: false, ...opts });
|
|
3742
3749
|
// Important, should not use reset() to mark the control as dirty.
|
|
3743
3750
|
// Otherwise, optimization using dirty (.e.g MeasurementForm) will not be notified by this changed
|
|
3744
|
-
control.
|
|
3751
|
+
if (isNotNil(control.value)) {
|
|
3752
|
+
if (wasDisabled) {
|
|
3753
|
+
control.reset(null, opts);
|
|
3754
|
+
}
|
|
3755
|
+
else {
|
|
3756
|
+
control.setValue(null, opts);
|
|
3757
|
+
}
|
|
3758
|
+
}
|
|
3745
3759
|
}
|
|
3746
3760
|
function setControlEnabled(control, enabled, opts) {
|
|
3747
3761
|
if (enabled) {
|
|
@@ -5466,7 +5480,7 @@ const DEFAULT_VALUE_ACCESSOR$5 = {
|
|
|
5466
5480
|
};
|
|
5467
5481
|
const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
|
|
5468
5482
|
const DURATION_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
|
|
5469
|
-
const noop$
|
|
5483
|
+
const noop$8 = () => { };
|
|
5470
5484
|
class MatDuration {
|
|
5471
5485
|
dateAdapter;
|
|
5472
5486
|
translate;
|
|
@@ -5474,8 +5488,8 @@ class MatDuration {
|
|
|
5474
5488
|
cd;
|
|
5475
5489
|
formGroupDir;
|
|
5476
5490
|
_subscription = new Subscription();
|
|
5477
|
-
_onChangeCallback = noop$
|
|
5478
|
-
_onTouchedCallback = noop$
|
|
5491
|
+
_onChangeCallback = noop$8;
|
|
5492
|
+
_onTouchedCallback = noop$8;
|
|
5479
5493
|
writing = true;
|
|
5480
5494
|
disabling = false;
|
|
5481
5495
|
_tabindex;
|
|
@@ -6057,13 +6071,13 @@ const DEFAULT_VALUE_ACCESSOR$4 = {
|
|
|
6057
6071
|
useExisting: forwardRef(() => MatBooleanField),
|
|
6058
6072
|
multi: true,
|
|
6059
6073
|
};
|
|
6060
|
-
const noop$
|
|
6074
|
+
const noop$7 = () => { };
|
|
6061
6075
|
class MatBooleanField {
|
|
6062
6076
|
cd;
|
|
6063
6077
|
el;
|
|
6064
6078
|
formGroupDir;
|
|
6065
|
-
_onChangeCallback = noop$
|
|
6066
|
-
_onTouchedCallback = noop$
|
|
6079
|
+
_onChangeCallback = noop$7;
|
|
6080
|
+
_onTouchedCallback = noop$7;
|
|
6067
6081
|
_subscription = new Subscription();
|
|
6068
6082
|
_writing = false;
|
|
6069
6083
|
_value;
|
|
@@ -7676,7 +7690,7 @@ class MatAutocompleteFieldUtils {
|
|
|
7676
7690
|
}
|
|
7677
7691
|
}
|
|
7678
7692
|
|
|
7679
|
-
const noop$
|
|
7693
|
+
const noop$6 = () => { };
|
|
7680
7694
|
class MatAutocompleteField {
|
|
7681
7695
|
injector;
|
|
7682
7696
|
el;
|
|
@@ -7684,8 +7698,8 @@ class MatAutocompleteField {
|
|
|
7684
7698
|
modalController;
|
|
7685
7699
|
renderer;
|
|
7686
7700
|
formGroupDir;
|
|
7687
|
-
_onChangeCallback = noop$
|
|
7688
|
-
_onTouchedCallback = noop$
|
|
7701
|
+
_onChangeCallback = noop$6;
|
|
7702
|
+
_onTouchedCallback = noop$6;
|
|
7689
7703
|
_onFetchMoreCallback;
|
|
7690
7704
|
_implicitValue;
|
|
7691
7705
|
_subscription = new Subscription();
|
|
@@ -8934,630 +8948,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
8934
8948
|
const MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING = 'fixed';
|
|
8935
8949
|
const MAT_FORM_FIELD_DEFAULT_APPEARANCE = 'fill';
|
|
8936
8950
|
|
|
8937
|
-
const noop$6 = () => { };
|
|
8938
|
-
class MatLatLongField {
|
|
8939
|
-
cd;
|
|
8940
|
-
formGroupDir;
|
|
8941
|
-
_onChangeCallback = noop$6;
|
|
8942
|
-
_onTouchedCallback = noop$6;
|
|
8943
|
-
_subscription = new Subscription();
|
|
8944
|
-
_disabling = false;
|
|
8945
|
-
_writing = false;
|
|
8946
|
-
_appearance = null;
|
|
8947
|
-
_subscriptSizing = null;
|
|
8948
|
-
_readonly = false;
|
|
8949
|
-
_tabindex;
|
|
8950
|
-
_defaultAppearance;
|
|
8951
|
-
_defaultSubscriptSizing;
|
|
8952
|
-
_focused = false;
|
|
8953
|
-
_touched = false;
|
|
8954
|
-
degreesControl;
|
|
8955
|
-
minutesControl;
|
|
8956
|
-
secondsControl;
|
|
8957
|
-
signControl;
|
|
8958
|
-
showMinutes = false;
|
|
8959
|
-
showSeconds = false;
|
|
8960
|
-
showSignControl;
|
|
8961
|
-
degreesPlaceholder;
|
|
8962
|
-
minutesPlaceholder;
|
|
8963
|
-
secondsPlaceholder;
|
|
8964
|
-
degreesMask;
|
|
8965
|
-
minutesMask;
|
|
8966
|
-
secondsMask;
|
|
8967
|
-
patternMaxDecimals = LAT_LONG_PATTERN_MAX_DECIMALS;
|
|
8968
|
-
i18nErrorKeys = SharedValidators.I18N_ERROR_KEYS;
|
|
8969
|
-
formControl;
|
|
8970
|
-
formControlName;
|
|
8971
|
-
type;
|
|
8972
|
-
pattern;
|
|
8973
|
-
maxDecimals = LAT_LONG_VALUE_MAX_DECIMALS;
|
|
8974
|
-
required = false;
|
|
8975
|
-
floatLabel = 'auto';
|
|
8976
|
-
placeholder;
|
|
8977
|
-
defaultSign;
|
|
8978
|
-
autofocus = false;
|
|
8979
|
-
mobile;
|
|
8980
|
-
degreesSymbolUnit = '°';
|
|
8981
|
-
minutesSymbolUnit = "'";
|
|
8982
|
-
secondsSymbolUnit = '"';
|
|
8983
|
-
clearable = false;
|
|
8984
|
-
classList;
|
|
8985
|
-
set tabindex(value) {
|
|
8986
|
-
if (this._tabindex !== value) {
|
|
8987
|
-
this._tabindex = value;
|
|
8988
|
-
setTimeout(() => this.updateTabIndex());
|
|
8989
|
-
}
|
|
8990
|
-
}
|
|
8991
|
-
get tabindex() {
|
|
8992
|
-
return this._tabindex;
|
|
8993
|
-
}
|
|
8994
|
-
set appearance(value) {
|
|
8995
|
-
this._appearance = value;
|
|
8996
|
-
}
|
|
8997
|
-
get appearance() {
|
|
8998
|
-
return this._appearance || this._defaultAppearance;
|
|
8999
|
-
}
|
|
9000
|
-
set readonly(value) {
|
|
9001
|
-
this._readonly = value;
|
|
9002
|
-
this.markForCheck();
|
|
9003
|
-
}
|
|
9004
|
-
get readonly() {
|
|
9005
|
-
return this._readonly;
|
|
9006
|
-
}
|
|
9007
|
-
set subscriptSizing(value) {
|
|
9008
|
-
this._subscriptSizing = value;
|
|
9009
|
-
}
|
|
9010
|
-
get subscriptSizing() {
|
|
9011
|
-
return this._subscriptSizing || this._defaultSubscriptSizing;
|
|
9012
|
-
}
|
|
9013
|
-
get showFields() {
|
|
9014
|
-
return isNotNilOrNaN(this.formControl.value) || this._focused;
|
|
9015
|
-
}
|
|
9016
|
-
get disabled() {
|
|
9017
|
-
return this.readonly || this.formControl.disabled;
|
|
9018
|
-
}
|
|
9019
|
-
// eslint-disable-next-line @angular-eslint/no-output-on-prefix,@angular-eslint/no-output-rename
|
|
9020
|
-
keyupEnter = new EventEmitter();
|
|
9021
|
-
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
9022
|
-
blurred = new EventEmitter();
|
|
9023
|
-
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
9024
|
-
focused = new EventEmitter();
|
|
9025
|
-
formField;
|
|
9026
|
-
fakeInput;
|
|
9027
|
-
inputDegrees;
|
|
9028
|
-
inputMinutes;
|
|
9029
|
-
inputSeconds;
|
|
9030
|
-
inputSign;
|
|
9031
|
-
inputSignSelect;
|
|
9032
|
-
constructor(cd, formGroupDir, defaultOptions) {
|
|
9033
|
-
this.cd = cd;
|
|
9034
|
-
this.formGroupDir = formGroupDir;
|
|
9035
|
-
this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;
|
|
9036
|
-
this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
|
|
9037
|
-
}
|
|
9038
|
-
ngOnInit() {
|
|
9039
|
-
this.mobile = this.mobile ?? isMobile(window);
|
|
9040
|
-
this.type = this.type || 'latitude';
|
|
9041
|
-
this.pattern = this.pattern || 'DDMM';
|
|
9042
|
-
this.showSignControl = this.pattern !== 'DD';
|
|
9043
|
-
switch (this.pattern) {
|
|
9044
|
-
case 'DD':
|
|
9045
|
-
this.patternMaxDecimals = 7;
|
|
9046
|
-
this.degreesPlaceholder =
|
|
9047
|
-
this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD_PLACEHOLDER' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD_PLACEHOLDER';
|
|
9048
|
-
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
9049
|
-
precision: this.patternMaxDecimals,
|
|
9050
|
-
min: this.type === 'latitude' ? -90 : -180,
|
|
9051
|
-
max: this.type === 'latitude' ? 90 : 180,
|
|
9052
|
-
minusSign: '-',
|
|
9053
|
-
});
|
|
9054
|
-
break;
|
|
9055
|
-
case 'DDMM':
|
|
9056
|
-
this.patternMaxDecimals = 3;
|
|
9057
|
-
this.showMinutes = true;
|
|
9058
|
-
this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
|
|
9059
|
-
this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM';
|
|
9060
|
-
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
9061
|
-
precision: 0,
|
|
9062
|
-
min: 0,
|
|
9063
|
-
max: this.type === 'latitude' ? 90 : 180,
|
|
9064
|
-
});
|
|
9065
|
-
this.minutesMask = maskitoNumberOptionsGenerator({
|
|
9066
|
-
precision: this.patternMaxDecimals,
|
|
9067
|
-
min: 0,
|
|
9068
|
-
max: 60 - this.computeDecimalPart(1, this.patternMaxDecimals),
|
|
9069
|
-
});
|
|
9070
|
-
break;
|
|
9071
|
-
default: // Default is DDMMSS
|
|
9072
|
-
this.patternMaxDecimals = 2;
|
|
9073
|
-
this.showMinutes = true;
|
|
9074
|
-
this.showSeconds = true;
|
|
9075
|
-
this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
|
|
9076
|
-
this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM';
|
|
9077
|
-
this.secondsPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.SS_SS';
|
|
9078
|
-
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
9079
|
-
precision: 0,
|
|
9080
|
-
min: 0,
|
|
9081
|
-
max: this.type === 'latitude' ? 90 : 180,
|
|
9082
|
-
});
|
|
9083
|
-
this.minutesMask = maskitoNumberOptionsGenerator({
|
|
9084
|
-
precision: 0,
|
|
9085
|
-
min: 0,
|
|
9086
|
-
max: 59,
|
|
9087
|
-
});
|
|
9088
|
-
this.secondsMask = maskitoNumberOptionsGenerator({
|
|
9089
|
-
precision: this.patternMaxDecimals,
|
|
9090
|
-
min: 0,
|
|
9091
|
-
max: 60 - this.computeDecimalPart(1, this.patternMaxDecimals),
|
|
9092
|
-
});
|
|
9093
|
-
break;
|
|
9094
|
-
}
|
|
9095
|
-
this.formControl =
|
|
9096
|
-
this.formControl || (this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName));
|
|
9097
|
-
if (!this.formControl)
|
|
9098
|
-
throw new Error("Missing mandatory attribute 'formControl' or 'formControlName' in <mat-latlong-field>.");
|
|
9099
|
-
this.degreesControl = new FormControl(null);
|
|
9100
|
-
this.minutesControl = new FormControl(null);
|
|
9101
|
-
this.secondsControl = new FormControl(null);
|
|
9102
|
-
this.signControl = new FormControl(null);
|
|
9103
|
-
this._subscription.add(merge(this.degreesControl.valueChanges, this.minutesControl.valueChanges, this.secondsControl.valueChanges, this.signControl.valueChanges).subscribe(() => this.onFormChange()));
|
|
9104
|
-
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
9105
|
-
this._subscription.add(this.formControl.statusChanges
|
|
9106
|
-
.pipe(filter(() => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
9107
|
-
)
|
|
9108
|
-
.subscribe(() => this.markForCheck()));
|
|
9109
|
-
}
|
|
9110
|
-
ngOnDestroy() {
|
|
9111
|
-
this._subscription.unsubscribe();
|
|
9112
|
-
}
|
|
9113
|
-
registerOnChange(fn) {
|
|
9114
|
-
this._onChangeCallback = fn;
|
|
9115
|
-
}
|
|
9116
|
-
registerOnTouched(fn) {
|
|
9117
|
-
this._onTouchedCallback = fn;
|
|
9118
|
-
}
|
|
9119
|
-
writeValue(value) {
|
|
9120
|
-
if (this._writing)
|
|
9121
|
-
return;
|
|
9122
|
-
this._writing = true;
|
|
9123
|
-
if (value !== this.formControl.value) {
|
|
9124
|
-
this.formControl.patchValue(value, { emitEvent: false });
|
|
9125
|
-
this._onChangeCallback(value);
|
|
9126
|
-
}
|
|
9127
|
-
const result = this.computeLatLongFormGroupValue(value);
|
|
9128
|
-
// DEBUG
|
|
9129
|
-
// console.debug('[mat-latlong-field] Changing value of inputs:', value, result);
|
|
9130
|
-
this.patchValue(result, { emitEvent: false });
|
|
9131
|
-
this._writing = false;
|
|
9132
|
-
this.markForCheck();
|
|
9133
|
-
setTimeout(() => {
|
|
9134
|
-
this.updateFakeInput();
|
|
9135
|
-
this.updateTabIndex();
|
|
9136
|
-
});
|
|
9137
|
-
}
|
|
9138
|
-
setDisabledState(isDisabled) {
|
|
9139
|
-
if (this._disabling)
|
|
9140
|
-
return;
|
|
9141
|
-
this._disabling = true;
|
|
9142
|
-
if (isDisabled) {
|
|
9143
|
-
this.degreesControl.disable();
|
|
9144
|
-
this.minutesControl.disable();
|
|
9145
|
-
this.secondsControl.disable();
|
|
9146
|
-
this.signControl.disable();
|
|
9147
|
-
}
|
|
9148
|
-
else {
|
|
9149
|
-
this.degreesControl.enable();
|
|
9150
|
-
this.minutesControl.enable();
|
|
9151
|
-
this.secondsControl.enable();
|
|
9152
|
-
this.signControl.enable();
|
|
9153
|
-
}
|
|
9154
|
-
this._disabling = false;
|
|
9155
|
-
this.markForCheck();
|
|
9156
|
-
}
|
|
9157
|
-
clearValue(event) {
|
|
9158
|
-
event?.stopPropagation();
|
|
9159
|
-
this.writeValue(null);
|
|
9160
|
-
}
|
|
9161
|
-
get internalElements() {
|
|
9162
|
-
return (this.inputDegrees ? [this.inputDegrees.nativeElement] : [])
|
|
9163
|
-
.concat(this.inputMinutes ? [this.inputMinutes.nativeElement] : [])
|
|
9164
|
-
.concat(this.inputSeconds ? [this.inputSeconds.nativeElement] : [])
|
|
9165
|
-
.concat(this.inputSign ? [this.inputSign.nativeElement] : [])
|
|
9166
|
-
.concat(this.fakeInput ? [this.fakeInput.nativeElement] : []);
|
|
9167
|
-
}
|
|
9168
|
-
onFocusFakeInput(event) {
|
|
9169
|
-
if (!this.showFields) {
|
|
9170
|
-
event.preventDefault();
|
|
9171
|
-
// Hide the fake input
|
|
9172
|
-
this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
|
|
9173
|
-
}
|
|
9174
|
-
this._touched = this.formControl.touched;
|
|
9175
|
-
// Focus on first input
|
|
9176
|
-
this.focus();
|
|
9177
|
-
}
|
|
9178
|
-
onBlurFakeInput(event) {
|
|
9179
|
-
const internalEvent = this.internalElements.some((el) => el === event.relatedTarget);
|
|
9180
|
-
if (internalEvent && !this._touched) {
|
|
9181
|
-
// Workaround to remove touched on the fakeInput
|
|
9182
|
-
this.formControl.markAsUntouched();
|
|
9183
|
-
}
|
|
9184
|
-
}
|
|
9185
|
-
_onFocusInput(event) {
|
|
9186
|
-
const internalEvent = this.internalElements.some((el) => el === event.target);
|
|
9187
|
-
if (internalEvent) {
|
|
9188
|
-
if (event.target === this.inputSign?.nativeElement) {
|
|
9189
|
-
this.inputSignSelect?.open();
|
|
9190
|
-
}
|
|
9191
|
-
else {
|
|
9192
|
-
selectInputContent(event.target);
|
|
9193
|
-
}
|
|
9194
|
-
}
|
|
9195
|
-
this.focus(event.target);
|
|
9196
|
-
}
|
|
9197
|
-
_onBlurInput(event) {
|
|
9198
|
-
const internalEvent = this.internalElements.some((el) => el === event.relatedTarget);
|
|
9199
|
-
if (!internalEvent) {
|
|
9200
|
-
this._focused = false;
|
|
9201
|
-
if (this.appearance == 'fill') {
|
|
9202
|
-
this.formField._lineRipple.deactivate();
|
|
9203
|
-
}
|
|
9204
|
-
this.blurred.emit(event);
|
|
9205
|
-
this.updateFakeInput();
|
|
9206
|
-
this.updateTabIndex();
|
|
9207
|
-
this._touched = true;
|
|
9208
|
-
this.formControl.markAsTouched();
|
|
9209
|
-
this._checkIfTouched();
|
|
9210
|
-
}
|
|
9211
|
-
}
|
|
9212
|
-
_onClickInput(event) {
|
|
9213
|
-
const internalEvent = this.internalElements.some((el) => el === event.target);
|
|
9214
|
-
if (internalEvent) {
|
|
9215
|
-
selectInputContent(event.target);
|
|
9216
|
-
}
|
|
9217
|
-
// Avoid mat-form-field to give focus to fake input
|
|
9218
|
-
event.stopPropagation();
|
|
9219
|
-
}
|
|
9220
|
-
focus(target) {
|
|
9221
|
-
if (this._focused)
|
|
9222
|
-
return true; // Already focused
|
|
9223
|
-
const showFields = this.showFields;
|
|
9224
|
-
this._focused = true;
|
|
9225
|
-
this.markForCheck();
|
|
9226
|
-
setTimeout(() => {
|
|
9227
|
-
if (!this._focused)
|
|
9228
|
-
return; // Focus was lost: skip
|
|
9229
|
-
if (!showFields) {
|
|
9230
|
-
this.inputDegrees.nativeElement.focus();
|
|
9231
|
-
selectInputContent(this.inputDegrees.nativeElement);
|
|
9232
|
-
}
|
|
9233
|
-
else if (target) {
|
|
9234
|
-
target.focus();
|
|
9235
|
-
selectInputContent(target);
|
|
9236
|
-
}
|
|
9237
|
-
if (this.appearance == 'fill') {
|
|
9238
|
-
this.formField._lineRipple.activate();
|
|
9239
|
-
}
|
|
9240
|
-
this.updateFakeInput();
|
|
9241
|
-
this.updateTabIndex();
|
|
9242
|
-
}, 50);
|
|
9243
|
-
}
|
|
9244
|
-
format(rawValue) {
|
|
9245
|
-
const values = this.computeLatLongFormGroupValue(rawValue);
|
|
9246
|
-
if (values.degrees === null)
|
|
9247
|
-
return '';
|
|
9248
|
-
let result = `${values.degrees}° `;
|
|
9249
|
-
if (values.minutes !== null)
|
|
9250
|
-
result += `${values.minutes}' `;
|
|
9251
|
-
if (values.seconds !== null)
|
|
9252
|
-
result += `${values.seconds}" `;
|
|
9253
|
-
if (this.type === 'latitude') {
|
|
9254
|
-
result += values.sign === 1 ? 'N' : 'S';
|
|
9255
|
-
}
|
|
9256
|
-
else {
|
|
9257
|
-
result += values.sign === 1 ? 'E' : 'W';
|
|
9258
|
-
}
|
|
9259
|
-
return result;
|
|
9260
|
-
}
|
|
9261
|
-
computeDecimalPart(value, nbOfDecimals) {
|
|
9262
|
-
return value * 10 ** (nbOfDecimals * -1);
|
|
9263
|
-
}
|
|
9264
|
-
computeLatLongFormGroupValue(rawValue) {
|
|
9265
|
-
const isLongitude = this.type === 'longitude';
|
|
9266
|
-
const value = typeof rawValue === 'string' ? parseFloat(rawValue.replace(/,/g, '.')) : rawValue;
|
|
9267
|
-
const result = {
|
|
9268
|
-
degrees: null,
|
|
9269
|
-
minutes: null,
|
|
9270
|
-
seconds: null,
|
|
9271
|
-
sign: isNotNil(value)
|
|
9272
|
-
? value < 0
|
|
9273
|
-
? -1
|
|
9274
|
-
: 1
|
|
9275
|
-
: // Use default sign, if any
|
|
9276
|
-
this.defaultSign && this.defaultSign === '-'
|
|
9277
|
-
? -1
|
|
9278
|
-
: 1,
|
|
9279
|
-
};
|
|
9280
|
-
if (value === 0) {
|
|
9281
|
-
result.degrees = 0;
|
|
9282
|
-
}
|
|
9283
|
-
else if (isNotNil(value)) {
|
|
9284
|
-
if (this.pattern === 'DD') {
|
|
9285
|
-
const splitValue = splitNumberToFieldsDD(value, {
|
|
9286
|
-
longitude: isLongitude,
|
|
9287
|
-
pattern: this.pattern,
|
|
9288
|
-
maxDecimals: this.patternMaxDecimals,
|
|
9289
|
-
fixLatLong: true,
|
|
9290
|
-
}).slice(1); // remove sign;
|
|
9291
|
-
result.degrees = (splitValue[0] + this.computeDecimalPart(splitValue[1] ?? 0, this.patternMaxDecimals)) * (result.sign || 1) || null;
|
|
9292
|
-
}
|
|
9293
|
-
else if (this.pattern === 'DDMM') {
|
|
9294
|
-
const splitValue = splitNumberToFieldsDDMM(value, {
|
|
9295
|
-
longitude: isLongitude,
|
|
9296
|
-
pattern: this.pattern,
|
|
9297
|
-
maxDecimals: this.patternMaxDecimals,
|
|
9298
|
-
fixLatLong: true,
|
|
9299
|
-
});
|
|
9300
|
-
result['minutes'] = Math.abs((splitValue[1] ?? 0) + this.computeDecimalPart(splitValue[2] ?? 0, this.patternMaxDecimals)) || null;
|
|
9301
|
-
result['degrees'] = Math.abs(!result['minutes'] && isNilOrBlank(splitValue[0]) ? null : (splitValue[0] ?? 0));
|
|
9302
|
-
}
|
|
9303
|
-
else {
|
|
9304
|
-
// Default // DDMMSS
|
|
9305
|
-
const splitValue = splitNumberToFieldsDDMMSS(value, {
|
|
9306
|
-
longitude: isLongitude,
|
|
9307
|
-
pattern: this.pattern,
|
|
9308
|
-
maxDecimals: this.patternMaxDecimals,
|
|
9309
|
-
fixLatLong: true,
|
|
9310
|
-
});
|
|
9311
|
-
result['seconds'] = Math.abs((splitValue[2] ?? 0) + this.computeDecimalPart(splitValue[3] ?? 0, this.patternMaxDecimals)) || null;
|
|
9312
|
-
result['minutes'] = !result['seconds'] && !splitValue[1] ? null : Math.abs(splitValue[1] ?? 0);
|
|
9313
|
-
result['degrees'] = !result['seconds'] && !result['minutes'] && isNilOrBlank(splitValue[0]) ? null : Math.abs(splitValue[0] ?? 0);
|
|
9314
|
-
}
|
|
9315
|
-
}
|
|
9316
|
-
return result;
|
|
9317
|
-
}
|
|
9318
|
-
markAsTouched() {
|
|
9319
|
-
this.formControl.markAsTouched();
|
|
9320
|
-
this.degreesControl.markAsTouched();
|
|
9321
|
-
this.minutesControl.markAsTouched();
|
|
9322
|
-
this.secondsControl.markAsTouched();
|
|
9323
|
-
this.signControl.markAsTouched();
|
|
9324
|
-
this._onTouchedCallback();
|
|
9325
|
-
}
|
|
9326
|
-
/* -- private method -- */
|
|
9327
|
-
patchValue(values, opts) {
|
|
9328
|
-
this.degreesControl.patchValue(values.degrees?.toString(), opts);
|
|
9329
|
-
this.minutesControl.patchValue(values.minutes?.toString(), opts);
|
|
9330
|
-
this.secondsControl.patchValue(values.seconds?.toString(), opts);
|
|
9331
|
-
this.signControl.patchValue(values.sign, opts);
|
|
9332
|
-
}
|
|
9333
|
-
onFormChange() {
|
|
9334
|
-
if (this._writing)
|
|
9335
|
-
return; // Skip if call by self
|
|
9336
|
-
this._writing = true;
|
|
9337
|
-
const degrees = isNotNilOrBlank(this.degreesControl.value) ? parseFloat(this.degreesControl.value) : undefined;
|
|
9338
|
-
const minutes = isNotNilOrBlank(this.minutesControl.value) ? parseFloat(this.minutesControl.value) : undefined;
|
|
9339
|
-
const seconds = isNotNilOrBlank(this.secondsControl.value) ? parseFloat(this.secondsControl.value) : undefined;
|
|
9340
|
-
const sign = this.signControl.value;
|
|
9341
|
-
const incompleteValue = isNil(degrees) && (isNotNil(minutes) || isNotNil(seconds));
|
|
9342
|
-
const invalid = incompleteValue || this.degreesControl.invalid || this.minutesControl.invalid || this.secondsControl.invalid || this.signControl.invalid;
|
|
9343
|
-
if (invalid) {
|
|
9344
|
-
this.formControl.markAsPending({ onlySelf: true });
|
|
9345
|
-
this.formControl.setErrors({
|
|
9346
|
-
invalid: incompleteValue,
|
|
9347
|
-
...this.degreesControl.errors,
|
|
9348
|
-
...this.minutesControl.errors,
|
|
9349
|
-
...this.secondsControl.errors,
|
|
9350
|
-
...this.signControl.errors,
|
|
9351
|
-
});
|
|
9352
|
-
if (this.degreesControl.dirty || this.minutesControl.dirty || this.secondsControl.dirty || this.signControl.dirty) {
|
|
9353
|
-
this.formControl.markAsDirty();
|
|
9354
|
-
}
|
|
9355
|
-
this._writing = false;
|
|
9356
|
-
return;
|
|
9357
|
-
}
|
|
9358
|
-
// Compute decimal values
|
|
9359
|
-
const value = isNil(degrees) || this.pattern === 'DD' ? degrees : computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals);
|
|
9360
|
-
// Set model value
|
|
9361
|
-
this.emitChange(value);
|
|
9362
|
-
this._writing = false;
|
|
9363
|
-
this.markForCheck();
|
|
9364
|
-
}
|
|
9365
|
-
emitChange(value) {
|
|
9366
|
-
if (this.formControl.value !== value) {
|
|
9367
|
-
this.formControl.setValue(value, { emitEvent: false });
|
|
9368
|
-
// Changes comes from inside function: use the callback
|
|
9369
|
-
this._onChangeCallback(value);
|
|
9370
|
-
// Check if need to update controls
|
|
9371
|
-
this._checkIfTouched();
|
|
9372
|
-
}
|
|
9373
|
-
}
|
|
9374
|
-
_checkIfTouched() {
|
|
9375
|
-
if (this.formControl.touched) {
|
|
9376
|
-
this._onTouchedCallback();
|
|
9377
|
-
this.markForCheck();
|
|
9378
|
-
this._touched = true;
|
|
9379
|
-
}
|
|
9380
|
-
else {
|
|
9381
|
-
this._touched = false;
|
|
9382
|
-
}
|
|
9383
|
-
}
|
|
9384
|
-
markForCheck() {
|
|
9385
|
-
this.cd.markForCheck();
|
|
9386
|
-
}
|
|
9387
|
-
/**
|
|
9388
|
-
* Show/Hide the fake input
|
|
9389
|
-
*/
|
|
9390
|
-
updateFakeInput() {
|
|
9391
|
-
if (this.showFields) {
|
|
9392
|
-
this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
|
|
9393
|
-
}
|
|
9394
|
-
else {
|
|
9395
|
-
this.fakeInput?.nativeElement.classList.remove('cdk-visually-hidden');
|
|
9396
|
-
}
|
|
9397
|
-
// TODO: check if need
|
|
9398
|
-
this.markForCheck();
|
|
9399
|
-
}
|
|
9400
|
-
/**
|
|
9401
|
-
* This is a special case, because, this component has a temporary component displayed before the first focus event
|
|
9402
|
-
*/
|
|
9403
|
-
updateTabIndex() {
|
|
9404
|
-
if (isNil(this._tabindex))
|
|
9405
|
-
return;
|
|
9406
|
-
if (this.fakeInput) {
|
|
9407
|
-
this.fakeInput.nativeElement.tabIndex = this._tabindex;
|
|
9408
|
-
}
|
|
9409
|
-
this.markForCheck();
|
|
9410
|
-
}
|
|
9411
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
|
|
9412
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongField, selector: "mat-latlong-field", inputs: { formControl: "formControl", formControlName: "formControlName", type: "type", pattern: ["latLongPattern", "pattern"], maxDecimals: "maxDecimals", required: "required", floatLabel: "floatLabel", placeholder: "placeholder", defaultSign: "defaultSign", autofocus: "autofocus", mobile: ["mobile", "mobile", booleanAttribute], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", clearable: ["clearable", "clearable", booleanAttribute], classList: ["class", "classList"], tabindex: ["tabindex", "tabindex", numberAttribute], appearance: "appearance", readonly: "readonly", subscriptSizing: "subscriptSizing" }, outputs: { keyupEnter: "keyup.enter", blurred: "blur", focused: "focus" }, providers: [
|
|
9413
|
-
{
|
|
9414
|
-
provide: NG_VALUE_ACCESSOR,
|
|
9415
|
-
multi: true,
|
|
9416
|
-
useExisting: forwardRef(() => MatLatLongField),
|
|
9417
|
-
},
|
|
9418
|
-
], viewQueries: [{ propertyName: "formField", first: true, predicate: ["formField"], descendants: true }, { propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }, { propertyName: "inputDegrees", first: true, predicate: ["inputDegrees"], descendants: true }, { propertyName: "inputMinutes", first: true, predicate: ["inputMinutes"], descendants: true }, { propertyName: "inputSeconds", first: true, predicate: ["inputSeconds"], descendants: true }, { propertyName: "inputSign", first: true, predicate: ["inputSign"], descendants: true, read: ElementRef }, { propertyName: "inputSignSelect", first: true, predicate: ["inputSign"], descendants: true, read: MatSelect }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: patternMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"showFields && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signControl.invalid || formControl.invalid)\"\n class=\"mat-latlong-field mat-latlong-field-{{ type }} {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [appAutofocus]=\"!showFields && autofocus\"\n [class.cdk-visually-hidden]=\"showFields\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurFakeInput($event)\"\n />\n <input\n matInput\n #inputDegrees\n [class.degrees]=\"pattern !== 'DD'\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n [formControl]=\"degreesControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"showFields && autofocus\"\n [maskito]=\"degreesMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n matInput\n #inputMinutes\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n [formControl]=\"minutesControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [maskito]=\"minutesMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n matInput\n #inputSeconds\n class=\"seconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n [formControl]=\"secondsControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [maskito]=\"secondsMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span [class.cdk-visually-hidden]=\"!showFields\" class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSignControl) {\n <span class=\"flex-spacer\"></span>\n <mat-select\n #inputSign\n [formControl]=\"signControl\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n [tabindex]=\"tabindex\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n class=\"sign\"\n >\n <mat-option [value]=\"1\" (click)=\"inputSign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"inputSign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0;--mdc-filled-text-field-input-text-placeholder-color: var(--mdc-filled-text-field-input-text-placeholder-color, var(--app-form-field-label-color));--mdc-outlined-text-field-input-text-placeholder-color: var(--mdc-outlined-text-field-input-text-placeholder-color, var(--app-form-field-label-color))}input{text-align:right}input::placeholder{letter-spacing:-.05em}input.degrees{width:2em}input.minutes{width:1.7em}input.minutes-seconds{width:3.55em}input.seconds{width:3em}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.mat-latlong-field-latitude input.degrees{width:1.3em!important}.symbol-unit{max-height:24px;display:inline-block;text-align:center;font-weight:700;font-size:1.3em}.mat-form-field-appearance-fill .symbol-unit{color:var(--mdc-filled-text-field-input-text-placeholder-color)!important}.mat-form-field-appearance-outline .symbol-unit{color:var(--mdc-outlined-text-field-input-text-placeholder-color)!important}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.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: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: LatLongFormatPipe, name: "latLongFormat" }, { kind: "pipe", type: ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: MapGetPipe, name: "mapGet" }, { kind: "pipe", type: MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: IsNilPipe, name: "isNil" }, { kind: "pipe", type: AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
9419
|
-
}
|
|
9420
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField, decorators: [{
|
|
9421
|
-
type: Component,
|
|
9422
|
-
args: [{ selector: 'mat-latlong-field', providers: [
|
|
9423
|
-
{
|
|
9424
|
-
provide: NG_VALUE_ACCESSOR,
|
|
9425
|
-
multi: true,
|
|
9426
|
-
useExisting: forwardRef(() => MatLatLongField),
|
|
9427
|
-
},
|
|
9428
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: patternMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"showFields && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signControl.invalid || formControl.invalid)\"\n class=\"mat-latlong-field mat-latlong-field-{{ type }} {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [appAutofocus]=\"!showFields && autofocus\"\n [class.cdk-visually-hidden]=\"showFields\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurFakeInput($event)\"\n />\n <input\n matInput\n #inputDegrees\n [class.degrees]=\"pattern !== 'DD'\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n [formControl]=\"degreesControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"showFields && autofocus\"\n [maskito]=\"degreesMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n matInput\n #inputMinutes\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n [formControl]=\"minutesControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [maskito]=\"minutesMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span class=\"symbol-unit\" [class.cdk-visually-hidden]=\"!showFields\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n matInput\n #inputSeconds\n class=\"seconds\"\n [class.cdk-visually-hidden]=\"!showFields\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n [formControl]=\"secondsControl\"\n [required]=\"false\"\n [tabindex]=\"tabindex\"\n [maskito]=\"secondsMask\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n />\n <span [class.cdk-visually-hidden]=\"!showFields\" class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSignControl) {\n <span class=\"flex-spacer\"></span>\n <mat-select\n #inputSign\n [formControl]=\"signControl\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n [tabindex]=\"tabindex\"\n (focus)=\"_onFocusInput($event)\"\n (blur)=\"_onBlurInput($event)\"\n (click)=\"_onClickInput($event)\"\n class=\"sign\"\n >\n <mat-option [value]=\"1\" (click)=\"inputSign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"inputSign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0;--mdc-filled-text-field-input-text-placeholder-color: var(--mdc-filled-text-field-input-text-placeholder-color, var(--app-form-field-label-color));--mdc-outlined-text-field-input-text-placeholder-color: var(--mdc-outlined-text-field-input-text-placeholder-color, var(--app-form-field-label-color))}input{text-align:right}input::placeholder{letter-spacing:-.05em}input.degrees{width:2em}input.minutes{width:1.7em}input.minutes-seconds{width:3.55em}input.seconds{width:3em}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.mat-latlong-field-latitude input.degrees{width:1.3em!important}.symbol-unit{max-height:24px;display:inline-block;text-align:center;font-weight:700;font-size:1.3em}.mat-form-field-appearance-fill .symbol-unit{color:var(--mdc-filled-text-field-input-text-placeholder-color)!important}.mat-form-field-appearance-outline .symbol-unit{color:var(--mdc-outlined-text-field-input-text-placeholder-color)!important}\n"] }]
|
|
9429
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$3.FormGroupDirective, decorators: [{
|
|
9430
|
-
type: Optional
|
|
9431
|
-
}] }, { type: undefined, decorators: [{
|
|
9432
|
-
type: Inject,
|
|
9433
|
-
args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
|
|
9434
|
-
}] }], propDecorators: { formControl: [{
|
|
9435
|
-
type: Input
|
|
9436
|
-
}], formControlName: [{
|
|
9437
|
-
type: Input
|
|
9438
|
-
}], type: [{
|
|
9439
|
-
type: Input
|
|
9440
|
-
}], pattern: [{
|
|
9441
|
-
type: Input,
|
|
9442
|
-
args: ['latLongPattern']
|
|
9443
|
-
}], maxDecimals: [{
|
|
9444
|
-
type: Input
|
|
9445
|
-
}], required: [{
|
|
9446
|
-
type: Input
|
|
9447
|
-
}], floatLabel: [{
|
|
9448
|
-
type: Input
|
|
9449
|
-
}], placeholder: [{
|
|
9450
|
-
type: Input
|
|
9451
|
-
}], defaultSign: [{
|
|
9452
|
-
type: Input
|
|
9453
|
-
}], autofocus: [{
|
|
9454
|
-
type: Input
|
|
9455
|
-
}], mobile: [{
|
|
9456
|
-
type: Input,
|
|
9457
|
-
args: [{ transform: booleanAttribute }]
|
|
9458
|
-
}], degreesSymbolUnit: [{
|
|
9459
|
-
type: Input
|
|
9460
|
-
}], minutesSymbolUnit: [{
|
|
9461
|
-
type: Input
|
|
9462
|
-
}], secondsSymbolUnit: [{
|
|
9463
|
-
type: Input
|
|
9464
|
-
}], clearable: [{
|
|
9465
|
-
type: Input,
|
|
9466
|
-
args: [{ transform: booleanAttribute }]
|
|
9467
|
-
}], classList: [{
|
|
9468
|
-
type: Input,
|
|
9469
|
-
args: ['class']
|
|
9470
|
-
}], tabindex: [{
|
|
9471
|
-
type: Input,
|
|
9472
|
-
args: [{ transform: numberAttribute }]
|
|
9473
|
-
}], appearance: [{
|
|
9474
|
-
type: Input
|
|
9475
|
-
}], readonly: [{
|
|
9476
|
-
type: Input
|
|
9477
|
-
}], subscriptSizing: [{
|
|
9478
|
-
type: Input
|
|
9479
|
-
}], keyupEnter: [{
|
|
9480
|
-
type: Output,
|
|
9481
|
-
args: ['keyup.enter']
|
|
9482
|
-
}], blurred: [{
|
|
9483
|
-
type: Output,
|
|
9484
|
-
args: ['blur']
|
|
9485
|
-
}], focused: [{
|
|
9486
|
-
type: Output,
|
|
9487
|
-
args: ['focus']
|
|
9488
|
-
}], formField: [{
|
|
9489
|
-
type: ViewChild,
|
|
9490
|
-
args: ['formField']
|
|
9491
|
-
}], fakeInput: [{
|
|
9492
|
-
type: ViewChild,
|
|
9493
|
-
args: ['fakeInput']
|
|
9494
|
-
}], inputDegrees: [{
|
|
9495
|
-
type: ViewChild,
|
|
9496
|
-
args: ['inputDegrees']
|
|
9497
|
-
}], inputMinutes: [{
|
|
9498
|
-
type: ViewChild,
|
|
9499
|
-
args: ['inputMinutes']
|
|
9500
|
-
}], inputSeconds: [{
|
|
9501
|
-
type: ViewChild,
|
|
9502
|
-
args: ['inputSeconds']
|
|
9503
|
-
}], inputSign: [{
|
|
9504
|
-
type: ViewChild,
|
|
9505
|
-
args: ['inputSign', { read: ElementRef }]
|
|
9506
|
-
}], inputSignSelect: [{
|
|
9507
|
-
type: ViewChild,
|
|
9508
|
-
args: ['inputSign', { read: MatSelect }]
|
|
9509
|
-
}] } });
|
|
9510
|
-
|
|
9511
|
-
class SharedMatLatLongModule {
|
|
9512
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9513
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, declarations: [MatLatLongField], imports: [CommonModule,
|
|
9514
|
-
IonicModule,
|
|
9515
|
-
ReactiveFormsModule,
|
|
9516
|
-
SharedDirectivesModule,
|
|
9517
|
-
SharedPipesModule,
|
|
9518
|
-
MatCommonModule,
|
|
9519
|
-
MatFormFieldModule,
|
|
9520
|
-
MatInputModule,
|
|
9521
|
-
MatButtonModule,
|
|
9522
|
-
MaskitoDirective,
|
|
9523
|
-
MatIconModule,
|
|
9524
|
-
MatSelectModule, i1$1.TranslateModule], exports: [MatLatLongField] });
|
|
9525
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, imports: [CommonModule,
|
|
9526
|
-
IonicModule,
|
|
9527
|
-
ReactiveFormsModule,
|
|
9528
|
-
SharedDirectivesModule,
|
|
9529
|
-
SharedPipesModule,
|
|
9530
|
-
MatCommonModule,
|
|
9531
|
-
MatFormFieldModule,
|
|
9532
|
-
MatInputModule,
|
|
9533
|
-
MatButtonModule,
|
|
9534
|
-
MatIconModule,
|
|
9535
|
-
MatSelectModule,
|
|
9536
|
-
TranslateModule.forChild()] });
|
|
9537
|
-
}
|
|
9538
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, decorators: [{
|
|
9539
|
-
type: NgModule,
|
|
9540
|
-
args: [{
|
|
9541
|
-
imports: [
|
|
9542
|
-
CommonModule,
|
|
9543
|
-
IonicModule,
|
|
9544
|
-
ReactiveFormsModule,
|
|
9545
|
-
SharedDirectivesModule,
|
|
9546
|
-
SharedPipesModule,
|
|
9547
|
-
MatCommonModule,
|
|
9548
|
-
MatFormFieldModule,
|
|
9549
|
-
MatInputModule,
|
|
9550
|
-
MatButtonModule,
|
|
9551
|
-
MaskitoDirective,
|
|
9552
|
-
MatIconModule,
|
|
9553
|
-
MatSelectModule,
|
|
9554
|
-
TranslateModule.forChild(),
|
|
9555
|
-
],
|
|
9556
|
-
exports: [MatLatLongField],
|
|
9557
|
-
declarations: [MatLatLongField],
|
|
9558
|
-
}]
|
|
9559
|
-
}] });
|
|
9560
|
-
|
|
9561
8951
|
const DEFAULT_VALUE_ACCESSOR$3 = {
|
|
9562
8952
|
provide: NG_VALUE_ACCESSOR,
|
|
9563
8953
|
useExisting: forwardRef(() => MatDate),
|
|
@@ -11136,8 +10526,8 @@ const DEFAULT_VALUE_ACCESSOR = {
|
|
|
11136
10526
|
class MatSwipeField {
|
|
11137
10527
|
cd;
|
|
11138
10528
|
formGroupDir;
|
|
11139
|
-
_onChangeCallback = noop$
|
|
11140
|
-
_onTouchedCallback = noop$
|
|
10529
|
+
_onChangeCallback = noop$9;
|
|
10530
|
+
_onTouchedCallback = noop$9;
|
|
11141
10531
|
_value;
|
|
11142
10532
|
_subscription = new Subscription();
|
|
11143
10533
|
_itemsSubscription;
|
|
@@ -13881,6 +13271,690 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
13881
13271
|
}]
|
|
13882
13272
|
}] });
|
|
13883
13273
|
|
|
13274
|
+
class MatLatLongFieldInput {
|
|
13275
|
+
_elementRef;
|
|
13276
|
+
_formField;
|
|
13277
|
+
ngControl;
|
|
13278
|
+
static nextId = 0;
|
|
13279
|
+
degreesInput;
|
|
13280
|
+
minutesInput;
|
|
13281
|
+
secondsInput;
|
|
13282
|
+
signInput;
|
|
13283
|
+
parts = inject(FormBuilder).group({
|
|
13284
|
+
degrees: ['', [Validators.required]],
|
|
13285
|
+
minutes: [''],
|
|
13286
|
+
seconds: [''],
|
|
13287
|
+
sign: [null, [Validators.required]],
|
|
13288
|
+
});
|
|
13289
|
+
stateChanges = new Subject();
|
|
13290
|
+
focused = false;
|
|
13291
|
+
touched = false;
|
|
13292
|
+
controlType = 'mat-latlong-input';
|
|
13293
|
+
id = `mat-latlong-input-${MatLatLongFieldInput.nextId++}`;
|
|
13294
|
+
onChange = (_) => { };
|
|
13295
|
+
onTouched = () => { };
|
|
13296
|
+
get empty() {
|
|
13297
|
+
const { value: { degrees, minutes, seconds }, } = this.parts;
|
|
13298
|
+
return !degrees && !minutes && !seconds;
|
|
13299
|
+
}
|
|
13300
|
+
get shouldLabelFloat() {
|
|
13301
|
+
return this.focused || !this.empty;
|
|
13302
|
+
}
|
|
13303
|
+
userAriaDescribedBy;
|
|
13304
|
+
placeholder; // Not used
|
|
13305
|
+
get required() {
|
|
13306
|
+
return this._required;
|
|
13307
|
+
}
|
|
13308
|
+
set required(value) {
|
|
13309
|
+
this._required = coerceBooleanProperty(value);
|
|
13310
|
+
this.stateChanges.next();
|
|
13311
|
+
}
|
|
13312
|
+
_required = false;
|
|
13313
|
+
get disabled() {
|
|
13314
|
+
return this._disabled;
|
|
13315
|
+
}
|
|
13316
|
+
set disabled(value) {
|
|
13317
|
+
this._disabled = coerceBooleanProperty(value);
|
|
13318
|
+
if (this._disabled) {
|
|
13319
|
+
this.parts.disable();
|
|
13320
|
+
}
|
|
13321
|
+
else {
|
|
13322
|
+
this.parts.enable();
|
|
13323
|
+
}
|
|
13324
|
+
this.stateChanges.next();
|
|
13325
|
+
}
|
|
13326
|
+
_disabled = false;
|
|
13327
|
+
get value() {
|
|
13328
|
+
if (this.parts.valid) {
|
|
13329
|
+
const degrees = parseFloat(this.parts.value.degrees);
|
|
13330
|
+
const minutes = parseFloat(this.parts.value.minutes);
|
|
13331
|
+
const seconds = parseFloat(this.parts.value.seconds);
|
|
13332
|
+
const sign = this.parts.value.sign;
|
|
13333
|
+
return this.parts.valid
|
|
13334
|
+
? isNil(degrees) || this.pattern === 'DD'
|
|
13335
|
+
? degrees
|
|
13336
|
+
: computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals)
|
|
13337
|
+
: null;
|
|
13338
|
+
}
|
|
13339
|
+
return null;
|
|
13340
|
+
}
|
|
13341
|
+
set value(value) {
|
|
13342
|
+
const result = this.computeLatLongFormGroupValue(value);
|
|
13343
|
+
console.debug(`${this.logPrefix} Setting value`, value, result);
|
|
13344
|
+
this.parts.setValue({
|
|
13345
|
+
degrees: result.degrees?.toString() || null,
|
|
13346
|
+
minutes: result.minutes?.toString() || null,
|
|
13347
|
+
seconds: result.seconds?.toString() || null,
|
|
13348
|
+
sign: result.sign,
|
|
13349
|
+
});
|
|
13350
|
+
this.stateChanges.next();
|
|
13351
|
+
}
|
|
13352
|
+
get errorState() {
|
|
13353
|
+
return this.parts.invalid && this.touched;
|
|
13354
|
+
}
|
|
13355
|
+
type;
|
|
13356
|
+
pattern;
|
|
13357
|
+
degreesSymbolUnit;
|
|
13358
|
+
minutesSymbolUnit;
|
|
13359
|
+
secondsSymbolUnit;
|
|
13360
|
+
defaultSign;
|
|
13361
|
+
maxDecimals;
|
|
13362
|
+
showMinutes;
|
|
13363
|
+
showSeconds;
|
|
13364
|
+
showSign;
|
|
13365
|
+
degreesMask;
|
|
13366
|
+
minutesMask;
|
|
13367
|
+
secondsMask;
|
|
13368
|
+
degreesPlaceholder;
|
|
13369
|
+
minutesPlaceholder;
|
|
13370
|
+
secondsPlaceholder;
|
|
13371
|
+
lastInputMaxDecimals;
|
|
13372
|
+
logPrefix = '[mat-latlong-input]';
|
|
13373
|
+
constructor(_elementRef, _formField, ngControl) {
|
|
13374
|
+
this._elementRef = _elementRef;
|
|
13375
|
+
this._formField = _formField;
|
|
13376
|
+
this.ngControl = ngControl;
|
|
13377
|
+
if (this.ngControl != null) {
|
|
13378
|
+
this.ngControl.valueAccessor = this;
|
|
13379
|
+
}
|
|
13380
|
+
}
|
|
13381
|
+
ngOnInit() {
|
|
13382
|
+
if (this.showMinutes) {
|
|
13383
|
+
this.parts.controls.minutes.addValidators(Validators.required);
|
|
13384
|
+
}
|
|
13385
|
+
if (this.showSeconds) {
|
|
13386
|
+
this.parts.controls.seconds.addValidators(Validators.required);
|
|
13387
|
+
}
|
|
13388
|
+
}
|
|
13389
|
+
ngOnDestroy() {
|
|
13390
|
+
this.stateChanges.complete();
|
|
13391
|
+
}
|
|
13392
|
+
onFocusIn(event) {
|
|
13393
|
+
if (!this.focused) {
|
|
13394
|
+
this.focused = true;
|
|
13395
|
+
this.stateChanges.next();
|
|
13396
|
+
}
|
|
13397
|
+
}
|
|
13398
|
+
onFocusOut(event) {
|
|
13399
|
+
if (!this._elementRef.nativeElement.contains(event.relatedTarget)) {
|
|
13400
|
+
this.touched = true;
|
|
13401
|
+
this.focused = false;
|
|
13402
|
+
this.onTouched();
|
|
13403
|
+
this.stateChanges.next();
|
|
13404
|
+
}
|
|
13405
|
+
}
|
|
13406
|
+
handleInput(controlName, nextControlName) {
|
|
13407
|
+
// Can autofocus next control ?
|
|
13408
|
+
let focusNext = false;
|
|
13409
|
+
switch (controlName) {
|
|
13410
|
+
case 'degrees': {
|
|
13411
|
+
const degrees = parseFloat(this.parts.value.degrees);
|
|
13412
|
+
if (this.type === 'latitude' && (degrees === 0 || degrees > 9)) {
|
|
13413
|
+
focusNext = true;
|
|
13414
|
+
}
|
|
13415
|
+
else if (this.type === 'longitude' && (degrees === 0 || degrees > 18)) {
|
|
13416
|
+
focusNext = true;
|
|
13417
|
+
}
|
|
13418
|
+
break;
|
|
13419
|
+
}
|
|
13420
|
+
case 'minutes': {
|
|
13421
|
+
const minutes = parseFloat(this.parts.value.minutes);
|
|
13422
|
+
if (minutes === 0 || minutes > 6) {
|
|
13423
|
+
focusNext = true;
|
|
13424
|
+
}
|
|
13425
|
+
break;
|
|
13426
|
+
}
|
|
13427
|
+
case 'seconds': {
|
|
13428
|
+
// focusNext = true;
|
|
13429
|
+
break;
|
|
13430
|
+
}
|
|
13431
|
+
}
|
|
13432
|
+
if (focusNext) {
|
|
13433
|
+
this.autoFocusNext(controlName, nextControlName);
|
|
13434
|
+
}
|
|
13435
|
+
this.onChange(this.value);
|
|
13436
|
+
}
|
|
13437
|
+
autoFocusNext(controlName, nextControlName) {
|
|
13438
|
+
if (!this.parts.controls[controlName].errors && nextControlName) {
|
|
13439
|
+
this.getElementByName(nextControlName).focus();
|
|
13440
|
+
}
|
|
13441
|
+
}
|
|
13442
|
+
autoFocusPrev(controlName, prevControlName) {
|
|
13443
|
+
if (isNilOrBlank(this.parts.controls[controlName].value)) {
|
|
13444
|
+
this.getElementByName(prevControlName).focus();
|
|
13445
|
+
}
|
|
13446
|
+
}
|
|
13447
|
+
getElementByName(name) {
|
|
13448
|
+
switch (name) {
|
|
13449
|
+
case 'degrees':
|
|
13450
|
+
return this.degreesInput.nativeElement;
|
|
13451
|
+
case 'minutes':
|
|
13452
|
+
return this.minutesInput.nativeElement;
|
|
13453
|
+
case 'seconds':
|
|
13454
|
+
return this.secondsInput.nativeElement;
|
|
13455
|
+
case 'sign':
|
|
13456
|
+
return this.signInput.nativeElement;
|
|
13457
|
+
default:
|
|
13458
|
+
throw new Error(`${this.logPrefix} No HTMLElement with name '${name}'`);
|
|
13459
|
+
}
|
|
13460
|
+
}
|
|
13461
|
+
setDescribedByIds(ids) {
|
|
13462
|
+
const controlElement = this._elementRef.nativeElement.querySelector('.mat-latlong-input-container');
|
|
13463
|
+
controlElement.setAttribute('aria-describedby', ids.join(' '));
|
|
13464
|
+
}
|
|
13465
|
+
onContainerClick() {
|
|
13466
|
+
console.debug(`${this.logPrefix} DEBUG onContainerClick`);
|
|
13467
|
+
if (this.empty) {
|
|
13468
|
+
this.degreesInput.nativeElement.focus();
|
|
13469
|
+
}
|
|
13470
|
+
else if (isNilOrBlank(this.parts.value.minutes)) {
|
|
13471
|
+
this.minutesInput.nativeElement.focus();
|
|
13472
|
+
}
|
|
13473
|
+
else if (isNilOrBlank(this.parts.value.seconds)) {
|
|
13474
|
+
this.secondsInput.nativeElement.focus();
|
|
13475
|
+
}
|
|
13476
|
+
else if (isNil(this.parts.value.sign)) {
|
|
13477
|
+
this.signInput.nativeElement.focus();
|
|
13478
|
+
}
|
|
13479
|
+
}
|
|
13480
|
+
writeValue(value) {
|
|
13481
|
+
this.value = value;
|
|
13482
|
+
}
|
|
13483
|
+
registerOnChange(fn) {
|
|
13484
|
+
this.onChange = fn;
|
|
13485
|
+
}
|
|
13486
|
+
registerOnTouched(fn) {
|
|
13487
|
+
this.onTouched = fn;
|
|
13488
|
+
}
|
|
13489
|
+
setDisabledState(isDisabled) {
|
|
13490
|
+
this.disabled = isDisabled;
|
|
13491
|
+
}
|
|
13492
|
+
computeLatLongFormGroupValue(rawValue) {
|
|
13493
|
+
const isLongitude = this.type === 'longitude';
|
|
13494
|
+
const value = typeof rawValue === 'string' ? parseFloat(rawValue.replace(/,/g, '.')) : rawValue;
|
|
13495
|
+
const result = {
|
|
13496
|
+
degrees: null,
|
|
13497
|
+
minutes: null,
|
|
13498
|
+
seconds: null,
|
|
13499
|
+
sign: isNotNil(value)
|
|
13500
|
+
? value < 0
|
|
13501
|
+
? -1
|
|
13502
|
+
: 1
|
|
13503
|
+
: // Use default sign, if any
|
|
13504
|
+
this.defaultSign
|
|
13505
|
+
? this.defaultSign === '-'
|
|
13506
|
+
? -1
|
|
13507
|
+
: 1
|
|
13508
|
+
: null,
|
|
13509
|
+
};
|
|
13510
|
+
if (value === 0) {
|
|
13511
|
+
result.degrees = 0;
|
|
13512
|
+
}
|
|
13513
|
+
else if (isNotNil(value)) {
|
|
13514
|
+
// Parse options
|
|
13515
|
+
const parseOptions = {
|
|
13516
|
+
longitude: isLongitude,
|
|
13517
|
+
pattern: this.pattern,
|
|
13518
|
+
maxDecimals: this.lastInputMaxDecimals,
|
|
13519
|
+
fixLatLong: true,
|
|
13520
|
+
};
|
|
13521
|
+
if (this.pattern === 'DD') {
|
|
13522
|
+
const splitValue = splitNumberToFieldsDD(value, parseOptions).slice(1); // remove sign;
|
|
13523
|
+
result.seconds = 0;
|
|
13524
|
+
result.minutes = 0;
|
|
13525
|
+
result.degrees = (splitValue[0] + computeDecimalPart(splitValue[1] ?? 0, this.lastInputMaxDecimals)) * (result.sign || 1);
|
|
13526
|
+
}
|
|
13527
|
+
else if (this.pattern === 'DDMM') {
|
|
13528
|
+
const splitValue = splitNumberToFieldsDDMM(value, parseOptions);
|
|
13529
|
+
result.seconds = 0;
|
|
13530
|
+
result.minutes = Math.abs((splitValue[1] ?? 0) + computeDecimalPart(splitValue[2] ?? 0, this.lastInputMaxDecimals));
|
|
13531
|
+
result.degrees = Math.abs(!result.minutes && isNilOrBlank(splitValue[0]) ? 0 : (splitValue[0] ?? 0));
|
|
13532
|
+
}
|
|
13533
|
+
else {
|
|
13534
|
+
// Default // DDMMSS
|
|
13535
|
+
const splitValue = splitNumberToFieldsDDMMSS(value, parseOptions);
|
|
13536
|
+
result.seconds = Math.abs((splitValue[2] ?? 0) + computeDecimalPart(splitValue[3] ?? 0, this.lastInputMaxDecimals));
|
|
13537
|
+
result.minutes = !result.seconds && !splitValue[1] ? 0 : Math.abs(splitValue[1] ?? 0);
|
|
13538
|
+
result.degrees = !result.seconds && !result.minutes && isNilOrBlank(splitValue[0]) ? 0 : Math.abs(splitValue[0] ?? 0);
|
|
13539
|
+
}
|
|
13540
|
+
}
|
|
13541
|
+
return result;
|
|
13542
|
+
}
|
|
13543
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, deps: [{ token: i0.ElementRef }, { token: MAT_FORM_FIELD, optional: true }, { token: i1$3.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
13544
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongFieldInput, selector: "mat-latlong-input", inputs: { userAriaDescribedBy: ["aria-describedby", "userAriaDescribedBy"], required: "required", disabled: "disabled", value: "value", type: "type", pattern: ["latLongPattern", "pattern"], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", defaultSign: "defaultSign", maxDecimals: "maxDecimals", showMinutes: "showMinutes", showSeconds: "showSeconds", showSign: "showSign", degreesMask: "degreesMask", minutesMask: "minutesMask", secondsMask: "secondsMask", degreesPlaceholder: "degreesPlaceholder", minutesPlaceholder: "minutesPlaceholder", secondsPlaceholder: "secondsPlaceholder", lastInputMaxDecimals: "lastInputMaxDecimals" }, host: { properties: { "class.label-floating": "shouldLabelFloat", "id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], viewQueries: [{ propertyName: "degreesInput", first: true, predicate: ["degrees"], descendants: true, read: ElementRef }, { propertyName: "minutesInput", first: true, predicate: ["minutes"], descendants: true, read: ElementRef }, { propertyName: "secondsInput", first: true, predicate: ["seconds"], descendants: true, read: ElementRef }, { propertyName: "signInput", first: true, predicate: ["sign"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right}input::placeholder{letter-spacing:-.075em;font-size:smaller}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\n"], dependencies: [{ 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: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
13545
|
+
}
|
|
13546
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, decorators: [{
|
|
13547
|
+
type: Component,
|
|
13548
|
+
args: [{ selector: 'mat-latlong-input', providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], host: {
|
|
13549
|
+
'[class.label-floating]': 'shouldLabelFloat',
|
|
13550
|
+
'[id]': 'id',
|
|
13551
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right}input::placeholder{letter-spacing:-.075em;font-size:smaller}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\n"] }]
|
|
13552
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i6.MatFormField, decorators: [{
|
|
13553
|
+
type: Optional
|
|
13554
|
+
}, {
|
|
13555
|
+
type: Inject,
|
|
13556
|
+
args: [MAT_FORM_FIELD]
|
|
13557
|
+
}] }, { type: i1$3.NgControl, decorators: [{
|
|
13558
|
+
type: Optional
|
|
13559
|
+
}, {
|
|
13560
|
+
type: Self
|
|
13561
|
+
}] }], propDecorators: { degreesInput: [{
|
|
13562
|
+
type: ViewChild,
|
|
13563
|
+
args: ['degrees', { read: ElementRef }]
|
|
13564
|
+
}], minutesInput: [{
|
|
13565
|
+
type: ViewChild,
|
|
13566
|
+
args: ['minutes', { read: ElementRef }]
|
|
13567
|
+
}], secondsInput: [{
|
|
13568
|
+
type: ViewChild,
|
|
13569
|
+
args: ['seconds', { read: ElementRef }]
|
|
13570
|
+
}], signInput: [{
|
|
13571
|
+
type: ViewChild,
|
|
13572
|
+
args: ['sign', { read: ElementRef }]
|
|
13573
|
+
}], userAriaDescribedBy: [{
|
|
13574
|
+
type: Input,
|
|
13575
|
+
args: ['aria-describedby']
|
|
13576
|
+
}], required: [{
|
|
13577
|
+
type: Input
|
|
13578
|
+
}], disabled: [{
|
|
13579
|
+
type: Input
|
|
13580
|
+
}], value: [{
|
|
13581
|
+
type: Input
|
|
13582
|
+
}], type: [{
|
|
13583
|
+
type: Input
|
|
13584
|
+
}], pattern: [{
|
|
13585
|
+
type: Input,
|
|
13586
|
+
args: ['latLongPattern']
|
|
13587
|
+
}], degreesSymbolUnit: [{
|
|
13588
|
+
type: Input
|
|
13589
|
+
}], minutesSymbolUnit: [{
|
|
13590
|
+
type: Input
|
|
13591
|
+
}], secondsSymbolUnit: [{
|
|
13592
|
+
type: Input
|
|
13593
|
+
}], defaultSign: [{
|
|
13594
|
+
type: Input
|
|
13595
|
+
}], maxDecimals: [{
|
|
13596
|
+
type: Input
|
|
13597
|
+
}], showMinutes: [{
|
|
13598
|
+
type: Input
|
|
13599
|
+
}], showSeconds: [{
|
|
13600
|
+
type: Input
|
|
13601
|
+
}], showSign: [{
|
|
13602
|
+
type: Input
|
|
13603
|
+
}], degreesMask: [{
|
|
13604
|
+
type: Input
|
|
13605
|
+
}], minutesMask: [{
|
|
13606
|
+
type: Input
|
|
13607
|
+
}], secondsMask: [{
|
|
13608
|
+
type: Input
|
|
13609
|
+
}], degreesPlaceholder: [{
|
|
13610
|
+
type: Input
|
|
13611
|
+
}], minutesPlaceholder: [{
|
|
13612
|
+
type: Input
|
|
13613
|
+
}], secondsPlaceholder: [{
|
|
13614
|
+
type: Input
|
|
13615
|
+
}], lastInputMaxDecimals: [{
|
|
13616
|
+
type: Input
|
|
13617
|
+
}] } });
|
|
13618
|
+
|
|
13619
|
+
class MatLatLongField {
|
|
13620
|
+
cd;
|
|
13621
|
+
formGroupDir;
|
|
13622
|
+
_subscription = new Subscription();
|
|
13623
|
+
_appearance = null;
|
|
13624
|
+
_subscriptSizing = null;
|
|
13625
|
+
_readonly = false;
|
|
13626
|
+
_tabindex;
|
|
13627
|
+
_defaultAppearance;
|
|
13628
|
+
_defaultSubscriptSizing;
|
|
13629
|
+
showMinutes = false;
|
|
13630
|
+
showSeconds = false;
|
|
13631
|
+
showSign;
|
|
13632
|
+
degreesPlaceholder;
|
|
13633
|
+
minutesPlaceholder;
|
|
13634
|
+
secondsPlaceholder;
|
|
13635
|
+
degreesMask;
|
|
13636
|
+
minutesMask;
|
|
13637
|
+
secondsMask;
|
|
13638
|
+
lastInputMaxDecimals = LAT_LONG_PATTERN_MAX_DECIMALS;
|
|
13639
|
+
i18nErrorKeys = SharedValidators.I18N_ERROR_KEYS;
|
|
13640
|
+
formControl;
|
|
13641
|
+
formControlName;
|
|
13642
|
+
type;
|
|
13643
|
+
pattern;
|
|
13644
|
+
maxDecimals = LAT_LONG_VALUE_MAX_DECIMALS;
|
|
13645
|
+
required = false;
|
|
13646
|
+
floatLabel = 'auto';
|
|
13647
|
+
placeholder;
|
|
13648
|
+
defaultSign;
|
|
13649
|
+
autofocus = false;
|
|
13650
|
+
mobile;
|
|
13651
|
+
degreesSymbolUnit = '°';
|
|
13652
|
+
minutesSymbolUnit = "'";
|
|
13653
|
+
secondsSymbolUnit = '"';
|
|
13654
|
+
clearable = false;
|
|
13655
|
+
classList;
|
|
13656
|
+
set tabindex(value) {
|
|
13657
|
+
if (this._tabindex !== value) {
|
|
13658
|
+
this._tabindex = value;
|
|
13659
|
+
}
|
|
13660
|
+
}
|
|
13661
|
+
get tabindex() {
|
|
13662
|
+
return this._tabindex;
|
|
13663
|
+
}
|
|
13664
|
+
set appearance(value) {
|
|
13665
|
+
this._appearance = value;
|
|
13666
|
+
}
|
|
13667
|
+
get appearance() {
|
|
13668
|
+
return this._appearance || this._defaultAppearance;
|
|
13669
|
+
}
|
|
13670
|
+
set readonly(value) {
|
|
13671
|
+
this._readonly = value;
|
|
13672
|
+
this.markForCheck();
|
|
13673
|
+
}
|
|
13674
|
+
get readonly() {
|
|
13675
|
+
return this._readonly;
|
|
13676
|
+
}
|
|
13677
|
+
set subscriptSizing(value) {
|
|
13678
|
+
this._subscriptSizing = value;
|
|
13679
|
+
}
|
|
13680
|
+
get subscriptSizing() {
|
|
13681
|
+
return this._subscriptSizing || this._defaultSubscriptSizing;
|
|
13682
|
+
}
|
|
13683
|
+
get disabled() {
|
|
13684
|
+
return this.readonly || this.formControl.disabled;
|
|
13685
|
+
}
|
|
13686
|
+
// eslint-disable-next-line @angular-eslint/no-output-on-prefix,@angular-eslint/no-output-rename
|
|
13687
|
+
// @Output('keyup.enter') keyupEnter = new EventEmitter<any>();
|
|
13688
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
13689
|
+
// @Output('blur') blurred = new EventEmitter<FocusEvent>();
|
|
13690
|
+
// eslint-disable-next-line @angular-eslint/no-output-rename
|
|
13691
|
+
// @Output('focus') focused = new EventEmitter<FocusEvent>();
|
|
13692
|
+
input;
|
|
13693
|
+
pendingValue;
|
|
13694
|
+
pendingValueSet = false;
|
|
13695
|
+
pendingDisabledState;
|
|
13696
|
+
pendingOnChange;
|
|
13697
|
+
pendingOnTouched;
|
|
13698
|
+
constructor(cd, formGroupDir, defaultOptions) {
|
|
13699
|
+
this.cd = cd;
|
|
13700
|
+
this.formGroupDir = formGroupDir;
|
|
13701
|
+
this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;
|
|
13702
|
+
this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
|
|
13703
|
+
}
|
|
13704
|
+
// Delegate control vale accessor
|
|
13705
|
+
writeValue(value) {
|
|
13706
|
+
if (this.input) {
|
|
13707
|
+
this.input.writeValue(value);
|
|
13708
|
+
}
|
|
13709
|
+
else {
|
|
13710
|
+
this.pendingValue = value;
|
|
13711
|
+
this.pendingValueSet = true;
|
|
13712
|
+
}
|
|
13713
|
+
}
|
|
13714
|
+
registerOnChange(fn) {
|
|
13715
|
+
if (this.input) {
|
|
13716
|
+
this.input.registerOnChange(fn);
|
|
13717
|
+
}
|
|
13718
|
+
else {
|
|
13719
|
+
this.pendingOnChange = fn;
|
|
13720
|
+
}
|
|
13721
|
+
}
|
|
13722
|
+
registerOnTouched(fn) {
|
|
13723
|
+
if (this.input) {
|
|
13724
|
+
this.input.registerOnTouched(fn);
|
|
13725
|
+
}
|
|
13726
|
+
else {
|
|
13727
|
+
this.pendingOnTouched = fn;
|
|
13728
|
+
}
|
|
13729
|
+
}
|
|
13730
|
+
setDisabledState(isDisabled) {
|
|
13731
|
+
if (this.input) {
|
|
13732
|
+
this.input.setDisabledState(isDisabled);
|
|
13733
|
+
}
|
|
13734
|
+
else {
|
|
13735
|
+
this.pendingDisabledState = isDisabled;
|
|
13736
|
+
}
|
|
13737
|
+
}
|
|
13738
|
+
ngOnInit() {
|
|
13739
|
+
this.formControl =
|
|
13740
|
+
this.formControl || (this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName));
|
|
13741
|
+
if (!this.formControl)
|
|
13742
|
+
throw new Error("Missing mandatory attribute 'formControl' or 'formControlName' in <mat-latlong-field>.");
|
|
13743
|
+
this.mobile = this.mobile ?? isMobile(window);
|
|
13744
|
+
this.type = this.type || 'latitude';
|
|
13745
|
+
this.pattern = this.pattern || 'DDMM';
|
|
13746
|
+
this.showSign = this.pattern !== 'DD';
|
|
13747
|
+
switch (this.pattern) {
|
|
13748
|
+
case 'DD':
|
|
13749
|
+
this.lastInputMaxDecimals = 7;
|
|
13750
|
+
this.degreesPlaceholder =
|
|
13751
|
+
this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD_PLACEHOLDER' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD_PLACEHOLDER';
|
|
13752
|
+
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
13753
|
+
precision: this.lastInputMaxDecimals,
|
|
13754
|
+
min: this.type === 'latitude' ? -90 : -180,
|
|
13755
|
+
max: this.type === 'latitude' ? 90 : 180,
|
|
13756
|
+
minusSign: '-',
|
|
13757
|
+
});
|
|
13758
|
+
break;
|
|
13759
|
+
case 'DDMM':
|
|
13760
|
+
this.lastInputMaxDecimals = 3;
|
|
13761
|
+
this.showMinutes = true;
|
|
13762
|
+
this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
|
|
13763
|
+
this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM_MMM';
|
|
13764
|
+
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
13765
|
+
precision: 0,
|
|
13766
|
+
min: 0,
|
|
13767
|
+
max: this.type === 'latitude' ? 90 : 180,
|
|
13768
|
+
});
|
|
13769
|
+
this.minutesMask = maskitoNumberOptionsGenerator({
|
|
13770
|
+
precision: this.lastInputMaxDecimals,
|
|
13771
|
+
min: 0,
|
|
13772
|
+
max: 60 - computeDecimalPart(1, this.lastInputMaxDecimals),
|
|
13773
|
+
});
|
|
13774
|
+
break;
|
|
13775
|
+
default: // Default is DDMMSS
|
|
13776
|
+
this.lastInputMaxDecimals = 2;
|
|
13777
|
+
this.showMinutes = true;
|
|
13778
|
+
this.showSeconds = true;
|
|
13779
|
+
this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DD' : 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.DDD';
|
|
13780
|
+
this.minutesPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.MM';
|
|
13781
|
+
this.secondsPlaceholder = 'COMMON.LAT_LONG.SINGLE_FIELD_PATTERN.SS_SS';
|
|
13782
|
+
this.degreesMask = maskitoNumberOptionsGenerator({
|
|
13783
|
+
precision: 0,
|
|
13784
|
+
min: 0,
|
|
13785
|
+
max: this.type === 'latitude' ? 90 : 180,
|
|
13786
|
+
});
|
|
13787
|
+
this.minutesMask = maskitoNumberOptionsGenerator({
|
|
13788
|
+
precision: 0,
|
|
13789
|
+
min: 0,
|
|
13790
|
+
max: 59,
|
|
13791
|
+
});
|
|
13792
|
+
this.secondsMask = maskitoNumberOptionsGenerator({
|
|
13793
|
+
precision: this.lastInputMaxDecimals,
|
|
13794
|
+
min: 0,
|
|
13795
|
+
max: 60 - computeDecimalPart(1, this.lastInputMaxDecimals),
|
|
13796
|
+
});
|
|
13797
|
+
break;
|
|
13798
|
+
}
|
|
13799
|
+
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
13800
|
+
// this._subscription.add(
|
|
13801
|
+
// this.formControl.statusChanges
|
|
13802
|
+
// .pipe(
|
|
13803
|
+
// filter(() => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
13804
|
+
// )
|
|
13805
|
+
// .subscribe(() => this.markForCheck())
|
|
13806
|
+
// );
|
|
13807
|
+
}
|
|
13808
|
+
ngAfterViewInit() {
|
|
13809
|
+
if (!this.readonly) {
|
|
13810
|
+
if (this.pendingOnChange) {
|
|
13811
|
+
this.input.registerOnChange(this.pendingOnChange);
|
|
13812
|
+
}
|
|
13813
|
+
if (this.pendingOnTouched) {
|
|
13814
|
+
this.input.registerOnTouched(this.pendingOnTouched);
|
|
13815
|
+
}
|
|
13816
|
+
if (isNotNil(this.pendingDisabledState)) {
|
|
13817
|
+
this.input.setDisabledState(this.pendingDisabledState);
|
|
13818
|
+
}
|
|
13819
|
+
if (this.pendingValueSet) {
|
|
13820
|
+
this.input.writeValue(this.pendingValue);
|
|
13821
|
+
}
|
|
13822
|
+
}
|
|
13823
|
+
}
|
|
13824
|
+
ngOnDestroy() {
|
|
13825
|
+
this._subscription.unsubscribe();
|
|
13826
|
+
}
|
|
13827
|
+
clearValue(event) {
|
|
13828
|
+
event?.stopPropagation();
|
|
13829
|
+
this.formControl.setValue(null);
|
|
13830
|
+
}
|
|
13831
|
+
/* -- private method -- */
|
|
13832
|
+
markForCheck() {
|
|
13833
|
+
this.cd.markForCheck();
|
|
13834
|
+
}
|
|
13835
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
|
|
13836
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongField, selector: "mat-latlong-field", inputs: { formControl: "formControl", formControlName: "formControlName", type: "type", pattern: ["latLongPattern", "pattern"], maxDecimals: "maxDecimals", required: "required", floatLabel: "floatLabel", placeholder: "placeholder", defaultSign: "defaultSign", autofocus: "autofocus", mobile: ["mobile", "mobile", booleanAttribute], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", clearable: ["clearable", "clearable", booleanAttribute], classList: ["class", "classList"], tabindex: ["tabindex", "tabindex", numberAttribute], appearance: "appearance", readonly: "readonly", subscriptSizing: "subscriptSizing" }, providers: [
|
|
13837
|
+
{
|
|
13838
|
+
provide: NG_VALUE_ACCESSOR,
|
|
13839
|
+
multi: true,
|
|
13840
|
+
useExisting: forwardRef(() => MatLatLongField),
|
|
13841
|
+
},
|
|
13842
|
+
], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: lastInputMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && formControl.invalid\"\n class=\"mat-latlong-field mat-latlong-field-{{ type }} {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-latlong-input\n #input\n [formControl]=\"formControl\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [latLongPattern]=\"pattern\"\n [defaultSign]=\"defaultSign\"\n [maxDecimals]=\"maxDecimals\"\n [lastInputMaxDecimals]=\"lastInputMaxDecimals\"\n [showMinutes]=\"showMinutes\"\n [showSeconds]=\"showSeconds\"\n [showSign]=\"showSign\"\n [degreesMask]=\"degreesMask\"\n [minutesMask]=\"minutesMask\"\n [secondsMask]=\"secondsMask\"\n [degreesPlaceholder]=\"degreesPlaceholder\"\n [minutesPlaceholder]=\"minutesPlaceholder\"\n [secondsPlaceholder]=\"secondsPlaceholder\"\n [degreesSymbolUnit]=\"degreesSymbolUnit\"\n [minutesSymbolUnit]=\"minutesSymbolUnit\"\n [secondsSymbolUnit]=\"secondsSymbolUnit\"\n ></mat-latlong-input>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative}.mat-latlong-field-latitude input.degrees{width:1.3em!important}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.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: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatLatLongFieldInput, selector: "mat-latlong-input", inputs: ["aria-describedby", "required", "disabled", "value", "type", "latLongPattern", "degreesSymbolUnit", "minutesSymbolUnit", "secondsSymbolUnit", "defaultSign", "maxDecimals", "showMinutes", "showSeconds", "showSign", "degreesMask", "minutesMask", "secondsMask", "degreesPlaceholder", "minutesPlaceholder", "secondsPlaceholder", "lastInputMaxDecimals"] }, { kind: "pipe", type: LatLongFormatPipe, name: "latLongFormat" }, { kind: "pipe", type: ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: MapGetPipe, name: "mapGet" }, { kind: "pipe", type: MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: IsNilPipe, name: "isNil" }, { kind: "pipe", type: AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
13843
|
+
}
|
|
13844
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongField, decorators: [{
|
|
13845
|
+
type: Component,
|
|
13846
|
+
args: [{ selector: 'mat-latlong-field', providers: [
|
|
13847
|
+
{
|
|
13848
|
+
provide: NG_VALUE_ACCESSOR,
|
|
13849
|
+
multi: true,
|
|
13850
|
+
useExisting: forwardRef(() => MatLatLongField),
|
|
13851
|
+
},
|
|
13852
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{\n formControl.value\n | latLongFormat: { pattern: pattern, maxDecimals: lastInputMaxDecimals, type: type, placeholderChar: '' }\n }}\n </ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n #formField\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && formControl.invalid\"\n class=\"mat-latlong-field mat-latlong-field-{{ type }} {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <mat-latlong-input\n #input\n [formControl]=\"formControl\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [latLongPattern]=\"pattern\"\n [defaultSign]=\"defaultSign\"\n [maxDecimals]=\"maxDecimals\"\n [lastInputMaxDecimals]=\"lastInputMaxDecimals\"\n [showMinutes]=\"showMinutes\"\n [showSeconds]=\"showSeconds\"\n [showSign]=\"showSign\"\n [degreesMask]=\"degreesMask\"\n [minutesMask]=\"minutesMask\"\n [secondsMask]=\"secondsMask\"\n [degreesPlaceholder]=\"degreesPlaceholder\"\n [minutesPlaceholder]=\"minutesPlaceholder\"\n [secondsPlaceholder]=\"secondsPlaceholder\"\n [degreesSymbolUnit]=\"degreesSymbolUnit\"\n [minutesSymbolUnit]=\"minutesSymbolUnit\"\n [secondsSymbolUnit]=\"secondsSymbolUnit\"\n ></mat-latlong-input>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n <mat-error>\n {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n </mat-error>\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (clearable && !readonly) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"formControl.value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative}.mat-latlong-field-latitude input.degrees{width:1.3em!important}\n"] }]
|
|
13853
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$3.FormGroupDirective, decorators: [{
|
|
13854
|
+
type: Optional
|
|
13855
|
+
}] }, { type: undefined, decorators: [{
|
|
13856
|
+
type: Inject,
|
|
13857
|
+
args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
|
|
13858
|
+
}] }], propDecorators: { formControl: [{
|
|
13859
|
+
type: Input
|
|
13860
|
+
}], formControlName: [{
|
|
13861
|
+
type: Input
|
|
13862
|
+
}], type: [{
|
|
13863
|
+
type: Input
|
|
13864
|
+
}], pattern: [{
|
|
13865
|
+
type: Input,
|
|
13866
|
+
args: ['latLongPattern']
|
|
13867
|
+
}], maxDecimals: [{
|
|
13868
|
+
type: Input
|
|
13869
|
+
}], required: [{
|
|
13870
|
+
type: Input
|
|
13871
|
+
}], floatLabel: [{
|
|
13872
|
+
type: Input
|
|
13873
|
+
}], placeholder: [{
|
|
13874
|
+
type: Input
|
|
13875
|
+
}], defaultSign: [{
|
|
13876
|
+
type: Input
|
|
13877
|
+
}], autofocus: [{
|
|
13878
|
+
type: Input
|
|
13879
|
+
}], mobile: [{
|
|
13880
|
+
type: Input,
|
|
13881
|
+
args: [{ transform: booleanAttribute }]
|
|
13882
|
+
}], degreesSymbolUnit: [{
|
|
13883
|
+
type: Input
|
|
13884
|
+
}], minutesSymbolUnit: [{
|
|
13885
|
+
type: Input
|
|
13886
|
+
}], secondsSymbolUnit: [{
|
|
13887
|
+
type: Input
|
|
13888
|
+
}], clearable: [{
|
|
13889
|
+
type: Input,
|
|
13890
|
+
args: [{ transform: booleanAttribute }]
|
|
13891
|
+
}], classList: [{
|
|
13892
|
+
type: Input,
|
|
13893
|
+
args: ['class']
|
|
13894
|
+
}], tabindex: [{
|
|
13895
|
+
type: Input,
|
|
13896
|
+
args: [{ transform: numberAttribute }]
|
|
13897
|
+
}], appearance: [{
|
|
13898
|
+
type: Input
|
|
13899
|
+
}], readonly: [{
|
|
13900
|
+
type: Input
|
|
13901
|
+
}], subscriptSizing: [{
|
|
13902
|
+
type: Input
|
|
13903
|
+
}], input: [{
|
|
13904
|
+
type: ViewChild,
|
|
13905
|
+
args: ['input']
|
|
13906
|
+
}] } });
|
|
13907
|
+
|
|
13908
|
+
class SharedMatLatLongModule {
|
|
13909
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13910
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, declarations: [MatLatLongField, MatLatLongFieldInput], imports: [CommonModule,
|
|
13911
|
+
IonicModule,
|
|
13912
|
+
ReactiveFormsModule,
|
|
13913
|
+
SharedDirectivesModule,
|
|
13914
|
+
SharedPipesModule,
|
|
13915
|
+
MatCommonModule,
|
|
13916
|
+
MatFormFieldModule,
|
|
13917
|
+
MatInputModule,
|
|
13918
|
+
MatButtonModule,
|
|
13919
|
+
MaskitoDirective,
|
|
13920
|
+
MatIconModule,
|
|
13921
|
+
MatSelectModule, i1$1.TranslateModule], exports: [MatLatLongField, MatLatLongFieldInput] });
|
|
13922
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, imports: [CommonModule,
|
|
13923
|
+
IonicModule,
|
|
13924
|
+
ReactiveFormsModule,
|
|
13925
|
+
SharedDirectivesModule,
|
|
13926
|
+
SharedPipesModule,
|
|
13927
|
+
MatCommonModule,
|
|
13928
|
+
MatFormFieldModule,
|
|
13929
|
+
MatInputModule,
|
|
13930
|
+
MatButtonModule,
|
|
13931
|
+
MatIconModule,
|
|
13932
|
+
MatSelectModule,
|
|
13933
|
+
TranslateModule.forChild()] });
|
|
13934
|
+
}
|
|
13935
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: SharedMatLatLongModule, decorators: [{
|
|
13936
|
+
type: NgModule,
|
|
13937
|
+
args: [{
|
|
13938
|
+
imports: [
|
|
13939
|
+
CommonModule,
|
|
13940
|
+
IonicModule,
|
|
13941
|
+
ReactiveFormsModule,
|
|
13942
|
+
SharedDirectivesModule,
|
|
13943
|
+
SharedPipesModule,
|
|
13944
|
+
MatCommonModule,
|
|
13945
|
+
MatFormFieldModule,
|
|
13946
|
+
MatInputModule,
|
|
13947
|
+
MatButtonModule,
|
|
13948
|
+
MaskitoDirective,
|
|
13949
|
+
MatIconModule,
|
|
13950
|
+
MatSelectModule,
|
|
13951
|
+
TranslateModule.forChild(),
|
|
13952
|
+
],
|
|
13953
|
+
declarations: [MatLatLongField, MatLatLongFieldInput],
|
|
13954
|
+
exports: [MatLatLongField, MatLatLongFieldInput],
|
|
13955
|
+
}]
|
|
13956
|
+
}] });
|
|
13957
|
+
|
|
13884
13958
|
//import {SharedMatNumpadModule} from './numpad/numpad.module';
|
|
13885
13959
|
const modules = [
|
|
13886
13960
|
// Angular material components
|
|
@@ -42486,7 +42560,7 @@ class LatLongTestPage {
|
|
|
42486
42560
|
}
|
|
42487
42561
|
stringify = JSON.stringify;
|
|
42488
42562
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LatLongTestPage, deps: [{ token: i1$3.UntypedFormBuilder }, { token: PlatformService }], target: i0.ɵɵFactoryTarget.Component });
|
|
42489
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: LatLongTestPage, selector: "app-latlong-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Lat/Long field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Tab nav - desktop mode -->\n <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'dev'\" (click)=\"toggleMode('dev')\">\n <mat-label>Dev</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form #tabPanel class=\"form-container ion-padding\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n @if (mode === 'mobile') {\n <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: true }\"></ng-container>\n } @else if (mode === 'desktop') {\n <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: false }\"></ng-container>\n } @else if (mode === 'dev') {\n <ion-grid>\n <ion-row>\n <ion-col>\n <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>LatLongFormat</mat-label>\n <mat-select #selectLatLongFormat [(value)]=\"selectedFormat\">\n <mat-option value=\"DDMM\" selected>DDMM</mat-option>\n <mat-option value=\"DDMMSS\">DDMMSS</mat-option>\n <mat-option value=\"DD\">DD</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @switch (selectedFormat) {\n @case ('DDMM') {\n <ion-row>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DDMM', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DDMM', required: true }\n \"\n ></ng-container>\n </ion-col>\n <!-- <ion-col> -->\n <!-- <ng-container -->\n <!-- *ngTemplateOutlet=\"testV2; context: { formGroup: 'disable', latLongPattern: 'DDMM', required: true }\" -->\n <!-- ></ng-container> -->\n <!-- </ion-col> -->\n </ion-row>\n }\n @case ('DDMMSS') {\n <ion-row>\n <!-- DDMMSS -->\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DDMMSS', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DDMMSS', required: true }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'disable', latLongPattern: 'DDMMSS', required: true }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n }\n @case ('DD') {\n <ion-row>\n <!-- DDMMSS -->\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DD', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DD', required: true }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'disable', latLongPattern: 'DD', required: true }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n }\n }\n </ion-grid>\n } @else {\n <!-- Temporay TAB (for DEV) -->\n <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, defaultSign '-'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ formGroup.value | json }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"-\"\n [required]=\"true\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </form>\n }\n </form>\n</ion-content>\n\n<ng-template #mainTest let-mobile=\"mobile\">\n <!-- Empty value -->\n <form *ngIf=\"form | formGetGroup: 'empty' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <ion-text><h4>Empty, with defaults</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, defaultSign '-'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMM Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM, defaultSign '+'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMMSS, defaultSign '+'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"+\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"+\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <!-- Empty value -->\n <form *ngIf=\"form | formGetGroup: 'emptyRequired' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text><h4>Empty, required (no defaults)</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, required</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMM -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM, required</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <!-- With value -->\n <ion-row>\n <ion-col>\n <ion-text><h4>With value</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMMSS</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <!-- Disable -->\n <form *ngIf=\"form | formGetGroup: 'disable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text><h4>Disabled control</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disabled control</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly (control is enable)</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"readonlyField.readonly = $event.checked\"\n [checked]=\"readonlyField.readonly\"\n ></mat-checkbox>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n #readonlyField\n [formControl]=\"form | formGetControl: 'enable.latitude'\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [readonly]=\"true\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With hint</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-latlong-field\n #readonlyField\n [formControl]=\"form | formGetControl: 'enable.latitude'\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-hint align=\"end\">This is a long long hint</mat-hint>\n </mat-latlong-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ng-template>\n\n<ng-template #newComponent let-formGroupName=\"formGroup\" let-pattern=\"latLongPattern\" let-required=\"required\">\n <form *ngIf=\"form | formGetGroup: formGroupName as formGroup\" [formGroup]=\"formGroup\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">{{ formGroupName }}</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-text color=\"medium\">\n <small>\n <pre>{{ formGroup.value | json }}</pre>\n <pre>invalid ? : {{ (formGroup | formGetControl: 'latitude').invalid }}</pre>\n <pre>touched ? : {{ (formGroup | formGetControl: 'latitude').touched }}</pre>\n <pre>errors : {{ formGroup | formGetGroup: 'latitude' | formError }}</pre>\n </small>\n </ion-text>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n [readonly]=\"true\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n [readonly]=\"true\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [required]=\"required\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [required]=\"required\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </form>\n</ng-template>\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.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2$1.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2$1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2$1.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2$1.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { 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.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { 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.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2$1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.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: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i7.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "component", type: MatLatLongField, selector: "mat-latlong-field", inputs: ["formControl", "formControlName", "type", "latLongPattern", "maxDecimals", "required", "floatLabel", "placeholder", "defaultSign", "autofocus", "mobile", "degreesSymbolUnit", "minutesSymbolUnit", "secondsSymbolUnit", "clearable", "class", "tabindex", "appearance", "readonly", "subscriptSizing"], outputs: ["keyup.enter", "blur", "focus"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }, { kind: "pipe", type: FormErrorPipe, name: "formError" }, { kind: "pipe", type: FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: FormGetGroupPipe, name: "formGetGroup" }] });
|
|
42563
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: LatLongTestPage, selector: "app-latlong-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Lat/Long field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Tab nav - desktop mode -->\n <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'dev'\" (click)=\"toggleMode('dev')\">\n <mat-label>Dev</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form #tabPanel class=\"form-container ion-padding\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n @if (mode === 'mobile') {\n <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: true }\"></ng-container>\n } @else if (mode === 'desktop') {\n <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: false }\"></ng-container>\n } @else if (mode === 'dev') {\n <ion-grid>\n <ion-row>\n <ion-col>\n <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>LatLongFormat</mat-label>\n <mat-select #selectLatLongFormat [(value)]=\"selectedFormat\">\n <mat-option value=\"DDMM\" selected>DDMM</mat-option>\n <mat-option value=\"DDMMSS\">DDMMSS</mat-option>\n <mat-option value=\"DD\">DD</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @switch (selectedFormat) {\n @case ('DDMM') {\n <ion-row>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DDMM', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DDMM', required: true }\n \"\n ></ng-container>\n </ion-col>\n <!-- <ion-col> -->\n <!-- <ng-container -->\n <!-- *ngTemplateOutlet=\"testV2; context: { formGroup: 'disable', latLongPattern: 'DDMM', required: true }\" -->\n <!-- ></ng-container> -->\n <!-- </ion-col> -->\n </ion-row>\n }\n @case ('DDMMSS') {\n <ion-row>\n <!-- DDMMSS -->\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DDMMSS', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DDMMSS', required: true }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'disable', latLongPattern: 'DDMMSS', required: true }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n }\n @case ('DD') {\n <ion-row>\n <!-- DDMMSS -->\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'empty', latLongPattern: 'DD', required: false }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'enable', latLongPattern: 'DD', required: true }\n \"\n ></ng-container>\n </ion-col>\n <ion-col>\n <ng-container\n *ngTemplateOutlet=\"\n newComponent;\n context: { formGroup: 'disable', latLongPattern: 'DD', required: true }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n }\n }\n </ion-grid>\n } @else {\n <!-- Temporay TAB (for DEV) -->\n <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, defaultSign '-'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ formGroup.value | json }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"-\"\n [required]=\"true\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </form>\n }\n </form>\n</ion-content>\n\n<ng-template #mainTest let-mobile=\"mobile\">\n <!-- Empty value -->\n <form *ngIf=\"form | formGetGroup: 'empty' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <ion-text><h4>Empty, with defaults</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, defaultSign '-'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMM Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM, defaultSign '+'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n defaultSign=\"+\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS Default sign -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMMSS, defaultSign '+'</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"+\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n defaultSign=\"+\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <!-- Empty value -->\n <form *ngIf=\"form | formGetGroup: 'emptyRequired' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text><h4>Empty, required (no defaults)</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD, required</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMM -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM, required</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <!-- With value -->\n <ion-row>\n <ion-col>\n <ion-text><h4>With value</h4></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <!-- DD -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DD</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DD\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DD\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMM</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- DDMMSS -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Format DDMMSS</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMMSS\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <!-- Disable -->\n <form *ngIf=\"form | formGetGroup: 'disable' as formGroup\" [formGroup]=\"formGroup\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text><h4>Disabled control</h4></ion-text>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Disabled control</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(formGroup.value) }}</pre>\n </small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n <ion-col>\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Readonly (control is enable)</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox\n (change)=\"readonlyField.readonly = $event.checked\"\n [checked]=\"readonlyField.readonly\"\n ></mat-checkbox>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-latlong-field\n #readonlyField\n [formControl]=\"form | formGetControl: 'enable.latitude'\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [readonly]=\"true\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <mat-icon matSuffix>gps_fixed</mat-icon>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">With hint</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-latlong-field\n #readonlyField\n [formControl]=\"form | formGetControl: 'enable.latitude'\"\n type=\"latitude\"\n latLongPattern=\"DDMM\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [mobile]=\"mobile\"\n >\n <mat-hint align=\"end\">This is a long long hint</mat-hint>\n </mat-latlong-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ng-template>\n\n<ng-template #newComponent let-formGroupName=\"formGroup\" let-pattern=\"latLongPattern\" let-required=\"required\">\n <form *ngIf=\"form | formGetGroup: formGroupName as formGroup\" [formGroup]=\"formGroup\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">{{ formGroupName }}</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-text color=\"medium\">\n <small>\n <pre>{{ formGroup.value | json }}</pre>\n <pre>invalid ? : {{ (formGroup | formGetControl: 'latitude').invalid }}</pre>\n <pre>touched ? : {{ (formGroup | formGetControl: 'latitude').touched }}</pre>\n <pre>errors : {{ formGroup | formGetGroup: 'latitude' | formError }}</pre>\n </small>\n </ion-text>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n [readonly]=\"true\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n ></mat-latlong-field>\n </ion-col>\n <ion-col sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n [readonly]=\"true\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n ></mat-latlong-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"latitude\"\n type=\"latitude\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Latitude\"\n [appearance]=\"appearance\"\n [required]=\"required\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n <mat-latlong-field\n formControlName=\"longitude\"\n type=\"longitude\"\n [latLongPattern]=\"pattern\"\n defaultSign=\"-\"\n placeholder=\"Longitude\"\n [appearance]=\"appearance\"\n [required]=\"required\"\n >\n <mat-icon matPrefix>room</mat-icon>\n <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n <mat-icon>gps_fixed</mat-icon>\n </button>\n </mat-latlong-field>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"geoPositionMessage\">\n <ion-col>{{ geoPositionMessage }}</ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n </form>\n</ng-template>\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.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2$1.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2$1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2$1.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2$1.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { 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.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { 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.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2$1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2$1.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.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: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i7.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "component", type: MatLatLongField, selector: "mat-latlong-field", inputs: ["formControl", "formControlName", "type", "latLongPattern", "maxDecimals", "required", "floatLabel", "placeholder", "defaultSign", "autofocus", "mobile", "degreesSymbolUnit", "minutesSymbolUnit", "secondsSymbolUnit", "clearable", "class", "tabindex", "appearance", "readonly", "subscriptSizing"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }, { kind: "pipe", type: FormErrorPipe, name: "formError" }, { kind: "pipe", type: FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: FormGetGroupPipe, name: "formGetGroup" }] });
|
|
42490
42564
|
}
|
|
42491
42565
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LatLongTestPage, decorators: [{
|
|
42492
42566
|
type: Component,
|
|
@@ -42984,6 +43058,234 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
42984
43058
|
args: [{ selector: 'app-maskito-test', template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Maskito test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <form [formGroup]=\"form\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Test Strategy Pattern</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-form-field>\n <input\n matInput\n #strategyInput\n formControlName=\"strategy\"\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"'__ _______ ___' | maskitoPlaceholder: labelMask\"\n placeholder=\"Strategy field\"\n />\n </mat-form-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n" }]
|
|
42985
43059
|
}], ctorParameters: () => [{ type: i1$3.UntypedFormBuilder }] });
|
|
42986
43060
|
|
|
43061
|
+
/** @title Form field with custom telephone number input control. */
|
|
43062
|
+
class FormFieldCustomControlExample {
|
|
43063
|
+
form = new FormGroup({
|
|
43064
|
+
tel: new FormControl(null),
|
|
43065
|
+
});
|
|
43066
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: FormFieldCustomControlExample, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
43067
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: FormFieldCustomControlExample, isStandalone: true, selector: "form-field-custom-control-example", ngImport: i0, template: `
|
|
43068
|
+
<div [formGroup]="form">
|
|
43069
|
+
<mat-form-field>
|
|
43070
|
+
<mat-label>Phone number</mat-label>
|
|
43071
|
+
<example-tel-input formControlName="tel" required></example-tel-input>
|
|
43072
|
+
<mat-icon matSuffix>phone</mat-icon>
|
|
43073
|
+
<mat-hint>Include area code</mat-hint>
|
|
43074
|
+
</mat-form-field>
|
|
43075
|
+
<p>Entered value: {{ form.valueChanges | async | json }}</p>
|
|
43076
|
+
</div>
|
|
43077
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => FormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1$3.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i1$3.NgControlStatusGroup), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(() => i1$3.RequiredValidator), selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1$3.FormGroupDirective), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i0.forwardRef(() => i1$3.FormControlName), selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatLabel), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(() => i6.MatHint), selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i0.forwardRef(() => i6.MatSuffix), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i0.forwardRef(() => MyTelInput), selector: "example-tel-input", inputs: ["aria-describedby", "placeholder", "required", "disabled", "value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i8.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i0.forwardRef(() => AsyncPipe), name: "async" }, { kind: "pipe", type: i0.forwardRef(() => JsonPipe), name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
43078
|
+
}
|
|
43079
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: FormFieldCustomControlExample, decorators: [{
|
|
43080
|
+
type: Component,
|
|
43081
|
+
args: [{
|
|
43082
|
+
selector: 'form-field-custom-control-example',
|
|
43083
|
+
template: `
|
|
43084
|
+
<div [formGroup]="form">
|
|
43085
|
+
<mat-form-field>
|
|
43086
|
+
<mat-label>Phone number</mat-label>
|
|
43087
|
+
<example-tel-input formControlName="tel" required></example-tel-input>
|
|
43088
|
+
<mat-icon matSuffix>phone</mat-icon>
|
|
43089
|
+
<mat-hint>Include area code</mat-hint>
|
|
43090
|
+
</mat-form-field>
|
|
43091
|
+
<p>Entered value: {{ form.valueChanges | async | json }}</p>
|
|
43092
|
+
</div>
|
|
43093
|
+
`,
|
|
43094
|
+
standalone: true,
|
|
43095
|
+
imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, forwardRef(() => MyTelInput), MatIconModule, AsyncPipe, JsonPipe],
|
|
43096
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
43097
|
+
}]
|
|
43098
|
+
}] });
|
|
43099
|
+
/** Data structure for holding telephone number. */
|
|
43100
|
+
class MyTel {
|
|
43101
|
+
area;
|
|
43102
|
+
exchange;
|
|
43103
|
+
subscriber;
|
|
43104
|
+
constructor(area, exchange, subscriber) {
|
|
43105
|
+
this.area = area;
|
|
43106
|
+
this.exchange = exchange;
|
|
43107
|
+
this.subscriber = subscriber;
|
|
43108
|
+
}
|
|
43109
|
+
}
|
|
43110
|
+
/** Custom `MatFormFieldControl` for telephone number input. */
|
|
43111
|
+
class MyTelInput {
|
|
43112
|
+
static nextId = 0;
|
|
43113
|
+
areaInput = viewChild.required('area');
|
|
43114
|
+
exchangeInput = viewChild.required('exchange');
|
|
43115
|
+
subscriberInput = viewChild.required('subscriber');
|
|
43116
|
+
ngControl = inject(NgControl, { optional: true, self: true });
|
|
43117
|
+
parts;
|
|
43118
|
+
stateChanges = new Subject();
|
|
43119
|
+
touched = signal(false);
|
|
43120
|
+
controlType = 'example-tel-input';
|
|
43121
|
+
id = `example-tel-input-${MyTelInput.nextId++}`;
|
|
43122
|
+
_userAriaDescribedBy = input('', { alias: 'aria-describedby' });
|
|
43123
|
+
_placeholder = input('', { alias: 'placeholder' });
|
|
43124
|
+
_required = input(false, {
|
|
43125
|
+
alias: 'required',
|
|
43126
|
+
transform: booleanAttribute,
|
|
43127
|
+
});
|
|
43128
|
+
_disabledByInput = input(false, {
|
|
43129
|
+
alias: 'disabled',
|
|
43130
|
+
transform: booleanAttribute,
|
|
43131
|
+
});
|
|
43132
|
+
_value = model(null, { alias: 'value' });
|
|
43133
|
+
onChange = (_) => { };
|
|
43134
|
+
onTouched = () => { };
|
|
43135
|
+
_formField = inject(MAT_FORM_FIELD, {
|
|
43136
|
+
optional: true,
|
|
43137
|
+
});
|
|
43138
|
+
_focused = signal(false);
|
|
43139
|
+
_disabledByCva = signal(false);
|
|
43140
|
+
_disabled = computed(() => this._disabledByInput() || this._disabledByCva());
|
|
43141
|
+
_focusMonitor = inject(FocusMonitor);
|
|
43142
|
+
_elementRef = inject(ElementRef);
|
|
43143
|
+
get focused() {
|
|
43144
|
+
return this._focused();
|
|
43145
|
+
}
|
|
43146
|
+
get empty() {
|
|
43147
|
+
const { value: { area, exchange, subscriber }, } = this.parts;
|
|
43148
|
+
return !area && !exchange && !subscriber;
|
|
43149
|
+
}
|
|
43150
|
+
get shouldLabelFloat() {
|
|
43151
|
+
return this.focused || !this.empty;
|
|
43152
|
+
}
|
|
43153
|
+
get userAriaDescribedBy() {
|
|
43154
|
+
return this._userAriaDescribedBy();
|
|
43155
|
+
}
|
|
43156
|
+
get placeholder() {
|
|
43157
|
+
return this._placeholder();
|
|
43158
|
+
}
|
|
43159
|
+
get required() {
|
|
43160
|
+
return this._required();
|
|
43161
|
+
}
|
|
43162
|
+
get disabled() {
|
|
43163
|
+
return this._disabled();
|
|
43164
|
+
}
|
|
43165
|
+
get value() {
|
|
43166
|
+
return this._value();
|
|
43167
|
+
}
|
|
43168
|
+
get errorState() {
|
|
43169
|
+
return this.parts.invalid && this.touched();
|
|
43170
|
+
}
|
|
43171
|
+
constructor() {
|
|
43172
|
+
if (this.ngControl != null) {
|
|
43173
|
+
this.ngControl.valueAccessor = this;
|
|
43174
|
+
}
|
|
43175
|
+
this.parts = inject(FormBuilder).group({
|
|
43176
|
+
area: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(3)]],
|
|
43177
|
+
exchange: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(3)]],
|
|
43178
|
+
subscriber: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(4)]],
|
|
43179
|
+
});
|
|
43180
|
+
effect(() => {
|
|
43181
|
+
// Read signals to trigger effect.
|
|
43182
|
+
this._placeholder();
|
|
43183
|
+
this._required();
|
|
43184
|
+
this._disabled();
|
|
43185
|
+
this._focused();
|
|
43186
|
+
// Propagate state changes.
|
|
43187
|
+
untracked(() => this.stateChanges.next());
|
|
43188
|
+
});
|
|
43189
|
+
effect(() => {
|
|
43190
|
+
if (this._disabled()) {
|
|
43191
|
+
untracked(() => this.parts.disable());
|
|
43192
|
+
}
|
|
43193
|
+
else {
|
|
43194
|
+
untracked(() => this.parts.enable());
|
|
43195
|
+
}
|
|
43196
|
+
});
|
|
43197
|
+
effect(() => {
|
|
43198
|
+
const value = this._value() || new MyTel('', '', '');
|
|
43199
|
+
untracked(() => this.parts.setValue(value));
|
|
43200
|
+
});
|
|
43201
|
+
this.parts.statusChanges.pipe(takeUntilDestroyed()).subscribe(() => {
|
|
43202
|
+
this.stateChanges.next();
|
|
43203
|
+
});
|
|
43204
|
+
this.parts.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {
|
|
43205
|
+
const tel = this.parts.valid
|
|
43206
|
+
? new MyTel(this.parts.value.area || '', this.parts.value.exchange || '', this.parts.value.subscriber || '')
|
|
43207
|
+
: null;
|
|
43208
|
+
this._updateValue(tel);
|
|
43209
|
+
});
|
|
43210
|
+
}
|
|
43211
|
+
ngOnDestroy() {
|
|
43212
|
+
this.stateChanges.complete();
|
|
43213
|
+
this._focusMonitor.stopMonitoring(this._elementRef);
|
|
43214
|
+
}
|
|
43215
|
+
onFocusIn() {
|
|
43216
|
+
if (!this._focused()) {
|
|
43217
|
+
this._focused.set(true);
|
|
43218
|
+
}
|
|
43219
|
+
}
|
|
43220
|
+
onFocusOut(event) {
|
|
43221
|
+
if (!this._elementRef.nativeElement.contains(event.relatedTarget)) {
|
|
43222
|
+
this.touched.set(true);
|
|
43223
|
+
this._focused.set(false);
|
|
43224
|
+
this.onTouched();
|
|
43225
|
+
}
|
|
43226
|
+
}
|
|
43227
|
+
autoFocusNext(control, nextElement) {
|
|
43228
|
+
if (!control.errors && nextElement) {
|
|
43229
|
+
this._focusMonitor.focusVia(nextElement, 'program');
|
|
43230
|
+
}
|
|
43231
|
+
}
|
|
43232
|
+
autoFocusPrev(control, prevElement) {
|
|
43233
|
+
if (control.value.length < 1) {
|
|
43234
|
+
this._focusMonitor.focusVia(prevElement, 'program');
|
|
43235
|
+
}
|
|
43236
|
+
}
|
|
43237
|
+
setDescribedByIds(ids) {
|
|
43238
|
+
const controlElement = this._elementRef.nativeElement.querySelector('.example-tel-input-container');
|
|
43239
|
+
controlElement.setAttribute('aria-describedby', ids.join(' '));
|
|
43240
|
+
}
|
|
43241
|
+
onContainerClick() {
|
|
43242
|
+
if (this.parts.controls.subscriber.valid) {
|
|
43243
|
+
this._focusMonitor.focusVia(this.subscriberInput(), 'program');
|
|
43244
|
+
}
|
|
43245
|
+
else if (this.parts.controls.exchange.valid) {
|
|
43246
|
+
this._focusMonitor.focusVia(this.subscriberInput(), 'program');
|
|
43247
|
+
}
|
|
43248
|
+
else if (this.parts.controls.area.valid) {
|
|
43249
|
+
this._focusMonitor.focusVia(this.exchangeInput(), 'program');
|
|
43250
|
+
}
|
|
43251
|
+
else {
|
|
43252
|
+
this._focusMonitor.focusVia(this.areaInput(), 'program');
|
|
43253
|
+
}
|
|
43254
|
+
}
|
|
43255
|
+
writeValue(tel) {
|
|
43256
|
+
this._updateValue(tel);
|
|
43257
|
+
}
|
|
43258
|
+
registerOnChange(fn) {
|
|
43259
|
+
this.onChange = fn;
|
|
43260
|
+
}
|
|
43261
|
+
registerOnTouched(fn) {
|
|
43262
|
+
this.onTouched = fn;
|
|
43263
|
+
}
|
|
43264
|
+
setDisabledState(isDisabled) {
|
|
43265
|
+
this._disabledByCva.set(isDisabled);
|
|
43266
|
+
}
|
|
43267
|
+
_handleInput(control, nextElement) {
|
|
43268
|
+
this.autoFocusNext(control, nextElement);
|
|
43269
|
+
this.onChange(this.value);
|
|
43270
|
+
}
|
|
43271
|
+
_updateValue(tel) {
|
|
43272
|
+
const current = this._value();
|
|
43273
|
+
if (tel === current || (tel?.area === current?.area && tel?.exchange === current?.exchange && tel?.subscriber === current?.subscriber)) {
|
|
43274
|
+
return;
|
|
43275
|
+
}
|
|
43276
|
+
this._value.set(tel);
|
|
43277
|
+
}
|
|
43278
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MyTelInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
43279
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: MyTelInput, isStandalone: true, selector: "example-tel-input", inputs: { _userAriaDescribedBy: { classPropertyName: "_userAriaDescribedBy", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, _disabledByInput: { classPropertyName: "_disabledByInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _value: { classPropertyName: "_value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { _value: "valueChange" }, host: { properties: { "class.example-floating": "shouldLabelFloat", "id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: MyTelInput }], viewQueries: [{ propertyName: "areaInput", first: true, predicate: ["area"], descendants: true, isSignal: true }, { propertyName: "exchangeInput", first: true, predicate: ["exchange"], descendants: true, isSignal: true }, { propertyName: "subscriberInput", first: true, predicate: ["subscriber"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n role=\"group\"\n class=\"example-tel-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"area\"\n size=\"3\"\n maxLength=\"3\"\n aria-label=\"Area code\"\n (input)=\"_handleInput(parts.controls.area, exchange)\"\n #area\n />\n <span class=\"example-tel-input-spacer\">–</span>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"exchange\"\n maxLength=\"3\"\n size=\"3\"\n aria-label=\"Exchange code\"\n (input)=\"_handleInput(parts.controls.exchange, subscriber)\"\n (keyup.backspace)=\"autoFocusPrev(parts.controls.exchange, area)\"\n #exchange\n />\n <span class=\"example-tel-input-spacer\">–</span>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"subscriber\"\n maxLength=\"4\"\n size=\"4\"\n aria-label=\"Subscriber number\"\n (input)=\"_handleInput(parts.controls.subscriber)\"\n (keyup.backspace)=\"autoFocusPrev(parts.controls.subscriber, exchange)\"\n #subscriber\n />\n</div>\n", styles: [".example-tel-input-container{display:flex}.example-tel-input-element{border:none;background:none;padding:0;outline:none;font:inherit;text-align:center;color:currentcolor}.example-tel-input-spacer{opacity:0;transition:opacity .2s}:host.example-floating .example-tel-input-spacer{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { 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: "ngmodule", type: ReactiveFormsModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
43280
|
+
}
|
|
43281
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MyTelInput, decorators: [{
|
|
43282
|
+
type: Component,
|
|
43283
|
+
args: [{ selector: 'example-tel-input', providers: [{ provide: MatFormFieldControl, useExisting: MyTelInput }], host: {
|
|
43284
|
+
'[class.example-floating]': 'shouldLabelFloat',
|
|
43285
|
+
'[id]': 'id',
|
|
43286
|
+
}, standalone: true, imports: [FormsModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n class=\"example-tel-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"area\"\n size=\"3\"\n maxLength=\"3\"\n aria-label=\"Area code\"\n (input)=\"_handleInput(parts.controls.area, exchange)\"\n #area\n />\n <span class=\"example-tel-input-spacer\">–</span>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"exchange\"\n maxLength=\"3\"\n size=\"3\"\n aria-label=\"Exchange code\"\n (input)=\"_handleInput(parts.controls.exchange, subscriber)\"\n (keyup.backspace)=\"autoFocusPrev(parts.controls.exchange, area)\"\n #exchange\n />\n <span class=\"example-tel-input-spacer\">–</span>\n <input\n class=\"example-tel-input-element\"\n formControlName=\"subscriber\"\n maxLength=\"4\"\n size=\"4\"\n aria-label=\"Subscriber number\"\n (input)=\"_handleInput(parts.controls.subscriber)\"\n (keyup.backspace)=\"autoFocusPrev(parts.controls.subscriber, exchange)\"\n #subscriber\n />\n</div>\n", styles: [".example-tel-input-container{display:flex}.example-tel-input-element{border:none;background:none;padding:0;outline:none;font:inherit;text-align:center;color:currentcolor}.example-tel-input-spacer{opacity:0;transition:opacity .2s}:host.example-floating .example-tel-input-spacer{opacity:1}\n"] }]
|
|
43287
|
+
}], ctorParameters: () => [] });
|
|
43288
|
+
|
|
42987
43289
|
const SHARED_MATERIAL_TESTING_PAGES = [
|
|
42988
43290
|
{ label: 'Shared Material components', divider: true },
|
|
42989
43291
|
{ label: 'Common field', page: '/testing/shared/common' },
|
|
@@ -42994,6 +43296,8 @@ const SHARED_MATERIAL_TESTING_PAGES = [
|
|
|
42994
43296
|
{ label: 'Autocomplete field', page: '/testing/shared/autocomplete' },
|
|
42995
43297
|
{ label: 'Boolean field', page: '/testing/shared/boolean' },
|
|
42996
43298
|
{ label: 'Lat/Long field', page: '/testing/shared/latlong' },
|
|
43299
|
+
{ label: 'Lat/Long field 2', page: '/testing/shared/latlong2' },
|
|
43300
|
+
{ label: 'TEST field', page: '/testing/shared/test' },
|
|
42997
43301
|
//{ label: 'Numeric pad component', page: '/testing/shared/numpad' },
|
|
42998
43302
|
{ label: 'Text form', page: '/testing/shared/text-form' },
|
|
42999
43303
|
{ label: 'Swipe component', page: '/testing/shared/swipe' },
|
|
@@ -43051,6 +43355,16 @@ const routes$b = [
|
|
|
43051
43355
|
component: LatLongTestPage,
|
|
43052
43356
|
},
|
|
43053
43357
|
// {
|
|
43358
|
+
// path: 'latlong2',
|
|
43359
|
+
// pathMatch: 'full',
|
|
43360
|
+
// component: LatLongTest2Page,
|
|
43361
|
+
// },
|
|
43362
|
+
{
|
|
43363
|
+
path: 'test',
|
|
43364
|
+
pathMatch: 'full',
|
|
43365
|
+
component: FormFieldCustomControlExample,
|
|
43366
|
+
},
|
|
43367
|
+
// {
|
|
43054
43368
|
// path: 'numpad',
|
|
43055
43369
|
// pathMatch: 'full',
|
|
43056
43370
|
// component: NumpadTestPage
|
|
@@ -43096,6 +43410,7 @@ class MaterialTestingModule {
|
|
|
43096
43410
|
AutocompleteTestPage,
|
|
43097
43411
|
BooleanTestPage,
|
|
43098
43412
|
LatLongTestPage,
|
|
43413
|
+
//LatLongTest2Page,
|
|
43099
43414
|
//NumpadTestPage,
|
|
43100
43415
|
TextFormTestingPage,
|
|
43101
43416
|
SwipeTestPage,
|
|
@@ -43108,7 +43423,8 @@ class MaterialTestingModule {
|
|
|
43108
43423
|
SharedMaterialModule, i1$1.TranslateModule, i1$5.RouterModule, SharedPipesModule,
|
|
43109
43424
|
SharedBadgeModule,
|
|
43110
43425
|
FormsModule,
|
|
43111
|
-
MaskitoDirective
|
|
43426
|
+
MaskitoDirective,
|
|
43427
|
+
SharedMatLatLongModule], exports: [SharedMaterialModule,
|
|
43112
43428
|
RouterModule,
|
|
43113
43429
|
MatCommonTestPage,
|
|
43114
43430
|
DateTimeTestPage,
|
|
@@ -43118,6 +43434,7 @@ class MaterialTestingModule {
|
|
|
43118
43434
|
AutocompleteTestPage,
|
|
43119
43435
|
BooleanTestPage,
|
|
43120
43436
|
LatLongTestPage,
|
|
43437
|
+
//LatLongTest2Page,
|
|
43121
43438
|
//NumpadTestPage,
|
|
43122
43439
|
TextFormTestingPage,
|
|
43123
43440
|
SwipeTestPage,
|
|
@@ -43133,7 +43450,8 @@ class MaterialTestingModule {
|
|
|
43133
43450
|
RouterModule.forChild(routes$b),
|
|
43134
43451
|
SharedPipesModule,
|
|
43135
43452
|
SharedBadgeModule,
|
|
43136
|
-
FormsModule,
|
|
43453
|
+
FormsModule,
|
|
43454
|
+
SharedMatLatLongModule, SharedMaterialModule,
|
|
43137
43455
|
RouterModule] });
|
|
43138
43456
|
}
|
|
43139
43457
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MaterialTestingModule, decorators: [{
|
|
@@ -43150,6 +43468,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
43150
43468
|
SharedBadgeModule,
|
|
43151
43469
|
FormsModule,
|
|
43152
43470
|
MaskitoDirective,
|
|
43471
|
+
SharedMatLatLongModule,
|
|
43153
43472
|
],
|
|
43154
43473
|
declarations: [
|
|
43155
43474
|
MatCommonTestPage,
|
|
@@ -43160,6 +43479,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
43160
43479
|
AutocompleteTestPage,
|
|
43161
43480
|
BooleanTestPage,
|
|
43162
43481
|
LatLongTestPage,
|
|
43482
|
+
//LatLongTest2Page,
|
|
43163
43483
|
//NumpadTestPage,
|
|
43164
43484
|
TextFormTestingPage,
|
|
43165
43485
|
SwipeTestPage,
|
|
@@ -43179,6 +43499,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
43179
43499
|
AutocompleteTestPage,
|
|
43180
43500
|
BooleanTestPage,
|
|
43181
43501
|
LatLongTestPage,
|
|
43502
|
+
//LatLongTest2Page,
|
|
43182
43503
|
//NumpadTestPage,
|
|
43183
43504
|
TextFormTestingPage,
|
|
43184
43505
|
SwipeTestPage,
|
|
@@ -44553,7 +44874,7 @@ class TableTestPage extends AppTable {
|
|
|
44553
44874
|
provide: AppTable,
|
|
44554
44875
|
useExisting: forwardRef(() => TableTestPage),
|
|
44555
44876
|
},
|
|
44556
|
-
], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }, { propertyName: "infiniteScroll", first: true, predicate: IonInfiniteScroll, descendants: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar\n color=\"primary\"\n [canGoBack]=\"true\"\n [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\"\n>\n <ion-title>Table (click to edit)</ion-title>\n <ion-buttons slot=\"end\">\n @if (selection | isEmptySelection) {\n <input matInput type=\"number\" step=\"1\" style=\"color: black; width: 50px\" [(ngModel)]=\"rowHeight\" />\n\n <!-- Add -->\n <button mat-icon-button *ngIf=\"canEdit && !mobile\" [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\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 *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- save -->\n <button mat-icon-button *ngIf=\"mobile\" [disabled]=\"(dirtySubject | async) !== true\" (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n } @else {\n <!-- if row selection -->\n <!-- delete -->\n <button\n mat-icon-button\n *ngIf=\"canEdit\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button\n mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: { equals: 1 }\"\n [title]=\"'COMMON.BTN_DUPLICATE' | translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\"\n >\n <mat-icon>file_copy</mat-icon>\n </button>\n }\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\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\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n [class.filter-panel-pinned]=\"!filterPanelFloating\"\n >\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <mat-label>{{ 'TABLE.TESTING.SEARCH_TEXT' | translate }}</mat-label>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput formControlName=\"searchText\" autocomplete=\"off\" />\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 </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 >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\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]=\"rowHeight + 'px'\"\n >\n <!-- group header cells -->\n <ng-container matColumnDef=\"top-start\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{ i18nColumnPrefix + 'GROUP_1' }}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"displayedColumns.length - 6\">\n <ion-label translate>{{ i18nColumnPrefix + 'GROUP_2' }}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" [stickyEnd]=\"stickyEnd\">\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n <ion-label></ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n @if (selection | isMultipleSelection) {\n <mat-checkbox\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n (change)=\"$event ? masterToggle() : null\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"toggleSelectRow($event, row)\"\n [checked]=\"selection | isSelected: row\"\n tabindex=\"-1\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'label'\">\n @if (row.editing) {\n <mat-form-field>\n <input\n matInput\n autocomplete=\"off\"\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL' | translate\"\n [appAutofocus]=\"focusColumn === 'label'\"\n [readonly]=\"!row.editing\"\n />\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'label' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'name'\">\n @if (row.editing) {\n <mat-form-field>\n <input\n matInput\n [formControl]=\"row.validator?.controls.name\"\n [placeholder]=\"'TABLE.TESTING.NAME' | translate\"\n [appAutofocus]=\"focusColumn === 'name'\"\n />\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'name' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'levelId'\">\n @if (row.editing) {\n <mat-autocomplete-field\n [formControl]=\"row.validator.controls.levelId\"\n [placeholder]=\"'TABLE.TESTING.LEVEL_ID' | translate\"\n floatLabel=\"never\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [autofocus]=\"focusColumn === 'levelId'\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'levelId' | referentialToString: autocompleteFields.level.attributes }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn = 'statusId'\"\n >\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"i18nColumnPrefix + 'STATUS_ID' | translate\"\n >\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <mat-icon><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n <mat-label>{{ item.label | translate }}</mat-label>\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Enum column -->\n <!-- NOTE : Never used in table -->\n <!-- <ng-container matColumnDef=\"values\">-->\n <!-- <th mat-header-cell *matHeaderCellDef>-->\n <!-- <span translate>Enums</span>-->\n <!-- </th>-->\n <!-- <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">-->\n <!-- <app-form-field-->\n <!-- [formControl]=\"row.validator|formGetControl:'properties.values'\"-->\n <!-- [definition]=\"columnDefinitions['values']\"-->\n <!-- ></app-form-field>-->\n <!-- </td>-->\n <!-- </ng-container>-->\n\n <!-- boolean (as checkbox) -->\n <ng-container matColumnDef=\"boolean\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Boolean</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (!readOnly && row.editing) {\n <mat-boolean-field\n floatLabel=\"never\"\n [style]=\"'checkbox'\"\n placeholder=\"Oui/Non\"\n [formControl]=\"row.validator | formGetControl: 'properties.boolean'\"\n [compact]=\"true\"\n ></mat-boolean-field>\n } @else {\n <ion-label appAutoTitle>\n {{ (row.validator | formGetValue: 'properties.boolean') ? '✔' : '✘' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- date -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\" class=\"mat-cell-date-time\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Date</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\" (click)=\"focusColumn = 'date'\">\n @if (!readOnly && row.editing) {\n <mat-date-time-field\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl: 'properties.date'\"\n [autofocus]=\"focusColumn === 'date'\"\n placeholder=\"Date/Time\"\n [compact]=\"true\"\n ></mat-date-time-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'properties.date' | dateFormat: { time: true } }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- latitude -->\n <ng-container matColumnDef=\"latitude\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Latitude</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'latitude'\">\n @if (!readOnly && row.editing) {\n <mat-latlong-field\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl: 'properties.latitude'\"\n placeholder=\"Latitude\"\n [latLongPattern]=\"'DDMM'\"\n [type]=\"'latitude'\"\n [autofocus]=\"focusColumn === 'latitude'\"\n ></mat-latlong-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'properties.latitude' | latitudeFormat: { pattern: 'DDMM', placeholderChar: '0' } }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text color=\"medium\" *ngIf=\"row.id !== -1\">\n <small>\n {{ row.validator | formGetValue: 'creationDate' | dateFormat: { time: true } }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input\n type=\"text\"\n matInput\n [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS' | translate\"\n [readonly]=\"!row.editing\"\n />\n </mat-form-field>\n\n <ng-template #iconComment>\n <ion-icon\n [color]=\"row.validator?.controls.comments.value ? 'tertiary' : 'medium'\"\n name=\"chatbox\"\n slot=\"icon-only\"\n ></ion-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions column -->\n <app-nav-actions-column\n [stickyEnd]=\"stickyEnd\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n [cellTemplate]=\"cellInjection\"\n [showPending]=\"true\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n </app-nav-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-mdc-row-selected]=\"row.editing\"\n [class.mat-mdc-row-error]=\"row.invalid\"\n [class.mat-mdc-row-disabled]=\"!row.editing\"\n [class.mat-mdc-row-dirty]=\"row.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.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\n <ion-infinite-scroll\n *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\"\n position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\"\n >\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS' | translate\"\n ></ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator\n *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\"\n [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n showFirstLastButtons\n ></mat-paginator>\n\n <app-form-buttons-bar\n *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject | async) || !dirty\"\n >\n <!-- error -->\n <ion-item *ngIf=\"error$ | async\" 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 </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-mdc-table{--mat-column-actions-min-width: 62px;--mat-column-actions-max-width: 62px}.table-container .mat-mdc-table .mat-row-selected{padding:3px}.table-container .mat-mdc-table .mat-column-select{min-width:30px}.table-container .mat-mdc-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-mdc-table .mat-column-label,.table-container .mat-mdc-table .mat-column-name,.table-container .mat-mdc-table .mat-column-levelId,.table-container .mat-mdc-table .mat-column-statusId{min-width:150px}.table-container .mat-mdc-table .mat-column-comments{min-width:100px;max-width:100px}.table-container .mat-mdc-table .mat-column-updateDate{min-width:110px;max-width:110px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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.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.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2$1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2$1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { 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.IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: i2$1.IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { 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: "component", type: i2$1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i6$5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { 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$3.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9$3.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { 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.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.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: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13$3.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i13$3.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i8.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: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8$1.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: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "selectionChange"] }, { kind: "component", type: MatLatLongField, selector: "mat-latlong-field", inputs: ["formControl", "formControlName", "type", "latLongPattern", "maxDecimals", "required", "floatLabel", "placeholder", "defaultSign", "autofocus", "mobile", "degreesSymbolUnit", "minutesSymbolUnit", "secondsSymbolUnit", "clearable", "class", "tabindex", "appearance", "readonly", "subscriptSizing"], outputs: ["keyup.enter", "blur", "focus"] }, { kind: "component", type: MatDateTime, selector: "mat-date-time-field", inputs: ["placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "startDate", "datePickerFilter", "allowNoTime", "appearance", "subscriptSizing", "formControl", "formControlName", "required", "readonly", "tabindex"] }, { 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: "directive", type: AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: AutoTitleDirective, selector: "[appAutoTitle]" }, { kind: "component", type: ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "disabledEscape", "classList", "saveButtonColor", "backText", "cancelText", "nextText", "showBack", "showCancel", "showNext", "showSave"], outputs: ["onCancel", "onSave", "onNext", "onBack", "onSaveAndClose", "onSaveAndNext"] }, { kind: "component", type: NavActionsColumnComponent, selector: "app-nav-actions-column", inputs: ["appTable", "matColumnDef", "style", "stickyEnd", "showPending", "dirtyIcon", "optionsTitle", "class", "cellTemplate", "throttleTime"], outputs: ["optionsClick"] }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ResizableComponent, selector: "th[resizable]", inputs: ["resizable"], outputs: ["sizeChanged"] }, { kind: "directive", type: ResizableDirective, selector: "[resizable]", outputs: ["resizable", "fit"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: LatitudeFormatPipe, name: "latitudeFormat" }, { kind: "pipe", type: NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: FormGetValuePipe, name: "formGetValue" }, { kind: "pipe", type: IsSelectedPipe, name: "isSelected" }, { kind: "pipe", type: IsEmptySelectionPipe, name: "isEmptySelection" }, { kind: "pipe", type: IsMultipleSelectionPipe, name: "isMultipleSelection" }, { kind: "pipe", type: IsAllSelectedPipe, name: "isAllSelected" }, { kind: "pipe", type: IsNotAllSelectedPipe, name: "isNotAllSelected" }, { kind: "pipe", type: ReferentialToStringPipe, name: "referentialToString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44877
|
+
], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }, { propertyName: "infiniteScroll", first: true, predicate: IonInfiniteScroll, descendants: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar\n color=\"primary\"\n [canGoBack]=\"true\"\n [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\"\n>\n <ion-title>Table (click to edit)</ion-title>\n <ion-buttons slot=\"end\">\n @if (selection | isEmptySelection) {\n <input matInput type=\"number\" step=\"1\" style=\"color: black; width: 50px\" [(ngModel)]=\"rowHeight\" />\n\n <!-- Add -->\n <button mat-icon-button *ngIf=\"canEdit && !mobile\" [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\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 *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- save -->\n <button mat-icon-button *ngIf=\"mobile\" [disabled]=\"(dirtySubject | async) !== true\" (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n } @else {\n <!-- if row selection -->\n <!-- delete -->\n <button\n mat-icon-button\n *ngIf=\"canEdit\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button\n mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: { equals: 1 }\"\n [title]=\"'COMMON.BTN_DUPLICATE' | translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\"\n >\n <mat-icon>file_copy</mat-icon>\n </button>\n }\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\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\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n [class.filter-panel-pinned]=\"!filterPanelFloating\"\n >\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <mat-label>{{ 'TABLE.TESTING.SEARCH_TEXT' | translate }}</mat-label>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput formControlName=\"searchText\" autocomplete=\"off\" />\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 </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 >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\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]=\"rowHeight + 'px'\"\n >\n <!-- group header cells -->\n <ng-container matColumnDef=\"top-start\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{ i18nColumnPrefix + 'GROUP_1' }}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"displayedColumns.length - 6\">\n <ion-label translate>{{ i18nColumnPrefix + 'GROUP_2' }}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" [stickyEnd]=\"stickyEnd\">\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n <ion-label></ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n @if (selection | isMultipleSelection) {\n <mat-checkbox\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n (change)=\"$event ? masterToggle() : null\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"toggleSelectRow($event, row)\"\n [checked]=\"selection | isSelected: row\"\n tabindex=\"-1\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'label'\">\n @if (row.editing) {\n <mat-form-field>\n <input\n matInput\n autocomplete=\"off\"\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL' | translate\"\n [appAutofocus]=\"focusColumn === 'label'\"\n [readonly]=\"!row.editing\"\n />\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'label' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'name'\">\n @if (row.editing) {\n <mat-form-field>\n <input\n matInput\n [formControl]=\"row.validator?.controls.name\"\n [placeholder]=\"'TABLE.TESTING.NAME' | translate\"\n [appAutofocus]=\"focusColumn === 'name'\"\n />\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'name' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'levelId'\">\n @if (row.editing) {\n <mat-autocomplete-field\n [formControl]=\"row.validator.controls.levelId\"\n [placeholder]=\"'TABLE.TESTING.LEVEL_ID' | translate\"\n floatLabel=\"never\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [autofocus]=\"focusColumn === 'levelId'\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'levelId' | referentialToString: autocompleteFields.level.attributes }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn = 'statusId'\"\n >\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"i18nColumnPrefix + 'STATUS_ID' | translate\"\n >\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <mat-icon><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n <mat-label>{{ item.label | translate }}</mat-label>\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Enum column -->\n <!-- NOTE : Never used in table -->\n <!-- <ng-container matColumnDef=\"values\">-->\n <!-- <th mat-header-cell *matHeaderCellDef>-->\n <!-- <span translate>Enums</span>-->\n <!-- </th>-->\n <!-- <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">-->\n <!-- <app-form-field-->\n <!-- [formControl]=\"row.validator|formGetControl:'properties.values'\"-->\n <!-- [definition]=\"columnDefinitions['values']\"-->\n <!-- ></app-form-field>-->\n <!-- </td>-->\n <!-- </ng-container>-->\n\n <!-- boolean (as checkbox) -->\n <ng-container matColumnDef=\"boolean\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Boolean</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n @if (!readOnly && row.editing) {\n <mat-boolean-field\n floatLabel=\"never\"\n [style]=\"'checkbox'\"\n placeholder=\"Oui/Non\"\n [formControl]=\"row.validator | formGetControl: 'properties.boolean'\"\n [compact]=\"true\"\n ></mat-boolean-field>\n } @else {\n <ion-label appAutoTitle>\n {{ (row.validator | formGetValue: 'properties.boolean') ? '✔' : '✘' }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- date -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\" class=\"mat-cell-date-time\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Date</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\" (click)=\"focusColumn = 'date'\">\n @if (!readOnly && row.editing) {\n <mat-date-time-field\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl: 'properties.date'\"\n [autofocus]=\"focusColumn === 'date'\"\n placeholder=\"Date/Time\"\n [compact]=\"true\"\n ></mat-date-time-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'properties.date' | dateFormat: { time: true } }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- latitude -->\n <ng-container matColumnDef=\"latitude\">\n <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n <!-- if sortable, wrap the header with a mat-sort-header -->\n <span mat-sort-header>\n <ion-label>Latitude</ion-label>\n </span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'latitude'\">\n @if (!readOnly && row.editing) {\n <mat-latlong-field\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl: 'properties.latitude'\"\n placeholder=\"Latitude\"\n [latLongPattern]=\"'DDMM'\"\n [type]=\"'latitude'\"\n [autofocus]=\"focusColumn === 'latitude'\"\n ></mat-latlong-field>\n } @else {\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'properties.latitude' | latitudeFormat: { pattern: 'DDMM', placeholderChar: '0' } }}\n </ion-label>\n }\n </td>\n </ng-container>\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text color=\"medium\" *ngIf=\"row.id !== -1\">\n <small>\n {{ row.validator | formGetValue: 'creationDate' | dateFormat: { time: true } }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input\n type=\"text\"\n matInput\n [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS' | translate\"\n [readonly]=\"!row.editing\"\n />\n </mat-form-field>\n\n <ng-template #iconComment>\n <ion-icon\n [color]=\"row.validator?.controls.comments.value ? 'tertiary' : 'medium'\"\n name=\"chatbox\"\n slot=\"icon-only\"\n ></ion-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions column -->\n <app-nav-actions-column\n [stickyEnd]=\"stickyEnd\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n [cellTemplate]=\"cellInjection\"\n [showPending]=\"true\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n </app-nav-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-mdc-row-selected]=\"row.editing\"\n [class.mat-mdc-row-error]=\"row.invalid\"\n [class.mat-mdc-row-disabled]=\"!row.editing\"\n [class.mat-mdc-row-dirty]=\"row.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.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\n <ion-infinite-scroll\n *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\"\n position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\"\n >\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS' | translate\"\n ></ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator\n *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\"\n [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n showFirstLastButtons\n ></mat-paginator>\n\n <app-form-buttons-bar\n *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject | async) || !dirty\"\n >\n <!-- error -->\n <ion-item *ngIf=\"error$ | async\" 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 </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-mdc-table{--mat-column-actions-min-width: 62px;--mat-column-actions-max-width: 62px}.table-container .mat-mdc-table .mat-row-selected{padding:3px}.table-container .mat-mdc-table .mat-column-select{min-width:30px}.table-container .mat-mdc-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-mdc-table .mat-column-label,.table-container .mat-mdc-table .mat-column-name,.table-container .mat-mdc-table .mat-column-levelId,.table-container .mat-mdc-table .mat-column-statusId{min-width:150px}.table-container .mat-mdc-table .mat-column-comments{min-width:100px;max-width:100px}.table-container .mat-mdc-table .mat-column-updateDate{min-width:110px;max-width:110px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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.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.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2$1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2$1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { 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.IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: i2$1.IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { 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: "component", type: i2$1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "directive", type: i6$5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { 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$3.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9$3.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { 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.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.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: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13$3.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i13$3.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i8.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: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8$1.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: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "selectionChange"] }, { kind: "component", type: MatLatLongField, selector: "mat-latlong-field", inputs: ["formControl", "formControlName", "type", "latLongPattern", "maxDecimals", "required", "floatLabel", "placeholder", "defaultSign", "autofocus", "mobile", "degreesSymbolUnit", "minutesSymbolUnit", "secondsSymbolUnit", "clearable", "class", "tabindex", "appearance", "readonly", "subscriptSizing"] }, { kind: "component", type: MatDateTime, selector: "mat-date-time-field", inputs: ["placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "startDate", "datePickerFilter", "allowNoTime", "appearance", "subscriptSizing", "formControl", "formControlName", "required", "readonly", "tabindex"] }, { 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: "directive", type: AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: AutoTitleDirective, selector: "[appAutoTitle]" }, { kind: "component", type: ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "disabledEscape", "classList", "saveButtonColor", "backText", "cancelText", "nextText", "showBack", "showCancel", "showNext", "showSave"], outputs: ["onCancel", "onSave", "onNext", "onBack", "onSaveAndClose", "onSaveAndNext"] }, { kind: "component", type: NavActionsColumnComponent, selector: "app-nav-actions-column", inputs: ["appTable", "matColumnDef", "style", "stickyEnd", "showPending", "dirtyIcon", "optionsTitle", "class", "cellTemplate", "throttleTime"], outputs: ["optionsClick"] }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ResizableComponent, selector: "th[resizable]", inputs: ["resizable"], outputs: ["sizeChanged"] }, { kind: "directive", type: ResizableDirective, selector: "[resizable]", outputs: ["resizable", "fit"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: LatitudeFormatPipe, name: "latitudeFormat" }, { kind: "pipe", type: NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: FormGetValuePipe, name: "formGetValue" }, { kind: "pipe", type: IsSelectedPipe, name: "isSelected" }, { kind: "pipe", type: IsEmptySelectionPipe, name: "isEmptySelection" }, { kind: "pipe", type: IsMultipleSelectionPipe, name: "isMultipleSelection" }, { kind: "pipe", type: IsAllSelectedPipe, name: "isAllSelected" }, { kind: "pipe", type: IsNotAllSelectedPipe, name: "isNotAllSelected" }, { kind: "pipe", type: ReferentialToStringPipe, name: "referentialToString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44557
44878
|
}
|
|
44558
44879
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: TableTestPage, decorators: [{
|
|
44559
44880
|
type: Component,
|
|
@@ -45578,5 +45899,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
45578
45899
|
* Generated bundle index. Do not edit.
|
|
45579
45900
|
*/
|
|
45580
45901
|
|
|
45581
|
-
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, AppHelpModal, AppHomePageModule, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, 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, 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, MaskitoPlaceholderPipe, MaskitoTestPage, MatAutocompleteConfigHolder, MatAutocompleteField, MatAutocompleteFieldUtils, MatBadgeTestPage, MatBooleanField, MatChipsField, MatColorPipe, MatCommonTestPage, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, 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, 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, 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, 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, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, ValueFormatPipe, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, computeDecimalDegrees, 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, getConnectionType, 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, isStartableService, isTouchUi, 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, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, splitNumberToFieldsDD, splitNumberToFieldsDDMM, splitNumberToFieldsDDMMSS, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
45902
|
+
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, AppHelpModal, AppHomePageModule, AppIconComponent, AppIconModule, AppImageGalleryComponent, AppInMemoryTable, AppInstallUpgradeCard, AppInstallUpgradeCardModule, AppListForm, AppListFormModule, AppLoadingSpinner, 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, 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, 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, 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, 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, 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, UserEventModule, UserEventNotificationIcon, UserEventNotificationList, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UserToken, UserTokenTable, UsersPage, ValueFormatPipe, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayResize, arraySize, asInputElement, booleanToString, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, collectByProperty, 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, getConnectionType, 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, isStartableService, isTouchUi, 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, slideInAnimation, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, splitNumberToFieldsDD, splitNumberToFieldsDDMM, splitNumberToFieldsDDMMSS, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, undefinedIfNull, underscoreToChangeCase, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending };
|
|
45582
45903
|
//# sourceMappingURL=sumaris-net.ngx-components.mjs.map
|