@sumaris-net/ngx-components 18.2.25 → 18.2.27-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.
Files changed (41) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/public_api.mjs +2 -1
  3. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +29 -10
  4. package/esm2022/src/app/core/peer/select-peer.modal.mjs +159 -18
  5. package/esm2022/src/app/core/peer/select-peer.module.mjs +11 -5
  6. package/esm2022/src/app/core/services/config/core.config.mjs +6 -1
  7. package/esm2022/src/app/core/services/model/node-feature.model.mjs +31 -0
  8. package/esm2022/src/app/core/services/model/peer.model.mjs +23 -3
  9. package/esm2022/src/app/core/services/network.service.mjs +4 -8
  10. package/esm2022/src/app/core/services/network.utils.mjs +1 -1
  11. package/esm2022/src/app/core/table/testing/table.testing.mjs +2 -2
  12. package/esm2022/src/app/shared/inputs.mjs +6 -2
  13. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +16 -25
  14. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +14 -5
  15. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +6 -5
  16. package/esm2022/src/app/shared/material/latlong/material.latlong2.mjs +631 -0
  17. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +18 -7
  18. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +2 -2
  19. package/esm2022/src/environments/environment.class.mjs +4 -1
  20. package/esm2022/src/environments/environment.mjs +3 -1
  21. package/fesm2022/sumaris-net.ngx-components.mjs +1316 -498
  22. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  23. package/package.json +1 -1
  24. package/public_api.d.ts +1 -0
  25. package/src/app/core/peer/select-peer.modal.d.ts +47 -6
  26. package/src/app/core/peer/select-peer.module.d.ts +3 -1
  27. package/src/app/core/services/config/core.config.d.ts +1 -0
  28. package/src/app/core/services/model/node-feature.model.d.ts +14 -0
  29. package/src/app/core/services/model/peer.model.d.ts +5 -0
  30. package/src/app/core/services/network.utils.d.ts +2 -0
  31. package/src/app/shared/material/latlong/latlong.utils.d.ts +10 -0
  32. package/src/app/shared/material/latlong/material.latlong.d.ts +1 -1
  33. package/src/app/shared/material/latlong/material.latlong.module.d.ts +15 -14
  34. package/src/app/shared/material/latlong/material.latlong2.d.ts +164 -0
  35. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +3 -2
  36. package/src/assets/i18n/en-US.json +6 -3
  37. package/src/assets/i18n/en.json +21 -18
  38. package/src/assets/i18n/fr.json +22 -12
  39. package/src/assets/manifest.json +1 -1
  40. package/src/environments/environment.class.d.ts +2 -0
  41. package/src/theme/_ngx-components.scss +2 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sumaris-net/ngx-components",
3
3
  "description": "SUMARiS Angular components",
4
- "version": "18.2.25",
4
+ "version": "18.2.27-alpha1",
5
5
  "author": "contact@e-is.pro",
6
6
  "license": "AGPL-3.0",
7
7
  "readmeFilename": "README.md",
package/public_api.d.ts CHANGED
@@ -23,6 +23,7 @@ export { MatDateShort } from './src/app/shared/material/datetime/material.datesh
23
23
  export { MatDateTime } from './src/app/shared/material/datetime/material.datetime';
24
24
  export { MatDate } from './src/app/shared/material/datetime/material.date';
25
25
  export { MatLatLongField } from './src/app/shared/material/latlong/material.latlong';
26
+ export { MatLatLongField2 } from './src/app/shared/material/latlong/material.latlong2';
26
27
  export * from './src/app/shared/material/latlong/material.latlong.module';
27
28
  export * from './src/app/shared/material/duration/duration.module';
28
29
  export { MatDuration } from './src/app/shared/material/duration/material.duration';
@@ -1,12 +1,13 @@
1
1
  import { ChangeDetectorRef, EventEmitter, OnDestroy } from '@angular/core';
2
- import { ModalController, PopoverController } from '@ionic/angular';
2
+ import { IonSearchbar, ModalController, PopoverController } from '@ionic/angular';
3
3
  import { Peer } from '../services/model/peer.model';
4
- import { Observable, Subject } from 'rxjs';
5
4
  import { HttpClient } from '@angular/common/http';
6
5
  import { Environment } from '../../../environments/environment.class';
7
6
  import { TextPopoverOptions } from '../form/text-popover/text-popover.component';
8
7
  import { TranslateService } from '@ngx-translate/core';
9
8
  import { ILoggingService } from '../../shared/logging/logger.model';
9
+ import { RxState } from '@rx-angular/state';
10
+ import { NodeFeature } from '../services/model/node-feature.model';
10
11
  import * as i0 from "@angular/core";
