@sumaris-net/ngx-components 1.18.7 → 1.19.2
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/bundles/sumaris-net.ngx-components.umd.js +804 -429
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +10 -0
- package/esm2015/public_api.js +10 -5
- package/esm2015/src/app/admin/admin-routing.module.js +3 -1
- package/esm2015/src/app/admin/admin.module.js +2 -1
- package/esm2015/src/app/admin/users/list/users.js +45 -7
- package/esm2015/src/app/core/services/base-entity-service.class.js +6 -6
- package/esm2015/src/app/core/services/local-settings.service.js +5 -5
- package/esm2015/src/app/core/services/model/referential.model.js +1 -1
- package/esm2015/src/app/core/services/platform.service.js +3 -4
- package/esm2015/src/app/shared/material/datetime/material.date.js +82 -70
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +3 -3
- package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +7 -5
- package/esm2015/src/app/shared/platforms.js +20 -4
- package/esm2015/src/app/shared/validator/validators.js +2 -2
- package/esm2015/src/app/social/message/message.form.js +73 -0
- package/esm2015/src/app/social/message/message.modal.js +96 -0
- package/esm2015/src/app/social/message/message.model.js +65 -0
- package/esm2015/src/app/social/message/message.service.js +87 -0
- package/esm2015/src/app/social/social.errors.js +6 -0
- package/esm2015/src/app/social/social.module.js +12 -15
- package/esm2015/src/app/social/user-event/user-event.fragments.js +27 -0
- package/esm2015/src/app/social/user-event/user-event.model.js +46 -0
- package/esm2015/src/app/social/user-event/user-event.service.js +367 -0
- package/esm2015/src/app/social/user-event/user-events.table.js +154 -0
- package/fesm2015/sumaris-net.ngx-components.js +734 -411
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +4 -3
- package/public_api.d.ts +9 -4
- package/src/app/admin/users/list/users.d.ts +10 -6
- package/src/app/core/services/local-settings.service.d.ts +3 -2
- package/src/app/core/services/model/referential.model.d.ts +7 -7
- package/src/app/shared/material/datetime/material.date.d.ts +6 -8
- package/src/app/shared/material/datetime/material.datetime.d.ts +2 -2
- package/src/app/shared/platforms.d.ts +1 -1
- package/src/app/social/message/message.form.d.ts +27 -0
- package/src/app/social/message/message.modal.d.ts +36 -0
- package/src/app/social/message/message.model.d.ts +31 -0
- package/src/app/social/message/message.service.d.ts +24 -0
- package/src/app/social/{services/errors.d.ts → social.errors.d.ts} +2 -1
- package/src/app/social/social.module.d.ts +0 -2
- package/src/app/social/{services/social.fragments.d.ts → user-event/user-event.fragments.d.ts} +1 -1
- package/src/app/social/{services/model → user-event}/user-event.model.d.ts +1 -1
- package/src/app/social/{services → user-event}/user-event.service.d.ts +4 -3
- package/src/app/social/{list → user-event}/user-events.table.d.ts +2 -2
- package/src/assets/i18n/en-US.json +23 -4
- package/src/assets/i18n/en.json +23 -4
- package/src/assets/i18n/fr.json +25 -5
- package/src/theme/_ionic.globals.scss +2 -1
- package/sumaris-net.ngx-components.metadata.json +1 -1
- package/esm2015/src/app/admin/services/errors.js +0 -6
- package/esm2015/src/app/social/list/user-events.table.js +0 -154
- package/esm2015/src/app/social/services/errors.js +0 -5
- package/esm2015/src/app/social/services/model/user-event.model.js +0 -46
- package/esm2015/src/app/social/services/social.fragments.js +0 -27
- package/esm2015/src/app/social/services/user-event.service.js +0 -367
- package/src/app/admin/services/errors.d.ts +0 -5
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import * as i1$3 from '@angular/common';
|
|
1
|
+
import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, ɵɵdefineInjectable, ɵɵinject, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, INJECTOR, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
|
|
4
2
|
import { CommonModule, DOCUMENT, Location } from '@angular/common';
|
|
5
3
|
import { CdkTableModule } from '@angular/cdk/table';
|
|
6
4
|
import { A11yModule } from '@angular/cdk/a11y';
|
|
7
5
|
import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
|
|
8
6
|
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
9
|
-
import * as i1$2 from '@angular/material/core';
|
|
10
7
|
import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
|
|
11
8
|
import { MatTableModule, MatTable, MatColumnDef } from '@angular/material/table';
|
|
12
9
|
import { MatSortModule, MatSort } from '@angular/material/sort';
|
|
@@ -30,22 +27,17 @@ import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
|
30
27
|
import { MatRadioModule } from '@angular/material/radio';
|
|
31
28
|
import { MatBadgeModule } from '@angular/material/badge';
|
|
32
29
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
33
|
-
import * as i2$1 from '@angular/material/dialog';
|
|
34
30
|
import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
|
|
35
31
|
import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS } from '@angular/material/autocomplete';
|
|
36
32
|
import { __awaiter, __decorate } from 'tslib';
|
|
37
|
-
import * as i1$6 from '@angular/forms';
|
|
38
33
|
import { Validators, NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, FormBuilder } from '@angular/forms';
|
|
39
34
|
import { timer, merge, fromEvent, BehaviorSubject, Subscription, Subject, isObservable, from, of, noop as noop$9, Observable, defer, forkJoin, combineLatest, EMPTY } from 'rxjs';
|
|
40
35
|
import { filter, first, map, takeUntil, switchMap, startWith, debounceTime, takeWhile, tap, distinctUntilChanged, mergeMap, catchError, throttleTime, skip } from 'rxjs/operators';
|
|
41
36
|
import { trigger, transition, style, animate, state } from '@angular/animations';
|
|
42
|
-
import * as i1$1 from '@ngx-translate/core';
|
|
43
37
|
import { TranslateService, TranslateModule } from '@ngx-translate/core';
|
|
44
|
-
import * as i1$4 from '@ionic/angular';
|
|
45
38
|
import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
|
|
46
39
|
import * as momentImported from 'moment';
|
|
47
40
|
import { isMoment } from 'moment';
|
|
48
|
-
import * as i1 from '@angular/material-moment-adapter';
|
|
49
41
|
import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
|
|
50
42
|
import * as momentTZImported from 'moment-timezone';
|
|
51
43
|
import { Keyboard } from '@ionic-native/keyboard/ngx';
|
|
@@ -55,38 +47,32 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
|
55
47
|
import { MatDividerModule } from '@angular/material/divider';
|
|
56
48
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
57
49
|
import { MatChipsModule } from '@angular/material/chips';
|
|
58
|
-
import * as i3$3 from '@angular/router';
|
|
59
50
|
import { Router, ActivatedRoute, RouterModule, RouteReuseStrategy } from '@angular/router';
|
|
60
|
-
import * as i1$5 from '@angular/platform-browser';
|
|
61
51
|
import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
|
|
62
|
-
import * as i2$2 from '@angular/common/http';
|
|
63
52
|
import { HttpResponse, HttpClient, HttpHeaders, HttpEventType, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
|
64
53
|
import { ColorPickerModule } from 'ngx-color-picker';
|
|
65
|
-
import { NativeAudio } from '@ionic-native/native-audio/ngx';
|
|
66
|
-
import { Vibration } from '@ionic-native/vibration/ngx';
|
|
54
|
+
import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
|
|
55
|
+
import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
|
|
67
56
|
import { AudioManagement } from '@ionic-native/audio-management/ngx';
|
|
68
|
-
import
|
|
69
|
-
import
|
|
70
|
-
import
|
|
57
|
+
import { NativeAudio } from '@ionic-native/native-audio/ngx/index';
|
|
58
|
+
import { Vibration } from '@ionic-native/vibration/ngx/index';
|
|
59
|
+
import { AudioManagement as AudioManagement$1 } from '@ionic-native/audio-management/ngx/index';
|
|
71
60
|
import * as uuidv4Imported from 'uuid/v4';
|
|
72
61
|
import { DragDropModule } from '@angular/cdk/drag-drop';
|
|
73
62
|
import { MarkdownModule } from 'ngx-markdown';
|
|
74
63
|
import { sign, box, hash, verify } from 'tweetnacl';
|
|
75
|
-
import * as i3$1 from '@ionic/storage';
|
|
76
64
|
import { Storage, IonicStorageModule } from '@ionic/storage';
|
|
77
65
|
import 'zone.js/dist/zone-error';
|
|
78
|
-
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
|
|
79
|
-
import { Connection, Network } from '@ionic-native/network/ngx';
|
|
80
|
-
import { CacheService, CacheModule } from 'ionic-cache';
|
|
81
|
-
import
|
|
82
|
-
import
|
|
83
|
-
import
|
|
84
|
-
import { StatusBar } from '@ionic-native/status-bar/ngx';
|
|
85
|
-
import * as i2$4 from '@angular/cdk/platform';
|
|
66
|
+
import { SplashScreen as SplashScreen$1 } from '@ionic-native/splash-screen/ngx';
|
|
67
|
+
import { Connection, Network as Network$1 } from '@ionic-native/network/ngx';
|
|
68
|
+
import { CacheService as CacheService$1, CacheModule } from 'ionic-cache';
|
|
69
|
+
import { CacheService } from 'ionic-cache/dist/cache.service';
|
|
70
|
+
import { Network } from '@ionic-native/network/ngx/index';
|
|
71
|
+
import { SplashScreen } from '@ionic-native/splash-screen/ngx/index';
|
|
72
|
+
import { StatusBar as StatusBar$1 } from '@ionic-native/status-bar/ngx';
|
|
86
73
|
import { Platform as Platform$1 } from '@angular/cdk/platform';
|
|
87
|
-
import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
|
|
74
|
+
import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
|
|
88
75
|
import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
|
|
89
|
-
import * as i2$3 from 'apollo-angular';
|
|
90
76
|
import { Apollo } from 'apollo-angular';
|
|
91
77
|
import { WebSocketLink } from '@apollo/client/link/ws';
|
|
92
78
|
import { getMainDefinition } from '@apollo/client/utilities';
|
|
@@ -94,14 +80,13 @@ import { RetryLink } from '@apollo/client/link/retry';
|
|
|
94
80
|
import QueueLink from 'apollo-link-queue';
|
|
95
81
|
import SerializingLink from 'apollo-link-serialize';
|
|
96
82
|
import loggerLink from 'apollo-link-logger';
|
|
97
|
-
import * as i3$2 from 'apollo-angular/http';
|
|
98
83
|
import { HttpLink } from 'apollo-angular/http';
|
|
99
84
|
import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
|
|
100
|
-
import { NotificationVisibility, Downloader } from '@ionic-native/downloader/ngx';
|
|
101
|
-
import
|
|
102
|
-
import
|
|
103
|
-
import
|
|
104
|
-
import
|
|
85
|
+
import { NotificationVisibility, Downloader as Downloader$1 } from '@ionic-native/downloader/ngx';
|
|
86
|
+
import { StatusBar } from '@ionic-native/status-bar/ngx/index';
|
|
87
|
+
import { Keyboard as Keyboard$1 } from '@ionic-native/keyboard/ngx/index';
|
|
88
|
+
import { InAppBrowser } from '@ionic-native/in-app-browser/ngx/index';
|
|
89
|
+
import { Downloader } from '@ionic-native/downloader/ngx/index';
|
|
105
90
|
import { CdkTextareaAutosize } from '@angular/cdk/text-field';
|
|
106
91
|
import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
|
|
107
92
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
@@ -1069,6 +1054,10 @@ trigger('slideUpDownAnimation', [
|
|
|
1069
1054
|
/* ---
|
|
1070
1055
|
* Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts
|
|
1071
1056
|
* --- */
|
|
1057
|
+
const _cache = {
|
|
1058
|
+
mobile: null,
|
|
1059
|
+
cordova: null
|
|
1060
|
+
};
|
|
1072
1061
|
const matchMedia = (win, query) => win.matchMedia(query).matches;
|
|
1073
1062
|
const testUserAgent = (win, expr) => {
|
|
1074
1063
|
const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
|
|
@@ -1076,22 +1065,34 @@ const testUserAgent = (win, expr) => {
|
|
|
1076
1065
|
};
|
|
1077
1066
|
const isWindows = (win) => testUserAgent(win, /windows/i);
|
|
1078
1067
|
const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
|
|
1079
|
-
const isMobile = (win) => isCordova(window) || isAndroid(win) || isIOS(window) || (isTouchUi(win) && !isWindows(win));
|
|
1080
1068
|
const isIpad = (win) => {
|
|
1081
1069
|
// iOS 12 and below
|
|
1082
1070
|
if (testUserAgent(win, /iPad/i)) {
|
|
1083
1071
|
return true;
|
|
1084
1072
|
}
|
|
1085
1073
|
// iOS 13+
|
|
1086
|
-
if (testUserAgent(win, /Macintosh/i) &&
|
|
1074
|
+
if (testUserAgent(win, /Macintosh/i) && isTouchUi(win)) {
|
|
1087
1075
|
return true;
|
|
1088
1076
|
}
|
|
1089
1077
|
return false;
|
|
1090
1078
|
};
|
|
1091
|
-
const ɵ0
|
|
1079
|
+
const ɵ0 = isIpad;
|
|
1092
1080
|
const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
|
|
1093
1081
|
const isAndroid = (win) => testUserAgent(win, /android|sink/i);
|
|
1094
|
-
const isCordova = (win) =>
|
|
1082
|
+
const isCordova = (win) => {
|
|
1083
|
+
if (_cache.cordova === null || _cache.cordova === undefined) {
|
|
1084
|
+
_cache.cordova = !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
|
|
1085
|
+
}
|
|
1086
|
+
return _cache.cordova;
|
|
1087
|
+
};
|
|
1088
|
+
const isMobile = (win) => {
|
|
1089
|
+
if (_cache.mobile === null || _cache.mobile === undefined) {
|
|
1090
|
+
_cache.mobile = isCordova(window)
|
|
1091
|
+
|| isAndroid(win) || isIOS(window)
|
|
1092
|
+
|| (isTouchUi(win) && !isWindows(win));
|
|
1093
|
+
}
|
|
1094
|
+
return _cache.mobile;
|
|
1095
|
+
};
|
|
1095
1096
|
|
|
1096
1097
|
class MatAutocompleteConfigHolder {
|
|
1097
1098
|
constructor(options) {
|
|
@@ -1147,14 +1148,14 @@ class MatAutocompleteFieldUtils {
|
|
|
1147
1148
|
return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
|
|
1148
1149
|
}
|
|
1149
1150
|
}
|
|
1150
|
-
const noop
|
|
1151
|
-
const ɵ0$
|
|
1151
|
+
const noop = (_) => { };
|
|
1152
|
+
const ɵ0$1 = noop;
|
|
1152
1153
|
class MatAutocompleteField {
|
|
1153
1154
|
constructor(cd, formGroupDir) {
|
|
1154
1155
|
this.cd = cd;
|
|
1155
1156
|
this.formGroupDir = formGroupDir;
|
|
1156
|
-
this._onChangeCallback = noop
|
|
1157
|
-
this._onTouchedCallback = noop
|
|
1157
|
+
this._onChangeCallback = noop;
|
|
1158
|
+
this._onTouchedCallback = noop;
|
|
1158
1159
|
this.logPrefix = '[mat-autocomplete] ';
|
|
1159
1160
|
this.formControlName = null;
|
|
1160
1161
|
this.required = false;
|
|
@@ -1903,7 +1904,7 @@ class DateFormatPipe {
|
|
|
1903
1904
|
return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);
|
|
1904
1905
|
}
|
|
1905
1906
|
}
|
|
1906
|
-
DateFormatPipe.ɵprov =
|
|
1907
|
+
DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
|
|
1907
1908
|
DateFormatPipe.decorators = [
|
|
1908
1909
|
{ type: Pipe, args: [{
|
|
1909
1910
|
name: 'dateFormat'
|
|
@@ -1915,7 +1916,7 @@ DateFormatPipe.ctorParameters = () => [
|
|
|
1915
1916
|
{ type: TranslateService }
|
|
1916
1917
|
];
|
|
1917
1918
|
|
|
1918
|
-
const moment
|
|
1919
|
+
const moment = momentImported;
|
|
1919
1920
|
class DateDiffDurationPipe {
|
|
1920
1921
|
constructor(dateAdapter, translate) {
|
|
1921
1922
|
this.dateAdapter = dateAdapter;
|
|
@@ -1931,17 +1932,17 @@ class DateDiffDurationPipe {
|
|
|
1931
1932
|
return this.format(startDate, endDate);
|
|
1932
1933
|
}
|
|
1933
1934
|
format(startDate, endDate) {
|
|
1934
|
-
const duration = moment
|
|
1935
|
+
const duration = moment.duration(endDate.diff(startDate));
|
|
1935
1936
|
if (duration.asMinutes() < 0)
|
|
1936
1937
|
return '';
|
|
1937
|
-
const timeDuration = moment
|
|
1938
|
+
const timeDuration = moment(0)
|
|
1938
1939
|
.hour(duration.hours())
|
|
1939
1940
|
.minute(duration.minutes());
|
|
1940
1941
|
const days = Math.floor(duration.asDays());
|
|
1941
1942
|
return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format('HH:mm');
|
|
1942
1943
|
}
|
|
1943
1944
|
}
|
|
1944
|
-
DateDiffDurationPipe.ɵprov =
|
|
1945
|
+
DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
|
|
1945
1946
|
DateDiffDurationPipe.decorators = [
|
|
1946
1947
|
{ type: Pipe, args: [{
|
|
1947
1948
|
name: 'dateDiffDuration'
|
|
@@ -1962,7 +1963,7 @@ class DateFromNowPipe {
|
|
|
1962
1963
|
return date ? date.fromNow(args && args.withoutSuffix) : '';
|
|
1963
1964
|
}
|
|
1964
1965
|
}
|
|
1965
|
-
DateFromNowPipe.ɵprov =
|
|
1966
|
+
DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
|
|
1966
1967
|
DateFromNowPipe.decorators = [
|
|
1967
1968
|
{ type: Pipe, args: [{
|
|
1968
1969
|
name: 'dateFromNow'
|
|
@@ -2031,7 +2032,7 @@ function formatToDD(value, opts) {
|
|
|
2031
2032
|
value *= -1;
|
|
2032
2033
|
}
|
|
2033
2034
|
}
|
|
2034
|
-
let degrees = roundFloat
|
|
2035
|
+
let degrees = roundFloat(value, opts.maxDecimals).toString();
|
|
2035
2036
|
// Add sign
|
|
2036
2037
|
let sign = negative ? '-' : '+';
|
|
2037
2038
|
if (opts.placeholderChar) {
|
|
@@ -2082,7 +2083,7 @@ function formatToDDMMSS(value, opts) {
|
|
|
2082
2083
|
}
|
|
2083
2084
|
let degrees = Math.trunc(value);
|
|
2084
2085
|
let minutes = Math.trunc((value - degrees) * 60);
|
|
2085
|
-
let seconds = roundFloat
|
|
2086
|
+
let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
|
|
2086
2087
|
while (seconds >= 60) {
|
|
2087
2088
|
seconds -= 60;
|
|
2088
2089
|
minutes += 1;
|
|
@@ -2150,7 +2151,7 @@ function formatToDDMM(value, opts) {
|
|
|
2150
2151
|
}
|
|
2151
2152
|
}
|
|
2152
2153
|
let degrees = Math.trunc(value);
|
|
2153
|
-
let minutes = roundFloat
|
|
2154
|
+
let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
|
|
2154
2155
|
while (minutes >= 60) {
|
|
2155
2156
|
minutes -= 60;
|
|
2156
2157
|
degrees += 1;
|
|
@@ -2201,15 +2202,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
|
|
|
2201
2202
|
return NaN;
|
|
2202
2203
|
}
|
|
2203
2204
|
if (pattern === 'DD')
|
|
2204
|
-
return roundFloat
|
|
2205
|
+
return roundFloat(degrees, maxDecimals);
|
|
2205
2206
|
const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
|
|
2206
2207
|
const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
|
|
2207
2208
|
const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
|
|
2208
2209
|
const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
|
|
2209
2210
|
degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
|
|
2210
|
-
return roundFloat
|
|
2211
|
+
return roundFloat(degrees, maxDecimals);
|
|
2211
2212
|
}
|
|
2212
|
-
function roundFloat
|
|
2213
|
+
function roundFloat(input, maxDecimals) {
|
|
2213
2214
|
if (maxDecimals > 0) {
|
|
2214
2215
|
const powDecimal = Math.pow(10, maxDecimals);
|
|
2215
2216
|
return Math.trunc(input * powDecimal + 0.5) / powDecimal;
|
|
@@ -2229,7 +2230,7 @@ class LatLongFormatPipe {
|
|
|
2229
2230
|
return ((!args.type || args.type !== 'latitude') ? formatLongitude : formatLatitude)(value, args);
|
|
2230
2231
|
}
|
|
2231
2232
|
}
|
|
2232
|
-
LatLongFormatPipe.ɵprov =
|
|
2233
|
+
LatLongFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
|
|
2233
2234
|
LatLongFormatPipe.decorators = [
|
|
2234
2235
|
{ type: Pipe, args: [{
|
|
2235
2236
|
name: 'latLongFormat'
|
|
@@ -2241,7 +2242,7 @@ class LatitudeFormatPipe {
|
|
|
2241
2242
|
this.transform = formatLatitude;
|
|
2242
2243
|
}
|
|
2243
2244
|
}
|
|
2244
|
-
LatitudeFormatPipe.ɵprov =
|
|
2245
|
+
LatitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
|
|
2245
2246
|
LatitudeFormatPipe.decorators = [
|
|
2246
2247
|
{ type: Pipe, args: [{
|
|
2247
2248
|
name: 'latitudeFormat'
|
|
@@ -2253,7 +2254,7 @@ class LongitudeFormatPipe {
|
|
|
2253
2254
|
this.transform = formatLongitude;
|
|
2254
2255
|
}
|
|
2255
2256
|
}
|
|
2256
|
-
LongitudeFormatPipe.ɵprov =
|
|
2257
|
+
LongitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
|
|
2257
2258
|
LongitudeFormatPipe.decorators = [
|
|
2258
2259
|
{ type: Pipe, args: [{
|
|
2259
2260
|
name: 'longitudeFormat'
|
|
@@ -2273,7 +2274,7 @@ class NumberFormatPipe {
|
|
|
2273
2274
|
}
|
|
2274
2275
|
}
|
|
2275
2276
|
}
|
|
2276
|
-
NumberFormatPipe.ɵprov =
|
|
2277
|
+
NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
|
|
2277
2278
|
NumberFormatPipe.decorators = [
|
|
2278
2279
|
{ type: Pipe, args: [{
|
|
2279
2280
|
name: 'numberFormat'
|
|
@@ -2313,7 +2314,7 @@ class HighlightPipe {
|
|
|
2313
2314
|
}
|
|
2314
2315
|
}
|
|
2315
2316
|
}
|
|
2316
|
-
HighlightPipe.ɵprov =
|
|
2317
|
+
HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
|
|
2317
2318
|
HighlightPipe.decorators = [
|
|
2318
2319
|
{ type: Pipe, args: [{
|
|
2319
2320
|
name: 'highlight'
|
|
@@ -2378,7 +2379,7 @@ FileSizePipe.decorators = [
|
|
|
2378
2379
|
{ type: Pipe, args: [{ name: 'fileSize' },] }
|
|
2379
2380
|
];
|
|
2380
2381
|
|
|
2381
|
-
const moment$
|
|
2382
|
+
const moment$1 = momentImported;
|
|
2382
2383
|
const tz = momentTZImported;
|
|
2383
2384
|
const DATE_UNIX_TIMESTAMP = 'X';
|
|
2384
2385
|
const DATE_UNIX_MS_TIMESTAMP = 'x';
|
|
@@ -2455,32 +2456,32 @@ function fromDateISOString(value) {
|
|
|
2455
2456
|
if (!value || isMoment(value))
|
|
2456
2457
|
return value;
|
|
2457
2458
|
// Parse the input value, as a ISO date time
|
|
2458
|
-
const date = moment$
|
|
2459
|
+
const date = moment$1(value, DATE_ISO_PATTERN);
|
|
2459
2460
|
if (date.isValid())
|
|
2460
2461
|
return date;
|
|
2461
2462
|
// Not valid: trying to convert from unix timestamp
|
|
2462
2463
|
if (typeof value === 'string') {
|
|
2463
2464
|
console.warn('Wrong date format - Trying to convert from local time: ' + value);
|
|
2464
2465
|
if (value.length === 10) {
|
|
2465
|
-
return moment$
|
|
2466
|
+
return moment$1(value, DATE_UNIX_TIMESTAMP);
|
|
2466
2467
|
}
|
|
2467
2468
|
else if (value.length === 13) {
|
|
2468
|
-
return moment$
|
|
2469
|
+
return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
|
|
2469
2470
|
}
|
|
2470
2471
|
}
|
|
2471
2472
|
console.warn('Unable to parse date: ' + value);
|
|
2472
2473
|
return undefined;
|
|
2473
2474
|
}
|
|
2474
2475
|
function fromUnixTimestamp(timeInSec) {
|
|
2475
|
-
return moment$
|
|
2476
|
+
return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
|
|
2476
2477
|
}
|
|
2477
2478
|
function fromUnixMsTimestamp(timeInMs) {
|
|
2478
|
-
return moment$
|
|
2479
|
+
return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
|
|
2479
2480
|
}
|
|
2480
2481
|
function toDuration(value, unit) {
|
|
2481
2482
|
if (!value)
|
|
2482
2483
|
return undefined;
|
|
2483
|
-
const duration = moment$
|
|
2484
|
+
const duration = moment$1.duration(value, unit);
|
|
2484
2485
|
// fix 990+ ms
|
|
2485
2486
|
if (duration.milliseconds() >= 990) {
|
|
2486
2487
|
duration.add(1000 - duration.milliseconds(), 'ms');
|
|
@@ -2509,7 +2510,7 @@ class DurationPipe {
|
|
|
2509
2510
|
return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
|
|
2510
2511
|
}
|
|
2511
2512
|
}
|
|
2512
|
-
DurationPipe.ɵprov =
|
|
2513
|
+
DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
|
|
2513
2514
|
DurationPipe.decorators = [
|
|
2514
2515
|
{ type: Pipe, args: [{
|
|
2515
2516
|
name: 'duration'
|
|
@@ -2530,7 +2531,7 @@ class MathAbsPipe {
|
|
|
2530
2531
|
}
|
|
2531
2532
|
}
|
|
2532
2533
|
}
|
|
2533
|
-
MathAbsPipe.ɵprov =
|
|
2534
|
+
MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
|
|
2534
2535
|
MathAbsPipe.decorators = [
|
|
2535
2536
|
{ type: Pipe, args: [{
|
|
2536
2537
|
name: 'mathAbs'
|
|
@@ -2542,7 +2543,7 @@ class EvenPipe {
|
|
|
2542
2543
|
return val % 2 === 0;
|
|
2543
2544
|
}
|
|
2544
2545
|
}
|
|
2545
|
-
EvenPipe.ɵprov =
|
|
2546
|
+
EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
|
|
2546
2547
|
EvenPipe.decorators = [
|
|
2547
2548
|
{ type: Pipe, args: [{
|
|
2548
2549
|
name: 'even'
|
|
@@ -2554,7 +2555,7 @@ class OddPipe {
|
|
|
2554
2555
|
return val % 2 !== 0;
|
|
2555
2556
|
}
|
|
2556
2557
|
}
|
|
2557
|
-
OddPipe.ɵprov =
|
|
2558
|
+
OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
|
|
2558
2559
|
OddPipe.decorators = [
|
|
2559
2560
|
{ type: Pipe, args: [{
|
|
2560
2561
|
name: 'odd'
|
|
@@ -2662,7 +2663,7 @@ class MapGetPipe {
|
|
|
2662
2663
|
return val[key];
|
|
2663
2664
|
}
|
|
2664
2665
|
}
|
|
2665
|
-
MapGetPipe.ɵprov =
|
|
2666
|
+
MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
|
|
2666
2667
|
MapGetPipe.decorators = [
|
|
2667
2668
|
{ type: Pipe, args: [{
|
|
2668
2669
|
name: 'mapGet'
|
|
@@ -2676,7 +2677,7 @@ class MapKeysPipe {
|
|
|
2676
2677
|
return Object.keys(map);
|
|
2677
2678
|
}
|
|
2678
2679
|
}
|
|
2679
|
-
MapKeysPipe.ɵprov =
|
|
2680
|
+
MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
|
|
2680
2681
|
MapKeysPipe.decorators = [
|
|
2681
2682
|
{ type: Pipe, args: [{
|
|
2682
2683
|
name: 'mapKeys'
|
|
@@ -2690,7 +2691,7 @@ class MapValuesPipe {
|
|
|
2690
2691
|
return Object.values(map);
|
|
2691
2692
|
}
|
|
2692
2693
|
}
|
|
2693
|
-
MapValuesPipe.ɵprov =
|
|
2694
|
+
MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
|
|
2694
2695
|
MapValuesPipe.decorators = [
|
|
2695
2696
|
{ type: Pipe, args: [{
|
|
2696
2697
|
name: 'mapValues'
|
|
@@ -2703,7 +2704,7 @@ class IsNotNilOrBlankPipe {
|
|
|
2703
2704
|
return isNotNilOrBlank(value);
|
|
2704
2705
|
}
|
|
2705
2706
|
}
|
|
2706
|
-
IsNotNilOrBlankPipe.ɵprov =
|
|
2707
|
+
IsNotNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
|
|
2707
2708
|
IsNotNilOrBlankPipe.decorators = [
|
|
2708
2709
|
{ type: Pipe, args: [{
|
|
2709
2710
|
name: 'isNotNilOrBlank'
|
|
@@ -2715,7 +2716,7 @@ class IsNilOrBlankPipe {
|
|
|
2715
2716
|
return isNilOrBlank(value);
|
|
2716
2717
|
}
|
|
2717
2718
|
}
|
|
2718
|
-
IsNilOrBlankPipe.ɵprov =
|
|
2719
|
+
IsNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
|
|
2719
2720
|
IsNilOrBlankPipe.decorators = [
|
|
2720
2721
|
{ type: Pipe, args: [{
|
|
2721
2722
|
name: 'isNilOrBlank'
|
|
@@ -2727,7 +2728,7 @@ class ToStringPipe {
|
|
|
2727
2728
|
return (value !== null && value !== undefined) ? value.toString() : '';
|
|
2728
2729
|
}
|
|
2729
2730
|
}
|
|
2730
|
-
ToStringPipe.ɵprov =
|
|
2731
|
+
ToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
|
|
2731
2732
|
ToStringPipe.decorators = [
|
|
2732
2733
|
{ type: Pipe, args: [{
|
|
2733
2734
|
name: 'toString'
|
|
@@ -2739,7 +2740,7 @@ class StrLengthPipe {
|
|
|
2739
2740
|
return value && value.length || 0;
|
|
2740
2741
|
}
|
|
2741
2742
|
}
|
|
2742
|
-
StrLengthPipe.ɵprov =
|
|
2743
|
+
StrLengthPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
|
|
2743
2744
|
StrLengthPipe.decorators = [
|
|
2744
2745
|
{ type: Pipe, args: [{
|
|
2745
2746
|
name: 'strLength'
|
|
@@ -2751,7 +2752,7 @@ class StrIncludesPipe {
|
|
|
2751
2752
|
return (value === null || value === void 0 ? void 0 : value.includes(searchString, position)) || false;
|
|
2752
2753
|
}
|
|
2753
2754
|
}
|
|
2754
|
-
StrIncludesPipe.ɵprov =
|
|
2755
|
+
StrIncludesPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrIncludesPipe_Factory() { return new StrIncludesPipe(); }, token: StrIncludesPipe, providedIn: "root" });
|
|
2755
2756
|
StrIncludesPipe.decorators = [
|
|
2756
2757
|
{ type: Pipe, args: [{
|
|
2757
2758
|
name: 'strIncludes'
|
|
@@ -2828,7 +2829,7 @@ class TranslateContextService {
|
|
|
2828
2829
|
return translations[keys[keys.length - 1]]; // Return the last keys translation
|
|
2829
2830
|
}
|
|
2830
2831
|
}
|
|
2831
|
-
TranslateContextService.ɵprov =
|
|
2832
|
+
TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
|
|
2832
2833
|
TranslateContextService.decorators = [
|
|
2833
2834
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
2834
2835
|
];
|
|
@@ -2878,7 +2879,7 @@ class PropertyGetPipe {
|
|
|
2878
2879
|
args && args.defaultValue);
|
|
2879
2880
|
}
|
|
2880
2881
|
}
|
|
2881
|
-
PropertyGetPipe.ɵprov =
|
|
2882
|
+
PropertyGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
|
|
2882
2883
|
PropertyGetPipe.decorators = [
|
|
2883
2884
|
{ type: Pipe, args: [{
|
|
2884
2885
|
name: 'propertyGet'
|
|
@@ -2903,7 +2904,7 @@ NgInitDirective.propDecorators = {
|
|
|
2903
2904
|
ngInit: [{ type: Output }]
|
|
2904
2905
|
};
|
|
2905
2906
|
|
|
2906
|
-
const moment$
|
|
2907
|
+
const moment$2 = momentImported;
|
|
2907
2908
|
// @dynamic
|
|
2908
2909
|
class SharedValidators {
|
|
2909
2910
|
static getDoubleRegexp(maxDecimals) {
|
|
@@ -2984,7 +2985,7 @@ class SharedValidators {
|
|
|
2984
2985
|
}
|
|
2985
2986
|
static validDate(control) {
|
|
2986
2987
|
const value = control.value;
|
|
2987
|
-
const date = !value || moment$
|
|
2988
|
+
const date = !value || moment$2.isMoment(value) ? value : moment$2(value, DATE_ISO_PATTERN);
|
|
2988
2989
|
if (date && (!date.isValid() || date.year() < 1970)) {
|
|
2989
2990
|
return { validDate: true };
|
|
2990
2991
|
}
|
|
@@ -4096,7 +4097,7 @@ class FormErrorTranslator {
|
|
|
4096
4097
|
return errorKey;
|
|
4097
4098
|
}
|
|
4098
4099
|
}
|
|
4099
|
-
FormErrorTranslator.ɵprov =
|
|
4100
|
+
FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
|
|
4100
4101
|
FormErrorTranslator.decorators = [
|
|
4101
4102
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
4102
4103
|
];
|
|
@@ -4176,7 +4177,7 @@ class FormGetPipe {
|
|
|
4176
4177
|
return form.get(path);
|
|
4177
4178
|
}
|
|
4178
4179
|
}
|
|
4179
|
-
FormGetPipe.ɵprov =
|
|
4180
|
+
FormGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetPipe_Factory() { return new FormGetPipe(); }, token: FormGetPipe, providedIn: "root" });
|
|
4180
4181
|
FormGetPipe.decorators = [
|
|
4181
4182
|
{ type: Pipe, args: [{
|
|
4182
4183
|
name: 'formGet'
|
|
@@ -4188,7 +4189,7 @@ class FormGetControlPipe {
|
|
|
4188
4189
|
return form.get(path);
|
|
4189
4190
|
}
|
|
4190
4191
|
}
|
|
4191
|
-
FormGetControlPipe.ɵprov =
|
|
4192
|
+
FormGetControlPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetControlPipe_Factory() { return new FormGetControlPipe(); }, token: FormGetControlPipe, providedIn: "root" });
|
|
4192
4193
|
FormGetControlPipe.decorators = [
|
|
4193
4194
|
{ type: Pipe, args: [{
|
|
4194
4195
|
name: 'formGetControl'
|
|
@@ -4200,7 +4201,7 @@ class FormGetArrayPipe {
|
|
|
4200
4201
|
return form.get(path);
|
|
4201
4202
|
}
|
|
4202
4203
|
}
|
|
4203
|
-
FormGetArrayPipe.ɵprov =
|
|
4204
|
+
FormGetArrayPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetArrayPipe_Factory() { return new FormGetArrayPipe(); }, token: FormGetArrayPipe, providedIn: "root" });
|
|
4204
4205
|
FormGetArrayPipe.decorators = [
|
|
4205
4206
|
{ type: Pipe, args: [{
|
|
4206
4207
|
name: 'formGetArray'
|
|
@@ -4212,7 +4213,7 @@ class FormGetGroupPipe {
|
|
|
4212
4213
|
return form.get(path);
|
|
4213
4214
|
}
|
|
4214
4215
|
}
|
|
4215
|
-
FormGetGroupPipe.ɵprov =
|
|
4216
|
+
FormGetGroupPipe.ɵprov = ɵɵdefineInjectable({ factory: function FormGetGroupPipe_Factory() { return new FormGetGroupPipe(); }, token: FormGetGroupPipe, providedIn: "root" });
|
|
4216
4217
|
FormGetGroupPipe.decorators = [
|
|
4217
4218
|
{ type: Pipe, args: [{
|
|
4218
4219
|
name: 'formGetGroup'
|
|
@@ -4541,9 +4542,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
|
|
|
4541
4542
|
const hour = parseInt(durationParts[0] || '0');
|
|
4542
4543
|
const minute = parseInt(durationParts[1] || '0');
|
|
4543
4544
|
const value = hour + (minute + 0.5) / 60;
|
|
4544
|
-
return roundFloat(value, maxDecimals);
|
|
4545
|
+
return roundFloat$1(value, maxDecimals);
|
|
4545
4546
|
}
|
|
4546
|
-
function roundFloat(input, maxDecimals) {
|
|
4547
|
+
function roundFloat$1(input, maxDecimals) {
|
|
4547
4548
|
if (maxDecimals > 0) {
|
|
4548
4549
|
const powDecimal = Math.pow(10, maxDecimals);
|
|
4549
4550
|
return Math.trunc(input * powDecimal + 0.5) / powDecimal;
|
|
@@ -4567,17 +4568,17 @@ const MASKS = {
|
|
|
4567
4568
|
DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
|
|
4568
4569
|
}
|
|
4569
4570
|
};
|
|
4570
|
-
const noop$
|
|
4571
|
+
const noop$1 = () => {
|
|
4571
4572
|
};
|
|
4572
|
-
const ɵ0$
|
|
4573
|
+
const ɵ0$2 = noop$1;
|
|
4573
4574
|
class MatLatLongField {
|
|
4574
4575
|
constructor(translate, formBuilder, cd, formGroupDir) {
|
|
4575
4576
|
this.translate = translate;
|
|
4576
4577
|
this.formBuilder = formBuilder;
|
|
4577
4578
|
this.cd = cd;
|
|
4578
4579
|
this.formGroupDir = formGroupDir;
|
|
4579
|
-
this._onChangeCallback = noop$
|
|
4580
|
-
this._onTouchedCallback = noop$
|
|
4580
|
+
this._onChangeCallback = noop$1;
|
|
4581
|
+
this._onTouchedCallback = noop$1;
|
|
4581
4582
|
this._subscription = new Subscription();
|
|
4582
4583
|
this.disabling = false;
|
|
4583
4584
|
this.writing = false;
|
|
@@ -4913,14 +4914,14 @@ SharedMatLatLongModule.decorators = [
|
|
|
4913
4914
|
},] }
|
|
4914
4915
|
];
|
|
4915
4916
|
|
|
4916
|
-
const DEFAULT_VALUE_ACCESSOR
|
|
4917
|
+
const DEFAULT_VALUE_ACCESSOR = {
|
|
4917
4918
|
provide: NG_VALUE_ACCESSOR,
|
|
4918
4919
|
useExisting: forwardRef(() => MatDate),
|
|
4919
4920
|
multi: true
|
|
4920
4921
|
};
|
|
4921
|
-
const
|
|
4922
|
-
const noop$
|
|
4923
|
-
const ɵ0$
|
|
4922
|
+
const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
|
|
4923
|
+
const noop$2 = () => { };
|
|
4924
|
+
const ɵ0$3 = noop$2;
|
|
4924
4925
|
class MatDate {
|
|
4925
4926
|
constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
|
|
4926
4927
|
this.dateAdapter = dateAdapter;
|
|
@@ -4929,13 +4930,13 @@ class MatDate {
|
|
|
4929
4930
|
this.cd = cd;
|
|
4930
4931
|
this.keyboard = keyboard;
|
|
4931
4932
|
this.formGroupDir = formGroupDir;
|
|
4932
|
-
this._onChangeCallback = noop$
|
|
4933
|
-
this._onTouchedCallback = noop$
|
|
4933
|
+
this._onChangeCallback = noop$2;
|
|
4934
|
+
this._onTouchedCallback = noop$2;
|
|
4934
4935
|
this._subscription = new Subscription();
|
|
4935
4936
|
this._writing = true;
|
|
4936
4937
|
this._disabling = false;
|
|
4937
4938
|
this._readonly = false;
|
|
4938
|
-
this.
|
|
4939
|
+
this.mask = TEXT_MASK;
|
|
4939
4940
|
this.floatLabel = 'auto';
|
|
4940
4941
|
this.compact = false;
|
|
4941
4942
|
this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
|
|
@@ -4980,22 +4981,24 @@ class MatDate {
|
|
|
4980
4981
|
this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
|
|
4981
4982
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
4982
4983
|
}
|
|
4983
|
-
// Create the
|
|
4984
|
-
this.
|
|
4984
|
+
// Create the text control
|
|
4985
|
+
this.textControl = this.formBuilder.control(null,
|
|
4986
|
+
// Important: should copy errors from the model formControl
|
|
4987
|
+
() => this.formControl.errors);
|
|
4985
4988
|
// Get patterns to display date
|
|
4986
4989
|
this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
|
|
4987
4990
|
this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
|
|
4988
4991
|
.subscribe((pattern) => this.updatePattern(pattern)));
|
|
4989
|
-
this._subscription.add(this.
|
|
4992
|
+
this._subscription.add(this.textControl.valueChanges
|
|
4990
4993
|
.subscribe((value) => this.onFormChange(value)));
|
|
4991
4994
|
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
4992
4995
|
this._subscription.add(this.formControl.statusChanges
|
|
4993
4996
|
.pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
4994
4997
|
)
|
|
4995
4998
|
.subscribe(() => {
|
|
4996
|
-
this.
|
|
4997
|
-
if (this.formControl.touched && !this.
|
|
4998
|
-
this.
|
|
4999
|
+
this.textControl.updateValueAndValidity({ emitEvent: false });
|
|
5000
|
+
if (this.formControl.touched && !this.textControl.touched) {
|
|
5001
|
+
this.textControl.markAsTouched();
|
|
4999
5002
|
}
|
|
5000
5003
|
this.markForCheck();
|
|
5001
5004
|
}));
|
|
@@ -5011,27 +5014,25 @@ class MatDate {
|
|
|
5011
5014
|
this._writing = true;
|
|
5012
5015
|
// DEBUG
|
|
5013
5016
|
//console.debug("[mat-date] writeValue() with:", value);
|
|
5014
|
-
// Convert into date
|
|
5015
|
-
|
|
5017
|
+
// Convert into date
|
|
5018
|
+
// Important: do a clone()
|
|
5019
|
+
let date = isMoment(value) ? value.clone() : fromDateISOString(value);
|
|
5016
5020
|
if (!date || !date.isValid()) {
|
|
5017
|
-
this.
|
|
5021
|
+
this.textControl.patchValue(null, { emitEvent: false });
|
|
5018
5022
|
if (this.formControl.value) {
|
|
5019
5023
|
this.formControl.patchValue(null, { emitEvent: false });
|
|
5020
5024
|
this._onChangeCallback(null);
|
|
5021
5025
|
}
|
|
5022
5026
|
}
|
|
5023
5027
|
else {
|
|
5024
|
-
//
|
|
5025
|
-
|
|
5026
|
-
//
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
if (this.dayControl.value !== dayStr) {
|
|
5033
|
-
// Update control
|
|
5034
|
-
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5028
|
+
// Move to the expected TZ (keeping local hour - e.g. midnight)
|
|
5029
|
+
date = (this.timezone && date.tz(this.timezone) || date)
|
|
5030
|
+
// Reset hour
|
|
5031
|
+
.startOf('day');
|
|
5032
|
+
const dayStr = this.dateAdapter.format(date, this.datePattern);
|
|
5033
|
+
if (this.textControl.value !== dayStr) {
|
|
5034
|
+
// Update day control
|
|
5035
|
+
this.textControl.patchValue(dayStr, { emitEvent: false });
|
|
5035
5036
|
}
|
|
5036
5037
|
}
|
|
5037
5038
|
this._writing = false;
|
|
@@ -5048,10 +5049,10 @@ class MatDate {
|
|
|
5048
5049
|
return;
|
|
5049
5050
|
this._disabling = true;
|
|
5050
5051
|
if (isDisabled) {
|
|
5051
|
-
this.
|
|
5052
|
+
this.textControl.disable({ emitEvent: false });
|
|
5052
5053
|
}
|
|
5053
5054
|
else {
|
|
5054
|
-
this.
|
|
5055
|
+
this.textControl.enable({ emitEvent: false });
|
|
5055
5056
|
}
|
|
5056
5057
|
this._disabling = false;
|
|
5057
5058
|
this.markForCheck();
|
|
@@ -5068,12 +5069,12 @@ class MatDate {
|
|
|
5068
5069
|
.locale(this.locale) // set as time as locale time
|
|
5069
5070
|
.minute(0).seconds(0).millisecond(0) // Reset hour
|
|
5070
5071
|
.utc(true);
|
|
5071
|
-
dateStr = this.dateAdapter.format(date, this.
|
|
5072
|
+
dateStr = this.dateAdapter.format(date, this.datePattern) || null;
|
|
5072
5073
|
}
|
|
5073
|
-
if (this.
|
|
5074
|
+
if (this.textControl.value !== dateStr) {
|
|
5074
5075
|
// DEBUG
|
|
5075
5076
|
//console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
5076
|
-
this.
|
|
5077
|
+
this.textControl.setValue(dateStr, {
|
|
5077
5078
|
emitEvent: true // Will call onFormChange
|
|
5078
5079
|
});
|
|
5079
5080
|
}
|
|
@@ -5118,7 +5119,7 @@ class MatDate {
|
|
|
5118
5119
|
});
|
|
5119
5120
|
}
|
|
5120
5121
|
clear() {
|
|
5121
|
-
this.
|
|
5122
|
+
this.textControl.patchValue(null, { emitEvent: false });
|
|
5122
5123
|
this.formControl.setValue(null, { emitEvent: false });
|
|
5123
5124
|
this._onChangeCallback(null);
|
|
5124
5125
|
this.markAsTouched();
|
|
@@ -5127,43 +5128,70 @@ class MatDate {
|
|
|
5127
5128
|
/* -- private method -- */
|
|
5128
5129
|
updatePattern(pattern) {
|
|
5129
5130
|
pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
|
|
5130
|
-
if (this.
|
|
5131
|
-
this.
|
|
5132
|
-
this.dayPattern = pattern;
|
|
5131
|
+
if (this.datePattern !== pattern) {
|
|
5132
|
+
this.datePattern = pattern;
|
|
5133
5133
|
this.markForCheck();
|
|
5134
5134
|
}
|
|
5135
5135
|
}
|
|
5136
5136
|
checkIfTouched(opts) {
|
|
5137
|
-
if (this.
|
|
5137
|
+
if (this.textControl.touched) {
|
|
5138
5138
|
this._onTouchedCallback();
|
|
5139
5139
|
if (!opts || opts.emitEvent !== false) {
|
|
5140
5140
|
this.markForCheck();
|
|
5141
5141
|
}
|
|
5142
5142
|
}
|
|
5143
5143
|
}
|
|
5144
|
-
onFormChange(
|
|
5144
|
+
onFormChange(value) {
|
|
5145
5145
|
if (this._writing)
|
|
5146
5146
|
return; // Skip if call by self
|
|
5147
5147
|
this._writing = true;
|
|
5148
|
-
|
|
5149
|
-
|
|
5150
|
-
|
|
5151
|
-
|
|
5152
|
-
|
|
5153
|
-
|
|
5154
|
-
|
|
5155
|
-
|
|
5156
|
-
|
|
5157
|
-
|
|
5148
|
+
// DEBUG
|
|
5149
|
+
//console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
|
|
5150
|
+
/*if (this.dayControl.invalid) {
|
|
5151
|
+
this.formControl.markAsPending({onlySelf: true});
|
|
5152
|
+
this.formControl.setErrors({
|
|
5153
|
+
...this.formControl.errors,
|
|
5154
|
+
...this.dayControl.errors
|
|
5155
|
+
});
|
|
5156
|
+
this.formControl.markAsDirty();
|
|
5157
|
+
this._writing = false;
|
|
5158
|
+
return;
|
|
5159
|
+
}*/
|
|
5160
|
+
if (value) {
|
|
5161
|
+
// Make to remove placeholder chars
|
|
5162
|
+
while (value.indexOf(this.placeholderChar) !== -1) {
|
|
5163
|
+
value = value.replace(this.placeholderChar, '');
|
|
5164
|
+
}
|
|
5165
|
+
// Force '0' for empty month (otherwise moment will use the current month)
|
|
5166
|
+
value = value.replace('//', '/0/')
|
|
5167
|
+
// Force '0' for empty year (otherwise moment will use the current year)
|
|
5168
|
+
.replace(/\/$/, '/0');
|
|
5158
5169
|
}
|
|
5159
|
-
// Parse
|
|
5160
|
-
let
|
|
5170
|
+
// Parse date (strict = false)
|
|
5171
|
+
let date = isNotNilOrBlank(value) && this.dateAdapter.parse(value, this.datePattern) || null;
|
|
5161
5172
|
// Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
|
|
5162
|
-
|
|
5163
|
-
|
|
5173
|
+
date = date && (this.timezone ? date.tz(this.timezone, true) : date) || null;
|
|
5174
|
+
date = date && date
|
|
5164
5175
|
.startOf('day') // Reset hour
|
|
5165
|
-
.utc()
|
|
5166
|
-
|
|
5176
|
+
.utc() // Convert to UTC (avoid TZ offset in final string)
|
|
5177
|
+
|| null;
|
|
5178
|
+
// Convert to model value (ISO date string)
|
|
5179
|
+
// IMPORTANT: If date is invalid, then keep the invalid string value
|
|
5180
|
+
// to allow SharedValidators.validDate() to raise an error
|
|
5181
|
+
const formControlValue = date && date.isValid() ? toDateISOString(date) : (value || null);
|
|
5182
|
+
if (this.formControl.value !== formControlValue) {
|
|
5183
|
+
// DEBUG
|
|
5184
|
+
//console.debug('[mat-date] Emit new value: ' + dateStr);
|
|
5185
|
+
// Apply to form control. => Will call writeValue()
|
|
5186
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5187
|
+
//this.formControl.setValue(dateStr, {emitEvent: false})
|
|
5188
|
+
// Changes comes from inside function: use the callback
|
|
5189
|
+
this._onChangeCallback(formControlValue);
|
|
5190
|
+
// Check if need to update controls
|
|
5191
|
+
this.checkIfTouched();
|
|
5192
|
+
}
|
|
5193
|
+
// Force the day control to update its validity (same errors as formControl - see ngOnInit())
|
|
5194
|
+
this.textControl.updateValueAndValidity();
|
|
5167
5195
|
this._writing = false;
|
|
5168
5196
|
}
|
|
5169
5197
|
waitKeyboardHide(waitKeyboardDelay) {
|
|
@@ -5180,21 +5208,6 @@ class MatDate {
|
|
|
5180
5208
|
}
|
|
5181
5209
|
});
|
|
5182
5210
|
}
|
|
5183
|
-
emitChange(value) {
|
|
5184
|
-
// Get the model value
|
|
5185
|
-
const dateStr = toDateISOString(value) || null;
|
|
5186
|
-
if (this.formControl.value !== dateStr) {
|
|
5187
|
-
// DEBUG
|
|
5188
|
-
//console.debug('[mat-date] Emit new value: ' + dateStr);
|
|
5189
|
-
// Apply to form control. => Will call writeValue()
|
|
5190
|
-
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5191
|
-
//this.formControl.setValue(dateStr, {emitEvent: false})
|
|
5192
|
-
// Changes comes from inside function: use the callback
|
|
5193
|
-
this._onChangeCallback(dateStr);
|
|
5194
|
-
// Check if need to update controls
|
|
5195
|
-
this.checkIfTouched();
|
|
5196
|
-
}
|
|
5197
|
-
}
|
|
5198
5211
|
updateTabIndex() {
|
|
5199
5212
|
if (isNil(this._tabindex) || this._tabindex === -1)
|
|
5200
5213
|
return; // skip
|
|
@@ -5207,7 +5220,7 @@ class MatDate {
|
|
|
5207
5220
|
});
|
|
5208
5221
|
}
|
|
5209
5222
|
markAsTouched(opts) {
|
|
5210
|
-
this.
|
|
5223
|
+
this.textControl.markAsTouched(opts);
|
|
5211
5224
|
this._onTouchedCallback();
|
|
5212
5225
|
this.markForCheck();
|
|
5213
5226
|
}
|
|
@@ -5221,16 +5234,16 @@ class MatDate {
|
|
|
5221
5234
|
MatDate.decorators = [
|
|
5222
5235
|
{ type: Component, args: [{
|
|
5223
5236
|
selector: 'mat-date-field',
|
|
5224
|
-
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern:
|
|
5237
|
+
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\">\n <ng-container [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </ng-container>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
|
|
5225
5238
|
providers: [
|
|
5226
|
-
DEFAULT_VALUE_ACCESSOR
|
|
5239
|
+
DEFAULT_VALUE_ACCESSOR,
|
|
5227
5240
|
],
|
|
5228
5241
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
5229
5242
|
styles: [":host{display:inline-block;width:100%;position:relative}:host [no-padding]{--ion-grid-column-padding:0}:host [nowrap]{flex-wrap:nowrap}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md,mat-form-field ion-datetime{padding:0!important}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
|
|
5230
5243
|
},] }
|
|
5231
5244
|
];
|
|
5232
5245
|
MatDate.ctorParameters = () => [
|
|
5233
|
-
{ type:
|
|
5246
|
+
{ type: MomentDateAdapter },
|
|
5234
5247
|
{ type: TranslateService },
|
|
5235
5248
|
{ type: FormBuilder },
|
|
5236
5249
|
{ type: ChangeDetectorRef },
|
|
@@ -5257,16 +5270,16 @@ MatDate.propDecorators = {
|
|
|
5257
5270
|
matInputs: [{ type: ViewChildren, args: ['matInput',] }]
|
|
5258
5271
|
};
|
|
5259
5272
|
|
|
5260
|
-
const DEFAULT_VALUE_ACCESSOR$
|
|
5273
|
+
const DEFAULT_VALUE_ACCESSOR$1 = {
|
|
5261
5274
|
provide: NG_VALUE_ACCESSOR,
|
|
5262
5275
|
useExisting: forwardRef(() => MatDateTime),
|
|
5263
5276
|
multi: true
|
|
5264
5277
|
};
|
|
5265
|
-
const DAY_MASK
|
|
5278
|
+
const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
|
|
5266
5279
|
const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
|
|
5267
|
-
const HOUR_MASK
|
|
5268
|
-
const noop$
|
|
5269
|
-
const ɵ0$
|
|
5280
|
+
const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
|
|
5281
|
+
const noop$3 = () => { };
|
|
5282
|
+
const ɵ0$4 = noop$3;
|
|
5270
5283
|
class MatDateTime {
|
|
5271
5284
|
constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
|
|
5272
5285
|
this.dateAdapter = dateAdapter;
|
|
@@ -5275,14 +5288,14 @@ class MatDateTime {
|
|
|
5275
5288
|
this.cd = cd;
|
|
5276
5289
|
this.keyboard = keyboard;
|
|
5277
5290
|
this.formGroupDir = formGroupDir;
|
|
5278
|
-
this._onChangeCallback = noop$
|
|
5279
|
-
this._onTouchedCallback = noop$
|
|
5291
|
+
this._onChangeCallback = noop$3;
|
|
5292
|
+
this._onTouchedCallback = noop$3;
|
|
5280
5293
|
this._subscription = new Subscription();
|
|
5281
5294
|
this._writing = true;
|
|
5282
5295
|
this._disabling = false;
|
|
5283
5296
|
this._readonly = false;
|
|
5284
|
-
this.dayMask = DAY_MASK
|
|
5285
|
-
this.hourMask = HOUR_MASK
|
|
5297
|
+
this.dayMask = DAY_MASK;
|
|
5298
|
+
this.hourMask = HOUR_MASK;
|
|
5286
5299
|
this.floatLabel = 'auto';
|
|
5287
5300
|
this.compact = false;
|
|
5288
5301
|
this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
|
|
@@ -5596,14 +5609,14 @@ MatDateTime.decorators = [
|
|
|
5596
5609
|
selector: 'mat-date-time-field',
|
|
5597
5610
|
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && (hourControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"hourControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"hourControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"hourControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
|
|
5598
5611
|
providers: [
|
|
5599
|
-
DEFAULT_VALUE_ACCESSOR$
|
|
5612
|
+
DEFAULT_VALUE_ACCESSOR$1,
|
|
5600
5613
|
],
|
|
5601
5614
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
5602
5615
|
styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
|
|
5603
5616
|
},] }
|
|
5604
5617
|
];
|
|
5605
5618
|
MatDateTime.ctorParameters = () => [
|
|
5606
|
-
{ type:
|
|
5619
|
+
{ type: MomentDateAdapter },
|
|
5607
5620
|
{ type: TranslateService },
|
|
5608
5621
|
{ type: FormBuilder },
|
|
5609
5622
|
{ type: ChangeDetectorRef },
|
|
@@ -5630,15 +5643,15 @@ MatDateTime.propDecorators = {
|
|
|
5630
5643
|
matInputs: [{ type: ViewChildren, args: ['matInput',] }]
|
|
5631
5644
|
};
|
|
5632
5645
|
|
|
5633
|
-
const DEFAULT_VALUE_ACCESSOR$
|
|
5646
|
+
const DEFAULT_VALUE_ACCESSOR$2 = {
|
|
5634
5647
|
provide: NG_VALUE_ACCESSOR,
|
|
5635
5648
|
useExisting: forwardRef(() => MatDateShort),
|
|
5636
5649
|
multi: true
|
|
5637
5650
|
};
|
|
5638
|
-
const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
|
|
5651
|
+
const DAY_MASK$1 = [/\d/, /\d/, /\d/, /\d/];
|
|
5639
5652
|
const noop$4 = () => {
|
|
5640
5653
|
};
|
|
5641
|
-
const ɵ0$
|
|
5654
|
+
const ɵ0$5 = noop$4;
|
|
5642
5655
|
class MatDateShort {
|
|
5643
5656
|
constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
|
|
5644
5657
|
this.dateAdapter = dateAdapter;
|
|
@@ -5651,7 +5664,7 @@ class MatDateShort {
|
|
|
5651
5664
|
this._onTouchedCallback = noop$4;
|
|
5652
5665
|
this.writing = true;
|
|
5653
5666
|
this.disabling = false;
|
|
5654
|
-
this.dayMask = DAY_MASK;
|
|
5667
|
+
this.dayMask = DAY_MASK$1;
|
|
5655
5668
|
this.disabled = false;
|
|
5656
5669
|
this.floatLabel = 'auto';
|
|
5657
5670
|
this.readonly = false;
|
|
@@ -5896,7 +5909,7 @@ MatDateShort.decorators = [
|
|
|
5896
5909
|
selector: 'mat-date-short-field',
|
|
5897
5910
|
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_YEAR_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker1)\"\n (keyup.escape)=\"preventEvent($event)\"\n (click)=\"matInput.select()\"\n [required]=\"required\"\n [tabindex]=\"tabindex\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker1)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final control -->\n <input matInput type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker1\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"openDatePicker($event, datePicker1)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"writeValue(null)\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('validDate')\" translate>ERROR.FIELD_NOT_VALID_DATE</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateIsAfter')\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateRange')\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMaxDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMinDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngIf=\"formControl.hasError('msg')\">{{formControl.errors.msg}}</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <mat-datepicker #datePicker1\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n (yearSelected)=\"closeDatePicker($event, datePicker1)\"\n [startAt]=\"startDate\"></mat-datepicker>\n\n <ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n </ng-template>\n\n <ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n </ng-template>\n\n</ng-template>\n",
|
|
5898
5911
|
providers: [
|
|
5899
|
-
DEFAULT_VALUE_ACCESSOR$
|
|
5912
|
+
DEFAULT_VALUE_ACCESSOR$2,
|
|
5900
5913
|
],
|
|
5901
5914
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
5902
5915
|
styles: [":host{display:inline-block;width:100%;position:relative}:host [no-padding]{--ion-grid-column-padding:0}:host [nowrap]{flex-wrap:nowrap}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md,mat-form-field ion-datetime{padding:0!important}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
|
|
@@ -5964,16 +5977,16 @@ SharedMatDateTimeModule.decorators = [
|
|
|
5964
5977
|
},] }
|
|
5965
5978
|
];
|
|
5966
5979
|
|
|
5967
|
-
const DEFAULT_VALUE_ACCESSOR$
|
|
5980
|
+
const DEFAULT_VALUE_ACCESSOR$3 = {
|
|
5968
5981
|
provide: NG_VALUE_ACCESSOR,
|
|
5969
5982
|
useExisting: forwardRef(() => MatDuration),
|
|
5970
5983
|
multi: true
|
|
5971
5984
|
};
|
|
5972
5985
|
const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
|
|
5973
|
-
const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
|
|
5974
|
-
const noop$
|
|
5986
|
+
const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
|
|
5987
|
+
const noop$5 = () => {
|
|
5975
5988
|
};
|
|
5976
|
-
const ɵ0$6 = noop$
|
|
5989
|
+
const ɵ0$6 = noop$5;
|
|
5977
5990
|
class MatDuration {
|
|
5978
5991
|
constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
|
|
5979
5992
|
this.dateAdapter = dateAdapter;
|
|
@@ -5982,11 +5995,11 @@ class MatDuration {
|
|
|
5982
5995
|
this.cd = cd;
|
|
5983
5996
|
this.formGroupDir = formGroupDir;
|
|
5984
5997
|
this._subscription = new Subscription();
|
|
5985
|
-
this._onChangeCallback = noop$
|
|
5986
|
-
this._onTouchedCallback = noop$
|
|
5998
|
+
this._onChangeCallback = noop$5;
|
|
5999
|
+
this._onTouchedCallback = noop$5;
|
|
5987
6000
|
this.writing = true;
|
|
5988
6001
|
this.disabling = false;
|
|
5989
|
-
this.hourMask = HOUR_MASK;
|
|
6002
|
+
this.hourMask = HOUR_MASK$1;
|
|
5990
6003
|
this.disabled = false;
|
|
5991
6004
|
this.floatLabel = 'auto';
|
|
5992
6005
|
this.readonly = false;
|
|
@@ -6166,7 +6179,7 @@ MatDuration.decorators = [
|
|
|
6166
6179
|
selector: 'mat-duration-field',
|
|
6167
6180
|
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{ formControl.value|duration }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput type=\"text\"\n autocomplete=\"off\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.DURATION_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n\n <!-- errors -->\n <mat-error *ngIf=\"!formControl.hasError('required') && textControl.hasError('pattern')\" translate>ERROR.FIELD_NOT_VALID_PATTERN</mat-error>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors.min }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors.max }}</mat-error>\n\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n</ng-template>\n\n",
|
|
6168
6181
|
providers: [
|
|
6169
|
-
DEFAULT_VALUE_ACCESSOR$
|
|
6182
|
+
DEFAULT_VALUE_ACCESSOR$3,
|
|
6170
6183
|
],
|
|
6171
6184
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
6172
6185
|
styles: [":host{display:inline-block;min-width:140px;position:relative;--ion-grid-column-padding:0}:host,mat-form-field{width:100%}mat-form-field .mat-form-field-subscript-wrapper{overflow:visible;top:100%}mat-form-field .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}mat-form-field .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}mat-error{text-align:right;width:100%}"]
|
|
@@ -6223,22 +6236,22 @@ SharedMatDurationModule.decorators = [
|
|
|
6223
6236
|
},] }
|
|
6224
6237
|
];
|
|
6225
6238
|
|
|
6226
|
-
const DEFAULT_VALUE_ACCESSOR$
|
|
6239
|
+
const DEFAULT_VALUE_ACCESSOR$4 = {
|
|
6227
6240
|
provide: NG_VALUE_ACCESSOR,
|
|
6228
6241
|
useExisting: forwardRef(() => MatBooleanField),
|
|
6229
6242
|
multi: true
|
|
6230
6243
|
};
|
|
6231
|
-
const noop$
|
|
6244
|
+
const noop$6 = () => {
|
|
6232
6245
|
};
|
|
6233
|
-
const ɵ0$
|
|
6246
|
+
const ɵ0$7 = noop$6;
|
|
6234
6247
|
class MatBooleanField {
|
|
6235
6248
|
constructor(translate, formBuilder, cd, formGroupDir) {
|
|
6236
6249
|
this.translate = translate;
|
|
6237
6250
|
this.formBuilder = formBuilder;
|
|
6238
6251
|
this.cd = cd;
|
|
6239
6252
|
this.formGroupDir = formGroupDir;
|
|
6240
|
-
this._onChangeCallback = noop$
|
|
6241
|
-
this._onTouchedCallback = noop$
|
|
6253
|
+
this._onChangeCallback = noop$6;
|
|
6254
|
+
this._onTouchedCallback = noop$6;
|
|
6242
6255
|
this._writing = false;
|
|
6243
6256
|
this.showRadio = false;
|
|
6244
6257
|
this.disabled = false;
|
|
@@ -6401,7 +6414,7 @@ MatBooleanField.decorators = [
|
|
|
6401
6414
|
selector: 'mat-boolean-field',
|
|
6402
6415
|
template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.value === true && yesLabel) || noLabel) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button> \n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label> </ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===undefined\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
|
|
6403
6416
|
providers: [
|
|
6404
|
-
DEFAULT_VALUE_ACCESSOR$
|
|
6417
|
+
DEFAULT_VALUE_ACCESSOR$4
|
|
6405
6418
|
],
|
|
6406
6419
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
6407
6420
|
styles: [":host{width:100%}.mat-form-field.mat-boolean-field-radio{margin-top:-2px}.mat-form-field.mat-boolean-field-button{margin-top:-4px}.mat-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-form-field .mat-form-field-buttons .mat-form-field-button{--flex-basis:calc(100% / var(--buttons-col-count, 2));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);white-space:normal;padding:0 2px;height:40px}"]
|
|
@@ -6647,7 +6660,7 @@ class MatNumpadDomService {
|
|
|
6647
6660
|
this.appRef.detachView(this.componentRef.hostView);
|
|
6648
6661
|
}
|
|
6649
6662
|
}
|
|
6650
|
-
MatNumpadDomService.ɵprov =
|
|
6663
|
+
MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
|
|
6651
6664
|
MatNumpadDomService.decorators = [
|
|
6652
6665
|
{ type: Injectable, args: [{
|
|
6653
6666
|
providedIn: 'root'
|
|
@@ -7011,7 +7024,7 @@ SharedMatNumpadModule.decorators = [
|
|
|
7011
7024
|
},] }
|
|
7012
7025
|
];
|
|
7013
7026
|
|
|
7014
|
-
const DEFAULT_VALUE_ACCESSOR = {
|
|
7027
|
+
const DEFAULT_VALUE_ACCESSOR$5 = {
|
|
7015
7028
|
provide: NG_VALUE_ACCESSOR,
|
|
7016
7029
|
useExisting: forwardRef(() => MatSwipeField),
|
|
7017
7030
|
multi: true
|
|
@@ -7274,7 +7287,7 @@ MatSwipeField.decorators = [
|
|
|
7274
7287
|
{ type: Component, args: [{
|
|
7275
7288
|
selector: 'mat-swipe-field',
|
|
7276
7289
|
template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
|
|
7277
|
-
providers: [DEFAULT_VALUE_ACCESSOR],
|
|
7290
|
+
providers: [DEFAULT_VALUE_ACCESSOR$5],
|
|
7278
7291
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
7279
7292
|
styles: [":host{display:inline-block;width:100%;position:relative}input.hidden{display:none}.slides-container .swiper-slide{font-size:16px!important}.slides-container.hidden{visibility:hidden;height:0!important}.button-next,.button-prev{position:absolute;top:calc(50% - 20px);z-index:10}.button-prev{left:0;right:auto}.button-next{left:auto;right:0}"]
|
|
7280
7293
|
},] }
|
|
@@ -7332,14 +7345,14 @@ SharedMatSwipeModule.decorators = [
|
|
|
7332
7345
|
},] }
|
|
7333
7346
|
];
|
|
7334
7347
|
|
|
7335
|
-
const noop$
|
|
7336
|
-
const ɵ0$
|
|
7348
|
+
const noop$7 = () => { };
|
|
7349
|
+
const ɵ0$8 = noop$7;
|
|
7337
7350
|
class MatChipsField {
|
|
7338
7351
|
constructor(cd, formGroupDir) {
|
|
7339
7352
|
this.cd = cd;
|
|
7340
7353
|
this.formGroupDir = formGroupDir;
|
|
7341
|
-
this._onChangeCallback = noop$
|
|
7342
|
-
this._onTouchedCallback = noop$
|
|
7354
|
+
this._onChangeCallback = noop$7;
|
|
7355
|
+
this._onTouchedCallback = noop$7;
|
|
7343
7356
|
this.logPrefix = '[mat-chips] ';
|
|
7344
7357
|
this.formControlName = null;
|
|
7345
7358
|
this.required = false;
|
|
@@ -8211,7 +8224,7 @@ class ProgressBarService {
|
|
|
8211
8224
|
}
|
|
8212
8225
|
}
|
|
8213
8226
|
}
|
|
8214
|
-
ProgressBarService.ɵprov =
|
|
8227
|
+
ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
|
|
8215
8228
|
ProgressBarService.decorators = [
|
|
8216
8229
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
8217
8230
|
];
|
|
@@ -8255,7 +8268,7 @@ class AppGestureConfig extends HammerGestureConfig {
|
|
|
8255
8268
|
return mc;
|
|
8256
8269
|
}
|
|
8257
8270
|
}
|
|
8258
|
-
AppGestureConfig.ɵprov =
|
|
8271
|
+
AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
|
|
8259
8272
|
AppGestureConfig.decorators = [
|
|
8260
8273
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
8261
8274
|
];
|
|
@@ -8480,7 +8493,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
|
|
|
8480
8493
|
this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
|
|
8481
8494
|
}
|
|
8482
8495
|
}
|
|
8483
|
-
MatPaginatorI18n.ɵprov =
|
|
8496
|
+
MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
|
|
8484
8497
|
MatPaginatorI18n.decorators = [
|
|
8485
8498
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
8486
8499
|
];
|
|
@@ -8570,17 +8583,17 @@ function getColorContrast(color, bw) {
|
|
|
8570
8583
|
return rgbArrayToHex(rgb.map(v => 255 - v));
|
|
8571
8584
|
}
|
|
8572
8585
|
|
|
8573
|
-
const noop = () => {
|
|
8586
|
+
const noop$8 = () => {
|
|
8574
8587
|
};
|
|
8575
|
-
const ɵ0$
|
|
8588
|
+
const ɵ0$9 = noop$8;
|
|
8576
8589
|
class AppFormField {
|
|
8577
8590
|
constructor(translate, cd, injector, formGroupDir) {
|
|
8578
8591
|
this.translate = translate;
|
|
8579
8592
|
this.cd = cd;
|
|
8580
8593
|
this.injector = injector;
|
|
8581
8594
|
this.formGroupDir = formGroupDir;
|
|
8582
|
-
this._onChangeCallback = noop;
|
|
8583
|
-
this._onTouchedCallback = noop;
|
|
8595
|
+
this._onChangeCallback = noop$8;
|
|
8596
|
+
this._onTouchedCallback = noop$8;
|
|
8584
8597
|
this.readonly = false;
|
|
8585
8598
|
this.compact = false;
|
|
8586
8599
|
this.floatLabel = 'auto';
|
|
@@ -9016,14 +9029,14 @@ class AudioProvider extends StartableService {
|
|
|
9016
9029
|
});
|
|
9017
9030
|
}
|
|
9018
9031
|
}
|
|
9019
|
-
AudioProvider.ɵprov =
|
|
9032
|
+
AudioProvider.ɵprov = ɵɵdefineInjectable({ factory: function AudioProvider_Factory() { return new AudioProvider(ɵɵinject(Platform), ɵɵinject(NativeAudio, 8), ɵɵinject(Vibration, 8), ɵɵinject(AudioManagement$1, 8)); }, token: AudioProvider, providedIn: "root" });
|
|
9020
9033
|
AudioProvider.decorators = [
|
|
9021
9034
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
9022
9035
|
];
|
|
9023
9036
|
AudioProvider.ctorParameters = () => [
|
|
9024
9037
|
{ type: Platform },
|
|
9025
|
-
{ type: NativeAudio, decorators: [{ type: Optional }] },
|
|
9026
|
-
{ type: Vibration, decorators: [{ type: Optional }] },
|
|
9038
|
+
{ type: NativeAudio$1, decorators: [{ type: Optional }] },
|
|
9039
|
+
{ type: Vibration$1, decorators: [{ type: Optional }] },
|
|
9027
9040
|
{ type: AudioManagement, decorators: [{ type: Optional }] }
|
|
9028
9041
|
];
|
|
9029
9042
|
|
|
@@ -9108,7 +9121,7 @@ class Hotkeys {
|
|
|
9108
9121
|
});
|
|
9109
9122
|
}
|
|
9110
9123
|
}
|
|
9111
|
-
Hotkeys.ɵprov =
|
|
9124
|
+
Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController), ɵɵinject(PopoverController)); }, token: Hotkeys, providedIn: "root" });
|
|
9112
9125
|
Hotkeys.decorators = [
|
|
9113
9126
|
{ type: Injectable, args: [{
|
|
9114
9127
|
providedIn: 'root'
|
|
@@ -9283,7 +9296,7 @@ class Base64ImageReader {
|
|
|
9283
9296
|
}
|
|
9284
9297
|
}
|
|
9285
9298
|
|
|
9286
|
-
const uuidv4
|
|
9299
|
+
const uuidv4 = uuidv4Imported;
|
|
9287
9300
|
class FileService {
|
|
9288
9301
|
constructor(platform,
|
|
9289
9302
|
//private transfer: FileTransfer,
|
|
@@ -9320,7 +9333,7 @@ class FileService {
|
|
|
9320
9333
|
const lastSlashIndex = source.lastIndexOf('/');
|
|
9321
9334
|
if (lastSlashIndex === -1)
|
|
9322
9335
|
throw new Error('Invalid URL: ' + source);
|
|
9323
|
-
const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4
|
|
9336
|
+
const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4();
|
|
9324
9337
|
// Download into the file system
|
|
9325
9338
|
if (responseType === 'file' && this.canUseFileSystem) {
|
|
9326
9339
|
console.warn(`WARN: [file] Fetching image {${source}} in local file...`);
|
|
@@ -9376,7 +9389,7 @@ class FileService {
|
|
|
9376
9389
|
this._started = true;
|
|
9377
9390
|
}
|
|
9378
9391
|
}
|
|
9379
|
-
FileService.ɵprov =
|
|
9392
|
+
FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
|
|
9380
9393
|
FileService.decorators = [
|
|
9381
9394
|
{ type: Injectable, args: [{
|
|
9382
9395
|
providedIn: 'root',
|
|
@@ -9542,7 +9555,7 @@ class Base58 {
|
|
|
9542
9555
|
Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
9543
9556
|
|
|
9544
9557
|
const scrypt = require('scrypt-async');
|
|
9545
|
-
const sha256
|
|
9558
|
+
const sha256 = require('hash.js/lib/hash/sha/256');
|
|
9546
9559
|
const sha512 = require('hash.js/lib/hash/sha/512');
|
|
9547
9560
|
const nacl = {
|
|
9548
9561
|
sign,
|
|
@@ -9646,7 +9659,7 @@ class CryptoService {
|
|
|
9646
9659
|
* Hash (using SHA256) a message
|
|
9647
9660
|
*/
|
|
9648
9661
|
sha256(message) {
|
|
9649
|
-
return sha256
|
|
9662
|
+
return sha256().update(message).digest('hex');
|
|
9650
9663
|
}
|
|
9651
9664
|
/**
|
|
9652
9665
|
* Hash (using SHA512) a message
|
|
@@ -9659,7 +9672,7 @@ class CryptoService {
|
|
|
9659
9672
|
return nacl.util.encodeBase64(m);
|
|
9660
9673
|
}
|
|
9661
9674
|
}
|
|
9662
|
-
CryptoService.ɵprov =
|
|
9675
|
+
CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
|
|
9663
9676
|
CryptoService.decorators = [
|
|
9664
9677
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
9665
9678
|
];
|
|
@@ -10419,7 +10432,7 @@ SelectPeerModal.propDecorators = {
|
|
|
10419
10432
|
onRefresh: [{ type: Input }]
|
|
10420
10433
|
};
|
|
10421
10434
|
|
|
10422
|
-
const moment$
|
|
10435
|
+
const moment$3 = momentImported;
|
|
10423
10436
|
const SETTINGS_STORAGE_KEY = 'settings';
|
|
10424
10437
|
const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
|
|
10425
10438
|
// fixme: this constant points to static environment
|
|
@@ -10662,11 +10675,11 @@ class LocalSettingsService extends StartableService {
|
|
|
10662
10675
|
if (!feature) {
|
|
10663
10676
|
feature = {
|
|
10664
10677
|
name: featureName.toLowerCase(),
|
|
10665
|
-
lastSyncDate: moment$
|
|
10678
|
+
lastSyncDate: moment$3().toISOString()
|
|
10666
10679
|
};
|
|
10667
10680
|
}
|
|
10668
10681
|
else {
|
|
10669
|
-
feature.lastSyncDate = moment$
|
|
10682
|
+
feature.lastSyncDate = moment$3().toISOString();
|
|
10670
10683
|
}
|
|
10671
10684
|
this.saveOfflineFeature(feature);
|
|
10672
10685
|
}
|
|
@@ -10827,7 +10840,7 @@ class LocalSettingsService extends StartableService {
|
|
|
10827
10840
|
if (!page || !page.title || !page.path)
|
|
10828
10841
|
throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
|
|
10829
10842
|
// Set time
|
|
10830
|
-
page.time = page.time || moment$
|
|
10843
|
+
page.time = page.time || moment$3();
|
|
10831
10844
|
// Clean the title (remove <small> tags)
|
|
10832
10845
|
if (!opts || opts.removeTitleSmallTag !== false) {
|
|
10833
10846
|
const tagIndex = page.title.indexOf('</small>');
|
|
@@ -10843,18 +10856,18 @@ class LocalSettingsService extends StartableService {
|
|
|
10843
10856
|
return page;
|
|
10844
10857
|
}
|
|
10845
10858
|
}
|
|
10846
|
-
LocalSettingsService.ɵprov =
|
|
10859
|
+
LocalSettingsService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsService_Factory() { return new LocalSettingsService(ɵɵinject(TranslateService), ɵɵinject(Platform), ɵɵinject(Storage), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_LOCAL_SETTINGS, 8), ɵɵinject(APP_LOCAL_SETTINGS_OPTIONS, 8)); }, token: LocalSettingsService, providedIn: "root" });
|
|
10847
10860
|
LocalSettingsService.decorators = [
|
|
10848
10861
|
{ type: Injectable, args: [{
|
|
10849
|
-
providedIn: 'root'
|
|
10850
|
-
deps: [APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS]
|
|
10862
|
+
providedIn: 'root'
|
|
10863
|
+
//deps: [APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS]
|
|
10851
10864
|
},] }
|
|
10852
10865
|
];
|
|
10853
10866
|
LocalSettingsService.ctorParameters = () => [
|
|
10854
10867
|
{ type: TranslateService },
|
|
10855
10868
|
{ type: Platform },
|
|
10856
10869
|
{ type: Storage },
|
|
10857
|
-
{ type:
|
|
10870
|
+
{ type: Environment, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
|
|
10858
10871
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_LOCAL_SETTINGS,] }] },
|
|
10859
10872
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_LOCAL_SETTINGS_OPTIONS,] }] }
|
|
10860
10873
|
];
|
|
@@ -11560,7 +11573,7 @@ class NetworkService extends StartableService {
|
|
|
11560
11573
|
});
|
|
11561
11574
|
}
|
|
11562
11575
|
}
|
|
11563
|
-
NetworkService.ɵprov =
|
|
11576
|
+
NetworkService.ɵprov = ɵɵdefineInjectable({ factory: function NetworkService_Factory() { return new NetworkService(ɵɵinject(DOCUMENT), ɵɵinject(Platform), ɵɵinject(ModalController), ɵɵinject(CryptoService), ɵɵinject(Storage), ɵɵinject(LocalSettingsService), ɵɵinject(CacheService), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT), ɵɵinject(Network, 8), ɵɵinject(SplashScreen, 8), ɵɵinject(TranslateService, 8), ɵɵinject(ToastController, 8)); }, token: NetworkService, providedIn: "root" });
|
|
11564
11577
|
NetworkService.decorators = [
|
|
11565
11578
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
11566
11579
|
];
|
|
@@ -11571,16 +11584,16 @@ NetworkService.ctorParameters = () => [
|
|
|
11571
11584
|
{ type: CryptoService },
|
|
11572
11585
|
{ type: Storage },
|
|
11573
11586
|
{ type: LocalSettingsService },
|
|
11574
|
-
{ type: CacheService },
|
|
11587
|
+
{ type: CacheService$1 },
|
|
11575
11588
|
{ type: HttpClient },
|
|
11576
11589
|
{ type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
|
|
11577
|
-
{ type: Network, decorators: [{ type: Optional }] },
|
|
11578
|
-
{ type: SplashScreen, decorators: [{ type: Optional }] },
|
|
11590
|
+
{ type: Network$1, decorators: [{ type: Optional }] },
|
|
11591
|
+
{ type: SplashScreen$1, decorators: [{ type: Optional }] },
|
|
11579
11592
|
{ type: TranslateService, decorators: [{ type: Optional }] },
|
|
11580
11593
|
{ type: ToastController, decorators: [{ type: Optional }] }
|
|
11581
11594
|
];
|
|
11582
11595
|
|
|
11583
|
-
const ErrorCodes
|
|
11596
|
+
const ErrorCodes = {
|
|
11584
11597
|
UNKNOWN_ERROR: 0,
|
|
11585
11598
|
LOAD_ACCOUNT_ERROR: 1,
|
|
11586
11599
|
BAD_PASSWORD: 2,
|
|
@@ -11932,7 +11945,7 @@ class EntityStore {
|
|
|
11932
11945
|
}
|
|
11933
11946
|
catch (err) {
|
|
11934
11947
|
console.error(err);
|
|
11935
|
-
throw { code: ErrorCodes
|
|
11948
|
+
throw { code: ErrorCodes.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
|
|
11936
11949
|
}
|
|
11937
11950
|
}
|
|
11938
11951
|
// Emit update event
|
|
@@ -12506,7 +12519,7 @@ class EntitiesStorage extends StartableService {
|
|
|
12506
12519
|
}
|
|
12507
12520
|
EntitiesStorage.TRASH_PREFIX = 'Trash#';
|
|
12508
12521
|
EntitiesStorage.REMOTE_PREFIX = 'Remote#';
|
|
12509
|
-
EntitiesStorage.ɵprov =
|
|
12522
|
+
EntitiesStorage.ɵprov = ɵɵdefineInjectable({ factory: function EntitiesStorage_Factory() { return new EntitiesStorage(ɵɵinject(Platform), ɵɵinject(ProgressBarService), ɵɵinject(Storage), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_LOCAL_STORAGE_TYPE_POLICIES, 8)); }, token: EntitiesStorage, providedIn: "root" });
|
|
12510
12523
|
EntitiesStorage.decorators = [
|
|
12511
12524
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
12512
12525
|
];
|
|
@@ -12643,10 +12656,10 @@ function referentialToString(obj, properties) {
|
|
|
12643
12656
|
function referentialsToString(values, properties, separator) {
|
|
12644
12657
|
return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
|
|
12645
12658
|
}
|
|
12646
|
-
const ɵ0$
|
|
12659
|
+
const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
|
|
12647
12660
|
const StatusList = Object.freeze([
|
|
12648
12661
|
{
|
|
12649
|
-
id: ɵ0$
|
|
12662
|
+
id: ɵ0$a,
|
|
12650
12663
|
icon: 'checkmark',
|
|
12651
12664
|
label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
|
|
12652
12665
|
},
|
|
@@ -12921,7 +12934,7 @@ function accountToString(data) {
|
|
|
12921
12934
|
(data.lastName || '')) || '';
|
|
12922
12935
|
}
|
|
12923
12936
|
|
|
12924
|
-
const uuidv4 = uuidv4Imported;
|
|
12937
|
+
const uuidv4$1 = uuidv4Imported;
|
|
12925
12938
|
const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
|
|
12926
12939
|
const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
|
|
12927
12940
|
/**
|
|
@@ -12965,7 +12978,7 @@ function createTrackerLink(opts) {
|
|
|
12965
12978
|
// Skip if not tracked
|
|
12966
12979
|
if (!context || !context.tracked)
|
|
12967
12980
|
return forward(operation);
|
|
12968
|
-
const id = context.serializationKey || uuidv4();
|
|
12981
|
+
const id = context.serializationKey || uuidv4$1();
|
|
12969
12982
|
console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
|
|
12970
12983
|
// Clean context, before calling JSON.stringify (remove unused attributes)
|
|
12971
12984
|
const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
|
|
@@ -13628,7 +13641,7 @@ class GraphqlService extends StartableService {
|
|
|
13628
13641
|
(err.networkError && ((err.networkError.error && this.toAppError(err.networkError.error))
|
|
13629
13642
|
|| this.toAppError(err.networkError)
|
|
13630
13643
|
|| (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status))
|
|
13631
|
-
|| this.createAppErrorByCode(ErrorCodes
|
|
13644
|
+
|| this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR)))
|
|
13632
13645
|
// If graphQL: try to convert the first error found
|
|
13633
13646
|
|| (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0]))
|
|
13634
13647
|
|| this.toAppError(err)
|
|
@@ -13636,7 +13649,7 @@ class GraphqlService extends StartableService {
|
|
|
13636
13649
|
|| (err.graphQLErrors && err.graphQLErrors[0])
|
|
13637
13650
|
|| err;
|
|
13638
13651
|
console.error('[graphql] ' + (error && error.message || error), error.stack || '');
|
|
13639
|
-
if (error && error.code === ErrorCodes
|
|
13652
|
+
if (error && error.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
|
|
13640
13653
|
console.error('[graphql] original error: ' + err.networkError.message);
|
|
13641
13654
|
this.onNetworkError.next(error);
|
|
13642
13655
|
}
|
|
@@ -13672,7 +13685,7 @@ class GraphqlService extends StartableService {
|
|
|
13672
13685
|
return 'ERROR.UNAUTHORIZED';
|
|
13673
13686
|
case ServerErrorCodes.FORBIDDEN:
|
|
13674
13687
|
return 'ERROR.FORBIDDEN';
|
|
13675
|
-
case ErrorCodes
|
|
13688
|
+
case ErrorCodes.UNKNOWN_NETWORK_ERROR:
|
|
13676
13689
|
return 'ERROR.UNKNOWN_NETWORK_ERROR';
|
|
13677
13690
|
case ServerErrorCodes.BAD_UPDATE_DATE:
|
|
13678
13691
|
return 'ERROR.BAD_UPDATE_DATE';
|
|
@@ -13703,7 +13716,7 @@ class GraphqlService extends StartableService {
|
|
|
13703
13716
|
return undefined;
|
|
13704
13717
|
}
|
|
13705
13718
|
}
|
|
13706
|
-
GraphqlService.ɵprov =
|
|
13719
|
+
GraphqlService.ɵprov = ɵɵdefineInjectable({ factory: function GraphqlService_Factory() { return new GraphqlService(ɵɵinject(Platform), ɵɵinject(Apollo), ɵɵinject(HttpLink), ɵɵinject(NetworkService), ɵɵinject(Storage), ɵɵinject(CryptoService), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_GRAPHQL_TYPE_POLICIES, 8)); }, token: GraphqlService, providedIn: "root" });
|
|
13707
13720
|
GraphqlService.decorators = [
|
|
13708
13721
|
{ type: Injectable, args: [{
|
|
13709
13722
|
providedIn: 'root'
|
|
@@ -13720,7 +13733,7 @@ GraphqlService.ctorParameters = () => [
|
|
|
13720
13733
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
|
|
13721
13734
|
];
|
|
13722
13735
|
|
|
13723
|
-
const sha256 = require('hash.js/lib/hash/sha/256');
|
|
13736
|
+
const sha256$1 = require('hash.js/lib/hash/sha/256');
|
|
13724
13737
|
class BaseGraphqlServiceOptions {
|
|
13725
13738
|
}
|
|
13726
13739
|
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
@@ -13871,8 +13884,8 @@ class BaseGraphqlService extends StartableService {
|
|
|
13871
13884
|
}
|
|
13872
13885
|
/* -- protected methods -- */
|
|
13873
13886
|
computeMutableWatchQueryId(opts) {
|
|
13874
|
-
const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
|
|
13875
|
-
const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
|
|
13887
|
+
const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
|
|
13888
|
+
const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
|
|
13876
13889
|
return [queryName, opts.arrayFieldName, variablesKey].join('|');
|
|
13877
13890
|
}
|
|
13878
13891
|
findMutableWatchQueries(opts) {
|
|
@@ -13942,7 +13955,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
|
|
|
13942
13955
|
/* ------------------------------------
|
|
13943
13956
|
* GraphQL queries
|
|
13944
13957
|
* ------------------------------------*/
|
|
13945
|
-
const Fragments
|
|
13958
|
+
const Fragments = {
|
|
13946
13959
|
account: gql `
|
|
13947
13960
|
fragment AccountFragment on AccountVO {
|
|
13948
13961
|
id
|
|
@@ -13977,14 +13990,14 @@ const Fragments$1 = {
|
|
|
13977
13990
|
}`
|
|
13978
13991
|
};
|
|
13979
13992
|
// Load account query
|
|
13980
|
-
const LoadQuery
|
|
13993
|
+
const LoadQuery = gql `
|
|
13981
13994
|
query Account {
|
|
13982
13995
|
data: account {
|
|
13983
13996
|
...AccountFragment
|
|
13984
13997
|
}
|
|
13985
13998
|
}
|
|
13986
|
-
${Fragments
|
|
13987
|
-
${Fragments
|
|
13999
|
+
${Fragments.account}
|
|
14000
|
+
${Fragments.settings}
|
|
13988
14001
|
`;
|
|
13989
14002
|
// Check email query
|
|
13990
14003
|
const IsEmailExistsQuery = gql `
|
|
@@ -13999,21 +14012,21 @@ const AccountMutations = {
|
|
|
13999
14012
|
...AccountFragment
|
|
14000
14013
|
}
|
|
14001
14014
|
}
|
|
14002
|
-
${Fragments
|
|
14003
|
-
${Fragments
|
|
14015
|
+
${Fragments.account}
|
|
14016
|
+
${Fragments.settings}`,
|
|
14004
14017
|
create: gql `mutation CreateAccount($data:AccountVOInput){
|
|
14005
14018
|
data: createAccount(account: $data){
|
|
14006
14019
|
...AccountFragment
|
|
14007
14020
|
}
|
|
14008
14021
|
}
|
|
14009
|
-
${Fragments
|
|
14010
|
-
${Fragments
|
|
14022
|
+
${Fragments.account}
|
|
14023
|
+
${Fragments.settings}`,
|
|
14011
14024
|
saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
|
|
14012
14025
|
data: saveSettings(settings: $data){
|
|
14013
14026
|
...UserSettingsFragment
|
|
14014
14027
|
}
|
|
14015
14028
|
}
|
|
14016
|
-
${Fragments
|
|
14029
|
+
${Fragments.settings}`
|
|
14017
14030
|
};
|
|
14018
14031
|
// Sent confirmation email
|
|
14019
14032
|
const SendConfirmEmailMutation = gql `
|
|
@@ -14328,7 +14341,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14328
14341
|
catch (error) {
|
|
14329
14342
|
console.error(error);
|
|
14330
14343
|
this.resetData();
|
|
14331
|
-
throw { code: ErrorCodes
|
|
14344
|
+
throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
|
|
14332
14345
|
}
|
|
14333
14346
|
// Store pubkey+keypair
|
|
14334
14347
|
this._cache.pubkey = Base58.encode(keypair.publicKey);
|
|
@@ -14362,7 +14375,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14362
14375
|
}
|
|
14363
14376
|
catch (err) {
|
|
14364
14377
|
// If account not found, check if email is valid
|
|
14365
|
-
if (err && +(err.code) === ErrorCodes
|
|
14378
|
+
if (err && +(err.code) === ErrorCodes.LOAD_ACCOUNT_ERROR) {
|
|
14366
14379
|
// Check email exists
|
|
14367
14380
|
if (data.username.indexOf('@') !== -1) {
|
|
14368
14381
|
let isEmailExists;
|
|
@@ -14374,11 +14387,11 @@ class AccountService extends BaseGraphqlService {
|
|
|
14374
14387
|
}
|
|
14375
14388
|
// Email not exists (no account)
|
|
14376
14389
|
if (!isEmailExists) {
|
|
14377
|
-
throw { code: ErrorCodes
|
|
14390
|
+
throw { code: ErrorCodes.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
|
|
14378
14391
|
}
|
|
14379
14392
|
}
|
|
14380
14393
|
// Email exists, so error = 'bad password'
|
|
14381
|
-
throw { code: ErrorCodes
|
|
14394
|
+
throw { code: ErrorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
|
|
14382
14395
|
}
|
|
14383
14396
|
throw err; // resend the first error
|
|
14384
14397
|
}
|
|
@@ -14524,8 +14537,8 @@ class AccountService extends BaseGraphqlService {
|
|
|
14524
14537
|
// Load remotely
|
|
14525
14538
|
else {
|
|
14526
14539
|
const { data } = yield this.graphql.query({
|
|
14527
|
-
query: LoadQuery
|
|
14528
|
-
error: { code: ErrorCodes
|
|
14540
|
+
query: LoadQuery,
|
|
14541
|
+
error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
|
|
14529
14542
|
fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
|
|
14530
14543
|
});
|
|
14531
14544
|
json = data;
|
|
@@ -14552,7 +14565,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14552
14565
|
return __awaiter(this, void 0, void 0, function* () {
|
|
14553
14566
|
const isEmailExists = yield this.isEmailExists(email);
|
|
14554
14567
|
if (isEmailExists) {
|
|
14555
|
-
throw { code: ErrorCodes
|
|
14568
|
+
throw { code: ErrorCodes.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
|
|
14556
14569
|
}
|
|
14557
14570
|
});
|
|
14558
14571
|
}
|
|
@@ -14588,7 +14601,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14588
14601
|
locale
|
|
14589
14602
|
},
|
|
14590
14603
|
error: {
|
|
14591
|
-
code: ErrorCodes
|
|
14604
|
+
code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,
|
|
14592
14605
|
message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED'
|
|
14593
14606
|
}
|
|
14594
14607
|
});
|
|
@@ -14604,7 +14617,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14604
14617
|
code
|
|
14605
14618
|
},
|
|
14606
14619
|
error: {
|
|
14607
|
-
code: ErrorCodes
|
|
14620
|
+
code: ErrorCodes.CONFIRM_EMAIL_FAILED,
|
|
14608
14621
|
message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED'
|
|
14609
14622
|
}
|
|
14610
14623
|
});
|
|
@@ -14683,7 +14696,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14683
14696
|
throw error;
|
|
14684
14697
|
console.error(error);
|
|
14685
14698
|
throw {
|
|
14686
|
-
code: ErrorCodes
|
|
14699
|
+
code: ErrorCodes.LOAD_ACCOUNT_ERROR,
|
|
14687
14700
|
message: 'ERROR.LOAD_ACCOUNT_ERROR'
|
|
14688
14701
|
};
|
|
14689
14702
|
}
|
|
@@ -14853,7 +14866,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14853
14866
|
if (!isNew) {
|
|
14854
14867
|
const existingAccount = yield this.load({ fetchPolicy: 'network-only' });
|
|
14855
14868
|
if (!existingAccount || !existingAccount.updateDate) {
|
|
14856
|
-
throw { code: ErrorCodes
|
|
14869
|
+
throw { code: ErrorCodes.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
|
|
14857
14870
|
}
|
|
14858
14871
|
this.copyIdAndUpdateDate(existingAccount, account);
|
|
14859
14872
|
}
|
|
@@ -14865,7 +14878,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14865
14878
|
mutation: isNew ? AccountMutations.create : AccountMutations.save,
|
|
14866
14879
|
variables: { data: json },
|
|
14867
14880
|
error: {
|
|
14868
|
-
code: ErrorCodes
|
|
14881
|
+
code: ErrorCodes.SAVE_ACCOUNT_ERROR,
|
|
14869
14882
|
message: 'ERROR.SAVE_ACCOUNT_ERROR'
|
|
14870
14883
|
}
|
|
14871
14884
|
});
|
|
@@ -14892,7 +14905,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14892
14905
|
mutation: AccountMutations.saveSettings,
|
|
14893
14906
|
variables: { data: json },
|
|
14894
14907
|
error: {
|
|
14895
|
-
code: ErrorCodes
|
|
14908
|
+
code: ErrorCodes.SAVE_SETTINGS_ERROR,
|
|
14896
14909
|
message: 'ERROR.SAVE_SETTINGS_ERROR'
|
|
14897
14910
|
}
|
|
14898
14911
|
});
|
|
@@ -14914,7 +14927,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14914
14927
|
if (counter > 4) {
|
|
14915
14928
|
if (this._debug)
|
|
14916
14929
|
console.debug(`[account] Failed to authentication on pod (after ${counter} attempts)`);
|
|
14917
|
-
throw { code: ErrorCodes
|
|
14930
|
+
throw { code: ErrorCodes.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
|
|
14918
14931
|
}
|
|
14919
14932
|
// Check if valid
|
|
14920
14933
|
if (token) {
|
|
@@ -14924,7 +14937,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14924
14937
|
token
|
|
14925
14938
|
},
|
|
14926
14939
|
error: {
|
|
14927
|
-
code: ErrorCodes
|
|
14940
|
+
code: ErrorCodes.UNAUTHORIZED,
|
|
14928
14941
|
message: 'ERROR.UNAUTHORIZED'
|
|
14929
14942
|
},
|
|
14930
14943
|
fetchPolicy: 'no-cache'
|
|
@@ -14940,7 +14953,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
14940
14953
|
}
|
|
14941
14954
|
// Generate a new token
|
|
14942
14955
|
const challengeError = {
|
|
14943
|
-
code: ErrorCodes
|
|
14956
|
+
code: ErrorCodes.AUTH_CHALLENGE_ERROR,
|
|
14944
14957
|
message: 'ERROR.AUTH_CHALLENGE_ERROR'
|
|
14945
14958
|
};
|
|
14946
14959
|
const data = yield this.graphql.query({
|
|
@@ -15018,7 +15031,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
15018
15031
|
query: AccountSubscriptions.listenChanges,
|
|
15019
15032
|
variables,
|
|
15020
15033
|
error: {
|
|
15021
|
-
code: ErrorCodes
|
|
15034
|
+
code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,
|
|
15022
15035
|
message: 'ERROR.ACCOUNT.SUBSCRIBE_ERROR'
|
|
15023
15036
|
}
|
|
15024
15037
|
}).pipe(map(({ data }) => data),
|
|
@@ -15047,7 +15060,7 @@ class AccountService extends BaseGraphqlService {
|
|
|
15047
15060
|
return Toasts.show(this.toastController, this.translate, opts);
|
|
15048
15061
|
}
|
|
15049
15062
|
}
|
|
15050
|
-
AccountService.ɵprov =
|
|
15063
|
+
AccountService.ɵprov = ɵɵdefineInjectable({ factory: function AccountService_Factory() { return new AccountService(ɵɵinject(CryptoService), ɵɵinject(NetworkService), ɵɵinject(GraphqlService), ɵɵinject(LocalSettingsService), ɵɵinject(Storage), ɵɵinject(FileService), ɵɵinject(TranslateService, 8), ɵɵinject(ToastController, 8), ɵɵinject(ENVIRONMENT)); }, token: AccountService, providedIn: "root" });
|
|
15051
15064
|
AccountService.decorators = [
|
|
15052
15065
|
{ type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
|
|
15053
15066
|
];
|
|
@@ -15315,7 +15328,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
|
|
|
15315
15328
|
/* ------------------------------------
|
|
15316
15329
|
* GraphQL queries
|
|
15317
15330
|
* ------------------------------------*/
|
|
15318
|
-
const Fragments = {
|
|
15331
|
+
const Fragments$1 = {
|
|
15319
15332
|
config: gql `
|
|
15320
15333
|
fragment ConfigFragment on ConfigurationVO {
|
|
15321
15334
|
id
|
|
@@ -15342,13 +15355,13 @@ const Fragments = {
|
|
|
15342
15355
|
}
|
|
15343
15356
|
`
|
|
15344
15357
|
};
|
|
15345
|
-
const LoadQuery = gql `
|
|
15358
|
+
const LoadQuery$1 = gql `
|
|
15346
15359
|
query Configuration{
|
|
15347
15360
|
data: configuration{
|
|
15348
15361
|
...ConfigFragment
|
|
15349
15362
|
}
|
|
15350
15363
|
}
|
|
15351
|
-
${Fragments.config}
|
|
15364
|
+
${Fragments$1.config}
|
|
15352
15365
|
`;
|
|
15353
15366
|
// Save (create or update) account mutation
|
|
15354
15367
|
const SaveMutation = gql `
|
|
@@ -15357,7 +15370,7 @@ const SaveMutation = gql `
|
|
|
15357
15370
|
...ConfigFragment
|
|
15358
15371
|
}
|
|
15359
15372
|
}
|
|
15360
|
-
${Fragments.config}
|
|
15373
|
+
${Fragments$1.config}
|
|
15361
15374
|
`;
|
|
15362
15375
|
const ClearCache = gql `
|
|
15363
15376
|
query ClearCache($name: String) {
|
|
@@ -15408,12 +15421,12 @@ class ConfigService extends BaseGraphqlService {
|
|
|
15408
15421
|
return __awaiter(this, void 0, void 0, function* () {
|
|
15409
15422
|
const now = Date.now();
|
|
15410
15423
|
console.debug('[config] Loading Pod configuration...');
|
|
15411
|
-
const query = opts && opts.query || LoadQuery;
|
|
15424
|
+
const query = opts && opts.query || LoadQuery$1;
|
|
15412
15425
|
const variables = opts && opts.variables || undefined;
|
|
15413
15426
|
const res = yield this.graphql.query({
|
|
15414
15427
|
query,
|
|
15415
15428
|
variables,
|
|
15416
|
-
error: { code: ErrorCodes
|
|
15429
|
+
error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
|
|
15417
15430
|
fetchPolicy: opts && opts.fetchPolicy || undefined /*default*/
|
|
15418
15431
|
});
|
|
15419
15432
|
const data = res && res.data ? Configuration.fromObject(res.data) : undefined;
|
|
@@ -15446,7 +15459,7 @@ class ConfigService extends BaseGraphqlService {
|
|
|
15446
15459
|
data: json
|
|
15447
15460
|
},
|
|
15448
15461
|
error: {
|
|
15449
|
-
code: ErrorCodes
|
|
15462
|
+
code: ErrorCodes.SAVE_CONFIG_ERROR,
|
|
15450
15463
|
message: 'ERROR.SAVE_CONFIG_ERROR'
|
|
15451
15464
|
}
|
|
15452
15465
|
});
|
|
@@ -15472,7 +15485,7 @@ class ConfigService extends BaseGraphqlService {
|
|
|
15472
15485
|
const res = yield this.graphql.query({
|
|
15473
15486
|
query: CacheStatistics,
|
|
15474
15487
|
variables: null,
|
|
15475
|
-
error: { code: ErrorCodes
|
|
15488
|
+
error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
|
|
15476
15489
|
fetchPolicy: 'network-only'
|
|
15477
15490
|
});
|
|
15478
15491
|
const data = res && res.cacheStatistics || undefined;
|
|
@@ -15488,7 +15501,7 @@ class ConfigService extends BaseGraphqlService {
|
|
|
15488
15501
|
const res = yield this.graphql.query({
|
|
15489
15502
|
query: ClearCache,
|
|
15490
15503
|
variables,
|
|
15491
|
-
error: { code: ErrorCodes
|
|
15504
|
+
error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
|
|
15492
15505
|
fetchPolicy: 'no-cache'
|
|
15493
15506
|
});
|
|
15494
15507
|
const data = res && res.clearCache || undefined;
|
|
@@ -15647,7 +15660,7 @@ class ConfigService extends BaseGraphqlService {
|
|
|
15647
15660
|
});
|
|
15648
15661
|
}
|
|
15649
15662
|
}
|
|
15650
|
-
ConfigService.ɵprov =
|
|
15663
|
+
ConfigService.ɵprov = ɵɵdefineInjectable({ factory: function ConfigService_Factory() { return new ConfigService(ɵɵinject(Platform), ɵɵinject(GraphqlService), ɵɵinject(Storage), ɵɵinject(NetworkService), ɵɵinject(FileService), ɵɵinject(ToastController), ɵɵinject(TranslateService), ɵɵinject(AccountService), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_CONFIG_OPTIONS, 8)); }, token: ConfigService, providedIn: "root" });
|
|
15651
15664
|
ConfigService.decorators = [
|
|
15652
15665
|
{ type: Injectable, args: [{
|
|
15653
15666
|
providedIn: 'root',
|
|
@@ -15667,7 +15680,7 @@ ConfigService.ctorParameters = () => [
|
|
|
15667
15680
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG_OPTIONS,] }] }
|
|
15668
15681
|
];
|
|
15669
15682
|
|
|
15670
|
-
const moment$
|
|
15683
|
+
const moment$4 = momentImported;
|
|
15671
15684
|
const AndroidOsEnvironment = Object.freeze({
|
|
15672
15685
|
DIRECTORY_DOWNLOADS: 'Download',
|
|
15673
15686
|
DIRECTORY_DOWNLOADS_OLD: 'Downloads',
|
|
@@ -15902,16 +15915,16 @@ class PlatformService extends StartableService {
|
|
|
15902
15915
|
}
|
|
15903
15916
|
// config moment lib
|
|
15904
15917
|
try {
|
|
15905
|
-
moment$
|
|
15918
|
+
moment$4.locale(event.lang);
|
|
15906
15919
|
console.debug('[platform] Use locale {' + event.lang + '}');
|
|
15907
15920
|
}
|
|
15908
15921
|
// If error, fallback to en
|
|
15909
15922
|
catch (err) {
|
|
15910
|
-
moment$
|
|
15923
|
+
moment$4.locale('en');
|
|
15911
15924
|
console.warn('[platform] Unknown local for moment lib. Using default [en]');
|
|
15912
15925
|
}
|
|
15913
15926
|
// Config date adapter
|
|
15914
|
-
this.dateAdapter.setLocale(moment$
|
|
15927
|
+
this.dateAdapter.setLocale(moment$4.locale());
|
|
15915
15928
|
}
|
|
15916
15929
|
});
|
|
15917
15930
|
this.settings.onChange.subscribe(data => {
|
|
@@ -15950,8 +15963,7 @@ class PlatformService extends StartableService {
|
|
|
15950
15963
|
(_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
|
|
15951
15964
|
return; // Skip
|
|
15952
15965
|
}
|
|
15953
|
-
const
|
|
15954
|
-
const remoteVersion = yield this.networkService.getAppVersion(peer);
|
|
15966
|
+
const remoteVersion = yield this.networkService.getAppVersion();
|
|
15955
15967
|
if (isNilOrBlank(remoteVersion)) {
|
|
15956
15968
|
if (production && !silent)
|
|
15957
15969
|
console.error('[platform] Cannot load remote app version. Skipping version check');
|
|
@@ -15960,7 +15972,7 @@ class PlatformService extends StartableService {
|
|
|
15960
15972
|
}
|
|
15961
15973
|
if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
|
|
15962
15974
|
if (!silent)
|
|
15963
|
-
console.info(
|
|
15975
|
+
console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
|
|
15964
15976
|
return;
|
|
15965
15977
|
}
|
|
15966
15978
|
// If newer version exists
|
|
@@ -16112,7 +16124,7 @@ class PlatformService extends StartableService {
|
|
|
16112
16124
|
});
|
|
16113
16125
|
}
|
|
16114
16126
|
}
|
|
16115
|
-
PlatformService.ɵprov =
|
|
16127
|
+
PlatformService.ɵprov = ɵɵdefineInjectable({ factory: function PlatformService_Factory() { return new PlatformService(ɵɵinject(Platform), ɵɵinject(Platform$1), ɵɵinject(ToastController), ɵɵinject(TranslateService), ɵɵinject(MomentDateAdapter), ɵɵinject(EntitiesStorage), ɵɵinject(LocalSettingsService), ɵɵinject(NetworkService), ɵɵinject(AccountService), ɵɵinject(ConfigService), ɵɵinject(CacheService), ɵɵinject(Storage), ɵɵinject(AudioProvider), ɵɵinject(ENVIRONMENT), ɵɵinject(StatusBar, 8), ɵɵinject(Keyboard$1, 8), ɵɵinject(SplashScreen, 8), ɵɵinject(InAppBrowser, 8), ɵɵinject(Downloader, 8)); }, token: PlatformService, providedIn: "root" });
|
|
16116
16128
|
PlatformService.decorators = [
|
|
16117
16129
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
16118
16130
|
];
|
|
@@ -16127,15 +16139,15 @@ PlatformService.ctorParameters = () => [
|
|
|
16127
16139
|
{ type: NetworkService },
|
|
16128
16140
|
{ type: AccountService },
|
|
16129
16141
|
{ type: ConfigService },
|
|
16130
|
-
{ type: CacheService },
|
|
16142
|
+
{ type: CacheService$1 },
|
|
16131
16143
|
{ type: Storage },
|
|
16132
16144
|
{ type: AudioProvider },
|
|
16133
16145
|
{ type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
|
|
16134
|
-
{ type: StatusBar, decorators: [{ type: Optional }] },
|
|
16146
|
+
{ type: StatusBar$1, decorators: [{ type: Optional }] },
|
|
16135
16147
|
{ type: Keyboard, decorators: [{ type: Optional }] },
|
|
16136
|
-
{ type: SplashScreen, decorators: [{ type: Optional }] },
|
|
16137
|
-
{ type: InAppBrowser, decorators: [{ type: Optional }] },
|
|
16138
|
-
{ type: Downloader, decorators: [{ type: Optional }] }
|
|
16148
|
+
{ type: SplashScreen$1, decorators: [{ type: Optional }] },
|
|
16149
|
+
{ type: InAppBrowser$1, decorators: [{ type: Optional }] },
|
|
16150
|
+
{ type: Downloader$1, decorators: [{ type: Optional }] }
|
|
16139
16151
|
];
|
|
16140
16152
|
|
|
16141
16153
|
class AppHelpModal {
|
|
@@ -16199,7 +16211,7 @@ class MatStepperI18n extends MatStepperIntl {
|
|
|
16199
16211
|
this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
|
|
16200
16212
|
}
|
|
16201
16213
|
}
|
|
16202
|
-
MatStepperI18n.ɵprov =
|
|
16214
|
+
MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
|
|
16203
16215
|
MatStepperI18n.decorators = [
|
|
16204
16216
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
16205
16217
|
];
|
|
@@ -18035,7 +18047,7 @@ function state2side(state) {
|
|
|
18035
18047
|
return 1;
|
|
18036
18048
|
}
|
|
18037
18049
|
}
|
|
18038
|
-
const ɵ0$
|
|
18050
|
+
const ɵ0$b = (defaultStateSize) => [
|
|
18039
18051
|
Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
|
|
18040
18052
|
Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
|
|
18041
18053
|
Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
|
|
@@ -18043,7 +18055,7 @@ const ɵ0$1 = (defaultStateSize) => [
|
|
|
18043
18055
|
const SCALE_OPTIONS_DEFAULT = {
|
|
18044
18056
|
startColor: rgbArrayMap.red,
|
|
18045
18057
|
startStates: [0, 2, 3],
|
|
18046
|
-
startStepsFn: ɵ0$
|
|
18058
|
+
startStepsFn: ɵ0$b
|
|
18047
18059
|
};
|
|
18048
18060
|
/**
|
|
18049
18061
|
* Internal function, that create a colors scale, using iteration
|
|
@@ -18840,7 +18852,7 @@ class UserSettingsValidatorService extends AppValidatorService {
|
|
|
18840
18852
|
});
|
|
18841
18853
|
}
|
|
18842
18854
|
}
|
|
18843
|
-
UserSettingsValidatorService.ɵprov =
|
|
18855
|
+
UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
|
|
18844
18856
|
UserSettingsValidatorService.decorators = [
|
|
18845
18857
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
18846
18858
|
];
|
|
@@ -18884,7 +18896,7 @@ class AccountValidatorService extends AppValidatorService {
|
|
|
18884
18896
|
return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
|
|
18885
18897
|
}
|
|
18886
18898
|
}
|
|
18887
|
-
AccountValidatorService.ɵprov =
|
|
18899
|
+
AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
|
|
18888
18900
|
AccountValidatorService.decorators = [
|
|
18889
18901
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
18890
18902
|
];
|
|
@@ -19449,7 +19461,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
|
|
|
19449
19461
|
});
|
|
19450
19462
|
}
|
|
19451
19463
|
}
|
|
19452
|
-
LocalSettingsValidatorService.ɵprov =
|
|
19464
|
+
LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
|
|
19453
19465
|
LocalSettingsValidatorService.decorators = [
|
|
19454
19466
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
19455
19467
|
];
|
|
@@ -20068,7 +20080,7 @@ class IsOnFieldModePipe {
|
|
|
20068
20080
|
return value === 'FIELD';
|
|
20069
20081
|
}
|
|
20070
20082
|
}
|
|
20071
|
-
IsOnFieldModePipe.ɵprov =
|
|
20083
|
+
IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
|
|
20072
20084
|
IsOnFieldModePipe.decorators = [
|
|
20073
20085
|
{ type: Pipe, args: [{
|
|
20074
20086
|
name: 'isOnField'
|
|
@@ -20080,7 +20092,7 @@ class IsNotOnFieldModePipe {
|
|
|
20080
20092
|
return value !== 'FIELD';
|
|
20081
20093
|
}
|
|
20082
20094
|
}
|
|
20083
|
-
IsNotOnFieldModePipe.ɵprov =
|
|
20095
|
+
IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
|
|
20084
20096
|
IsNotOnFieldModePipe.decorators = [
|
|
20085
20097
|
{ type: Pipe, args: [{
|
|
20086
20098
|
name: 'isNotOnField'
|
|
@@ -20095,7 +20107,7 @@ class PersonToStringPipe {
|
|
|
20095
20107
|
return PersonUtils.personToString(value);
|
|
20096
20108
|
}
|
|
20097
20109
|
}
|
|
20098
|
-
PersonToStringPipe.ɵprov =
|
|
20110
|
+
PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
|
|
20099
20111
|
PersonToStringPipe.decorators = [
|
|
20100
20112
|
{ type: Pipe, args: [{
|
|
20101
20113
|
name: 'personToString'
|
|
@@ -20480,7 +20492,7 @@ class IsLoginAccountPipe {
|
|
|
20480
20492
|
return value && value.pubkey && true;
|
|
20481
20493
|
}
|
|
20482
20494
|
}
|
|
20483
|
-
IsLoginAccountPipe.ɵprov =
|
|
20495
|
+
IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
|
|
20484
20496
|
IsLoginAccountPipe.decorators = [
|
|
20485
20497
|
{ type: Pipe, args: [{
|
|
20486
20498
|
name: 'isLogin'
|
|
@@ -20492,7 +20504,7 @@ class AccountToStringPipe {
|
|
|
20492
20504
|
return accountToString(value);
|
|
20493
20505
|
}
|
|
20494
20506
|
}
|
|
20495
|
-
AccountToStringPipe.ɵprov =
|
|
20507
|
+
AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
|
|
20496
20508
|
AccountToStringPipe.decorators = [
|
|
20497
20509
|
{ type: Pipe, args: [{
|
|
20498
20510
|
name: 'accountToString'
|
|
@@ -20507,7 +20519,7 @@ class DepartmentToStringPipe {
|
|
|
20507
20519
|
return departmentToString(value);
|
|
20508
20520
|
}
|
|
20509
20521
|
}
|
|
20510
|
-
DepartmentToStringPipe.ɵprov =
|
|
20522
|
+
DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
|
|
20511
20523
|
DepartmentToStringPipe.decorators = [
|
|
20512
20524
|
{ type: Pipe, args: [{
|
|
20513
20525
|
name: 'departmentToString'
|
|
@@ -20603,7 +20615,7 @@ class MenuService {
|
|
|
20603
20615
|
this._visibleSubject.next(value);
|
|
20604
20616
|
}
|
|
20605
20617
|
}
|
|
20606
|
-
MenuService.ɵprov =
|
|
20618
|
+
MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
|
|
20607
20619
|
MenuService.decorators = [
|
|
20608
20620
|
{ type: Injectable, args: [{
|
|
20609
20621
|
providedIn: 'root'
|
|
@@ -21059,7 +21071,7 @@ class AuthGuardService {
|
|
|
21059
21071
|
}));
|
|
21060
21072
|
}
|
|
21061
21073
|
}
|
|
21062
|
-
AuthGuardService.ɵprov =
|
|
21074
|
+
AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
|
|
21063
21075
|
AuthGuardService.decorators = [
|
|
21064
21076
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
21065
21077
|
];
|
|
@@ -21101,7 +21113,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21101
21113
|
query,
|
|
21102
21114
|
variables: { id },
|
|
21103
21115
|
fetchPolicy: opts && opts.fetchPolicy || undefined,
|
|
21104
|
-
error: { code: ErrorCodes
|
|
21116
|
+
error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
|
|
21105
21117
|
})
|
|
21106
21118
|
.pipe(map(({ data }) => (!opts || opts.toEntity !== false)
|
|
21107
21119
|
? (data && this.fromObject(data))
|
|
@@ -21116,7 +21128,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21116
21128
|
query,
|
|
21117
21129
|
variables: { id },
|
|
21118
21130
|
fetchPolicy: opts && opts.fetchPolicy || undefined,
|
|
21119
|
-
error: { code: ErrorCodes
|
|
21131
|
+
error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
|
|
21120
21132
|
});
|
|
21121
21133
|
// Convert to entity
|
|
21122
21134
|
return (!opts || opts.toEntity !== false)
|
|
@@ -21147,7 +21159,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21147
21159
|
totalFieldName: withTotal ? 'total' : undefined,
|
|
21148
21160
|
insertFilterFn: filter && filter.asFilterFn(),
|
|
21149
21161
|
variables,
|
|
21150
|
-
error: { code: ErrorCodes
|
|
21162
|
+
error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
|
|
21151
21163
|
fetchPolicy: opts && opts.fetchPolicy || undefined
|
|
21152
21164
|
})
|
|
21153
21165
|
.pipe(map(({ data, total }) => {
|
|
@@ -21183,7 +21195,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21183
21195
|
const { data, total } = yield this.graphql.query({
|
|
21184
21196
|
query,
|
|
21185
21197
|
variables,
|
|
21186
|
-
error: { code: ErrorCodes
|
|
21198
|
+
error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
|
|
21187
21199
|
fetchPolicy: opts && opts.fetchPolicy || 'network-only'
|
|
21188
21200
|
});
|
|
21189
21201
|
const entities = (!opts || opts.toEntity !== false) ?
|
|
@@ -21191,18 +21203,18 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21191
21203
|
(data || []);
|
|
21192
21204
|
if (debug)
|
|
21193
21205
|
console.debug(this._logPrefix + `${this._logTypeName} items loaded in ${Date.now() - now}ms`);
|
|
21194
|
-
const
|
|
21206
|
+
const result = {
|
|
21195
21207
|
data: entities,
|
|
21196
|
-
total
|
|
21208
|
+
total: total || entities.length
|
|
21197
21209
|
};
|
|
21198
21210
|
// Add fetch more capability, if total was fetched
|
|
21199
21211
|
if (withTotal) {
|
|
21200
21212
|
const nextOffset = (offset || 0) + entities.length;
|
|
21201
|
-
if (nextOffset <
|
|
21202
|
-
|
|
21213
|
+
if (nextOffset < result.total) {
|
|
21214
|
+
result.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts);
|
|
21203
21215
|
}
|
|
21204
21216
|
}
|
|
21205
|
-
return
|
|
21217
|
+
return result;
|
|
21206
21218
|
});
|
|
21207
21219
|
}
|
|
21208
21220
|
countAll(filter, opts) {
|
|
@@ -21222,7 +21234,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21222
21234
|
variables: {
|
|
21223
21235
|
filter: filter && filter.asPodObject()
|
|
21224
21236
|
},
|
|
21225
|
-
error: { code: ErrorCodes
|
|
21237
|
+
error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
|
|
21226
21238
|
fetchPolicy: opts && opts.fetchPolicy || 'network-only'
|
|
21227
21239
|
});
|
|
21228
21240
|
return res.total;
|
|
@@ -21258,7 +21270,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21258
21270
|
variables: {
|
|
21259
21271
|
data: json
|
|
21260
21272
|
},
|
|
21261
|
-
error: { code: ErrorCodes
|
|
21273
|
+
error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
|
|
21262
21274
|
update: (proxy, { data }) => {
|
|
21263
21275
|
const savedEntities = data && data.data;
|
|
21264
21276
|
if (savedEntities) {
|
|
@@ -21314,7 +21326,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21314
21326
|
variables: {
|
|
21315
21327
|
data: json
|
|
21316
21328
|
},
|
|
21317
|
-
error: { code: ErrorCodes
|
|
21329
|
+
error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
|
|
21318
21330
|
update: (cache, { data }) => {
|
|
21319
21331
|
// Update entity
|
|
21320
21332
|
const savedEntity = data && data.data;
|
|
@@ -21362,7 +21374,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21362
21374
|
refetchQueries: this.getRefetchQueriesForMutation(opts),
|
|
21363
21375
|
awaitRefetchQueries: opts && opts.awaitRefetchQueries,
|
|
21364
21376
|
variables: { ids },
|
|
21365
|
-
error: { code: ErrorCodes
|
|
21377
|
+
error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
|
|
21366
21378
|
update: (cache, res) => {
|
|
21367
21379
|
// Remove from cache
|
|
21368
21380
|
if (this.watchQueriesUpdatePolicy === 'update-cache') {
|
|
@@ -21403,7 +21415,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21403
21415
|
refetchQueries: this.getRefetchQueriesForMutation(opts),
|
|
21404
21416
|
awaitRefetchQueries: opts && opts.awaitRefetchQueries,
|
|
21405
21417
|
variables: { id },
|
|
21406
|
-
error: { code: ErrorCodes
|
|
21418
|
+
error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
|
|
21407
21419
|
update: (proxy, res) => {
|
|
21408
21420
|
// Remove from cache
|
|
21409
21421
|
if (this.watchQueriesUpdatePolicy === 'update-cache') {
|
|
@@ -21439,7 +21451,7 @@ class BaseEntityService extends BaseGraphqlService {
|
|
|
21439
21451
|
fetchPolicy: opts && opts.fetchPolicy || 'no-cache',
|
|
21440
21452
|
variables,
|
|
21441
21453
|
error: {
|
|
21442
|
-
code: ErrorCodes
|
|
21454
|
+
code: ErrorCodes.SUBSCRIBE_DATA_ERROR,
|
|
21443
21455
|
message: 'ERROR.SUBSCRIBE_DATA_ERROR'
|
|
21444
21456
|
}
|
|
21445
21457
|
})
|
|
@@ -21625,7 +21637,7 @@ class EntitiesTableDataSource extends TableDataSource {
|
|
|
21625
21637
|
if (this._debug)
|
|
21626
21638
|
invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
|
|
21627
21639
|
// Stop with an error
|
|
21628
|
-
throw { code: ErrorCodes
|
|
21640
|
+
throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
|
|
21629
21641
|
}
|
|
21630
21642
|
this._editingRowCount = 0;
|
|
21631
21643
|
let data;
|
|
@@ -22496,14 +22508,14 @@ class AppTable {
|
|
|
22496
22508
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22497
22509
|
opts = Object.assign({ keepEditing: this.keepEditedRowOnSave }, opts);
|
|
22498
22510
|
if (this.readOnly) {
|
|
22499
|
-
throw { code: ErrorCodes
|
|
22511
|
+
throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
|
|
22500
22512
|
}
|
|
22501
22513
|
this.resetError();
|
|
22502
22514
|
// Keep edited row id (should be done BEFORE confirmEditCreate() )
|
|
22503
22515
|
this.previouslyEditedRowId = opts.keepEditing ? ((((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) ? this.editedRow.id : undefined) || ((_b = this.singleSelectedRow) === null || _b === void 0 ? void 0 : _b.id)) : undefined;
|
|
22504
22516
|
const previouslyEditedData = opts.keepEditing ? (isNotNil(this.previouslyEditedRowId) && ((_c = this.editedRow) === null || _c === void 0 ? void 0 : _c.currentData) || ((_d = this.singleSelectedRow) === null || _d === void 0 ? void 0 : _d.currentData)) : undefined;
|
|
22505
22517
|
if (!this.confirmEditCreate()) {
|
|
22506
|
-
throw { code: ErrorCodes
|
|
22518
|
+
throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
|
|
22507
22519
|
}
|
|
22508
22520
|
// Mark as saving
|
|
22509
22521
|
this.markAsSaving();
|
|
@@ -22622,7 +22634,7 @@ class AppTable {
|
|
|
22622
22634
|
var _a;
|
|
22623
22635
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22624
22636
|
if (this.readOnly) {
|
|
22625
|
-
throw { code: ErrorCodes
|
|
22637
|
+
throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
|
|
22626
22638
|
}
|
|
22627
22639
|
if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
|
|
22628
22640
|
return 0; // SKip
|
|
@@ -24202,7 +24214,7 @@ class AppEntityEditor extends AppTabEditor {
|
|
|
24202
24214
|
try {
|
|
24203
24215
|
const data = yield this.dataService.load(id, opts);
|
|
24204
24216
|
if (!data)
|
|
24205
|
-
throw { code: ErrorCodes
|
|
24217
|
+
throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
|
|
24206
24218
|
this._usageMode = this.computeUsageMode(data);
|
|
24207
24219
|
yield this.onEntityLoaded(data, opts);
|
|
24208
24220
|
yield this.updateView(data, opts);
|
|
@@ -24756,9 +24768,10 @@ AppInMemoryTable.propDecorators = {
|
|
|
24756
24768
|
canDelete: [{ type: Input }]
|
|
24757
24769
|
};
|
|
24758
24770
|
|
|
24759
|
-
const
|
|
24771
|
+
const SocialErrorCodes = {
|
|
24760
24772
|
LOAD_USER_EVENTS_ERROR: 50000,
|
|
24761
|
-
SAVE_USER_EVENT_ERROR: 50001
|
|
24773
|
+
SAVE_USER_EVENT_ERROR: 50001,
|
|
24774
|
+
SEND_MESSAGE_ERROR: 50003
|
|
24762
24775
|
};
|
|
24763
24776
|
|
|
24764
24777
|
var UserEvent_1;
|
|
@@ -24802,7 +24815,7 @@ UserEvent = UserEvent_1 = __decorate([
|
|
|
24802
24815
|
EntityClass({ typename: 'UserEventVO' })
|
|
24803
24816
|
], UserEvent);
|
|
24804
24817
|
|
|
24805
|
-
const
|
|
24818
|
+
const UserEventFragments = {
|
|
24806
24819
|
userEvent: gql `fragment UserEventFragment on UserEventVO {
|
|
24807
24820
|
id
|
|
24808
24821
|
issuer
|
|
@@ -24853,7 +24866,7 @@ let UserEventFilter = class UserEventFilter extends EntityFilter {
|
|
|
24853
24866
|
}
|
|
24854
24867
|
};
|
|
24855
24868
|
UserEventFilter = __decorate([
|
|
24856
|
-
EntityClass({ typename: '
|
|
24869
|
+
EntityClass({ typename: 'UserEventFilterVO' })
|
|
24857
24870
|
], UserEventFilter);
|
|
24858
24871
|
const SaveQuery = gql `
|
|
24859
24872
|
mutation SaveUserEvent($data: UserEventVOInput){
|
|
@@ -24861,7 +24874,7 @@ const SaveQuery = gql `
|
|
|
24861
24874
|
...UserEventFragment
|
|
24862
24875
|
}
|
|
24863
24876
|
}
|
|
24864
|
-
${
|
|
24877
|
+
${UserEventFragments.userEvent}
|
|
24865
24878
|
`;
|
|
24866
24879
|
const LoadAllQuery = gql `
|
|
24867
24880
|
query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
|
|
@@ -24869,7 +24882,7 @@ const LoadAllQuery = gql `
|
|
|
24869
24882
|
...LightUserEventFragment
|
|
24870
24883
|
}
|
|
24871
24884
|
}
|
|
24872
|
-
${
|
|
24885
|
+
${UserEventFragments.lightUserEvent}
|
|
24873
24886
|
`;
|
|
24874
24887
|
const DeleteByIdsMutation = gql `
|
|
24875
24888
|
mutation DeleteUserEvents($ids:[Int]){
|
|
@@ -24882,7 +24895,7 @@ const LoadAllWithContentQuery = gql `
|
|
|
24882
24895
|
...UserEventFragment
|
|
24883
24896
|
}
|
|
24884
24897
|
}
|
|
24885
|
-
${
|
|
24898
|
+
${UserEventFragments.userEvent}
|
|
24886
24899
|
`;
|
|
24887
24900
|
class UserEventService extends BaseGraphqlService {
|
|
24888
24901
|
constructor(graphql, accountService, network, translate, toastController, environment) {
|
|
@@ -24895,7 +24908,7 @@ class UserEventService extends BaseGraphqlService {
|
|
|
24895
24908
|
this.environment = environment;
|
|
24896
24909
|
this._userEventActions = [];
|
|
24897
24910
|
// For DEV only
|
|
24898
|
-
this._debug = !environment.production;
|
|
24911
|
+
this._debug = environment && !environment.production;
|
|
24899
24912
|
}
|
|
24900
24913
|
/**
|
|
24901
24914
|
*
|
|
@@ -24932,7 +24945,7 @@ class UserEventService extends BaseGraphqlService {
|
|
|
24932
24945
|
filter: filter && filter.asPodObject()
|
|
24933
24946
|
},
|
|
24934
24947
|
arrayFieldName: 'data',
|
|
24935
|
-
error: { code:
|
|
24948
|
+
error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },
|
|
24936
24949
|
fetchPolicy: options && options.fetchPolicy || undefined
|
|
24937
24950
|
})
|
|
24938
24951
|
.pipe(map(res => {
|
|
@@ -24970,7 +24983,7 @@ class UserEventService extends BaseGraphqlService {
|
|
|
24970
24983
|
variables: {
|
|
24971
24984
|
data: json
|
|
24972
24985
|
},
|
|
24973
|
-
error: { code:
|
|
24986
|
+
error: { code: SocialErrorCodes.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },
|
|
24974
24987
|
update: (proxy, { data }) => {
|
|
24975
24988
|
// Update entity
|
|
24976
24989
|
const savedEntity = data && data.data;
|
|
@@ -25154,7 +25167,7 @@ class UserEventService extends BaseGraphqlService {
|
|
|
25154
25167
|
EntityUtils.copyIdAndUpdateDate(source, target);
|
|
25155
25168
|
}
|
|
25156
25169
|
}
|
|
25157
|
-
UserEventService.ɵprov =
|
|
25170
|
+
UserEventService.ɵprov = ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(ɵɵinject(GraphqlService), ɵɵinject(AccountService), ɵɵinject(NetworkService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: UserEventService, providedIn: "root" });
|
|
25158
25171
|
UserEventService.decorators = [
|
|
25159
25172
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
25160
25173
|
];
|
|
@@ -25164,7 +25177,7 @@ UserEventService.ctorParameters = () => [
|
|
|
25164
25177
|
{ type: NetworkService },
|
|
25165
25178
|
{ type: TranslateService },
|
|
25166
25179
|
{ type: ToastController },
|
|
25167
|
-
{ type:
|
|
25180
|
+
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
25168
25181
|
];
|
|
25169
25182
|
|
|
25170
25183
|
const ICONS_MAP = {
|
|
@@ -25291,7 +25304,7 @@ class UserEventsTable extends AppTable {
|
|
|
25291
25304
|
UserEventsTable.decorators = [
|
|
25292
25305
|
{ type: Component, args: [{
|
|
25293
25306
|
selector: 'app-user-events-table',
|
|
25294
|
-
template: "\n<!-- Type = options menu -->\n<mat-menu #optionsMenu=\"matMenu\" xPosition=\"after\">\n\n <!-- display columns -->\n <button mat-menu-item\n (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n</mat-menu>\n\n<!-- top header -->\n<mat-toolbar>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n\n <button mat-icon-button [title]=\"'COMMON.BTN_REFRESH'|translate\" (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button class=\"hidden-xs hidden-sm\" *ngIf=\"canDelete\"\n [title]=\"'COMMON.BTN_DELETE'|translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" hidden-xs hidden-sm hidden-mobile lines=\"none\">\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 <div class=\"toolbar-spacer\"></div>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS'|translate\"\n [matMenuTriggerFor]=\"optionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n</mat-toolbar>\n\n\n<mat-table [dataSource]=\"dataSource\" matSort\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <!-- select -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <!-- id -->\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef mat-sort-header [class.cdk-visually-hidden]=\"!isAdmin\">\n <app-loading-spinner [loading]=\"loadingSubject|async\"><ion-label>#</ion-label></app-loading-spinner>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!isAdmin\">{{ row.currentData.id | mathAbs }}</mat-cell>\n </ng-container>\n\n <!-- creationDate -->\n <ng-container matColumnDef=\"creationDate\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.CREATION_DATE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ion-text>\n {{row.currentData.creationDate | dateFromNow }}<br/>\n <ion-text color=\"medium\"><small>{{row.currentData.creationDate | dateFormat: {time: true} }}</small></ion-text>\n </ion-text>\n </mat-cell>\n </ng-container>\n\n <!-- icon -->\n <ng-container matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getIcon(row.currentData); let details\">\n <ion-icon slot=\"start\" *ngIf=\"details.icon\" [name]=\"details.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"details.matIcon\">{{details.matIcon}}</mat-icon>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- event type -->\n <ng-container matColumnDef=\"eventType\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.EVENT_TYPE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <span>{{'SOCIAL.
|
|
25307
|
+
template: "\n<!-- Type = options menu -->\n<mat-menu #optionsMenu=\"matMenu\" xPosition=\"after\">\n\n <!-- display columns -->\n <button mat-menu-item\n (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n</mat-menu>\n\n<!-- top header -->\n<mat-toolbar>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n\n <button mat-icon-button [title]=\"'COMMON.BTN_REFRESH'|translate\" (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button class=\"hidden-xs hidden-sm\" *ngIf=\"canDelete\"\n [title]=\"'COMMON.BTN_DELETE'|translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" hidden-xs hidden-sm hidden-mobile lines=\"none\">\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 <div class=\"toolbar-spacer\"></div>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS'|translate\"\n [matMenuTriggerFor]=\"optionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n</mat-toolbar>\n\n\n<mat-table [dataSource]=\"dataSource\" matSort\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <!-- select -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <!-- id -->\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef mat-sort-header [class.cdk-visually-hidden]=\"!isAdmin\">\n <app-loading-spinner [loading]=\"loadingSubject|async\"><ion-label>#</ion-label></app-loading-spinner>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!isAdmin\">{{ row.currentData.id | mathAbs }}</mat-cell>\n </ng-container>\n\n <!-- creationDate -->\n <ng-container matColumnDef=\"creationDate\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.CREATION_DATE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ion-text>\n {{row.currentData.creationDate | dateFromNow }}<br/>\n <ion-text color=\"medium\"><small>{{row.currentData.creationDate | dateFormat: {time: true} }}</small></ion-text>\n </ion-text>\n </mat-cell>\n </ng-container>\n\n <!-- icon -->\n <ng-container matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getIcon(row.currentData); let details\">\n <ion-icon slot=\"start\" *ngIf=\"details.icon\" [name]=\"details.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"details.matIcon\">{{details.matIcon}}</mat-icon>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- event type -->\n <ng-container matColumnDef=\"eventType\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.EVENT_TYPE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <span>{{'SOCIAL.USER_EVENT.TYPE_ENUM.' + row.currentData.eventType | translate}}</span>\n </mat-cell>\n </ng-container>\n\n <!-- message -->\n <ng-container matColumnDef=\"message\">\n <mat-header-cell *matHeaderCellDef>\n <ion-label translate>SOCIAL.USER_EVENT.MESSAGE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <ion-text [innerHTML]=\"details.title|translate\">\n </ion-text>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- Actions buttons column -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <button mat-icon-button color=\"light\"\n *ngFor=\"let action of details.actions\"\n [title]=\"action.title |translate\"\n [color]=\"action.color\"\n (click)=\"doAction(action, row)\">\n <ion-icon slot=\"start\" *ngIf=\"action.icon\" [name]=\"action.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"action.matIcon\">{{action.matIcon}}</mat-icon>\n </button>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"mat-row-disabled\"\n (click)=\"clickRow($event, row)\"></mat-row>\n\n</mat-table>\n\n<ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col class=\"ion-no-padding\" size=\"auto\">\n <mat-paginator [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n </ion-col>\n</ion-row>\n",
|
|
25295
25308
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
25296
25309
|
styles: [".mat-header-row .mat-column-icon,.mat-row .mat-column-icon{max-width:40px;padding-left:0}.mat-header-row .mat-column-icon ion-icon,.mat-header-row .mat-column-icon mat-icon,.mat-row .mat-column-icon ion-icon,.mat-row .mat-column-icon mat-icon{font-size:1.2em;height:1.2em;width:1.2em}.mat-header-row .mat-column-creationDate,.mat-row .mat-column-creationDate{min-width:100px;max-width:120px}"]
|
|
25297
25310
|
},] }
|
|
@@ -25311,32 +25324,309 @@ UserEventsTable.propDecorators = {
|
|
|
25311
25324
|
defaultSortDirection: [{ type: Input }]
|
|
25312
25325
|
};
|
|
25313
25326
|
|
|
25314
|
-
|
|
25315
|
-
|
|
25316
|
-
|
|
25317
|
-
|
|
25318
|
-
|
|
25319
|
-
|
|
25320
|
-
|
|
25321
|
-
|
|
25322
|
-
|
|
25327
|
+
const MessageTypes = {
|
|
25328
|
+
INBOX_MESSAGE: 'INBOX_MESSAGE',
|
|
25329
|
+
EMAIL: 'EMAIL',
|
|
25330
|
+
FEED: 'FEED',
|
|
25331
|
+
};
|
|
25332
|
+
const MessageTypeList = Object.freeze([
|
|
25333
|
+
{
|
|
25334
|
+
id: MessageTypes.INBOX_MESSAGE,
|
|
25335
|
+
icon: 'notifications',
|
|
25336
|
+
label: 'SOCIAL.MESSAGE.TYPE_ENUM.INBOX_MESSAGE'
|
|
25337
|
+
},
|
|
25338
|
+
{
|
|
25339
|
+
id: MessageTypes.EMAIL,
|
|
25340
|
+
icon: 'mail',
|
|
25341
|
+
label: 'SOCIAL.MESSAGE.TYPE_ENUM.EMAIL'
|
|
25342
|
+
},
|
|
25343
|
+
{
|
|
25344
|
+
id: MessageTypes.FEED,
|
|
25345
|
+
icon: 'paper',
|
|
25346
|
+
label: 'SOCIAL.MESSAGE.TYPE_ENUM.FEED'
|
|
25347
|
+
}
|
|
25348
|
+
]);
|
|
25349
|
+
// @dynamic
|
|
25350
|
+
let Message = class Message extends Entity {
|
|
25351
|
+
constructor() {
|
|
25352
|
+
super();
|
|
25353
|
+
}
|
|
25354
|
+
fromObject(source, opts) {
|
|
25355
|
+
super.fromObject(source, opts);
|
|
25356
|
+
this.type = source.type;
|
|
25357
|
+
this.issuer = source.issuer && Person.fromObject(source.issuer);
|
|
25358
|
+
this.recipients = source.recipients && source.recipients.map(Person.fromObject);
|
|
25359
|
+
this.subject = source.subject;
|
|
25360
|
+
this.body = source.body;
|
|
25361
|
+
}
|
|
25362
|
+
asObject(opts) {
|
|
25363
|
+
const target = super.asObject(opts);
|
|
25364
|
+
target.recipients = this.recipients && this.recipients.map(p => p.asObject(opts));
|
|
25365
|
+
return target;
|
|
25366
|
+
}
|
|
25367
|
+
};
|
|
25368
|
+
Message = __decorate([
|
|
25369
|
+
EntityClass({ typename: 'MessageVO' })
|
|
25370
|
+
], Message);
|
|
25371
|
+
// @dynamic
|
|
25372
|
+
let MessageFilter = class MessageFilter extends EntityFilter {
|
|
25373
|
+
fromObject(source, opts) {
|
|
25374
|
+
super.fromObject(source, opts);
|
|
25375
|
+
}
|
|
25376
|
+
buildFilter() {
|
|
25377
|
+
const filterFns = super.buildFilter();
|
|
25378
|
+
return filterFns;
|
|
25379
|
+
}
|
|
25380
|
+
};
|
|
25381
|
+
MessageFilter = __decorate([
|
|
25382
|
+
EntityClass({ typename: 'MessageFilterVO' })
|
|
25383
|
+
], MessageFilter);
|
|
25384
|
+
|
|
25385
|
+
class MessageModal {
|
|
25386
|
+
constructor(settings, viewCtrl, accountService, cd) {
|
|
25387
|
+
this.settings = settings;
|
|
25388
|
+
this.viewCtrl = viewCtrl;
|
|
25389
|
+
this.accountService = accountService;
|
|
25390
|
+
this.cd = cd;
|
|
25391
|
+
this.mobile = this.settings.mobile;
|
|
25392
|
+
}
|
|
25393
|
+
ngOnInit() {
|
|
25394
|
+
this.canSelectType = toBoolean(this.canSelectType, this.accountService.isAdmin());
|
|
25395
|
+
}
|
|
25396
|
+
ngAfterViewInit() {
|
|
25397
|
+
this.form.markAsReady({ emitEvent: false });
|
|
25398
|
+
if (this.data) {
|
|
25399
|
+
this.data.type = this.data.type || MessageTypes.INBOX_MESSAGE;
|
|
25400
|
+
this.form.setValue(this.data);
|
|
25401
|
+
}
|
|
25402
|
+
this.form.markAsLoaded();
|
|
25403
|
+
this.form.enable();
|
|
25404
|
+
}
|
|
25405
|
+
cancel(event) {
|
|
25406
|
+
this.viewCtrl.dismiss();
|
|
25407
|
+
}
|
|
25408
|
+
doSubmit(event) {
|
|
25409
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25410
|
+
if (this.form.disabled)
|
|
25411
|
+
return;
|
|
25412
|
+
if (!this.form.valid) {
|
|
25413
|
+
yield AppFormUtils.waitWhilePending(this.form);
|
|
25414
|
+
if (this.form.invalid) {
|
|
25415
|
+
AppFormUtils.logFormErrors(this.form.form, '[message-modal] ');
|
|
25416
|
+
this.form.markAllAsTouched();
|
|
25417
|
+
return;
|
|
25418
|
+
}
|
|
25419
|
+
}
|
|
25420
|
+
this.markAsLoading();
|
|
25421
|
+
try {
|
|
25422
|
+
const data = this.form.value;
|
|
25423
|
+
// Disable the form
|
|
25424
|
+
this.form.disable();
|
|
25425
|
+
const entity = Message.fromObject(data);
|
|
25426
|
+
return this.viewCtrl.dismiss(entity);
|
|
25427
|
+
}
|
|
25428
|
+
catch (err) {
|
|
25429
|
+
this.form.error = err && err.message || err;
|
|
25430
|
+
this.markAsLoaded();
|
|
25431
|
+
// Enable the form
|
|
25432
|
+
this.form.enable();
|
|
25433
|
+
// Reset form error on next changes
|
|
25434
|
+
firstNotNilPromise(this.form.form.valueChanges).then(() => {
|
|
25435
|
+
this.form.error = null;
|
|
25436
|
+
this.markForCheck();
|
|
25437
|
+
});
|
|
25438
|
+
return;
|
|
25439
|
+
}
|
|
25440
|
+
});
|
|
25441
|
+
}
|
|
25442
|
+
markForCheck() {
|
|
25443
|
+
this.cd.markForCheck();
|
|
25444
|
+
}
|
|
25445
|
+
markAsLoading(opts) {
|
|
25446
|
+
this.form.markAsLoading(opts);
|
|
25447
|
+
}
|
|
25448
|
+
markAsLoaded(opts) {
|
|
25449
|
+
this.form.markAsLoaded(opts);
|
|
25323
25450
|
}
|
|
25324
25451
|
}
|
|
25452
|
+
MessageModal.decorators = [
|
|
25453
|
+
{ type: Component, args: [{
|
|
25454
|
+
selector: 'app-message-modal',
|
|
25455
|
+
template: "<ion-header>\n <ion-toolbar color=\"secondary\">\n <ion-buttons slot=\"start\">\n <ion-button class=\"back-button\" (click)=\"cancel($event)\" visible-xs visible-sm visible-mobile>\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n </ion-buttons>\n\n <ion-title>\n {{'SOCIAL.MESSAGE.NEW.TITLE' | translate}}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n\n <ion-button class=\"back-button\" (click)=\"doSubmit($event)\"\n [disabled]=\"!form.valid\"\n visible-xs visible-sm visible-mobile>\n <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n\n<ion-content class=\"ion-padding\" >\n\n <ion-item *ngIf=\"form.error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"form.error|translate\"></ion-label>\n </ion-item>\n\n <app-message-form #form (onSubmit)=\"doSubmit($event)\"\n (onCancel)=\"cancel($event)\"\n [canSelectType]=\"canSelectType\"\n [suggestFn]=\"suggestFn\">\n </app-message-form>\n\n</ion-content>\n\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <!-- buttons -->\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel($event)\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n\n <ion-button [fill]=\"form.invalid ? 'clear' : 'solid'\"\n [disabled]=\"form.loading || form.invalid\"\n (keyup.enter)=\"doSubmit($event)\"\n (click)=\"doSubmit($event)\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_SEND</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n\n\n </ion-toolbar>\n</ion-footer>\n",
|
|
25456
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
25457
|
+
},] }
|
|
25458
|
+
];
|
|
25459
|
+
MessageModal.ctorParameters = () => [
|
|
25460
|
+
{ type: LocalSettingsService },
|
|
25461
|
+
{ type: ModalController },
|
|
25462
|
+
{ type: AccountService },
|
|
25463
|
+
{ type: ChangeDetectorRef }
|
|
25464
|
+
];
|
|
25465
|
+
MessageModal.propDecorators = {
|
|
25466
|
+
suggestFn: [{ type: Input }],
|
|
25467
|
+
data: [{ type: Input }],
|
|
25468
|
+
canSelectType: [{ type: Input }],
|
|
25469
|
+
form: [{ type: ViewChild, args: ['form', { static: true },] }]
|
|
25470
|
+
};
|
|
25471
|
+
|
|
25472
|
+
class MessageForm extends AppForm {
|
|
25473
|
+
constructor(injector, formBuilder, cd) {
|
|
25474
|
+
super(injector);
|
|
25475
|
+
this.formBuilder = formBuilder;
|
|
25476
|
+
this.cd = cd;
|
|
25477
|
+
this.subjectMinLength = 5;
|
|
25478
|
+
this.subjectMaxLength = 255;
|
|
25479
|
+
this.bodyMaxLength = 2000;
|
|
25480
|
+
this.bodyAutoHeight = true;
|
|
25481
|
+
this.canSelectType = false;
|
|
25482
|
+
this.types = MessageTypeList;
|
|
25483
|
+
this.mobile = this.settings.mobile;
|
|
25484
|
+
}
|
|
25485
|
+
ngOnInit() {
|
|
25486
|
+
this.setForm(this.formBuilder.group({
|
|
25487
|
+
type: [MessageTypes.INBOX_MESSAGE, Validators.required],
|
|
25488
|
+
recipients: [null, Validators.required],
|
|
25489
|
+
subject: [null, this.subjectMaxLength
|
|
25490
|
+
? Validators.compose([Validators.required, Validators.minLength(this.subjectMinLength), Validators.maxLength(this.subjectMaxLength)])
|
|
25491
|
+
: Validators.required],
|
|
25492
|
+
body: [null, this.bodyMaxLength
|
|
25493
|
+
? Validators.compose([Validators.maxLength(this.bodyMaxLength)])
|
|
25494
|
+
: Validators.required]
|
|
25495
|
+
}));
|
|
25496
|
+
const personAttributes = this.settings.getFieldDisplayAttributes('person', ['lastName', 'firstName', 'department.name']);
|
|
25497
|
+
this.registerAutocompleteField('recipients', {
|
|
25498
|
+
showAllOnFocus: false,
|
|
25499
|
+
suggestFn: this.suggestFn,
|
|
25500
|
+
filter: {
|
|
25501
|
+
statusIds: [StatusIds.TEMPORARY, StatusIds.ENABLE]
|
|
25502
|
+
},
|
|
25503
|
+
attributes: personAttributes,
|
|
25504
|
+
displayWith: PersonUtils.personToString,
|
|
25505
|
+
multiple: true,
|
|
25506
|
+
mobile: this.mobile
|
|
25507
|
+
});
|
|
25508
|
+
}
|
|
25509
|
+
isSamePerson(o1, o2) {
|
|
25510
|
+
return EntityUtils.equals(o1, o2, 'id');
|
|
25511
|
+
}
|
|
25512
|
+
markForCheck() {
|
|
25513
|
+
this.cd.markForCheck();
|
|
25514
|
+
}
|
|
25515
|
+
}
|
|
25516
|
+
MessageForm.decorators = [
|
|
25517
|
+
{ type: Component, args: [{
|
|
25518
|
+
selector: 'app-message-form',
|
|
25519
|
+
template: "\n\n<form [formGroup]=\"form\" class=\"form-container\">\n\n <!-- type -->\n <mat-form-field *ngIf=\"canSelectType\">\n <mat-select formControlName=\"type\" [placeholder]=\"'SOCIAL.MESSAGE.TYPE'|translate\">\n <mat-option *ngFor=\"let item of types\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <!-- Recipients -->\n <mat-chips-field *ngIf=\"(form.controls.type.valueChanges|async) !== 'FEED'\"\n formControlName=\"recipients\"\n [placeholder]=\"'SOCIAL.MESSAGE.RECIPIENTS'|translate\"\n [config]=\"autocompleteFields.recipients\"\n [equals]=\"isSamePerson\">\n </mat-chips-field>\n\n <!-- Subject -->\n <mat-form-field>\n <input matInput type=\"text\"\n [placeholder]=\"'SOCIAL.MESSAGE.SUBJECT'|translate\"\n formControlName=\"subject\"\n autocomplete=\"off\"\n required>\n <mat-error *ngIf=\"form.controls.subject.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('minlength')\">\n {{ 'ERROR.FIELD_MIN_LENGTH_COMPACT'|translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH_COMPACT'|translate }}\n </mat-error>\n <mat-hint *ngIf=\"subjectMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.subject.value?.length || 0, max: subjectMaxLength } }}\n </mat-hint>\n </mat-form-field>\n\n <!-- Body -->\n <mat-form-field floatLabel=\"never\">\n <textarea matInput type=\"text\"\n [placeholder]=\"'SOCIAL.MESSAGE.BODY_HELP'|translate\"\n formControlName=\"body\"\n [class.fixed-height]=\"!bodyAutoHeight\"\n [cdkTextareaAutosize]=\"bodyAutoHeight\"\n (keydown.control.enter)=\"doSubmit($event)\"\n >\n </textarea>\n <mat-error *ngIf=\"form.controls.body.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: form.controls.body.errors.maxlength }}\n </mat-error>\n <mat-hint *ngIf=\"bodyMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.body.value?.length || 0, max: bodyMaxLength } }}\n </mat-hint>\n </mat-form-field>\n\n</form>\n",
|
|
25520
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
25521
|
+
styles: ["textarea.fixed-height{height:11.5em}textarea{min-height:11.5em}"]
|
|
25522
|
+
},] }
|
|
25523
|
+
];
|
|
25524
|
+
MessageForm.ctorParameters = () => [
|
|
25525
|
+
{ type: Injector },
|
|
25526
|
+
{ type: FormBuilder },
|
|
25527
|
+
{ type: ChangeDetectorRef }
|
|
25528
|
+
];
|
|
25529
|
+
MessageForm.propDecorators = {
|
|
25530
|
+
suggestFn: [{ type: Input }],
|
|
25531
|
+
subjectMinLength: [{ type: Input }],
|
|
25532
|
+
subjectMaxLength: [{ type: Input }],
|
|
25533
|
+
bodyMaxLength: [{ type: Input }],
|
|
25534
|
+
bodyAutoHeight: [{ type: Input }],
|
|
25535
|
+
canSelectType: [{ type: Input }]
|
|
25536
|
+
};
|
|
25537
|
+
|
|
25538
|
+
class SocialModule {
|
|
25539
|
+
}
|
|
25325
25540
|
SocialModule.decorators = [
|
|
25326
25541
|
{ type: NgModule, args: [{
|
|
25327
25542
|
imports: [
|
|
25328
25543
|
CommonModule,
|
|
25329
|
-
CoreModule
|
|
25544
|
+
CoreModule,
|
|
25545
|
+
SharedModule
|
|
25330
25546
|
],
|
|
25331
25547
|
declarations: [
|
|
25332
|
-
UserEventsTable
|
|
25548
|
+
UserEventsTable,
|
|
25549
|
+
MessageModal,
|
|
25550
|
+
MessageForm
|
|
25333
25551
|
],
|
|
25334
25552
|
exports: [
|
|
25335
|
-
UserEventsTable
|
|
25553
|
+
UserEventsTable,
|
|
25554
|
+
MessageModal
|
|
25336
25555
|
]
|
|
25337
25556
|
},] }
|
|
25338
25557
|
];
|
|
25339
25558
|
|
|
25559
|
+
const Mutations = {
|
|
25560
|
+
send: gql `mutation SendMessage($data: MessageVOInput){
|
|
25561
|
+
done: sendMessage(message: $data)
|
|
25562
|
+
}`
|
|
25563
|
+
};
|
|
25564
|
+
class MessageService extends BaseGraphqlService {
|
|
25565
|
+
constructor(graphql, translate, toastController, environment) {
|
|
25566
|
+
super(graphql, environment);
|
|
25567
|
+
this.graphql = graphql;
|
|
25568
|
+
this.translate = translate;
|
|
25569
|
+
this.toastController = toastController;
|
|
25570
|
+
this.environment = environment;
|
|
25571
|
+
// For DEV only
|
|
25572
|
+
this._debug = !environment.production;
|
|
25573
|
+
}
|
|
25574
|
+
/**
|
|
25575
|
+
* Send a message to recipient(s)
|
|
25576
|
+
*
|
|
25577
|
+
* @param entity
|
|
25578
|
+
* @param opts
|
|
25579
|
+
*/
|
|
25580
|
+
send(entity, opts) {
|
|
25581
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25582
|
+
// Transform into json
|
|
25583
|
+
const data = entity.asObject(MINIFY_ENTITY_FOR_POD);
|
|
25584
|
+
const now = Date.now();
|
|
25585
|
+
if (this._debug)
|
|
25586
|
+
console.debug(`[message-service] Send message...`, data);
|
|
25587
|
+
try {
|
|
25588
|
+
const { done } = yield this.graphql.mutate({
|
|
25589
|
+
mutation: Mutations.send,
|
|
25590
|
+
variables: { data },
|
|
25591
|
+
error: { code: SocialErrorCodes.SEND_MESSAGE_ERROR, message: 'SOCIAL.ERROR.SEND_MESSAGE_ERROR' }
|
|
25592
|
+
});
|
|
25593
|
+
if (this._debug)
|
|
25594
|
+
console.debug(`[message-service] Send message [OK] in ${Date.now() - now}ms`);
|
|
25595
|
+
if (done && (!opts || opts.showToast !== false)) {
|
|
25596
|
+
yield this.showToast({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_SENT' });
|
|
25597
|
+
}
|
|
25598
|
+
return done;
|
|
25599
|
+
}
|
|
25600
|
+
catch (err) {
|
|
25601
|
+
const error = err && err.message || err;
|
|
25602
|
+
console.error(error);
|
|
25603
|
+
// Show error
|
|
25604
|
+
if (!opts || opts.showToast !== false) {
|
|
25605
|
+
let message = error || 'SOCIAL.ERROR.SEND_MESSAGE_ERROR';
|
|
25606
|
+
yield this.showToast({ type: 'error', message });
|
|
25607
|
+
}
|
|
25608
|
+
return false;
|
|
25609
|
+
}
|
|
25610
|
+
});
|
|
25611
|
+
}
|
|
25612
|
+
/* -- protected methods -- */
|
|
25613
|
+
showToast(opts) {
|
|
25614
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25615
|
+
return Toasts.show(this.toastController, this.translate, Object.assign({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_SENT' }, opts));
|
|
25616
|
+
});
|
|
25617
|
+
}
|
|
25618
|
+
}
|
|
25619
|
+
MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
|
|
25620
|
+
MessageService.decorators = [
|
|
25621
|
+
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
25622
|
+
];
|
|
25623
|
+
MessageService.ctorParameters = () => [
|
|
25624
|
+
{ type: GraphqlService },
|
|
25625
|
+
{ type: TranslateService },
|
|
25626
|
+
{ type: ToastController },
|
|
25627
|
+
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
25628
|
+
];
|
|
25629
|
+
|
|
25340
25630
|
var PersonFilter_1;
|
|
25341
25631
|
// @dynamic
|
|
25342
25632
|
let PersonFilter = PersonFilter_1 = class PersonFilter extends EntityFilter {
|
|
@@ -25535,7 +25825,7 @@ class PersonService extends BaseEntityService {
|
|
|
25535
25825
|
return target;
|
|
25536
25826
|
}
|
|
25537
25827
|
}
|
|
25538
|
-
PersonService.ɵprov =
|
|
25828
|
+
PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
|
|
25539
25829
|
PersonService.decorators = [
|
|
25540
25830
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
25541
25831
|
];
|
|
@@ -25566,7 +25856,7 @@ class PersonValidatorService {
|
|
|
25566
25856
|
return this.formBuilder.group(formConfig);
|
|
25567
25857
|
}
|
|
25568
25858
|
}
|
|
25569
|
-
PersonValidatorService.ɵprov =
|
|
25859
|
+
PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
|
|
25570
25860
|
PersonValidatorService.decorators = [
|
|
25571
25861
|
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
25572
25862
|
];
|
|
@@ -25576,7 +25866,7 @@ PersonValidatorService.ctorParameters = () => [
|
|
|
25576
25866
|
];
|
|
25577
25867
|
|
|
25578
25868
|
class UsersPage extends AppTable {
|
|
25579
|
-
constructor(injector, accountService, validatorService, configService, dataService,
|
|
25869
|
+
constructor(injector, formBuilder, accountService, validatorService, configService, dataService, messageService, cd, environment) {
|
|
25580
25870
|
super(injector, RESERVED_START_COLUMNS
|
|
25581
25871
|
.concat([
|
|
25582
25872
|
'avatar',
|
|
@@ -25601,16 +25891,17 @@ class UsersPage extends AppTable {
|
|
|
25601
25891
|
this.validatorService = validatorService;
|
|
25602
25892
|
this.configService = configService;
|
|
25603
25893
|
this.dataService = dataService;
|
|
25894
|
+
this.messageService = messageService;
|
|
25604
25895
|
this.cd = cd;
|
|
25605
|
-
this.canEdit = false;
|
|
25606
25896
|
this.profiles = [...PRIORITIZED_AUTHORITIES].reverse();
|
|
25607
|
-
this.filterCriteriaCount = 0;
|
|
25608
25897
|
this.statusList = StatusList;
|
|
25609
25898
|
this.statusById = StatusById;
|
|
25899
|
+
this.filterCriteriaCount = 0;
|
|
25610
25900
|
this.useSticky = false;
|
|
25611
25901
|
this.referentialToString = referentialToString;
|
|
25612
|
-
this.inlineEdition = accountService.isAdmin(); // Allow inline edition only if admin
|
|
25613
25902
|
this.canEdit = accountService.isAdmin();
|
|
25903
|
+
this.canSendMessage = this.canEdit;
|
|
25904
|
+
this.inlineEdition = this.canEdit;
|
|
25614
25905
|
this.confirmBeforeDelete = true;
|
|
25615
25906
|
this.autoLoad = false; // Wait config loading
|
|
25616
25907
|
this.i18nColumnPrefix = 'USER.';
|
|
@@ -25703,6 +25994,39 @@ class UsersPage extends AppTable {
|
|
|
25703
25994
|
formControl.setValue(null);
|
|
25704
25995
|
return false;
|
|
25705
25996
|
}
|
|
25997
|
+
openComposeMessageModal(event) {
|
|
25998
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25999
|
+
// Get recipients
|
|
26000
|
+
const recipients = (this.selection.selected || [])
|
|
26001
|
+
.map(row => row.currentData)
|
|
26002
|
+
.map(Person.fromObject)
|
|
26003
|
+
.map(p => {
|
|
26004
|
+
var _a;
|
|
26005
|
+
const target = p.asObject({ minify: true });
|
|
26006
|
+
target.department = (_a = p.department) === null || _a === void 0 ? void 0 : _a.asObject();
|
|
26007
|
+
return target;
|
|
26008
|
+
});
|
|
26009
|
+
const hasTopModal = !!(yield this.modalCtrl.getTop());
|
|
26010
|
+
const modal = yield this.modalCtrl.create({
|
|
26011
|
+
component: MessageModal,
|
|
26012
|
+
componentProps: {
|
|
26013
|
+
suggestFn: (value, filter, sortBy, sortDirection) => this.dataService.suggest(value, filter, sortBy, sortDirection),
|
|
26014
|
+
data: {
|
|
26015
|
+
recipients
|
|
26016
|
+
}
|
|
26017
|
+
},
|
|
26018
|
+
cssClass: hasTopModal && 'stack-modal'
|
|
26019
|
+
});
|
|
26020
|
+
// Open the modal
|
|
26021
|
+
yield modal.present();
|
|
26022
|
+
// On dismiss
|
|
26023
|
+
const { data } = yield modal.onDidDismiss();
|
|
26024
|
+
if (!data || !(data instanceof Message))
|
|
26025
|
+
return; // CANCELLED
|
|
26026
|
+
console.info('[users] received message to send: ', data);
|
|
26027
|
+
yield this.messageService.send(data);
|
|
26028
|
+
});
|
|
26029
|
+
}
|
|
25706
26030
|
/* -- protected methods -- */
|
|
25707
26031
|
markForCheck() {
|
|
25708
26032
|
this.cd.markForCheck();
|
|
@@ -25711,7 +26035,7 @@ class UsersPage extends AppTable {
|
|
|
25711
26035
|
UsersPage.decorators = [
|
|
25712
26036
|
{ type: Component, args: [{
|
|
25713
26037
|
selector: 'app-users-table',
|
|
25714
|
-
template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *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 *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let 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 #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\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 [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\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 <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\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 <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.ke\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls['pubkey'].value\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls['pubkey'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['pubkey'].hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
|
|
26038
|
+
template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *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 *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let 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 #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\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 [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\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 <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\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 <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.ke\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
|
|
25715
26039
|
providers: [
|
|
25716
26040
|
{ provide: ValidatorService, useExisting: PersonValidatorService }
|
|
25717
26041
|
],
|
|
@@ -25722,12 +26046,13 @@ UsersPage.decorators = [
|
|
|
25722
26046
|
];
|
|
25723
26047
|
UsersPage.ctorParameters = () => [
|
|
25724
26048
|
{ type: Injector },
|
|
26049
|
+
{ type: FormBuilder },
|
|
25725
26050
|
{ type: AccountService },
|
|
25726
26051
|
{ type: ValidatorService },
|
|
25727
26052
|
{ type: ConfigService },
|
|
25728
26053
|
{ type: PersonService },
|
|
26054
|
+
{ type: MessageService },
|
|
25729
26055
|
{ type: ChangeDetectorRef },
|
|
25730
|
-
{ type: FormBuilder },
|
|
25731
26056
|
{ type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
|
|
25732
26057
|
];
|
|
25733
26058
|
UsersPage.propDecorators = {
|
|
@@ -25754,22 +26079,24 @@ AdminModule.decorators = [
|
|
|
25754
26079
|
UsersPage
|
|
25755
26080
|
],
|
|
25756
26081
|
exports: [
|
|
26082
|
+
SocialModule,
|
|
25757
26083
|
UsersPage
|
|
25758
26084
|
]
|
|
25759
26085
|
},] }
|
|
25760
26086
|
];
|
|
25761
26087
|
AdminModule.ctorParameters = () => [];
|
|
25762
26088
|
|
|
25763
|
-
const ɵ0 = {
|
|
26089
|
+
const ɵ0$c = {
|
|
25764
26090
|
profile: 'ADMIN'
|
|
25765
26091
|
};
|
|
25766
|
-
const routes
|
|
26092
|
+
const routes = [
|
|
25767
26093
|
{
|
|
25768
26094
|
path: 'users',
|
|
25769
26095
|
pathMatch: 'full',
|
|
25770
26096
|
component: UsersPage,
|
|
25771
26097
|
canActivate: [AuthGuardService],
|
|
25772
|
-
|
|
26098
|
+
canDeactivate: [ComponentDirtyGuard],
|
|
26099
|
+
data: ɵ0$c
|
|
25773
26100
|
}
|
|
25774
26101
|
];
|
|
25775
26102
|
class AdminRoutingModule {
|
|
@@ -25779,33 +26106,27 @@ AdminRoutingModule.decorators = [
|
|
|
25779
26106
|
imports: [
|
|
25780
26107
|
SharedRoutingModule,
|
|
25781
26108
|
AdminModule,
|
|
25782
|
-
RouterModule.forChild(routes
|
|
26109
|
+
RouterModule.forChild(routes)
|
|
25783
26110
|
],
|
|
25784
26111
|
exports: [RouterModule]
|
|
25785
26112
|
},] }
|
|
25786
26113
|
];
|
|
25787
26114
|
|
|
25788
|
-
|
|
25789
|
-
LOAD_PERSONS_ERROR: 100,
|
|
25790
|
-
SAVE_PERSONS_ERROR: 101,
|
|
25791
|
-
DELETE_PERSONS_ERROR: 102,
|
|
25792
|
-
};
|
|
25793
|
-
|
|
25794
|
-
class EntityTestClass$1 {
|
|
26115
|
+
class EntityTestClass {
|
|
25795
26116
|
}
|
|
25796
|
-
const FAKE_ENTITIES
|
|
26117
|
+
const FAKE_ENTITIES = [
|
|
25797
26118
|
{ id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
|
|
25798
26119
|
{ id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
|
|
25799
26120
|
{ id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
|
|
25800
26121
|
];
|
|
25801
|
-
function deepCopy
|
|
26122
|
+
function deepCopy(values, size) {
|
|
25802
26123
|
if (isNil(size)) {
|
|
25803
|
-
return (values || FAKE_ENTITIES
|
|
26124
|
+
return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
|
|
25804
26125
|
}
|
|
25805
26126
|
let result = [];
|
|
25806
26127
|
let i = 1;
|
|
25807
26128
|
while (result.length < size) {
|
|
25808
|
-
result = result.concat((values || FAKE_ENTITIES
|
|
26129
|
+
result = result.concat((values || FAKE_ENTITIES).map(entity => {
|
|
25809
26130
|
const name = entity.name + ' #' + i;
|
|
25810
26131
|
return Object.assign(Object.assign({}, entity), { id: i++, name });
|
|
25811
26132
|
}));
|
|
@@ -25815,7 +26136,7 @@ function deepCopy$1(values, size) {
|
|
|
25815
26136
|
class AutocompleteTestPage {
|
|
25816
26137
|
constructor(formBuilder) {
|
|
25817
26138
|
this.formBuilder = formBuilder;
|
|
25818
|
-
this._items = deepCopy
|
|
26139
|
+
this._items = deepCopy(FAKE_ENTITIES, 100);
|
|
25819
26140
|
this._$items = new BehaviorSubject(undefined);
|
|
25820
26141
|
this.autocompleteFields = new MatAutocompleteConfigHolder();
|
|
25821
26142
|
this.memoryHide = false;
|
|
@@ -25860,7 +26181,7 @@ class AutocompleteTestPage {
|
|
|
25860
26181
|
});
|
|
25861
26182
|
// From items
|
|
25862
26183
|
this.autocompleteFields.add('entity-items-large', {
|
|
25863
|
-
items: FAKE_ENTITIES
|
|
26184
|
+
items: FAKE_ENTITIES.slice(),
|
|
25864
26185
|
attributes: ['label', 'name', 'description', 'comments'],
|
|
25865
26186
|
displayWith: this.entityToString
|
|
25866
26187
|
});
|
|
@@ -25879,13 +26200,13 @@ class AutocompleteTestPage {
|
|
|
25879
26200
|
loadData() {
|
|
25880
26201
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25881
26202
|
const data = {
|
|
25882
|
-
entity: deepCopy
|
|
26203
|
+
entity: deepCopy(FAKE_ENTITIES)[0],
|
|
25883
26204
|
// This item is NOT in the items list => i should be displayed anyway
|
|
25884
26205
|
missingEntity: {
|
|
25885
26206
|
id: -1, label: '??', name: 'Missing item'
|
|
25886
26207
|
},
|
|
25887
|
-
disableEntity: deepCopy
|
|
25888
|
-
entities: deepCopy
|
|
26208
|
+
disableEntity: deepCopy(FAKE_ENTITIES)[2],
|
|
26209
|
+
entities: deepCopy(FAKE_ENTITIES)
|
|
25889
26210
|
};
|
|
25890
26211
|
this.form.setValue(data);
|
|
25891
26212
|
// Load observables
|
|
@@ -26032,13 +26353,13 @@ LatLongTestPage.ctorParameters = () => [
|
|
|
26032
26353
|
{ type: FormBuilder }
|
|
26033
26354
|
];
|
|
26034
26355
|
|
|
26035
|
-
const moment$
|
|
26356
|
+
const moment$5 = momentImported;
|
|
26036
26357
|
class SwipeTestPage {
|
|
26037
26358
|
constructor(formBuilder, dateFormatPipe) {
|
|
26038
26359
|
this.formBuilder = formBuilder;
|
|
26039
26360
|
this.dateFormatPipe = dateFormatPipe;
|
|
26040
26361
|
this.$dates = new BehaviorSubject(undefined);
|
|
26041
|
-
this._today = moment$
|
|
26362
|
+
this._today = moment$5().startOf('day');
|
|
26042
26363
|
this.form = formBuilder.group({
|
|
26043
26364
|
empty: [null, Validators.required],
|
|
26044
26365
|
date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
|
|
@@ -26051,7 +26372,7 @@ class SwipeTestPage {
|
|
|
26051
26372
|
ngOnInit() {
|
|
26052
26373
|
const dates = [];
|
|
26053
26374
|
for (let d = 0; d < 7; d++) {
|
|
26054
|
-
dates[d] = moment$
|
|
26375
|
+
dates[d] = moment$5(this._today).add(d - 3, 'day');
|
|
26055
26376
|
}
|
|
26056
26377
|
this.$dates.next(dates);
|
|
26057
26378
|
this.loadData();
|
|
@@ -26092,7 +26413,7 @@ SwipeTestPage.ctorParameters = () => [
|
|
|
26092
26413
|
{ type: DateFormatPipe }
|
|
26093
26414
|
];
|
|
26094
26415
|
|
|
26095
|
-
const moment$
|
|
26416
|
+
const moment$6 = momentImported;
|
|
26096
26417
|
class DateTimeTestPage {
|
|
26097
26418
|
constructor(platform, formBuilder, cd) {
|
|
26098
26419
|
this.platform = platform;
|
|
@@ -26123,7 +26444,7 @@ class DateTimeTestPage {
|
|
|
26123
26444
|
// Load the form with data
|
|
26124
26445
|
loadData() {
|
|
26125
26446
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26126
|
-
const now = moment$
|
|
26447
|
+
const now = moment$6();
|
|
26127
26448
|
const data = {
|
|
26128
26449
|
empty: toDateISOString(now.clone().add(2, 'hours')),
|
|
26129
26450
|
enable: toDateISOString(now),
|
|
@@ -26184,9 +26505,9 @@ DateTimeTestPage.ctorParameters = () => [
|
|
|
26184
26505
|
{ type: ChangeDetectorRef }
|
|
26185
26506
|
];
|
|
26186
26507
|
|
|
26187
|
-
class EntityTestClass {
|
|
26508
|
+
class EntityTestClass$1 {
|
|
26188
26509
|
}
|
|
26189
|
-
const FAKE_ENTITIES = [
|
|
26510
|
+
const FAKE_ENTITIES$1 = [
|
|
26190
26511
|
{ id: 1, label: 'AAA', name: 'Item A' },
|
|
26191
26512
|
{ id: 2, label: 'BBB', name: 'Item B' },
|
|
26192
26513
|
{ id: 3, label: 'CCC', name: 'Item C' },
|
|
@@ -26195,14 +26516,14 @@ const FAKE_ENTITIES = [
|
|
|
26195
26516
|
{ id: 6, label: 'FFF', name: 'Item F' },
|
|
26196
26517
|
{ id: 7, label: 'GGG', name: 'Item G' }
|
|
26197
26518
|
];
|
|
26198
|
-
function deepCopy(values, size) {
|
|
26519
|
+
function deepCopy$1(values, size) {
|
|
26199
26520
|
if (isNil(size)) {
|
|
26200
|
-
return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
|
|
26521
|
+
return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
|
|
26201
26522
|
}
|
|
26202
26523
|
let result = [];
|
|
26203
26524
|
let i = 1;
|
|
26204
26525
|
while (result.length < size) {
|
|
26205
|
-
result = result.concat((values || FAKE_ENTITIES).map(entity => {
|
|
26526
|
+
result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
|
|
26206
26527
|
const name = entity.name + ' #' + i;
|
|
26207
26528
|
return Object.assign(Object.assign({}, entity), { id: i++, name });
|
|
26208
26529
|
}));
|
|
@@ -26212,7 +26533,7 @@ function deepCopy(values, size) {
|
|
|
26212
26533
|
class ChipsTestPage {
|
|
26213
26534
|
constructor(formBuilder) {
|
|
26214
26535
|
this.formBuilder = formBuilder;
|
|
26215
|
-
this._items = deepCopy(FAKE_ENTITIES, 100);
|
|
26536
|
+
this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
|
|
26216
26537
|
this._$items = new BehaviorSubject(undefined);
|
|
26217
26538
|
this.autocompleteFields = new MatAutocompleteConfigHolder();
|
|
26218
26539
|
this.form = formBuilder.group({
|
|
@@ -26251,7 +26572,7 @@ class ChipsTestPage {
|
|
|
26251
26572
|
// Load the form with data
|
|
26252
26573
|
loadData() {
|
|
26253
26574
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26254
|
-
const items = deepCopy(FAKE_ENTITIES);
|
|
26575
|
+
const items = deepCopy$1(FAKE_ENTITIES$1);
|
|
26255
26576
|
const data = {
|
|
26256
26577
|
entity: items.slice(0, 1),
|
|
26257
26578
|
entityInitial: items.slice(1, 2),
|
|
@@ -26367,7 +26688,7 @@ NumpadTestPage.ctorParameters = () => [
|
|
|
26367
26688
|
{ type: FormBuilder }
|
|
26368
26689
|
];
|
|
26369
26690
|
|
|
26370
|
-
const moment = momentImported;
|
|
26691
|
+
const moment$7 = momentImported;
|
|
26371
26692
|
class DateTestPage {
|
|
26372
26693
|
constructor(formBuilder, cd) {
|
|
26373
26694
|
this.formBuilder = formBuilder;
|
|
@@ -26379,7 +26700,8 @@ class DateTestPage {
|
|
|
26379
26700
|
this.timezone = 'Indian/Mahe';
|
|
26380
26701
|
this.stringify = JSON.stringify;
|
|
26381
26702
|
this.form = formBuilder.group({
|
|
26382
|
-
empty: [null,
|
|
26703
|
+
empty: [null, SharedValidators.validDate],
|
|
26704
|
+
emptyRequired: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
|
|
26383
26705
|
enable: [null, Validators.required],
|
|
26384
26706
|
disable: [null, Validators.required],
|
|
26385
26707
|
readonly: [null],
|
|
@@ -26399,10 +26721,11 @@ class DateTestPage {
|
|
|
26399
26721
|
// Load the form with data
|
|
26400
26722
|
loadData() {
|
|
26401
26723
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26402
|
-
const now = moment();
|
|
26724
|
+
const now = moment$7();
|
|
26403
26725
|
const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
|
|
26404
26726
|
const data = {
|
|
26405
|
-
empty:
|
|
26727
|
+
empty: null,
|
|
26728
|
+
emptyRequired: null,
|
|
26406
26729
|
enable: toDateISOString(now),
|
|
26407
26730
|
disable: now.clone(),
|
|
26408
26731
|
readonly: now.clone(),
|
|
@@ -26456,7 +26779,7 @@ class DateTestPage {
|
|
|
26456
26779
|
DateTestPage.decorators = [
|
|
26457
26780
|
{ type: Component, args: [{
|
|
26458
26781
|
selector: 'app-data-test',
|
|
26459
|
-
template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <hr/>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value={{stringify(form.controls.timezone.value)}}</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #readonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n </form>\n\n</ion-content>\n"
|
|
26782
|
+
template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value (required)\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.emptyRequired.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"emptyRequired\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"mobileReadonlyField.readonly=$event.checked\" [checked]=\"mobileReadonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #mobileReadonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <hr/>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value (required)\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.emptyRequired.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"emptyRequired\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value={{stringify(form.controls.timezone.value)}}</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"desktopReadonlyField.readonly=$event.checked\" [checked]=\"desktopReadonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #desktopReadonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n\n </form>\n</ion-content>\n"
|
|
26460
26783
|
},] }
|
|
26461
26784
|
];
|
|
26462
26785
|
DateTestPage.ctorParameters = () => [
|
|
@@ -26476,7 +26799,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
|
|
|
26476
26799
|
{ label: 'Shared directives', divider: true },
|
|
26477
26800
|
{ label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
|
|
26478
26801
|
];
|
|
26479
|
-
const routes$
|
|
26802
|
+
const routes$1 = [
|
|
26480
26803
|
{
|
|
26481
26804
|
path: '',
|
|
26482
26805
|
pathMatch: 'full',
|
|
@@ -26533,7 +26856,7 @@ MaterialTestingModule.decorators = [
|
|
|
26533
26856
|
ReactiveFormsModule,
|
|
26534
26857
|
SharedMaterialModule,
|
|
26535
26858
|
TranslateModule.forChild(),
|
|
26536
|
-
RouterModule.forChild(routes$
|
|
26859
|
+
RouterModule.forChild(routes$1)
|
|
26537
26860
|
],
|
|
26538
26861
|
declarations: [
|
|
26539
26862
|
DateTimeTestPage,
|
|
@@ -26594,7 +26917,7 @@ ToastTestingPage.ctorParameters = () => [
|
|
|
26594
26917
|
{ type: TranslateService }
|
|
26595
26918
|
];
|
|
26596
26919
|
|
|
26597
|
-
const routes$
|
|
26920
|
+
const routes$2 = [
|
|
26598
26921
|
{
|
|
26599
26922
|
path: 'toast',
|
|
26600
26923
|
pathMatch: 'full',
|
|
@@ -26609,7 +26932,7 @@ ToastTestingModule.decorators = [
|
|
|
26609
26932
|
CommonModule,
|
|
26610
26933
|
IonicModule,
|
|
26611
26934
|
TranslateModule.forChild(),
|
|
26612
|
-
RouterModule.forChild(routes$
|
|
26935
|
+
RouterModule.forChild(routes$2)
|
|
26613
26936
|
],
|
|
26614
26937
|
declarations: [
|
|
26615
26938
|
ToastTestingPage
|
|
@@ -26672,7 +26995,7 @@ UploadFileTestingPage.ctorParameters = () => [
|
|
|
26672
26995
|
{ type: PopoverController }
|
|
26673
26996
|
];
|
|
26674
26997
|
|
|
26675
|
-
const routes$
|
|
26998
|
+
const routes$3 = [
|
|
26676
26999
|
{
|
|
26677
27000
|
path: 'upload-file',
|
|
26678
27001
|
pathMatch: 'full',
|
|
@@ -26687,7 +27010,7 @@ UploadFileTestingModule.decorators = [
|
|
|
26687
27010
|
CommonModule,
|
|
26688
27011
|
IonicModule,
|
|
26689
27012
|
TranslateModule.forChild(),
|
|
26690
|
-
RouterModule.forChild(routes$
|
|
27013
|
+
RouterModule.forChild(routes$3)
|
|
26691
27014
|
],
|
|
26692
27015
|
declarations: [
|
|
26693
27016
|
UploadFileTestingPage
|
|
@@ -27068,7 +27391,7 @@ TextPopoverTestingPage.ctorParameters = () => [
|
|
|
27068
27391
|
{ type: PopoverController }
|
|
27069
27392
|
];
|
|
27070
27393
|
|
|
27071
|
-
const routes$
|
|
27394
|
+
const routes$4 = [
|
|
27072
27395
|
{
|
|
27073
27396
|
path: 'text-popover',
|
|
27074
27397
|
pathMatch: 'full',
|
|
@@ -27083,7 +27406,7 @@ TextPopoverTestingModule.decorators = [
|
|
|
27083
27406
|
CommonModule,
|
|
27084
27407
|
IonicModule,
|
|
27085
27408
|
TranslateModule.forChild(),
|
|
27086
|
-
RouterModule.forChild(routes$
|
|
27409
|
+
RouterModule.forChild(routes$4)
|
|
27087
27410
|
],
|
|
27088
27411
|
declarations: [
|
|
27089
27412
|
TextPopoverTestingPage
|
|
@@ -27100,7 +27423,7 @@ const CORE_TESTING_PAGES = [
|
|
|
27100
27423
|
{ label: 'Table', page: '/testing/core/table' },
|
|
27101
27424
|
{ label: 'Text popover', page: '/testing/core/text-popover' }
|
|
27102
27425
|
];
|
|
27103
|
-
const routes = [
|
|
27426
|
+
const routes$5 = [
|
|
27104
27427
|
{
|
|
27105
27428
|
path: '',
|
|
27106
27429
|
pathMatch: 'full',
|
|
@@ -27124,7 +27447,7 @@ CoreTestingModule.decorators = [
|
|
|
27124
27447
|
imports: [
|
|
27125
27448
|
CommonModule,
|
|
27126
27449
|
TranslateModule.forChild(),
|
|
27127
|
-
RouterModule.forChild(routes),
|
|
27450
|
+
RouterModule.forChild(routes$5),
|
|
27128
27451
|
// Sub modules
|
|
27129
27452
|
TableTestingModule,
|
|
27130
27453
|
TextPopoverTestingModule
|
|
@@ -27144,5 +27467,5 @@ CoreTestingModule.decorators = [
|
|
|
27144
27467
|
* Generated bundle index. Do not edit.
|
|
27145
27468
|
*/
|
|
27146
27469
|
|
|
27147
|
-
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment,
|
|
27470
|
+
export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageService, MessageTypeList, MessageTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventFragments, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
|
|
27148
27471
|
//# sourceMappingURL=sumaris-net.ngx-components.js.map
|