@sumaris-net/ngx-components 1.17.1 → 1.18.1

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 (39) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +623 -540
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +9 -0
  6. package/esm2015/src/app/core/graphql/graphql.service.js +3 -2
  7. package/esm2015/src/app/core/services/config.service.js +3 -2
  8. package/esm2015/src/app/core/services/local-settings.service.js +2 -2
  9. package/esm2015/src/app/core/services/platform.service.js +12 -11
  10. package/esm2015/src/app/shared/directives/autofocus.directive.js +4 -2
  11. package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +1 -1
  12. package/esm2015/src/app/shared/inputs.js +1 -1
  13. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +103 -61
  14. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +20 -5
  15. package/esm2015/src/app/shared/material/chips/material.chips.js +26 -23
  16. package/esm2015/src/app/shared/material/datetime/material.date.js +8 -9
  17. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +8 -8
  18. package/esm2015/src/app/shared/material/datetime/material.datetime.js +7 -8
  19. package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +3 -3
  20. package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +4 -7
  21. package/esm2015/src/app/shared/material/latlong/material.latlong.js +4 -6
  22. package/esm2015/src/app/shared/material/material.module.js +1 -1
  23. package/esm2015/src/app/shared/platforms.js +2 -2
  24. package/esm2015/src/app/shared/services/entity-service.class.js +1 -1
  25. package/fesm2015/sumaris-net.ngx-components.js +596 -529
  26. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  27. package/package.json +1 -1
  28. package/src/app/core/services/platform.service.d.ts +1 -1
  29. package/src/app/shared/directives/autofocus.directive.d.ts +2 -1
  30. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +8 -3
  31. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +5 -3
  32. package/src/app/shared/material/datetime/material.date.d.ts +2 -4
  33. package/src/app/shared/material/datetime/material.dateshort.d.ts +2 -3
  34. package/src/app/shared/material/datetime/material.datetime.d.ts +1 -3
  35. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +1 -3
  36. package/src/app/shared/material/latlong/material.latlong.d.ts +1 -3
  37. package/src/app/shared/services/entity-service.class.d.ts +4 -1
  38. package/src/theme/_ngx-components.scss +67 -20
  39. package/sumaris-net.ngx-components.metadata.json +1 -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": "1.17.1",
4
+ "version": "1.18.1",
5
5
  "author": "contact@e-is.pro",
6
6
  "license": "AGPL-3.0",
7
7
  "readmeFilename": "README.md",
