@sumaris-net/ngx-components 18.2.25 → 18.2.26

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 (27) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +29 -10
  3. package/esm2022/src/app/core/peer/select-peer.modal.mjs +159 -18
  4. package/esm2022/src/app/core/peer/select-peer.module.mjs +11 -5
  5. package/esm2022/src/app/core/services/config/core.config.mjs +6 -1
  6. package/esm2022/src/app/core/services/model/node-feature.model.mjs +31 -0
  7. package/esm2022/src/app/core/services/model/peer.model.mjs +23 -3
  8. package/esm2022/src/app/core/services/network.service.mjs +4 -8
  9. package/esm2022/src/app/core/services/network.utils.mjs +1 -1
  10. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +2 -2
  11. package/esm2022/src/environments/environment.class.mjs +4 -1
  12. package/esm2022/src/environments/environment.mjs +3 -1
  13. package/fesm2022/sumaris-net.ngx-components.mjs +635 -433
  14. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  15. package/package.json +1 -1
  16. package/src/app/core/peer/select-peer.modal.d.ts +47 -6
  17. package/src/app/core/peer/select-peer.module.d.ts +3 -1
  18. package/src/app/core/services/config/core.config.d.ts +1 -0
  19. package/src/app/core/services/model/node-feature.model.d.ts +14 -0
  20. package/src/app/core/services/model/peer.model.d.ts +5 -0
  21. package/src/app/core/services/network.utils.d.ts +2 -0
  22. package/src/assets/i18n/en-US.json +6 -1
  23. package/src/assets/i18n/en.json +6 -1
  24. package/src/assets/i18n/fr.json +7 -2
  25. package/src/assets/manifest.json +1 -1
  26. package/src/environments/environment.class.d.ts +2 -0
  27. 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.26",
5
5
  "author": "contact@e-is.pro",
6
6
  "license": "AGPL-3.0",
7
7
  "readmeFilename": "README.md",
@@ -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;
@@ -147,6 +147,7 @@
147
147
  "CONFIGURATION": {
148
148
  "OPTIONS": {
149
149
  "ANDROID_INSTALL_URL": "Android > Install App URL",
150
+ "IOS_INSTALL_URL": "iOS > Install App URL",
150
151
  "DB_TIMEZONE": "Persistence > Database timezone (readonly option)",
151
152
  "LOGO": "Menu > Logo (max width 110px)",
152
153
  "FAVICON": "favicon",
@@ -474,8 +475,12 @@
474
475
  "OFFLINE": "Unreachable node",
475
476
  "SELECT_MODAL": {
476
477
  "TITLE": "Network nodes",
478
+ "STARTUP_TITLE": "Startup",
479
+ "TAB_NETWORK": "Databases",
480
+ "TAB_FEATURES": "Data collection programs",
477
481
  "BTN_SET_MANUALLY": "Define manually",
478
- "HELP": "Please choose a network node to connect to:",
482
+ "NETWORK_HELP": "Please choose a <b>database</b> node to connect to:",
483
+ "FEATURES_HELP": "Please choose a <b>data collection program</b> you would like to participate in:",
479
484
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
480
485
  }
481
486
  },
@@ -146,6 +146,7 @@
146
146
  "CONFIGURATION": {
147
147
  "OPTIONS": {
148
148
  "ANDROID_INSTALL_URL": "Android > Install App URL",
149
+ "IOS_INSTALL_URL": "iOS > Install App URL",
149
150
  "DB_TIMEZONE": "Persistence > Database timezone (readonly option)",
150
151
  "LOGO": "Menu > Logo (max width 110px)",
151
152
  "FAVICON": "favicon",
@@ -473,8 +474,12 @@
473
474
  "OFFLINE": "Unreachable node",
474
475
  "SELECT_MODAL": {
475
476
  "TITLE": "Network nodes",
477
+ "STARTUP_TITLE": "Startup",
478
+ "TAB_NETWORK": "Databases",
479
+ "TAB_FEATURES": "Data collection programmes",
476
480
  "BTN_SET_MANUALLY": "Define manually",
477
- "HELP": "Please choose a network node to connect to:",
481
+ "NETWORK_HELP": "Please choose a <b>database</b> node to connect to:",
482
+ "FEATURES_HELP": "Please choose a <b>data collection programme</b> you would like to participate in:",
478
483
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
479
484
  }
480
485
  },
@@ -146,6 +146,7 @@
146
146
  "CONFIGURATION": {
147
147
  "OPTIONS": {
148
148
  "ANDROID_INSTALL_URL": "Android > URL d'installation App",
149
+ "IOS_INSTALL_URL": "iOS > URL d'installation App",
149
150
  "DB_TIMEZONE": "Persistance > Timezone de la base de données (option non modifiable)",
150
151
  "LOGO": "Menu > Logo (largeur max 110px)",
151
152
  "FAVICON": "favicon",
@@ -472,9 +473,13 @@
472
473
  "PEER": {
473
474
  "OFFLINE": "Nœud injoignable",
474
475
  "SELECT_MODAL": {
475
- "TITLE": "Nœuds réseau",
476
+ "TITLE": "Sélection du nœud réseau",
477
+ "STARTUP_TITLE": "Démarrage",
478
+ "TAB_NETWORK": "Bases de données",
479
+ "TAB_FEATURES": "Programmes de collecte",
476
480
  "BTN_SET_MANUALLY": "Saisir manuellement",
477
- "HELP": "Veuillez choisir un nœud réseau auquel vous connecter :",
481
+ "NETWORK_HELP": "Veuillez choisir la <b>base de données</b> à laquelle vous souhaitez vous connecter :",
482
+ "FEATURES_HELP": "Veuillez choisir un <b>programme de collecte ou d'expérimentation</b> auquel vous souhaitez participer :",
478
483
  "NOT_COMPATIBLE_HELP": "Version requise : v{{version}} ou +"
479
484
  }
480
485
  },
@@ -2,7 +2,7 @@
2
2
  "name": "ngx-sumaris-components",
3
3
  "short_name": "ngx-sumaris-components",
4
4
  "manifest_version": 1,
5
- "version": "18.2.25",
5
+ "version": "18.2.26",
6
6
  "default_locale": "fr",
7
7
  "description": "Angular components for building beautiful and responsive Apps",
8
8
  "icons": [{
@@ -32,6 +32,7 @@ export declare class Environment {
32
32
  }[];
33
33
  peerMinVersion?: string;
34
34
  peerDefaultPrefix?: string;
35
+ enableSelectPeerByFeature?: boolean;
35
36
  checkAppVersionIntervalInSeconds?: number;
36
37
  persistCache?: boolean;
37
38
  offline?: boolean;
@@ -41,6 +42,7 @@ export declare class Environment {
41
42
  defaultDepartmentId?: number;
42
43
  defaultAppName?: string;
43
44
  defaultAndroidInstallUrl?: string;
45
+ defaultIOSInstallUrl?: string;
44
46
  useHash?: boolean;
45
47
  allowDarkMode?: boolean;
46
48
  logging?: Partial<LoggingServiceConfig>;
@@ -312,9 +312,10 @@ ion-list,
312
312
  // Define useful variable
313
313
  html.plt-ios {
314
314
  --ion-searchbar-height: 60px;
315
+ //--ion-toolbar-height: 58px;
315
316
  }
316
317
  html {
317
- --ion-searchbar-height: 58px;
318
+ //--ion-searchbar-height: 58px;
318
319
  }
319
320
 
320
321
  ion-list,