@sumaris-net/ngx-components 1.8.1 → 1.9.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.
Files changed (34) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +208 -197
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +1 -1
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +5 -1
  6. package/esm2015/public_api.js +2 -1
  7. package/esm2015/src/app/admin/users/list/users.js +5 -22
  8. package/esm2015/src/app/core/home/home.js +3 -3
  9. package/esm2015/src/app/core/register/confirm/confirm.js +1 -1
  10. package/esm2015/src/app/core/services/account.service.js +38 -27
  11. package/esm2015/src/app/core/services/local-settings.service.js +18 -14
  12. package/esm2015/src/app/core/services/model/settings.model.js +1 -1
  13. package/esm2015/src/app/core/services/platform.service.js +35 -31
  14. package/esm2015/src/app/core/table/memory-table.class.js +2 -7
  15. package/esm2015/src/app/core/table/table.class.js +21 -24
  16. package/esm2015/src/app/shared/directives/autofocus.directive.js +15 -24
  17. package/esm2015/src/app/shared/platforms.js +36 -0
  18. package/esm2015/src/app/shared/services/progress-bar.service.js +1 -1
  19. package/esm2015/src/app/social/list/user-events.table.js +3 -8
  20. package/fesm2015/sumaris-net.ngx-components.js +162 -136
  21. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  22. package/package.json +1 -1
  23. package/public_api.d.ts +1 -0
  24. package/src/app/admin/users/list/users.d.ts +1 -12
  25. package/src/app/core/services/account.service.d.ts +2 -0
  26. package/src/app/core/services/local-settings.service.d.ts +0 -2
  27. package/src/app/core/services/model/settings.model.d.ts +0 -1
  28. package/src/app/core/services/platform.service.d.ts +8 -5
  29. package/src/app/core/table/memory-table.class.d.ts +0 -1
  30. package/src/app/core/table/table.class.d.ts +8 -10
  31. package/src/app/shared/directives/autofocus.directive.d.ts +4 -5
  32. package/src/app/shared/platforms.d.ts +13 -0
  33. package/src/app/social/list/user-events.table.d.ts +0 -1
  34. package/sumaris-net.ngx-components.metadata.json +1 -1
@@ -992,7 +992,7 @@ class MatAutocompleteConfigHolder {
992
992
  }
993
993
  }
994
994
  const noop$8 = (_) => { };
995
- const ɵ0$b = noop$8;
995
+ const ɵ0$c = noop$8;
996
996
  class MatAutocompleteField {
997
997
  constructor(cd, formGroupDir) {
998
998
  this.cd = cd;
@@ -3918,26 +3918,56 @@ SharedPipesModule.decorators = [
3918
3918
  },] }
3919
3919
  ];
3920
3920
 
3921
+ /* ---
3922
+ * Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts
3923
+ * --- */
3924
+ const matchMedia = (win, query) => win.matchMedia(query).matches;
3925
+ const testUserAgent = (win, expr) => {
3926
+ const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
3927
+ return expr.test(userAgent);
3928
+ };
3929
+ const isWindow = (win) => {
3930
+ const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
3931
+ return /windows/i.test(userAgent);
3932
+ };
3933
+ /**
3934
+ * Detect desktop, by fine cursor. See https://github.com/ionic-team/ionic-framework/issues/19942
3935
+ * @param win
3936
+ */
3937
+ const isDesktop = (win) => matchMedia(win, '(any-pointer:fine)');
3938
+ const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
3939
+ const isMobile = (win) => isTouchUi(win) && !isDesktop(win);
3940
+ const isIpad = (win) => {
3941
+ // iOS 12 and below
3942
+ if (testUserAgent(win, /iPad/i)) {
3943
+ return true;
3944
+ }
3945
+ // iOS 13+
3946
+ if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {
3947
+ return true;
3948
+ }
3949
+ return false;
3950
+ };
3951
+ const ɵ0$b = isIpad;
3952
+ const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
3953
+ const isAndroid = (win) => testUserAgent(win, /android|sink/i);
3954
+ const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
3955
+
3921
3956
  // Import the core angular services.
3922
3957
  // ----------------------------------------------------------------------------------- //
3923
3958
  // ----------------------------------------------------------------------------------- //
3924
3959
  const BASE_TIMER_DELAY = 100;