@@ -60,8 +60,8 @@ export declare class PlatformService extends StartableService {
60
60
  isCordova(): boolean;
61
61
  isAndroidCordova(): boolean;
62
62
  isIOSCordova(): boolean;
63
- isWeb(): boolean;
64
63
  isApp(): boolean;
64
+ isWeb(): boolean;
65
65
  isMobileWeb(): boolean;
66
66
  get canDownload(): boolean;
67
67
  get canOpenFile(): boolean;
@@ -1,4 +1,5 @@
1
1
  import { AfterContentInit, ElementRef, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { Platform } from '@ionic/angular';
2
3
  import { Keyboard } from '@ionic-native/keyboard/ngx';
3
4
  export declare class AutofocusDirective implements AfterContentInit, OnChanges, OnDestroy {
4
5
  protected keyboard: Keyboard;
@@ -7,7 +8,7 @@ export declare class AutofocusDirective implements AfterContentInit, OnChanges,
7
8
  private readonly _elementRef;
8
9
  private readonly _mobile;
9
10
  private _timer;
10
- constructor(elementRef: ElementRef, keyboard: Keyboard);
11
+ constructor(platform: Platform, elementRef: ElementRef, keyboard: Keyboard);
11
12
  ngAfterContentInit(): void;
12
13
  ngOnChanges(changes: SimpleChanges): void;
13
14
  ngOnDestroy(): void;
@@ -7,6 +7,7 @@ import { DisplayFn, EqualsFn } from '../../form/field.model';
7
7
  import { FloatLabelType } from '@angular/material/form-field';
8
8
  import { MatSelect } from '@angular/material/select';
9
9
  import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
10
+ import { IonSearchbar } from '@ionic/angular';
10
11
  export declare interface MatAutocompleteFieldConfig<T = any, F = any> {
11
12
  attributes: string[];
12
13
  suggestFn?: (value: any, options?: any) => Promise<T[] | LoadResult<T>>;
@@ -14,6 +15,7 @@ export declare interface MatAutocompleteFieldConfig<T = any, F = any> {
14
15
  items?: Observable<T[]> | T[];
15
16
  columnSizes?: (number | 'auto' | undefined)[];
16
17
  columnNames?: (string | undefined)[];
18
+ multiple?: boolean;
17
19
  displayWith?: DisplayFn;
18
20
  equals?: EqualsFn;
19
21
  showAllOnFocus?: boolean;
@@ -75,6 +77,8 @@ export declare class MatAutocompleteField implements OnInit, OnDestroy, InputEle
75
77
  suggestLengthThreshold: number;
76
78
  showLoadingSpinner: boolean;
77
79
  debug: boolean;
80
+ showSearchBar: boolean;
81
+ stickySearchBar: boolean;
78
82
  clicked: EventEmitter<MouseEvent>;
79
83
  blurred: EventEmitter<FocusEvent>;
80
84
  focused: EventEmitter<FocusEvent>;
@@ -82,15 +86,14 @@ export declare class MatAutocompleteField implements OnInit, OnDestroy, InputEle
82
86
  keydownEscape: EventEmitter<any>;
83
87
  keyupEnter: EventEmitter<any>;
84
88
  matSelect: MatSelect;
89
+ ionSearchbar: IonSearchbar;
85
90
  matInputText: ElementRef;
86
91
  autocomplete: MatAutocomplete;
87
92
  autocompleteTrigger: MatAutocompleteTrigger;
88
93
  _readonly: boolean;
89
94
  _tabindex: number;
90
- matSelectItems$: Observable<any[]>;
91
95
  $inputItems: BehaviorSubject<any[]>;
92
96
  $filteredItems: BehaviorSubject<any[]>;
93
- searchable: boolean;
94
97
  displayValue: string;
95
98
  _moreItemsCount: number;
96
99
  _fetchMore$: EventEmitter<Event>;
@@ -117,6 +120,7 @@ export declare class MatAutocompleteField implements OnInit, OnDestroy, InputEle
117
120
  get disabled(): boolean;
118
121
  get enabled(): boolean;
119
122
  get loading(): boolean;
123
+ get desktop(): boolean;
120
124
  ngOnInit(): void;
121
125
  ngOnDestroy(): void;
122
126
  /**
@@ -130,9 +134,10 @@ export declare class MatAutocompleteField implements OnInit, OnDestroy, InputEle
130
134
  focus(): void;
131
135
  filterInputTextFocusEvent(event: FocusEvent): boolean;
132
136
  filterInputTextBlurEvent(event: FocusEvent): boolean;
137
+ ionSearchBarChanged(event: CustomEvent<InputEvent>): void;
138
+ ionSearchBarClear(event: UIEvent): void;
133
139
  filterMatSelectFocusEvent(event: FocusEvent): void;
134
140
  filterMatSelectBlurEvent(event: FocusEvent): boolean;
135
- toggleSearch(event: UIEvent): void;
136
141
  clearValue(event: UIEvent): void;
137
142
  _initAutocompleteInfiniteScroll(threshold?: string): void;
138
143
  _initMatSelectInfiniteScroll(threshold?: string): void;
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { OnInit } from '@angular/core';
3
- import { FormBuilder, FormGroup } from '@angular/forms';
4
- import { MatAutocompleteConfigHolder } from '../material.autocomplete';
3
+ import { FormArray, FormBuilder, FormGroup } from '@angular/forms';
4
+ import { MatAutocompleteConfigHolder, MatAutocompleteField } from '../material.autocomplete';
5
5
  import { LoadResult } from '../../../services/entity-service.class';
6
6
  import Timer = NodeJS.Timer;
7
7
  declare class EntityTestClass {
@@ -20,18 +20,20 @@ export declare class AutocompleteTestPage implements OnInit {
20
20
  memoryAutocompleteFieldName: string;
21
21
  memoryTimer: Timer;
22
22
  mode: 'mobile' | 'desktop' | 'memory' | 'temp';
23
+ entitiesArray: FormArray;
23
24
  constructor(formBuilder: FormBuilder);
24
25
  ngOnInit(): void;
25
26
  loadData(): Promise<void>;
26
27
  loadItems(): Promise<void>;
27
28
  entityToString(item: any): string;
29
+ entitiesToString(items: any[]): string;
28
30
  suggest(value: any, filter?: any): Promise<LoadResult<EntityTestClass>>;
29
31
  doSubmit(event: any): void;
30
32
  equals(o1: EntityTestClass, o2: EntityTestClass): boolean;
31
33
  toggleMode(value: any): void;
32
34
  startMemoryTimer(): void;
33
35
  stopMemoryTimer(): void;
34
- updateFilter(fieldName: string): void;
36
+ updateFilter(autocompleteField: MatAutocompleteField, fieldName: string): void;
35
37
  stringify(value: any): string;
36
38
  }
37
39
  export {};
@@ -1,5 +1,4 @@
1
1
  import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit, QueryList } from '@angular/core';
2
- import { Platform } from '@ionic/angular';
3
2
  import { AbstractControl, ControlValueAccessor, FormBuilder, FormControl, FormGroupDirective } from '@angular/forms';
4
3
  import { TranslateService } from '@ngx-translate/core';
5
4
  import { Moment } from 'moment';
@@ -9,7 +8,6 @@ import { FloatLabelType } from '@angular/material/form-field';
9
8
  import { DateFilterFn, MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';
10
9
  import { DateAdapter } from '@angular/material/core';
11
10
  export declare class MatDate implements OnInit, OnDestroy, ControlValueAccessor, InputElement {
12
- private platform;
13
11
  private dateAdapter;
14
12
  private translate;
15
13
  private formBuilder;
@@ -29,12 +27,12 @@ export declare class MatDate implements OnInit, OnDestroy, ControlValueAccessor,
29
27
  dayPattern: string;
30
28
  locale: string;
31
29
  readonly dayMask: (string | RegExp)[];
30
+ mobile: boolean;
32
31
  formControl: FormControl;
33
32
  formControlName: string;
34
33
  placeholder: string;
35
34
  floatLabel: FloatLabelType;
36
35
  required: boolean;
37
- mobile: boolean;
38
36
  compact: boolean;
39
37
  placeholderChar: string;
40
38
  autofocus: boolean;
@@ -49,7 +47,7 @@ export declare class MatDate implements OnInit, OnDestroy, ControlValueAccessor,
49
47
  get value(): any;
50
48
  datePicker: MatDatepicker<Moment>;
51
49
  matInputs: QueryList<ElementRef>;
52
- constructor(platform: Platform, dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
50
+ constructor(dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
53
51
  ngOnInit(): void;
54
52
  ngOnDestroy(): void;
55
53
  writeValue(value: any): void;
@@ -1,5 +1,4 @@
1
1
  import { ChangeDetectorRef, ElementRef, OnInit, QueryList } from '@angular/core';
2
- import { Platform } from '@ionic/angular';
3
2
  import { AbstractControl, ControlValueAccessor, FormBuilder, FormControl, FormGroupDirective } from '@angular/forms';
4
3
  import { TranslateService } from '@ngx-translate/core';
5
4
  import { Moment } from 'moment/moment';
@@ -21,13 +20,13 @@ export declare class MatDateShort implements OnInit, ControlValueAccessor, Input
21
20
  protected disabling: boolean;
22
21
  protected _tabindex: number;
23
22
  protected keyboardHideDelay: number;
24
- mobile: boolean;
25
23
  dayControl: AbstractControl;
26
24
  displayPattern: string;
27
25
  dayPattern: string;
28
26
  _value: Moment;
29
27
  locale: string;
30
28
  dayMask: RegExp[];
29
+ mobile: boolean;
31
30
  disabled: boolean;
32
31
  formControl: FormControl;
33
32
  formControlName: string;
@@ -45,7 +44,7 @@ export declare class MatDateShort implements OnInit, ControlValueAccessor, Input
45
44
  datePicker2: MatDatepicker<Moment>;
46
45
  matInputs: QueryList<ElementRef>;
47
46
  get value(): any;
48
- constructor(platform: Platform, dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
47
+ constructor(dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
49
48
  ngOnInit(): void;
50
49
  writeValue(obj: any): void;
51
50
  registerOnChange(fn: any): void;
@@ -1,5 +1,4 @@
1
1
  import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit, QueryList } from '@angular/core';
2
- import { Platform } from '@ionic/angular';
3
2
  import { DateAdapter } from '@angular/material/core';
4
3
  import { FloatLabelType } from '@angular/material/form-field';
5
4
  import { ControlValueAccessor, FormBuilder, FormControl, FormGroupDirective } from '@angular/forms';
@@ -19,7 +18,6 @@ declare interface NgxTimePicker {
19
18
  close(): any;
20
19
  }
21
20
  export declare class MatDateTime implements OnInit, OnDestroy, ControlValueAccessor, InputElement {
22
- private platform;
23
21
  private dateAdapter;
24
22
  private translate;
25
23
  private formBuilder;
@@ -61,7 +59,7 @@ export declare class MatDateTime implements OnInit, OnDestroy, ControlValueAcces
61
59
  datePicker: MatDatepicker<Moment>;
62
60
  timePicker: NgxTimePicker;
63
61
  matInputs: QueryList<ElementRef>;
64
- constructor(platform: Platform, dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
62
+ constructor(dateAdapter: DateAdapter<Moment>, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, keyboard: Keyboard, formGroupDir: FormGroupDirective);
65
63
  ngOnInit(): void;
66
64
  ngOnDestroy(): void;
67
65
  writeValue(value: any): void;
@@ -1,10 +1,8 @@
1
1
  /// <reference types="node" />
2
2
  import { ChangeDetectorRef, OnInit } from '@angular/core';
3
3
  import { FormBuilder, FormGroup } from '@angular/forms';
4
- import { Platform } from '@ionic/angular';
5
4
  import Timer = NodeJS.Timer;
6
5
  export declare class DateTestPage implements OnInit {
7
- protected platform: Platform;
8
6
  protected formBuilder: FormBuilder;
9
7
  protected cd: ChangeDetectorRef;
10
8
  showLogPanel: boolean;
@@ -14,7 +12,7 @@ export declare class DateTestPage implements OnInit {
14
12
  memoryTimer: Timer;
15
13
  timezone: string;
16
14
  form: FormGroup;
17
- constructor(platform: Platform, formBuilder: FormBuilder, cd: ChangeDetectorRef);
15
+ constructor(formBuilder: FormBuilder, cd: ChangeDetectorRef);
18
16
  ngOnInit(): void;
19
17
  loadData(): Promise<void>;
20
18
  doSubmit(event: any): void;
@@ -1,12 +1,10 @@
1
1
  import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
- import { Platform } from '@ionic/angular';
3
2
  import { FloatLabelType } from '@angular/material/form-field';
4
3
  import { ControlValueAccessor, FormBuilder, FormControl, FormGroupDirective } from '@angular/forms';
5
4
  import { TranslateService } from '@ngx-translate/core';
6
5
  import { LatLongFormatFn, LatLongFormatOptions, LatLongPattern } from './latlong.utils';
7
6
  import { TextMaskConfig } from 'angular2-text-mask';
8
7
  export declare class MatLatLongField implements OnInit, OnDestroy, ControlValueAccessor {
9
- private platform;
10
8
  private translate;
11
9
  private formBuilder;
12
10
  private cd;
@@ -44,7 +42,7 @@ export declare class MatLatLongField implements OnInit, OnDestroy, ControlValueA
44
42
  onBlur: EventEmitter<FocusEvent>;
45
43
  onFocus: EventEmitter<FocusEvent>;
46
44
  inputElement: ElementRef;
47
- constructor(platform: Platform, translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, formGroupDir: FormGroupDirective);
45
+ constructor(translate: TranslateService, formBuilder: FormBuilder, cd: ChangeDetectorRef, formGroupDir: FormGroupDirective);
48
46
  ngOnInit(): void;
49
47
  ngOnDestroy(): void;
50
48
  writeValue(obj: any): void;
@@ -16,7 +16,10 @@ export declare interface LoadResult<T> {
16
16
  errors?: any[];
17
17
  fetchMore?: FetchMoreFn<LoadResult<T>>;
18
18
  }
19
- export declare type SuggestFn<T, F> = (value: any, filter?: F, sortBy?: string, sortDirection?: SortDirection) => Promise<T[] | LoadResult<T>>;
19
+ export declare type SuggestFn<T, F> = (value: any, filter?: F, sortBy?: string | keyof T, sortDirection?: SortDirection, opts?: {
20
+ fetchPolicy: FetchPolicy;
21
+ [key: string]: any;
22
+ }) => Promise<T[] | LoadResult<T>>;
20
23
  export declare interface SuggestService<T, F> {
21
24
  suggest: SuggestFn<T, F>;
22
25
  }
@@ -274,7 +274,7 @@ mat-option {
274
274
  }
275
275
  }
276
276
 
277
- mat-option:not(:last-child) {
277
+ mat-option:not(:last-of-type) {
278
278
  border-bottom: 1px solid #{$app-select-option-border-color};
279
279
  }
280
280
 
@@ -322,31 +322,77 @@ mat-option:not(:last-child) {
322
322
  left: 0;
323
323
  }
324
324
 
325
+ .mat-select-panel,
326
+ .mat-autocomplete-panel {
327
+ /* when multiple selection enable */
328
+ mat-pseudo-checkbox {
329
+ margin-left: 8px;
330
+ }
331
+ }
325
332
  .mat-select-panel,
326
333
  .mat-menu-panel,
327
334
  .mat-autocomplete-panel {
328
335
 
336
+ /* Avoid bad display, when opening panel for the first time */
337
+ &.ng-trigger-transformPanel {
338
+ ion-searchbar.mat-select-header,
339
+ ion-searchbar.mat-autocomplete-header {
340
+ visibility: visible;
341
+ display: flex;
342
+ opacity: 1;
343
+ transition: opacity 0.3s ease-in-out;
344
+ }
345
+ }
346
+
347
+ ion-searchbar.mat-select-header,
348
+ ion-searchbar.mat-autocomplete-header
349
+ {
350
+ visibility: hidden;
351
+ display: none;
352
+ opacity: 0;
353
+
354
+ height: 58px;
355
+ background-color: var(--ion-color-secondary100) !important;
356
+
357
+ &.ion-searchbar-sticky {
358
+ z-index: 1001;
359
+ /* Set header as sticky*/
360
+ position: -webkit-sticky;
361
+ position: sticky;
362
+ top: 0;
363
+ }
364
+ }
365
+
329
366
  ion-row.mat-select-header,
330
367
  ion-row.mat-menu-header,
331
368
  ion-row.mat-autocomplete-header {
332
- /* Set header as sticky*/
333
- position: -webkit-sticky;
334
- position: sticky;
335
- top: 0;
336
- z-index: 1001;
337
-
338
- background-color: var(--ion-color-secondary);
339
- color: var(--ion-color-secondary-contrast);
340
- border-bottom: 1px solid #{$app-select-option-border-color};
341
- @include font-size(12px);
342
- font-weight: 500;
343
- height: 20px;
344
- line-height: 20px;
345
-
346
- ion-col {
347
- white-space: nowrap;
348
- text-overflow: ellipsis;
369
+ &.multiple {
370
+ /* Offset due to mat-pseudo-checkbox */
371
+ padding-left: 32px;
372
+ }
373
+ &.column {
374
+ /* Set header as sticky*/
375
+ position: -webkit-sticky;
376
+ position: sticky;
377
+ top: 0;
378
+ z-index: 1001;
379
+ background-color: var(--ion-color-secondary);
380
+ border-bottom: 1px solid #{$app-select-option-border-color};
381
+ color: var(--ion-color-secondary-contrast);
382
+ line-height: 20px;
383
+ @include font-size(12px);
384
+ font-weight: 500;
385
+ height: 20px;
386
+ ion-col {
387
+ white-space: nowrap;
388
+ text-overflow: ellipsis;
389
+ }
390
+ &.ion-searchbar-sticky {
391
+ /* offset because of the searchbar height */
392
+ top: 58px;
393
+ }
349
394
  }
395
+
350
396
  }
351
397
 
352
398
  ion-row.mat-select-footer,
@@ -357,7 +403,7 @@ mat-option:not(:last-child) {
357
403
  position: sticky;
358
404
  bottom: 0;
359
405
  z-index: 1001;
360
-
406
+ border-top: 1px solid #{$app-select-option-border-color};
361
407
  background-color: whitesmoke;
362
408
  color: var(--ion-color-medium);
363
409
  @include font-size(12px);
@@ -375,8 +421,9 @@ mat-option:not(:last-child) {
375
421
  --ion-grid-column-padding: 0;
376
422
 
377
423
  ion-col {
424
+ --ion-padding-start: 8px;
378
425
  padding: 0 !important;
379
- padding-left: 8px !important;
426
+ padding-left: var(--ion-padding-start) !important;
380
427
  text-overflow: ellipsis;
381
428
  overflow: hidden;
382
429
  }