11
12
  export interface ISelectPeerModalOptions {
12
13
  canCancel: boolean;
@@ -14,8 +15,21 @@ export interface ISelectPeerModalOptions {
14
15
  onRefresh: EventEmitter<Event>;
15
16
  showSetManuallyButton: boolean;
16
17
  selectedPeer?: string;
18
+ title?: string;
19
+ defaultPeers: Peer[];
20
+ showSearchBar?: boolean;
17
21
  }
18
- export declare class SelectPeerModal implements OnDestroy, ISelectPeerModalOptions {
22
+ export interface ISelectPeerModalState {
23
+ defaultPeers: Peer[];
24
+ peers: Peer[];
25
+ filteredPeers: Peer[];
26
+ filteredPeersByFeatures: Peer[];
27
+ filteredPeerCount: number;
28
+ filteredFeaturesCount: number;
29
+ searchText: string;
30
+ selectedTabIndex: number;
31
+ }
32
+ export declare class SelectPeerModal extends RxState<ISelectPeerModalState> implements OnDestroy, ISelectPeerModalOptions {
19
33
  private modalCtrl;
20
34
  private popoverController;
21
35
  private translate;
@@ -25,21 +39,44 @@ export declare class SelectPeerModal implements OnDestroy, ISelectPeerModalOptio
25
39
  protected loggingService?: ILoggingService;
26
40
  private _subscription;
27
41
  private readonly _logger;
42
+ protected defaultPeers$: import("rxjs").Observable<Peer[]>;
43
+ protected peers$: import("rxjs").Observable<Peer[]>;
44
+ protected filteredPeers$: import("rxjs").Observable<Peer[]>;
45
+ protected filteredPeersByFeatures$: import("rxjs").Observable<Peer[]>;
46
+ protected filteredPeerCount$: import("rxjs").Observable<number>;
47
+ protected filteredFeaturesCount$: import("rxjs").Observable<number>;
28
48
  protected loading: boolean;
29
49
  protected mobile: boolean;
30
- protected $peers: Subject<Peer[]>;
31
50
  protected peerMinVersion: string;
32
51
  protected peerDefaultPrefix: string;
52
+ protected enableSelectPeerByFeature: boolean;
53
+ protected collapsedPeers: {
54
+ [key: string]: boolean;
55
+ };
56
+ set peers(value: Peer[]);
57
+ get peers(): Peer[];
58
+ set searchText(value: string);
59
+ get searchText(): string;
60
+ set filteredPeers(value: Peer[]);
61
+ get filteredPeers(): Peer[];
62
+ set selectedTabIndex(value: number);
63
+ get selectedTabIndex(): number;
33
64
  selectedPeer: string;
65
+ title: string;
34
66
  canCancel: boolean;
35
67
  allowSelectDownPeer: boolean;
36
68
  showSetManuallyButton: boolean;
69
+ showSearchBar: boolean;
70
+ tabGroupAnimationDuration: '200ms';
37
71
  onRefresh: EventEmitter<Event>;
72
+ set defaultPeers(value: Peer[]);
73
+ searchbar: IonSearchbar;
38
74
  constructor(modalCtrl: ModalController, popoverController: PopoverController, translate: TranslateService, http: HttpClient, cd: ChangeDetectorRef, environment: Environment, loggingService?: ILoggingService);
39
- set peers(peers: Observable<Peer[]>);
40
75
  cancel(): void;
41
76
  ngOnDestroy(): void;
42
77
  selectPeer(peer: Peer): void;
78
+ toggleSearchBar(): Promise<void>;
79
+ togglePeerFeatures(peerUrl: string): void;
43
80
  /**
44
81
  * Check the min pod version, defined by the app
45
82
  *
@@ -48,13 +85,17 @@ export declare class SelectPeerModal implements OnDestroy, ISelectPeerModalOptio
48
85
  isCompatible(peer: Peer): boolean;
49
86
  refresh(event: Event): void;
50
87
  clickSetManually(event?: Event): Promise<void>;
88
+ protected clearLogo(peer: Peer | NodeFeature): void;
51
89
  refreshPeers(peers: Peer[]): Promise<void>;
52
90
  protected refreshPeer(peer: Peer): Promise<Peer>;
53
91
  protected openPeerUrlPopover(event: Event, opts?: Partial<TextPopoverOptions>): Promise<any>;
92
+ protected updateFilteredPeer(event: any): void;
54
93
  protected markForCheck(): void;
55
94
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectPeerModal, [null, null, null, null, null, null, { optional: true; }]>;
56
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectPeerModal, "select-peer-modal", never, { "selectedPeer": { "alias": "selectedPeer"; "required": false; }; "canCancel": { "alias": "canCancel"; "required": false; }; "allowSelectDownPeer": { "alias": "allowSelectDownPeer"; "required": false; }; "showSetManuallyButton": { "alias": "showSetManuallyButton"; "required": false; }; "onRefresh": { "alias": "onRefresh"; "required": false; }; }, {}, never, never, false, never>;
95
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectPeerModal, "select-peer-modal", never, { "selectedTabIndex": { "alias": "selectedTabIndex"; "required": false; }; "selectedPeer": { "alias": "selectedPeer"; "required": false; }; "title": { "alias": "title"; "required": false; }; "canCancel": { "alias": "canCancel"; "required": false; }; "allowSelectDownPeer": { "alias": "allowSelectDownPeer"; "required": false; }; "showSetManuallyButton": { "alias": "showSetManuallyButton"; "required": false; }; "showSearchBar": { "alias": "showSearchBar"; "required": false; }; "tabGroupAnimationDuration": { "alias": "tabGroupAnimationDuration"; "required": false; }; "onRefresh": { "alias": "onRefresh"; "required": false; }; "defaultPeers": { "alias": "defaultPeers"; "required": false; }; }, {}, never, never, false, never>;
96
+ static ngAcceptInputType_selectedTabIndex: unknown;
57
97
  static ngAcceptInputType_canCancel: unknown;
58
98
  static ngAcceptInputType_allowSelectDownPeer: unknown;
59
99
  static ngAcceptInputType_showSetManuallyButton: unknown;
100
+ static ngAcceptInputType_showSearchBar: unknown;
60
101
  }
@@ -3,8 +3,10 @@ import * as i1 from "./select-peer.modal";
3
3
  import * as i2 from "../../shared/shared.module";
4
4
  import * as i3 from "@ngx-translate/core";
5
5
  import * as i4 from "../form/text-popover/text-popover.module";
6
+ import * as i5 from "../services/pipes/pipes.module";
7
+ import * as i6 from "@angular/forms";
6
8
  export declare class AppSelectPeerModule {
7
9
  static ɵfac: i0.ɵɵFactoryDeclaration<AppSelectPeerModule, never>;
8
- static ɵmod: i0.ɵɵNgModuleDeclaration<AppSelectPeerModule, [typeof i1.SelectPeerModal], [typeof i2.SharedModule, typeof i3.TranslateModule, typeof i4.AppTextPopoverModule], [typeof i3.TranslateModule, typeof i1.SelectPeerModal]>;
10
+ static ɵmod: i0.ɵɵNgModuleDeclaration<AppSelectPeerModule, [typeof i1.SelectPeerModal], [typeof i2.SharedModule, typeof i3.TranslateModule, typeof i4.AppTextPopoverModule, typeof i5.CorePipesModule, typeof i6.FormsModule], [typeof i3.TranslateModule, typeof i1.SelectPeerModal]>;
9
11
  static ɵinj: i0.ɵɵInjectorDeclaration<AppSelectPeerModule>;
10
12
  }
@@ -36,6 +36,7 @@ export declare const CORE_CONFIG_OPTIONS: Readonly<{
36
36
  FORM_FIELD_FOCUS_BACKGROUND_COLOR: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
37
37
  FORM_FIELD_DISABLED_BACKGROUND_COLOR: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
38
38
  ANDROID_INSTALL_URL: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
39
+ IOS_INSTALL_URL: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
39
40
  DB_TIMEZONE: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
40
41
  ACCOUNT_LAT_LONG_FORMAT_ENABLE: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
41
42
  ACCOUNT_READONLY: FormFieldDefinition<string, import("../../../shared/form/field.model").FormFieldType, any>;
@@ -0,0 +1,14 @@
1
+ import { Moment } from 'moment/moment';
2
+ import { Cloneable, Entity, EntityAsObjectOptions } from './entity.model';
3
+ export declare class NodeFeature extends Entity<NodeFeature> implements Cloneable<NodeFeature> {
4
+ static fromObject: (source: any, opts?: any) => NodeFeature;
5
+ label: string;
6
+ name: string;
7
+ description: string;
8
+ logo: string;
9
+ creationDate: Moment;
10
+ statusId: number;
11
+ validityStatusId: number;
12
+ asObject(options?: EntityAsObjectOptions): any;
13
+ fromObject(source: any): void;
14
+ }
@@ -1,9 +1,11 @@
1
1
  import { Cloneable, Entity, EntityAsObjectOptions } from './entity.model';
2
+ import { NodeFeature } from './node-feature.model';
2
3
  export declare class Peer extends Entity<Peer> implements Cloneable<Peer> {
3
4
  static fromObject: (source: any, opts?: any) => Peer;
4
5
  static parseUrl(peerUrl: string): Peer;
5
6
  static path(peer: Peer, ...paths: string[]): string;
6
7
  static equals(p1: Peer, p2: Peer): boolean;
8
+ static countAllFeatures(peers: Peer[]): number;
7
9
  dns: string;
8
10
  ipv4: string;
9
11
  ipv6: string;
@@ -17,6 +19,9 @@ export declare class Peer extends Entity<Peer> implements Cloneable<Peer> {
17
19
  softwareVersion: string;
18
20
  label: string;
19
21
  name: string;
22
+ registrationUri?: string;
23
+ registrationManager?: string;
24
+ features?: NodeFeature[];
20
25
  constructor();
21
26
  asObject(options?: EntityAsObjectOptions): any;
22
27
  fromObject(source: any): void;
@@ -1,10 +1,12 @@
1
1
  import { HttpClient, HttpHeaders } from '@angular/common/http';
2
2
  import { Peer } from './model/peer.model';
3
+ import { NodeFeature } from './model/node-feature.model';
3
4
  export interface NodeInfo {
4
5
  softwareName: string;
5
6
  softwareVersion: string;
6
7
  nodeLabel?: string;
7
8
  nodeName?: string;
9
+ features?: NodeFeature[];
8
10
  }
9
11
  export interface AppManifest {
10
12
  manifest_version: number;
@@ -18,4 +18,14 @@ export declare const LAT_LONG_DEFAULT_MAX_DECIMALS = 3;
18
18
  export declare function formatLatLong(value: number, type: LatLongType, opts?: Partial<LatLongFormatOptions>): string;
19
19
  export declare function formatLatitude(value: number | null, opts?: Partial<LatLongFormatOptions>): string;
20
20
  export declare function formatLongitude(value: number | null, opts?: Partial<LatLongFormatOptions>): string;
21
+ export declare function splitNumberToFieldsDD(value: number, opts: LatLongFormatOptions & {
22
+ longitude: boolean;
23
+ }): (number | string)[];
24
+ export declare function splitNumberToFieldsDDMM(value: number, opts: LatLongFormatOptions & {
25
+ longitude: boolean;
26
+ }): number[];
27
+ export declare function splitNumberToFieldsDDMMSS(value: number, opts: LatLongFormatOptions & {
28
+ longitude: boolean;
29
+ }): number[];
21
30
  export declare function parseLatitudeOrLongitude(input: string, pattern: string, maxDecimals?: number, placeholderChar?: string): number | null;
31
+ export declare function computeDecimalDegrees(degrees: number, minutes: number, seconds: number, sign: -1 | 1, maxDecimals?: number): number;
@@ -68,6 +68,6 @@ export declare class MatLatLongField implements OnInit, OnDestroy, ControlValueA
68
68
  private parseValue;
69
69
  private markForCheck;
70
70
  static ɵfac: i0.ɵɵFactoryDeclaration<MatLatLongField, [null, null, null, { optional: true; }, null]>;
71
- static ɵcmp: i0.ɵɵComponentDeclaration<MatLatLongField, "mat-latlong-field", never, { "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "type": { "alias": "type"; "required": false; }; "pattern": { "alias": "latLongPattern"; "required": false; }; "required": { "alias": "required"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "defaultSign": { "alias": "defaultSign"; "required": false; }; "maxDecimals": { "alias": "maxDecimals"; "required": false; }; "placeholderChar": { "alias": "placeholderChar"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; }, { "onBlur": "onBlur"; "onFocus": "onFocus"; }, never, ["[matPrefix]", "[matSuffix]", "mat-error,[matError]", "mat-hint:not([align='end']),[matHint]", "mat-hint[align='end']"], false, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<MatLatLongField, "mat-latlong-field-old", never, { "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "type": { "alias": "type"; "required": false; }; "pattern": { "alias": "latLongPattern"; "required": false; }; "required": { "alias": "required"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "defaultSign": { "alias": "defaultSign"; "required": false; }; "maxDecimals": { "alias": "maxDecimals"; "required": false; }; "placeholderChar": { "alias": "placeholderChar"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; }, { "onBlur": "onBlur"; "onFocus": "onFocus"; }, never, ["[matPrefix]", "[matSuffix]", "mat-error,[matError]", "mat-hint:not([align='end']),[matHint]", "mat-hint[align='end']"], false, never>;
72
72
  static ngAcceptInputType_mobile: unknown;
73
73
  }
@@ -1,20 +1,21 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import * as i1 from "./material.latlong";
3
- import * as i2 from "@angular/common";
4
- import * as i3 from "@ionic/angular";
5
- import * as i4 from "@angular/forms";
6
- import * as i5 from "../../directives/directives.module";
7
- import * as i6 from "../../pipes/pipes.module";
8
- import * as i7 from "@angular/material/core";
9
- import * as i8 from "@angular/material/form-field";
10
- import * as i9 from "@angular/material/input";
11
- import * as i10 from "@angular/material/button";
12
- import * as i11 from "@maskito/angular";
13
- import * as i12 from "@angular/material/icon";
14
- import * as i13 from "@angular/material/select";
15
- import * as i14 from "@ngx-translate/core";
3
+ import * as i2 from "./material.latlong2";
4
+ import * as i3 from "@angular/common";
5
+ import * as i4 from "@ionic/angular";
6
+ import * as i5 from "@angular/forms";
7
+ import * as i6 from "../../directives/directives.module";
8
+ import * as i7 from "../../pipes/pipes.module";
9
+ import * as i8 from "@angular/material/core";
10
+ import * as i9 from "@angular/material/form-field";
11
+ import * as i10 from "@angular/material/input";
12
+ import * as i11 from "@angular/material/button";
13
+ import * as i12 from "@maskito/angular";
14
+ import * as i13 from "@angular/material/icon";
15
+ import * as i14 from "@angular/material/select";
16
+ import * as i15 from "@ngx-translate/core";
16
17
  export declare class SharedMatLatLongModule {
17
18
  static ɵfac: i0.ɵɵFactoryDeclaration<SharedMatLatLongModule, never>;
18
- static ɵmod: i0.ɵɵNgModuleDeclaration<SharedMatLatLongModule, [typeof i1.MatLatLongField], [typeof i2.CommonModule, typeof i3.IonicModule, typeof i4.ReactiveFormsModule, typeof i5.SharedDirectivesModule, typeof i6.SharedPipesModule, typeof i7.MatCommonModule, typeof i8.MatFormFieldModule, typeof i9.MatInputModule, typeof i10.MatButtonModule, typeof i11.MaskitoDirective, typeof i12.MatIconModule, typeof i13.MatSelectModule, typeof i14.TranslateModule], [typeof i1.MatLatLongField]>;
19
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SharedMatLatLongModule, [typeof i1.MatLatLongField, typeof i2.MatLatLongField2], [typeof i3.CommonModule, typeof i4.IonicModule, typeof i5.ReactiveFormsModule, typeof i6.SharedDirectivesModule, typeof i7.SharedPipesModule, typeof i8.MatCommonModule, typeof i9.MatFormFieldModule, typeof i10.MatInputModule, typeof i11.MatButtonModule, typeof i12.MaskitoDirective, typeof i13.MatIconModule, typeof i14.MatSelectModule, typeof i15.TranslateModule], [typeof i1.MatLatLongField, typeof i2.MatLatLongField2]>;
19
20
  static ɵinj: i0.ɵɵInjectorDeclaration<SharedMatLatLongModule>;
20
21
  }
@@ -0,0 +1,164 @@
1
+ import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import { ControlValueAccessor, FormControl, FormGroupDirective, UntypedFormControl } from '@angular/forms';
3
+ import { MatFormField, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';
4
+ import { AppFloatLabelType } from '../../form/field.model';
5
+ import { LatLongPattern, LatLongType } from './latlong.utils';
6
+ import * as i0 from "@angular/core";
7
+ declare type LatLongSign = 1 | -1;
8
+ interface ILatLongData {
9
+ degrees: number;
10
+ minutes: number;
11
+ seconds: number;
12
+ sign: LatLongSign;
13
+ }
14
+ export declare class MatLatLongField2 implements OnInit, OnDestroy, ControlValueAccessor {
15
+ private cd;
16
+ private formGroupDir;
17
+ private _onChangeCallback;
18
+ private _onTouchedCallback;
19
+ private _subscription;
20
+ private _disabling;
21
+ private _writing;
22
+ private _appearance;
23
+ private _subscriptSizing;
24
+ private _readonly;
25
+ private _tabindex;
26
+ private readonly _defaultAppearance;
27
+ private readonly _defaultSubscriptSizing;
28
+ protected _focused: boolean;
29
+ protected _touched: boolean;
30
+ protected degreesControl: FormControl<number>;
31
+ protected minutesControl: FormControl<number>;
32
+ protected secondsControl: FormControl<number>;
33
+ protected signControl: FormControl<LatLongSign>;
34
+ protected showMinutes: boolean;
35
+ protected showSeconds: boolean;
36
+ protected showSignControl: boolean;
37
+ protected degreesPlaceholder: string;
38
+ protected minutesPlaceholder: string;
39
+ protected secondsPlaceholder: string;
40
+ protected maxDecimals: number;
41
+ protected i18nErrorKeys: {
42
+ required: string;
43
+ min: string;
44
+ max: string;
45
+ minlength: string;
46
+ maxlength: string;
47
+ pubkey: string;
48
+ validDate: string;
49
+ dateIsAfter: string;
50
+ dateIsBefore: string;
51
+ dateRange: string;
52
+ dateMinDuration: string;
53
+ dateMaxDuration: string;
54
+ maxDecimals: string;
55
+ decimal: string;
56
+ integer: string;
57
+ precision: string;
58
+ email: string;
59
+ latitude: string;
60
+ longitude: string;
61
+ pattern: string;
62
+ unique: string;
63
+ entity: string;
64
+ invalid: string;
65
+ inconsistent: string;
66
+ equals: string;
67
+ };
68
+ protected minMaxValues: {
69
+ degrees?: {
70
+ min: number;
71
+ max: number;
72
+ step: number;
73
+ };
74
+ minutes?: {
75
+ min: number;
76
+ max: number;
77
+ step: number;
78
+ };
79
+ seconds?: {
80
+ min: number;
81
+ max: number;
82
+ step: number;
83
+ };
84
+ };
85
+ protected inputWidth: {
86
+ degrees: string;
87
+ degreesUnit: string;
88
+ minutes?: string;
89
+ minutesUnit?: string;
90
+ seconds?: string;
91
+ secondsUnit?: string;
92
+ };
93
+ formControl: UntypedFormControl;
94
+ formControlName: string;
95
+ type: LatLongType;
96
+ pattern: LatLongPattern;
97
+ required: boolean;
98
+ floatLabel: AppFloatLabelType;
99
+ placeholder: string;
100
+ defaultSign: '-' | '+';
101
+ autofocus: boolean;
102
+ mobile: boolean;
103
+ degreesSymbolUnit: string;
104
+ minutesSymbolUnit: string;
105
+ secondsSymbolUnit: string;
106
+ clearable: boolean;
107
+ set tabindex(value: number);
108
+ get tabindex(): number;
109
+ set appearance(value: MatFormFieldAppearance);
110
+ get appearance(): MatFormFieldAppearance;
111
+ set readonly(value: boolean);
112
+ get readonly(): boolean;
113
+ set subscriptSizing(value: SubscriptSizing);
114
+ get subscriptSizing(): SubscriptSizing;
115
+ get showFields(): boolean;
116
+ get disabled(): any;
117
+ keyupEnter: EventEmitter<any>;
118
+ blurred: EventEmitter<FocusEvent>;
119
+ focused: EventEmitter<FocusEvent>;
120
+ formField: MatFormField;
121
+ fakeInput: ElementRef;
122
+ inputDegrees: ElementRef;
123
+ inputMinutes: ElementRef;
124
+ inputSeconds: ElementRef;
125
+ inputSign: ElementRef;
126
+ constructor(cd: ChangeDetectorRef, formGroupDir: FormGroupDirective, defaultOptions?: MatFormFieldDefaultOptions);
127
+ ngOnInit(): void;
128
+ ngOnDestroy(): void;
129
+ registerOnChange(fn: any): void;
130
+ registerOnTouched(fn: any): void;
131
+ writeValue(value: number | string): void;
132
+ setDisabledState(isDisabled: boolean): void;
133
+ clearValue(event?: Event): void;
134
+ protected get inputsElements(): HTMLElement[];
135
+ protected onFocusFakeInput(event: FocusEvent): void;
136
+ protected onBlurFakeInput(event: FocusEvent): void;
137
+ protected _onFocusInput(event: FocusEvent): void;
138
+ protected _onBlurInput(event: FocusEvent): void;
139
+ protected _onClickInput(event: Event): void;
140
+ focus(focusOnDegrees?: boolean): boolean;
141
+ protected format(rawValue: number): string;
142
+ protected computeDecimalPart(value: number, nbOfDecimals: number): number;
143
+ protected computeLatLongFormGroupValue(rawValue: number | string): ILatLongData;
144
+ protected markAsTouched(): void;
145
+ private patchValue;
146
+ private onFormChange;
147
+ private emitChange;
148
+ private _checkIfTouched;
149
+ private markForCheck;
150
+ /**
151
+ * Show/Hide the fake input
152
+ */
153
+ private updateFakeInput;
154
+ /**
155
+ * This is a special case, because, this component has a temporary component displayed before the first focus event
156
+ */
157
+ private updateTabIndex;
158
+ static ɵfac: i0.ɵɵFactoryDeclaration<MatLatLongField2, [null, { optional: true; }, null]>;
159
+ static ɵcmp: i0.ɵɵComponentDeclaration<MatLatLongField2, "mat-latlong-field", never, { "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "type": { "alias": "type"; "required": false; }; "pattern": { "alias": "latLongPattern"; "required": false; }; "required": { "alias": "required"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "defaultSign": { "alias": "defaultSign"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "degreesSymbolUnit": { "alias": "degreesSymbolUnit"; "required": false; }; "minutesSymbolUnit": { "alias": "minutesSymbolUnit"; "required": false; }; "secondsSymbolUnit": { "alias": "secondsSymbolUnit"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; }, { "keyupEnter": "keyup.enter"; "blurred": "blur"; "focused": "focus"; }, never, ["[matPrefix]", "[matSuffix]", "mat-error,[matError]", "mat-hint:not([align='end']),[matHint]", "mat-hint[align='end']"], false, never>;
160
+ static ngAcceptInputType_mobile: unknown;
161
+ static ngAcceptInputType_clearable: unknown;
162
+ static ngAcceptInputType_tabindex: unknown;
163
+ }
164
+ export {};
@@ -9,13 +9,14 @@ export declare class LatLongTestPage implements OnInit {
9
9
  protected platform: PlatformService;
10
10
  form: UntypedFormGroup;
11
11
  geoPositionMessage: string;
12
- mode: 'desktop' | 'mobile' | 'temp';
12
+ mode: 'mobile' | 'desktop' | 'dev' | 'temp';
13
+ selectedFormat: string;
13
14
  appearance: MatFormFieldAppearance;
14
15
  constructor(formBuilder: UntypedFormBuilder, platform: PlatformService);
15
16
  ngOnInit(): void;
16
17
  toggleMode(value: any): void;
17
18
  loadData(): Promise<void>;
18
- doSubmit(event: any): void;
19
+ doSubmit(event: Event): void;
19
20
  geoPosition(event: Event, controlName?: string): Promise<void>;
20
21
  toggleAppearance(event: MatCheckboxChange): void;
21
22
  stringify: {
@@ -33,8 +33,6 @@
33
33
  "BTN_SAVE": "Save",
34
34
  "BTN_SAVE_WITH_SHORTCUT": "<u>S</u>ave",
35
35
  "BTN_SAVE_WITH_SHORTCUT_HELP": "Save (Ctrl+S)",
36
- "BTN_SAVE_AND_CLOSE": "Save and close",
37
- "BTN_SAVE_AND_NEXT": "Save and next",
38
36
  "BTN_FILTER": "Filter",
39
37
  "BTN_RELOAD": "Reload",
40
38
  "BTN_REFRESH": "Refresh",
@@ -147,6 +145,7 @@
147
145
  "CONFIGURATION": {
148
146
  "OPTIONS": {
149
147
  "ANDROID_INSTALL_URL": "Android > Install App URL",
148
+ "IOS_INSTALL_URL": "iOS > Install App URL",
150
149
  "DB_TIMEZONE": "Persistence > Database timezone (readonly option)",
151
150
  "LOGO": "Menu > Logo (max width 110px)",
152
151
  "FAVICON": "favicon",
@@ -474,8 +473,12 @@
474
473
  "OFFLINE": "Unreachable node",
475
474
  "SELECT_MODAL": {
476
475
  "TITLE": "Network nodes",
476
+ "STARTUP_TITLE": "Startup",
477
+ "TAB_NETWORK": "Databases",
478
+ "TAB_FEATURES": "Data collection programs",
477
479
  "BTN_SET_MANUALLY": "Define manually",
478
- "HELP": "Please choose a network node to connect to:",
480
+ "NETWORK_HELP": "Please choose a <b>database</b> node to connect to:",
481
+ "FEATURES_HELP": "Please choose a <b>data collection program</b> you would like to participate in:",
479
482
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
480
483
  }
481
484
  },
@@ -33,8 +33,6 @@
33
33
  "BTN_SAVE": "Save",
34
34
  "BTN_SAVE_WITH_SHORTCUT": "<u>S</u>ave",
35
35
  "BTN_SAVE_WITH_SHORTCUT_HELP": "Save (Ctrl+S)",
36
- "BTN_SAVE_AND_CLOSE": "Save and close",
37
- "BTN_SAVE_AND_NEXT": "Save and next",
38
36
  "BTN_FILTER": "Filter",
39
37
  "BTN_RELOAD": "Reload",
40
38
  "BTN_REFRESH": "Refresh",
@@ -128,11 +126,11 @@
128
126
  },
129
127
  "DEBUG": {
130
128
  "TITLE": "Debug",
131
- "BTN_DEBUG_DOTS": "Débogage...",
129
+ "BTN_DEBUG_DOTS": "Debug...",
132
130
  "BTN_ENABLE_DEBUG": "Enable debug?"
133
131
  },
134
132
  "NAMED_FILTER": {
135
- "TITLE": "Saved filters",
133
+ "TITLE": "Saved filter",
136
134
  "SAVE": "Save the filter",
137
135
  "DELETE": "Delete the filter",
138
136
  "DELETED": "Filter deleted",
@@ -145,7 +143,8 @@
145
143
  },
146
144
  "CONFIGURATION": {
147
145
  "OPTIONS": {
148
- "ANDROID_INSTALL_URL": "Android > Install App URL",
146
+ "ANDROID_INSTALL_URL": "App > Android > Install App URL",
147
+ "IOS_INSTALL_URL": "App > iOS > Install App URL",
149
148
  "DB_TIMEZONE": "Persistence > Database timezone (readonly option)",
150
149
  "LOGO": "Menu > Logo (max width 110px)",
151
150
  "FAVICON": "favicon",
@@ -400,13 +399,13 @@
400
399
  "BTN_CHANGE_PEER": "See available nodes",
401
400
  "BTN_DARK_MODE": "Dark theme?",
402
401
  "BTN_SHOW_MORE_HELP": "Show more parameters",
403
- "BTN_SHOW_OPTION_KEY": "Show the option code?",
402
+ "BTN_SHOW_OPTION_KEY": "Show options code?",
404
403
  "BTN_CLEAR_CACHE": "Clear data cache",
405
404
  "OFFLINE_MODE": "Force offline mode? (experimental)",
406
405
  "DATA_ENTRY_DIVIDER": "Data entry settings",
407
406
  "USAGE_MODE": "Usage mode",
408
- "USAGE_MODE_FIELD": "<b>On field</b> mode",
409
- "USAGE_MODE_DESK": "<b>In office</b> mode",
407
+ "USAGE_MODE_FIELD": "Mode on <b>field</b>",
408
+ "USAGE_MODE_DESK": "Mode in <b>office</b>",
410
409
  "USAGE_MODES": {
411
410
  "FIELD": "On field",
412
411
  "DESK": "In office"
@@ -414,7 +413,7 @@
414
413
  "PROPERTY_KEY": "Entry field",
415
414
  "PROPERTY_VALUE": "Display",
416
415
  "BTN_ADD_PROPERTY": "Add a entry field",
417
- "BTN_RESET_PROPERTY": "Reset option",
416
+ "BTN_RESET_PROPERTY": "Reset the option",
418
417
  "FIELDS": {
419
418
  "DEPARTMENT": "Dropdown list > Departments",
420
419
  "ATTRIBUTES": {
@@ -453,7 +452,7 @@
453
452
  "ADMIN": "Administrator",
454
453
  "SUPERVISOR": "Manager",
455
454
  "USER": "Observer",
456
- "GUEST": "Invité"
455
+ "GUEST": "Guest"
457
456
  },
458
457
  "LIST": {
459
458
  "TITLE": "Users",
@@ -473,15 +472,19 @@
473
472
  "OFFLINE": "Unreachable node",
474
473
  "SELECT_MODAL": {
475
474
  "TITLE": "Network nodes",
475
+ "STARTUP_TITLE": "Startup",
476
+ "TAB_NETWORK": "Databases",
477
+ "TAB_FEATURES": "Data collection programmes",
476
478
  "BTN_SET_MANUALLY": "Define manually",
477
- "HELP": "Please choose a network node to connect to:",
479
+ "NETWORK_HELP": "Please choose a <b>database</b> node to connect to:",
480
+ "FEATURES_HELP": "Please choose a <b>data collection programme</b> you would like to participate in:",
478
481
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
479
482
  }
480
483
  },
481
484
  "SYNCHRONIZATION_STATUS": {
482
- "DIRTY": "Offline",
485
+ "DIRTY": "Not sent",
483
486
  "READY_TO_SYNC": "Ready to synchronize",
484
- "SYNC": "Online"
487
+ "SYNC": "Sent"
485
488
  },
486
489
  "INFO": {
487
490
  "IMPORTATION_PCT_DOTS": "Importation... {{pct}}%",
@@ -529,7 +532,7 @@
529
532
  "MESSAGE": {
530
533
  "TYPE": "Message type",
531
534
  "RECIPIENTS": "Recipients",
532
- "RECIPIENT_FILTER_COUNT": "{{count}} filtered users",
535
+ "RECIPIENT_FILTER_COUNT": "{{count}} filtered user(s)",
533
536
  "SUBJECT": "Object",
534
537
  "BODY_HELP": "Your message...",
535
538
  "NEW": {
@@ -596,7 +599,7 @@
596
599
  "FIELD_INCONSISTENT": "Inconsistent value",
597
600
  "FIELD_NOT_VALID_DECIMAL": "Expected decimal value",
598
601
  "FIELD_NOT_VALID_INTEGER": "Expected integer value",
599
- "FIELD_NOT_VALID_PRECISION": "Minimum precision: {{precision}}",
602
+ "FIELD_NOT_VALID_PRECISION": "Minimal precision: {{precision}}",
600
603
  "FIELD_NOT_VALID_PRECISION_COMPACT": "Min precision {{precision}}",
601
604
  "FIELD_NOT_VALID_EMAIL": "Invalid email address",
602
605
  "FIELD_NOT_VALID_DATE": "Invalid date",
@@ -615,7 +618,7 @@
615
618
  "FIELD_NOT_EQUALS": "Value not equals",
616
619
  "SPACE_NOT_ALLOW": "Spaces or special characters not allowed",
617
620
  "SCRYPT_ERROR": "Unable to create account keys",
618
- "INVALID_OR_INCOMPLETE_FILL": "Invalid or incomplete fill",
621
+ "INVALID_OR_INCOMPLETE_FILL": "Incomplete or invalid entry",
619
622
  "UNKNOWN_ACCOUNT_EMAIL": "No account matches this email.",
620
623
  "BAD_PASSWORD": "Incorrect password.",
621
624
  "EMAIL_ALREADY_REGISTERED": "Email already registered",
@@ -668,7 +671,7 @@
668
671
  "LOAD_ERROR": "Error while loading",
669
672
  "SAVE_ERROR": "Error while saving",
670
673
  "SUBSCRIBE_ERROR": "Error while subscribe to changes",
671
- "FIELD_NOT_EXISTS": "This value not exists",
674
+ "FIELD_NOT_EXISTS": "Value doesn't exist",
672
675
  "FIREFOX_NO_STORAGE": "The application cannot run with Firefox in 'private' mode or without keeping navigation history",
673
676
  "FEATURE_NOT_IMPLEMENTED": "Feature not implemented! <small><br/>Please contact your administrator.</small>"
674
677
  },
@@ -690,7 +693,7 @@
690
693
  },
691
694
  "INFO": {
692
695
  "ALERT_HEADER": "Information",
693
- "SYNCHRONIZATION_SUCCEED": "Synchronization completed! <br/> The data has been received by the server.",
696
+ "SYNCHRONIZATION_SUCCEED": "Synchronization <b>completed successfully</b>!<br/>The data has been received by the server.",
694
697
  "COPY_SUCCEED": "Copy successfully!",
695
698
  "DEBUG_DATA_SEND": "Help request sent to administrator",
696
699
  "DATA_MIGRATION_STARTED": "Data recovery in progress. <br/><b>Please wait ...</b>",