3925
3960
  class AutofocusDirective {
3926
3961
  // I initialize the autofocus directive.
3927
- constructor(elementRef, platform, keyboard) {
3962
+ constructor(elementRef, keyboard) {
3928
3963
  this.keyboard = keyboard;
3929
- this.timer = null;
3930
- this.elementRef = elementRef;
3964
+ this._timer = null;
3965
+ this._elementRef = elementRef;
3931
3966
  this.shouldFocusElement = '';
3932
- this.timer = null;
3967
+ this._timer = null;
3933
3968
  this.timerDelay = BASE_TIMER_DELAY;
3934
- platform.ready().then(() => {
3935
- this.touchUi = platform.is('mobile') || platform.is('tablet');
3936
- });
3969
+ this._mobile = isMobile(window);
3937
3970
  }
3938
- // ---
3939
- // PUBLIC METHODS.
3940
- // ---
3941
3971
  // I get called once after the contents have been fully initialized.
3942
3972
  ngAfterContentInit() {
3943
3973
  // Because this directive can act on the stand-only "autofocus" attribute or
@@ -3972,29 +4002,26 @@ class AutofocusDirective {
3972
4002
  ngOnDestroy() {
3973
4003
  this.stopFocusWorkflow();
3974
4004
  }
3975
- // ---
3976
- // PRIVATE METHODS.
3977
- // ---
4005
+ /* --- private functions -- */
3978
4006
  // I start the timer-based workflow that will focus the current element.
3979
4007
  startFocusWorkflow() {
3980
4008
  // if touch UI: do NOT focus when keyboard hide
3981
- if (this.touchUi && this.keyboard && this.keyboard.isVisible === false)
4009
+ if (this._mobile && this.keyboard && this.keyboard.isVisible === false)
3982
4010
  return;
3983
4011
  // If there is already a timer running for this element, just let it play out -
3984
4012
  // resetting it at this point will only push-out the time at which the focus is
3985
4013
  // applied to the element.
3986
- if (this.timer) {
4014
+ if (this._timer)
3987
4015
  return;
3988
- }
3989
- this.timer = setTimeout(() => {
3990
- this.timer = null;
3991
- this.elementRef.nativeElement.focus();
4016
+ this._timer = setTimeout(() => {
4017
+ this._timer = null;
4018
+ this._elementRef.nativeElement.focus();
3992
4019
  }, this.timerDelay);
3993
4020
  }
3994
4021
  // I stop the timer-based workflow, preventing focus from taking place.
3995
4022
  stopFocusWorkflow() {
3996
- clearTimeout(this.timer);
3997
- this.timer = null;
4023
+ clearTimeout(this._timer);
4024
+ this._timer = null;
3998
4025
  }
3999
4026
  }
4000
4027
  AutofocusDirective.decorators = [
@@ -4008,7 +4035,6 @@ AutofocusDirective.decorators = [
4008
4035
  ];
4009
4036
  AutofocusDirective.ctorParameters = () => [
4010
4037
  { type: ElementRef },
4011
- { type: Platform },
4012
4038
  { type: Keyboard, decorators: [{ type: Optional }] }
4013
4039
  ];
4014
4040
 
@@ -9980,7 +10006,7 @@ SelectPeerModal.propDecorators = {
9980
10006
 
9981
10007
  const moment$3 = momentImported;
9982
10008
  const SETTINGS_STORAGE_KEY = 'settings';
9983
- const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi'];
10009
+ const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
9984
10010
  // fixme: this constant points to static environment
9985
10011
  const DEFAULT_SETTINGS = {
9986
10012
  accountInheritance: true,
@@ -10016,29 +10042,32 @@ class LocalSettingsService extends StartableService {
10016
10042
  return this._data && this._data.latLongFormat || 'DDMM';
10017
10043
  }
10018
10044
  get usageMode() {
10019
- return (this._data && this._data.usageMode || (this.mobile ? 'FIELD' : 'DESK'));
10045
+ var _a;
10046
+ if (isNil((_a = this._data) === null || _a === void 0 ? void 0 : _a.mobile)) {
10047
+ console.warn("[settings] Accessing to property 'usageMode' BEFORE service started! Please use ready()");
10048
+ return isCordova(window) ? 'FIELD' : 'DESK';
10049
+ }
10050
+ return this._data.usageMode;
10020
10051
  }
10021
10052
  get mobile() {
10022
- return this._data && toBoolean(this._data.mobile, this.platform.is('mobile'));
10053
+ var _a;
10054
+ if (isNil((_a = this._data) === null || _a === void 0 ? void 0 : _a.mobile)) {
10055
+ console.warn("[settings] Accessing to property 'mobile' BEFORE service started! Please use ready()");
10056
+ return isMobile(window);
10057
+ }
10058
+ return this._data.mobile;
10023
10059
  }
10024
10060
  set mobile(value) {
10025
10061
  this._data.mobile = value;
10026
10062
  }
10027
- get touchUi() {
10028
- return this._data.touchUi;
10029
- }
10030
- set touchUi(value) {
10031
- this._data.touchUi = value;
10032
- }
10033
10063
  get pageHistory() {
10034
10064
  return (this._data && this._data.pageHistory || []);
10035
10065
  }
10036
10066
  ngOnStart() {
10037
10067
  console.info('[settings] Starting service...');
10038
10068
  // Restoring local settings
10039
- this._data.mobile = toBoolean(this._data.mobile, this.platform.is('mobile'));
10040
- this._data.touchUi = this._data.mobile || this.platform.is('phablet') || this.platform.is('tablet');
10041
- this._data.usageMode = this.platform.is('android') || this.platform.is('ios') ? 'FIELD' : 'DESK'; // FIELD by default if Android or iOs
10069
+ this._data.mobile = isNotNil(this._data.mobile) ? this._data.mobile : isMobile(window);
10070
+ this._data.usageMode = (isAndroid(window) || isIOS(window)) ? 'FIELD' : 'DESK'; // FIELD by default if Android or iOS
10042
10071
  // Restoring local settings
10043
10072
  return this.restoreLocally();
10044
10073
  }
@@ -13561,6 +13590,7 @@ class AccountService extends BaseGraphqlService {
13561
13590
  this.onChange = new Subject();
13562
13591
  this.onAuthTokenChange = new Subject();
13563
13592
  this.onAuthBasicChange = new Subject();
13593
+ this._stopWatching$ = new Subject();
13564
13594
  this._cache = {
13565
13595
  loaded: false,
13566
13596
  keypair: null,
@@ -13963,6 +13993,7 @@ class AccountService extends BaseGraphqlService {
13963
13993
  if (hadAuthBasic)
13964
13994
  this.onAuthBasicChange.next(undefined);
13965
13995
  this.onChange.next(undefined);
13996
+ this._stopWatching$.next();
13966
13997
  });
13967
13998
  }
13968
13999
  /**
@@ -14079,12 +14110,17 @@ class AccountService extends BaseGraphqlService {
14079
14110
  return res && res.confirmAccountEmail;
14080
14111
  });
14081
14112
  }
14082
- listenChanges() {
14113
+ watch() {
14083
14114
  if (!this._cache.pubkey)
14084
- return Subscription.EMPTY;
14085
- const self = this;
14086
- console.debug('[account] [WS] Listening changes');
14087
- const subscription = this.graphql.subscribe({
14115
+ throw new Error('Not logged in');
14116
+ if (!this.started) {
14117
+ // Wait service ready, then loop
14118
+ return from(this.ready())
14119
+ .pipe(switchMap(() => this.watch()));
14120
+ }
14121
+ this._stopWatching$.next(); // Stop previous listening
14122
+ console.debug('[account] [WS] Watching changes');
14123
+ return this.graphql.subscribe({
14088
14124
  query: AccountSubscriptions.listenChanges,
14089
14125
  variables: {
14090
14126
  interval: 10
@@ -14093,35 +14129,39 @@ class AccountService extends BaseGraphqlService {
14093
14129
  code: ErrorCodes$2.SUBSCRIBE_ACCOUNT_ERROR,
14094
14130
  message: 'ERROR.ACCOUNT.SUBSCRIBE_ACCOUNT_ERROR'
14095
14131
  }
14096
- }).subscribe({
14097
- next: ({ data }) => __awaiter(this, void 0, void 0, function* () {
14098
- var _a;
14099
- if (!data)
14100
- return;
14101
- const existingUpdateDate = toDateISOString((_a = self._data) === null || _a === void 0 ? void 0 : _a.updateDate);
14102
- if (existingUpdateDate !== data.updateDate) {
14103
- console.debug(`[account] [WS] Detected update on {${data.updateDate}}`);
14104
- yield self.refresh();
14105
- }
14106
- }),
14107
- error: (err) => __awaiter(this, void 0, void 0, function* () {
14132
+ })
14133
+ .pipe(
14134
+ // Stop this pipe next time we call watch()
14135
+ takeUntil(this._stopWatching$), map(({ data }) => {
14136
+ var _a;
14137
+ if (!data)
14138
+ return;
14139
+ const existingUpdateDate = toDateISOString((_a = this._data) === null || _a === void 0 ? void 0 : _a.updateDate);
14140
+ if (existingUpdateDate === data.updateDate)
14141
+ return;
14142
+ console.debug(`[account] [WS] Detected update on {${data.updateDate}}`);
14143
+ return Account.fromObject(data);
14144
+ }), filter(isNotNil));
14145
+ }
14146
+ listenChanges() {
14147
+ const self = this;
14148
+ const subscription = this.watch()
14149
+ .subscribe({
14150
+ next: (data) => self.refresh(),
14151
+ error: (err) => {
14108
14152
  if (err && +err.code === ServerErrorCodes.NOT_FOUND) {
14109
14153
  console.info('[account] Account not exists anymore: force user to logout...', err);
14110
- yield self.logout();
14154
+ self.logout();
14111
14155
  }
14112
14156
  else if (err && +err.code === ServerErrorCodes.UNAUTHORIZED) {
14113
14157
  console.info('[account] Account not authorized: force user to logout...', err);
14114
- yield self.logout();
14158
+ self.logout();
14115
14159
  }
14116
14160
  else {
14117
14161
  console.warn('[account] [WS] Received error:', err);
14118
14162
  }
14119
- }),
14120
- complete: () => {
14121
- console.debug('[account] [WS] Completed');
14122
14163
  }
14123
14164
  });
14124
- // Add log when closing WS
14125
14165
  subscription.add(() => console.debug('[account] [WS] Stop listening changes'));
14126
14166
  return subscription;
14127
14167
  }
@@ -15125,24 +15165,39 @@ class PlatformService extends StartableService {
15125
15165
  if (this._debug)
15126
15166
  console.debug('[platform] Creating service');
15127
15167
  }
15128
- get mobile() {
15129
- return isNotNil(this._mobile) ? this._mobile : this.platform.is('mobile');
15130
- }
15131
15168
  is(platformName) {
15132
- return this.platform.is(platformName);
15169
+ switch (platformName) {
15170
+ case 'mobile':
15171
+ // Use custom mobile detection - see SUMARIS issue #323
15172
+ return isMobile(window);
15173
+ default:
15174
+ return this.platform.is(platformName);
15175
+ }
15176
+ }
15177
+ get mobile() {
15178
+ return isNotNil(this._mobile) ? this._mobile : isMobile(window);
15133
15179
  }
15134
15180
  /**
15135
- * Say if opened has been opened from a web browser (and NOT inside an Android or iOs App).
15181
+ * Say if opened has been opened inside an Android or iOs App.
15136
15182
  * This is used to known if there is cordova features
15137
15183
  */
15138
- isWebOrDesktop() {
15139
- return !this.platform.is('mobile') || this.platform.is('mobileweb');
15184
+ isCordova() {
15185
+ return this._cordova;
15140
15186
  }
15141
15187
  isAndroidCordova() {
15142
15188
  return this._android && this._cordova || false;
15143
15189
  }
15190
+ isIOSCordova() {
15191
+ return this._ios && this._cordova || false;
15192
+ }
15193
+ isWeb() {
15194
+ return !this._cordova || (!this._android && !this._ios);
15195
+ }
15196
+ isApp() {
15197
+ return this._cordova && (this._android || this._ios);
15198
+ }
15144
15199
  get canDownload() {
15145
- return this._android && this._cordova && isNotNil(this.downloader);
15200
+ return !!this.downloader && this.isAndroidCordova();
15146
15201
  }
15147
15202
  get canOpenFile() {
15148
15203
  return false;
@@ -15159,16 +15214,13 @@ class PlatformService extends StartableService {
15159
15214
  this.accountService.tokenType = undefined;
15160
15215
  console.info('[platform] Starting platform...');
15161
15216
  try {
15162
- this._mobile = this.platform.is('mobile');
15163
- this._cordova = this.platform.is('cordova');
15164
- this._android = this.platform.is('android');
15165
- this.configureCordovaPlugins(this._mobile);
15166
- this.touchUi = this._mobile || this.platform.is('tablet') || this.platform.is('phablet');
15167
- // Force mobile in settings
15168
- if (this._mobile) {
15169
- this.settings.mobile = this._mobile;
15170
- this.settings.touchUi = this.touchUi;
15171
- }
15217
+ this._mobile = this.is('mobile');
15218
+ this._cordova = this.is('cordova');
15219
+ this._android = this.is('android');
15220
+ this._ios = this.is('ios');
15221
+ this.configureCordovaPlugins();
15222
+ // Force some settings
15223
+ this.settings.mobile = this._mobile;
15172
15224
  // Configure translation
15173
15225
  yield this.configureTranslate();
15174
15226
  // Configure storage
@@ -15182,7 +15234,7 @@ class PlatformService extends StartableService {
15182
15234
  this.networkService.ready(),
15183
15235
  this.audioProvider.ready()
15184
15236
  ]);
15185
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, touchUi: ${this.touchUi}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15237
+ console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
15186
15238
  // Update cache configuration when network changed
15187
15239
  this.networkService.onNetworkStatusChanges
15188
15240
  .pipe(skip(1)) // Skip the first event (behavior subject send event immediately)
@@ -15194,7 +15246,7 @@ class PlatformService extends StartableService {
15194
15246
  console.info(`[platform] Using auth token type {${tokenType}}`);
15195
15247
  this.accountService.tokenType = tokenType;
15196
15248
  });
15197
- // Hide the splashscreen (if mobile) - after 1s
15249
+ // Hide the splashscreen (if mobile) - after 1s - and play start sound
15198
15250
  if (this.mobile) {
15199
15251
  setTimeout(() => {
15200
15252
  var _a;
@@ -15269,7 +15321,7 @@ class PlatformService extends StartableService {
15269
15321
  //}
15270
15322
  }
15271
15323
  /* -- protected methods -- */
15272
- configureCordovaPlugins(mobile) {
15324
+ configureCordovaPlugins() {
15273
15325
  console.info('[platform] Configuring Cordova plugins...');
15274
15326
  if (this.statusBar) {
15275
15327
  this.statusBar.styleDefault();
@@ -15278,15 +15330,6 @@ class PlatformService extends StartableService {
15278
15330
  if (this.keyboard) {
15279
15331
  this.keyboard.hideFormAccessoryBar(true);
15280
15332
  }
15281
- // Force to use InAppBrowser instead of default window.open()
15282
- if (this.browser) {
15283
- // FIXME: this create a infinite loop (e.g. when downloading an extraction file)
15284
- // window.open = (url?: string, target?: string, features?: string, replace?: boolean) => {
15285
- // console.debug("[platform] Call to window.open() redirected to InAppBrowser.open()");
15286
- // this.browser.create(url, target, features).show();
15287
- // return window;
15288
- // };
15289
- }
15290
15333
  }
15291
15334
  configureTranslate() {
15292
15335
  console.info('[platform] Configuring i18n ...');
@@ -18006,7 +18049,7 @@ class HomePage {
18006
18049
  this.appName = config.label || this.environment.defaultAppName || 'SUMARiS';
18007
18050
  this.logo = config.largeLogo || config.smallLogo || undefined;
18008
18051
  this.description = config.name;
18009
- this.isWeb = this.platform.isWebOrDesktop();
18052
+ this.isWeb = this.platform.isWeb();
18010
18053
  this.canRegister = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);
18011
18054
  const partners = (config.partners || []).filter(p => p && p.logo);
18012
18055
  this.$partners.next(partners);
@@ -18096,7 +18139,7 @@ HomePage.decorators = [
18096
18139
  template: "<app-toolbar [canGoBack]=\"false\"\n visible-xs visible-sm visible-mobile>\n\n <!-- change locale button -->\n <ion-button slot=\"end\" *ngIf=\"currentLocaleCode; let code\"\n [matMenuTriggerFor]=\"localeMenu\">\n <ion-label class=\"ion-text-uppercase\">&nbsp;{{ code }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n</app-toolbar>\n\n<!-- change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <button *ngFor=\"let item of locales\"\n mat-menu-item\n (click)=\"changeLanguage(item.key)\">\n <ion-label>{{item.value}}</ion-label>\n </button>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" no-padding-xs>\n\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!loading\">\n <div class=\"spinner\" *ngIf=\"loading && showSpinner\">\n <p>Loading...</p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n <div hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n <!-- change locale button -->\n <ion-button color=\"secondary\" fill=\"solid\"\n *ngIf=\"currentLocaleCode; let code\"\n [matMenuTriggerFor]=\"localeMenu\">\n <ion-label class=\"ion-text-uppercase\">&nbsp;{{ code }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\"\n showInstallButton=\"true\">\n </app-install-upgrade-card>\n\n <!-- Welcome card -->\n <ion-card *ngIf=\"!loading\"\n class=\"main welcome ion-padding ion-text-center ion-align-self-center\"\n @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB'|translate: {appName: appName}\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP'|translate: {appName: appName}\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\">\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img class=\"logo\" *ngIf=\"logo\" src=\"{{ logo }}\">\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br/>\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n </ion-card-content>\n\n <ion-footer class=\"ion-padding-top\">\n\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons;\">\n\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n\n <!-- Feature buttons -->\n <ng-container *ngIf=\"$filteredButtons | async as buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n <ion-button *ngIf=\"item.path\"\n expand=\"block\" color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">{{item.matIcon}}</mat-icon>\n <ion-text>{{'HOME.BTN_DATA_ENTRY'|translate: {name: (item.title | translate) } }}</ion-text>\n </ion-button>\n\n <!-- divider -->\n <div *ngIf=\"!item.path && !item.action\" [class]=\"item.cssClass\">\n <ion-label translate>{{item.title}}&nbsp;</ion-label>\n </div>\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: {displayName: accountName }\"></ion-text>\n <br/>\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n\n\n </ng-template>\n\n </ion-footer>\n </ion-card>\n\n <!-- Page history -->\n <ion-grid *ngIf=\"!loading && isLogin && pageHistory.length; else bottomBanner\"\n class=\"history-container ion-align-self-center\">\n <ion-row>\n <ion-col size=\"12\" size-xl=\"\" *ngFor=\"let page of pageHistory; trackBy: getPagePath\"\n class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button type=\"button\" tabindex=\"-1\"\n (click)=\"settings.removePageHistory(page.path)\"\n mat-icon-button class=\"ion-float-start ion-no-margin\">\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle|translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time|dateFormat:{time: true}\">\n <small><ion-icon name=\"time-outline\"></ion-icon>&nbsp;{{ page.time|dateFromNow }}</small>&nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item detail=\"true\"\n tappable class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\" lines=\"none\">\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{page.matIcon}}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n <ion-card-content class=\"ion-no-padding ion-padding-start\" *ngIf=\"page.children?.length\">\n <ion-list class=\"ion-no-padding\">\n <ion-item detail=\"true\"\n *ngFor=\"let childPage of page.children\"\n tappable class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\">\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">{{childPage.matIcon}}</mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Display configured Departments logos -->\n <ng-template #bottomBanner>\n <div class=\"bottom-banner ion-text-center ion-padding\" *ngIf=\"!loadingBanner\" @fadeInAnimation>\n <a href=\"{{ item.siteUrl }}\" *ngFor=\"let item of $partners | async \">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{item.label}}\" [title]=\"item.label\" />\n </a>\n </div>\n </ng-template>\n\n\n</ion-content>\n",
18097
18140
  changeDetection: ChangeDetectionStrategy.OnPush,
18098
18141
  animations: [fadeInAnimation, slideUpDownAnimation],
18099
- styles: ["h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background:transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;display:inline-block;padding:15px}ion-content,ion-content .loading-page{background-color:var(--ion-color-primary)}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:hsla(0,0%,100%,.7)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:hsla(0,0%,100%,.7)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{--ion-item-background:$transparent;--ion-item-icon-color:var(--ion-color-primary);--ion-item-text-color:var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;-webkit-margin-end:16px!important;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background:var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color:var(--ion-color-dark);--ion-item-text-color:var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;-webkit-margin-end:16px!important;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{background-color:hsla(0,0%,100%,.7);min-width:240px;z-index:0;position:absolute;left:16px;right:16px;bottom:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content ion-text{text-align:center}@media screen and (max-width:575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card button{margin-top:8px}ion-content .bottom-banner{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width:767px) and (min-width:576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width:768px){ion-content{min-height:calc(100% - 100px)}}"]
18142
+ styles: ["h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background:transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;display:inline-block;padding:15px}ion-content,ion-content .loading-page{background-color:var(--ion-color-primary)}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:hsla(0,0%,100%,.7)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:hsla(0,0%,100%,.7)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{--ion-item-background:$transparent;--ion-item-icon-color:var(--ion-color-primary);--ion-item-text-color:var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;-webkit-margin-end:16px!important;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background:var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color:var(--ion-color-dark);--ion-item-text-color:var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;-webkit-margin-end:16px!important;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{background-color:hsla(0,0%,100%,.7);min-width:240px;z-index:0;position:absolute;left:16px;right:16px;bottom:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content ion-text{text-align:center}@media screen and (max-width:575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width:767px) and (min-width:576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width:768px){ion-content{min-height:calc(100% - 100px)}}"]
18100
18143
  },] }
18101
18144
  ];
18102
18145
  HomePage.ctorParameters = () => [
@@ -18183,7 +18226,7 @@ RegisterConfirmPage.decorators = [
18183
18226
  { type: Component, args: [{
18184
18227
  selector: 'page-register-confirm',
18185
18228
  template: "<app-toolbar [title]=\"'REGISTER.CONFIRMED.TITLE'|translate\" color=\"primary\">\n</app-toolbar>\n\n\n<ion-content class=\"bg-image-cover center ion-padding\" [ngStyle]=\"contentStyle\">\n\n <p class=\"hidden-xs ion-padding\">&nbsp;<br /><br /></p>\n <p class=\"hidden-xs\">&nbsp;</p>\n\n\n <ion-card>\n <ion-card-content>\n\n <div>\n <ng-container *ngIf=\"loading\">\n <h4 translate>REGISTER.CONFIRMED.LOADING</h4>\n <p><ion-spinner></ion-spinner></p>\n </ng-container>\n\n <!-- error -->\n <ion-item *ngIf=\"!loading && error\">\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 </div>\n\n <div *ngIf=\"!loading && !error\">\n <h3>\n <ion-icon name=\"checkmark\"></ion-icon>\n <b translate>REGISTER.CONFIRMED.SUB_TITLE</b>\n </h3>\n\n <ion-text>\n <p [innerHTML]=\"'REGISTER.CONFIRMED.SUCCESS'|translate: {email: email}\"></p>\n <p *ngIf=\"!isLogin\" [innerHTML]=\"'REGISTER.CONFIRMED.LOGIN_HELP'|translate\"></p>\n </ion-text>\n\n </div>\n\n </ion-card-content>\n\n <ion-footer *ngIf=\"!loading\">\n <ion-button expand=\"full\" color=\"primary\" [routerLink]=\"['/account']\" *ngIf=\"!isLogin\">\n <ion-icon name=\"log-in\" slot=\"start\"></ion-icon>\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n\n <ion-button expand=\"full\" color=\"secondary\" [routerLink]=\"['/account']\" *ngIf=\"isLogin\">\n <ion-icon name=\"contact\" slot=\"start\"></ion-icon>\n <span translate>HOME.BTN_MY_ACCOUNT</span>\n </ion-button>\n </ion-footer>\n </ion-card>\n\n</ion-content>\n",
18186
- styles: ["h1,h2,h3,h4,h5{white-space:normal}.bottom-banner,.center,ion-card,ion-card img,ion-content,ion-text{text-align:center;display:inline-block}ion-content{--ion-background-color:transparent;background-size:cover;display:inline-block;padding:15px}ion-card{padding:var(--ion-padding);background-color:hsla(0,0%,100%,.7);min-width:240px;max-width:400px;z-index:9}ion-card button{margin-top:16px}ion-card img{max-width:250px}.bottom-banner{padding:var(--ion-padding);background-color:hsla(0,0%,100%,.7);min-width:240px;z-index:0}.bottom-banner img.logo{max-height:50px;margin-left:8px}@media screen and (max-width:575px){ion-content ion-card{min-width:160px;width:auto;max-width:260px}ion-content ion-card img{max-width:100px;margin-left:8px}ion-content ion-card button{margin-top:8px}.bottom-banner img.logo{max-height:30px}}@media screen and (max-width:767px) and (min-width:576px){ion-content{min-height:555px}.bottom-banner img.logo{max-height:40px}}@media screen and (min-width:768px){ion-content{min-height:606px}.main-content{padding-bottom:0}.bottom-banner{position:absolute;bottom:16px;left:16px;right:16px}}"]
18229
+ styles: ["h1,h2,h3,h4,h5{white-space:normal}.bottom-banner,.center,ion-card,ion-card img,ion-content,ion-text{text-align:center;display:inline-block}ion-content{--ion-background-color:transparent;background-size:cover;display:inline-block;padding:15px}ion-card{padding:var(--ion-padding);background-color:hsla(0,0%,100%,.7);min-width:240px;max-width:400px;z-index:9}ion-card button{margin-top:16px}ion-card img{max-width:250px}.bottom-banner{padding:var(--ion-padding);background-color:hsla(0,0%,100%,.7);min-width:240px;z-index:0}.bottom-banner img.logo{max-height:50px;margin-left:8px}@media screen and (max-width:575px){ion-content ion-card{min-width:160px;width:auto;max-width:260px}ion-content ion-card img{max-width:100px;margin-left:8px}ion-content ion-card ion-footer ion-button{margin-top:8px}.bottom-banner img.logo{max-height:30px}}@media screen and (max-width:767px) and (min-width:576px){ion-content{min-height:555px}.bottom-banner img.logo{max-height:40px}}@media screen and (min-width:768px){ion-content{min-height:606px}.main-content{padding-bottom:0}.bottom-banner{position:absolute;bottom:16px;left:16px;right:16px}}"]
18187
18230
  },] }
18188
18231
  ];
18189
18232
  RegisterConfirmPage.ctorParameters = () => [
@@ -21296,13 +21339,7 @@ class CellValueChangeListener {
21296
21339
  // @dynamic
21297
21340
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
21298
21341
  class AppTable {
21299
- constructor(route, router, platform, location, modalCtrl, settings, columns, _dataSource, _filter, injector) {
21300
- this.route = route;
21301
- this.router = router;
21302
- this.platform = platform;
21303
- this.location = location;
21304
- this.modalCtrl = modalCtrl;
21305
- this.settings = settings;
21342
+ constructor(injector, columns, _dataSource, _filter) {
21306
21343
  this.columns = columns;
21307
21344
  this._dataSource = _dataSource;
21308
21345
  this._filter = _filter;
@@ -21345,13 +21382,19 @@ class AppTable {
21345
21382
  this.onDirty = new EventEmitter();
21346
21383
  this.onError = new EventEmitter();
21347
21384
  this._paginator = null;
21348
- this.mobile = this.platform.is('mobile');
21349
- this.translate = injector === null || injector === void 0 ? void 0 : injector.get(TranslateService);
21350
- this.formErrorAdapter = injector === null || injector === void 0 ? void 0 : injector.get(FormErrorTranslator);
21351
- this.alertCtrl = injector === null || injector === void 0 ? void 0 : injector.get(AlertController);
21352
- this.toastController = injector === null || injector === void 0 ? void 0 : injector.get(ToastController);
21385
+ this.route = injector.get(ActivatedRoute);
21386
+ this.router = injector.get(Router);
21387
+ this.location = injector.get(Location);
21388
+ this.settings = injector.get(LocalSettingsService);
21389
+ this.translate = injector.get(TranslateService);
21390
+ this.modalCtrl = injector.get(ModalController);
21391
+ this.alertCtrl = injector.get(AlertController);
21392
+ this.toastController = injector.get(ToastController);
21393
+ this.formErrorAdapter = injector.get(FormErrorTranslator);
21394
+ this.mobile = this.settings.mobile;
21395
+ // Autocomplete fields
21353
21396
  this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({
21354
- getUserAttributes: (a, b) => settings.getFieldDisplayAttributes(a, b)
21397
+ getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b)
21355
21398
  });
21356
21399
  this.autocompleteFields = this._autocompleteConfigHolder.fields;
21357
21400
  }
@@ -22513,9 +22556,12 @@ class AppTable {
22513
22556
  return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();
22514
22557
  }
22515
22558
  generateTableId() {
22516
- return this.location.path(true).replace(/[?].*$/g, '').replace(/\/[\d]+/g, '_id') + '_' + this.constructor.name;
22559
+ const id = this.location.path(true)
22560
+ .replace(/[?].*$/g, '')
22561
+ .replace(/\/[\d]+/g, '_id')
22562
+ + '_' + this.constructor.name;
22517
22563
  //if (this.debug) console.debug("[table] id = " + id);
22518
- //return id;
22564
+ return id;
22519
22565
  }
22520
22566
  addRowToTable(insertAt) {
22521
22567
  return __awaiter(this, void 0, void 0, function* () {
@@ -22782,16 +22828,10 @@ AppTable.decorators = [
22782
22828
  { type: Directive }
22783
22829
  ];
22784
22830
  AppTable.ctorParameters = () => [
22785
- { type: ActivatedRoute },
22786
- { type: Router },
22787
- { type: undefined },
22788
- { type: Location },
22789
- { type: ModalController },
22790
- { type: LocalSettingsService },
22831
+ { type: Injector },
22791
22832
  { type: Array },
22792
22833
  { type: EntitiesTableDataSource },
22793
- { type: undefined },
22794
- { type: Injector }
22834
+ { type: undefined }
22795
22835
  ];
22796
22836
  AppTable.propDecorators = {
22797
22837
  settingsId: [{ type: Input }],
@@ -24024,8 +24064,7 @@ AppEntityEditor.ctorParameters = () => [
24024
24064
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
24025
24065
  class AppInMemoryTable extends AppTable {
24026
24066
  constructor(injector, columns, dataType, memoryDataService, validatorService, options, filter) {
24027
- super(injector.get(ActivatedRoute), injector.get(Router), injector.get(Platform), injector.get(Location), injector.get(ModalController), injector.get(LocalSettingsService), columns, new EntitiesTableDataSource(dataType, memoryDataService, validatorService, options), filter, injector);
24028
- this.injector = injector;
24067
+ super(injector, columns, new EntitiesTableDataSource(dataType, memoryDataService, validatorService, options), filter);
24029
24068
  this.columns = columns;
24030
24069
  this.dataType = dataType;
24031
24070
  this.memoryDataService = memoryDataService;
@@ -24515,7 +24554,7 @@ const ICONS_MAP = {
24515
24554
  }*/
24516
24555
  class UserEventsTable extends AppTable {
24517
24556
  constructor(injector, accountService, service, entities, cd, environment) {
24518
- super(injector.get(ActivatedRoute), injector.get(Router), injector.get(Platform), injector.get(Location), injector.get(ModalController), injector.get(LocalSettingsService),
24557
+ super(injector,
24519
24558
  // columns
24520
24559
  RESERVED_START_COLUMNS
24521
24560
  .concat([
@@ -24524,8 +24563,7 @@ class UserEventsTable extends AppTable {
24524
24563
  'eventType',
24525
24564
  'message'
24526
24565
  ])
24527
- .concat(RESERVED_END_COLUMNS), null, null, injector);
24528
- this.injector = injector;
24566
+ .concat(RESERVED_END_COLUMNS), null, null);
24529
24567
  this.accountService = accountService;
24530
24568
  this.service = service;
24531
24569
  this.entities = entities;
@@ -24899,8 +24937,8 @@ PersonValidatorService.ctorParameters = () => [
24899
24937
  ];
24900
24938
 
24901
24939
  class UsersPage extends AppTable {
24902
- constructor(route, router, platform, location, modalCtrl, accountService, settings, validatorService, configService, dataService, cd, formBuilder, injector, environment) {
24903
- super(route, router, platform, location, modalCtrl, settings, RESERVED_START_COLUMNS
24940
+ constructor(injector, accountService, validatorService, configService, dataService, cd, formBuilder, environment) {
24941
+ super(injector, RESERVED_START_COLUMNS
24904
24942
  .concat([
24905
24943
  'avatar',
24906
24944
  'lastName',
@@ -24919,14 +24957,8 @@ class UsersPage extends AppTable {
24919
24957
  dataServiceOptions: {
24920
24958
  saveOnlyDirtyRows: true
24921
24959
  }
24922
- }), null, injector);
24923
- this.route = route;
24924
- this.router = router;
24925
- this.platform = platform;
24926
- this.location = location;
24927
- this.modalCtrl = modalCtrl;
24960
+ }), null);
24928
24961
  this.accountService = accountService;
24929
- this.settings = settings;
24930
24962
  this.validatorService = validatorService;
24931
24963
  this.configService = configService;
24932
24964
  this.dataService = dataService;
@@ -25050,19 +25082,13 @@ UsersPage.decorators = [
25050
25082
  },] }
25051
25083
  ];
25052
25084
  UsersPage.ctorParameters = () => [
25053
- { type: ActivatedRoute },
25054
- { type: Router },
25055
- { type: PlatformService },
25056
- { type: Location },
25057
- { type: ModalController },
25085
+ { type: Injector },
25058
25086
  { type: AccountService },
25059
- { type: LocalSettingsService },
25060
25087
  { type: ValidatorService },
25061
25088
  { type: ConfigService },
25062
25089
  { type: PersonService },
25063
25090
  { type: ChangeDetectorRef },
25064
25091
  { type: FormBuilder },
25065
- { type: Injector },
25066
25092
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
25067
25093
  ];
25068
25094
  UsersPage.propDecorators = {
@@ -25132,5 +25158,5 @@ const ErrorCodes = {
25132
25158
  * Generated bundle index. Do not edit.
25133
25159
  */
25134
25160
 
25135
- 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, 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, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, 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, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileService, FileSizePipe, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, 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, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialChipsModule, MaterialTestingModule, MaterialTestingPage, MathAbsPipe, MenuComponent, MenuItems, MenuService, 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, ReferentialRef, ReferentialUtils, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UserEvent, UserEventFilter, 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, isControlHasInput, isEmptyArray, isInputElement, isInstanceOf, isInt, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, 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, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, SharedMatBadgeIconModule as ɵc, MatBadgeIconDirective as ɵd, isFocusableElement as ɵe, MatBadgeIconTestPage as ɵf, RegisterForm as ɵg, AccountValidatorService as ɵh, RegisterModal as ɵi, UserSettingsValidatorService as ɵj, LocalSettingsValidatorService as ɵk, AppIconComponent as ɵl };
25161
+ 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, 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, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, 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, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileService, FileSizePipe, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, 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, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialChipsModule, MaterialTestingModule, MaterialTestingPage, MathAbsPipe, MenuComponent, MenuItems, MenuService, 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, ReferentialRef, ReferentialUtils, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UserEvent, UserEventFilter, 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, isControlHasInput, isCordova, isDesktop, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isTouchUi, isWindow, 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$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, SharedMatBadgeIconModule as ɵc, MatBadgeIconDirective as ɵd, isFocusableElement as ɵe, MatBadgeIconTestPage as ɵf, RegisterForm as ɵg, AccountValidatorService as ɵh, RegisterModal as ɵi, UserSettingsValidatorService as ɵj, LocalSettingsValidatorService as ɵk, AppIconComponent as ɵl };
25136
25162
  //# sourceMappingURL=sumaris-net.ngx-components.js.map