@sumaris-net/ngx-components 0.27.15 → 0.27.19

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.
@@ -2926,6 +2926,18 @@
2926
2926
  var SharedValidators = /** @class */ (function () {
2927
2927
  function SharedValidators() {
2928
2928
  }
2929
+ SharedValidators.getDoubleRegexp = function (maxDecimals) {
2930
+ if (isNil(maxDecimals))
2931
+ return this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS.NO_LIMIT;
2932
+ if (maxDecimals < 0)
2933
+ throw new Error("Invalid maxDecimals value: " + maxDecimals);
2934
+ var regexp = this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS[maxDecimals];
2935
+ if (regexp)
2936
+ return regexp;
2937
+ // New regexp: add it to cache
2938
+ this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS[maxDecimals] = new RegExp("^[-]?[0-9]+([.,][0-9]{1," + maxDecimals + "})?$");
2939
+ return this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS[maxDecimals];
2940
+ };
2929
2941
  SharedValidators.validDate = function (control) {
2930
2942
  var value = control.value;
2931
2943
  var date = !value || moment$4.isMoment(value) ? value : moment$4(control.value, DATE_ISO_PATTERN);
@@ -2985,24 +2997,15 @@
2985
2997
  return null;
2986
2998
  };
2987
2999
  SharedValidators.double = function (opts) {
2988
- var regexpStr;
2989
- if (opts && isNotNil(opts.maxDecimals)) {
2990
- if (opts.maxDecimals < 0)
2991
- throw new Error("Invalid maxDecimals value: " + opts.maxDecimals);
2992
- regexpStr = opts.maxDecimals > 1 ? "^[-]?[0-9]+([.,][0-9]{1," + opts.maxDecimals + "})?$" : '^[-]?[0-9]+([.,][0-9])?$';
2993
- }
2994
- else {
2995
- regexpStr = '^[-]?[0-9]+([.,][0-9]*)?$';
2996
- }
2997
- var regexp = new RegExp(regexpStr);
3000
+ var regexp = this.getDoubleRegexp(opts === null || opts === void 0 ? void 0 : opts.maxDecimals);
2998
3001
  return function (control) {
2999
3002
  var value = control.value;
3000
3003
  if (Number.isNaN(value)) {
3001
3004
  //console.log("WARN: Getting a NaN value !");
3002
- value = null;
3005
+ return null;
3003
3006
  }
3004
3007
  if (isNotNil(value) && value !== '' && !regexp.test(value)) {
3005
- return { maxDecimals: true };
3008
+ return { maxDecimals: { maxDecimals: opts === null || opts === void 0 ? void 0 : opts.maxDecimals } };
3006
3009
  }
3007
3010
  return null;
3008
3011
  };
@@ -3095,6 +3098,14 @@
3095
3098
  };
3096
3099
  return SharedValidators;
3097
3100
  }());
3101
+ SharedValidators._REGEXP_CACHE = {
3102
+ DOUBLE_BY_MAX_DECIMALS: {
3103
+ NO_LIMIT: /^[-]?[0-9]+([.,][0-9]*)?$/,
3104
+ 1: /^[-]?[0-9]+([.,][0-9])?$/,
3105
+ 2: /^[-]?[0-9]+([.,][0-9]{1,2})?$/,
3106
+ 3: /^[-]?[0-9]+([.,][0-9]{1,2})?$/,
3107
+ }
3108
+ };
3098
3109
  SharedValidators.I18N_ERROR_KEYS = {
3099
3110
  required: 'ERROR.FIELD_REQUIRED',
3100
3111
  min: 'ERROR.FIELD_MIN',
@@ -3113,7 +3124,8 @@
3113
3124
  latitude: 'ERROR.FIELD_NOT_VALID_LATITUDE',
3114
3125
  longitude: 'ERROR.FIELD_NOT_VALID_LONGITUDE',
3115
3126
  pattern: 'ERROR.FIELD_NOT_VALID_PATTERN',
3116
- unique: 'ERROR.FIELD_NOT_UNIQUE'
3127
+ unique: 'ERROR.FIELD_NOT_UNIQUE',
3128
+ entity: 'ERROR.FIELD_INVALID'
3117
3129
  };
3118
3130
  // @dynamic
3119
3131
  var SharedFormGroupValidators = /** @class */ (function () {
@@ -22352,7 +22364,7 @@
22352
22364
  MenuComponent.decorators = [
22353
22365
  { type: i0.Component, args: [{
22354
22366
  selector: 'app-menu',
22355
- template: "<ion-split-pane #splitPane contentId=\"menu-content\" (swiperight)=\"onSwipeRight($event)\">\n\n <ion-menu id=\"menu\" menuId=\"left\" contentId=\"menu-content\">\n <ion-header>\n\n <mat-toolbar class=\"ion-padding\" @fadeInAnimation *ngIf=\"!isLogin\"\n style=\"height: unset; height: unset; display: block; margin: auto; text-align: center;\">\n <img *ngIf=\"logo\" src=\"{{logo}}\" [title]=\"'APP_NAME'|translate: {appName: appName}\" width=\"150px;\"/>\n <span *ngIf=\"!logo\" width=\"150px;\">{{appName}}</span>\n </mat-toolbar>\n\n <ion-toolbar @fadeInAnimation *ngIf=\"isLogin\" class=\"ion-toolbar-top\">\n <ion-grid>\n <ion-row>\n <ion-col size=\"4\">\n <button type=\"button\" mat-flat-button\n class=\"user-avatar\" [class.primary]=\"!accountAvatar\"\n [style.background-image]=\"'url('+(accountAvatar||'./assets/img/person.png')+')'\"\n [routerLink]=\"['/account']\"\n routerDirection=\"root\"\n routerLinkActive=\"ion-color-primary\"\n (click)=\"menuClose()\">\n </button>\n </ion-col>\n <ion-col size=\"8\" class=\"user-logo\">\n <img *ngIf=\"logo\" src=\"{{logo}}\" [title]=\"'APP_NAME'|translate: {appName: appName}\" width=\"108px;\"/>\n <span *ngIf=\"!logo\" width=\"108px;\">{{appName}}</span>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-no-padding\">\n\n <button mat-button type=\"button\"\n [routerLink]=\"['/account']\"\n routerDirection=\"root\"\n routerLinkActive=\"ion-color-primary\"\n (click)=\"menuClose()\">\n <ion-label color=\"primary\" class=\"ion-text-wrap ion-text-start\">\n <h3 class=\"no-margin username\">\n <b>{{accountName}}</b>\n </h3>\n <h4>{{accountEmail}}</h4>\n </ion-label>\n </button>\n\n </ion-row>\n </ion-grid>\n\n </ion-toolbar>\n </ion-header>\n\n <ion-content [class.has-user-header]=\"isLogin\">\n\n <ion-list lines=\"none\">\n <ion-menu-toggle auto-hide=\"false\"\n [class.flex-spacer]=\"item.cssClass == 'flex-spacer'\"\n *ngFor=\"let item of $items | async\">\n\n <!-- link -->\n <ion-item *ngIf=\"!loading && item.path\"\n @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}} text-1x\"\n tappable\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n routerLinkActive=\"selected\"\n [routerLinkActiveOptions]=\"{exact: (item.path === '/')}\">\n <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{item.matIcon}}</mat-icon>\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item>\n\n <!-- action -->\n <ion-item *ngIf=\"!loading && item.action\"\n @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}} text-1x\"\n tappable\n (click)=\"doAction(item.action, $event)\">\n <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{item.matIcon}}</mat-icon>\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item>\n\n <!-- divider -->\n <ion-item-divider @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}}\"\n *ngIf=\"!loading && !item.path && !item.action\">\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item-divider>\n\n </ion-menu-toggle>\n </ion-list>\n </ion-content>\n\n <ion-footer class=\"hidden-xs hidden-sm\">\n <ion-toolbar>\n\n <ion-buttons slot=\"start\">\n <ion-button mat-icon-button color=\"accent\" (click)=\"openAboutModal($event)\">\n <mat-icon slot=\"icon-only\">help_outline</mat-icon>\n </ion-button>\n </ion-buttons>\n\n <ion-title (click)=\"openAboutModal($event)\" color=\"medium\">\n {{'MENU.FOOTER_VERSION_ABOUT'| translate: {version: appVersion} }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <button mat-icon-button color=\"accent\" (click)=\"toggleSplitPane($event)\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(splitPaneOpened ? 'COMMON.BTN_HIDE_MENU' : 'COMMON.BTN_SHOW_MENU') |translate\">\n <mat-icon><span>{{splitPaneOpened ? '&#xab;' : '&#xbb;'}}</span></mat-icon>\n </button>\n </ion-buttons>\n </ion-toolbar>\n </ion-footer>\n\n </ion-menu>\n\n <ng-content></ng-content>\n\n</ion-split-pane>\n",
22367
+ template: "<ion-split-pane #splitPane contentId=\"menu-content\" (swiperight)=\"onSwipeRight($event)\">\n\n <ion-menu id=\"menu\" menuId=\"left\" contentId=\"menu-content\">\n <ion-header>\n\n <ion-toolbar @fadeInAnimation *ngIf=\"isLogin; else notLogin\" class=\"ion-toolbar-top\">\n <ion-grid>\n <ion-row>\n <ion-col size=\"4\">\n <button type=\"button\" mat-flat-button\n class=\"user-avatar\" [class.primary]=\"!accountAvatar\"\n [style.background-image]=\"'url('+(accountAvatar||'./assets/img/person.png')+')'\"\n [routerLink]=\"['/account']\"\n routerDirection=\"root\"\n routerLinkActive=\"ion-color-primary\"\n (click)=\"menuClose()\">\n </button>\n </ion-col>\n <ion-col size=\"8\" class=\"user-logo\">\n <img *ngIf=\"logo\" src=\"{{logo}}\" [title]=\"'APP_NAME'|translate: {appName: appName}\" width=\"108px;\"/>\n <span *ngIf=\"!logo\" width=\"108px;\">{{appName}}</span>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-no-padding\">\n\n <button mat-button type=\"button\"\n [routerLink]=\"['/account']\"\n routerDirection=\"root\"\n routerLinkActive=\"ion-color-primary\"\n (click)=\"menuClose()\">\n <ion-label color=\"primary\" class=\"ion-text-wrap ion-text-start\">\n <h3 class=\"no-margin username\">\n <b>{{accountName}}</b>\n </h3>\n <h4>{{accountEmail}}</h4>\n </ion-label>\n </button>\n\n </ion-row>\n </ion-grid>\n\n </ion-toolbar>\n\n <!-- User not logged -->\n <ng-template #notLogin>\n <mat-toolbar class=\"ion-padding\" @fadeInAnimation\n style=\"height: unset; display: block; margin: auto; text-align: center;\">\n <img *ngIf=\"logo\" src=\"{{logo}}\" [title]=\"'APP_NAME'|translate: {appName: appName}\" width=\"150px;\">\n <span *ngIf=\"!logo\" style=\"width: 150px\">{{appName}}</span>\n </mat-toolbar>\n </ng-template>\n </ion-header>\n\n <ion-content [class.has-user-header]=\"isLogin\">\n\n <ion-list lines=\"none\">\n <ion-menu-toggle auto-hide=\"false\"\n [class.flex-spacer]=\"item.cssClass == 'flex-spacer'\"\n *ngFor=\"let item of $items | async\">\n\n <!-- link -->\n <ion-item *ngIf=\"!loading && item.path\"\n @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}} text-1x\"\n tappable\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n routerLinkActive=\"selected\"\n [routerLinkActiveOptions]=\"{exact: (item.path === '/')}\">\n <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{item.matIcon}}</mat-icon>\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item>\n\n <!-- action -->\n <ion-item *ngIf=\"!loading && item.action\"\n @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}} text-1x\"\n tappable\n (click)=\"doAction(item.action, $event)\">\n <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{item.matIcon}}</mat-icon>\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item>\n\n <!-- divider -->\n <ion-item-divider @fadeInAnimation\n class=\"{{item.cssClass}} {{item.color}}\"\n *ngIf=\"!loading && !item.path && !item.action\">\n <ion-label translate>{{item.title}}</ion-label>\n </ion-item-divider>\n\n </ion-menu-toggle>\n </ion-list>\n </ion-content>\n\n <ion-footer class=\"hidden-xs hidden-sm\">\n <ion-toolbar>\n\n <ion-buttons slot=\"start\">\n <ion-button mat-icon-button color=\"accent\" (click)=\"openAboutModal($event)\">\n <mat-icon slot=\"icon-only\">help_outline</mat-icon>\n </ion-button>\n </ion-buttons>\n\n <ion-title (click)=\"openAboutModal($event)\" color=\"medium\">\n {{'MENU.FOOTER_VERSION_ABOUT'| translate: {version: appVersion} }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <button mat-icon-button color=\"accent\" (click)=\"toggleSplitPane($event)\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(splitPaneOpened ? 'COMMON.BTN_HIDE_MENU' : 'COMMON.BTN_SHOW_MENU') |translate\">\n <mat-icon><span>{{splitPaneOpened ? '&#xab;' : '&#xbb;'}}</span></mat-icon>\n </button>\n </ion-buttons>\n </ion-toolbar>\n </ion-footer>\n\n </ion-menu>\n\n <ng-content></ng-content>\n\n</ion-split-pane>\n",
22356
22368
  animations: [fadeInAnimation],
22357
22369
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
22358
22370
  styles: ["ion-menu{--ion-item-background:transparent;--ion-item-divider-background:transparent;--ion-item-icon-color:var(--ion-color-primary-tint);--ion-item-text-color:var(--ion-color-primary-tint);--ion-item-background-selected:var(--ion-color-secondary100);--ion-item-text-color-selected:var(--ion-color-primary);--ion-item-icon-color-selected:var(--ion-color-primary);--ion-item-text-color-disable:var(--ion-color-medium);--ion-item-icon-color-disable:var(--ion-color-medium)}ion-menu ion-header ion-text{color:var(--ion-color-primary)}ion-menu ion-header .user-avatar{background-size:cover;background-repeat:no-repeat;background-position:50%;background-color:var(--ion-color-secondary);border:1px solid var(--ion-color-primary);overflow:hidden!important;font-size:var(--avatar-size,60px)!important;line-height:var(--avatar-size,60px);height:var(--avatar-size,60px)!important;width:var(--avatar-size,60px)!important;border-radius:50%;display:inline-block}ion-menu ion-header .user-logo{text-align:right}ion-menu ion-header .user-logo img{max-width:120px;max-height:var(--avatar-size,60px);width:auto}ion-menu ion-header .username{padding-top:0;margin-top:0;margin-bottom:0;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}ion-menu ion-header button[mat-button]{padding:0;text-align:start!important;width:100%}ion-menu .scroll-content{margin-top:79px!important}ion-menu .has-user-header .scroll-content{margin-top:188px!important}ion-menu ion-content.has-profile-header{--offset-top:188px}ion-menu ion-content.no-profile-header{--offset-top:79px}ion-menu ion-content ion-list{min-height:100%;display:flex;flex-direction:column;justify-content:flex-start}ion-menu ion-content ion-list ion-menu-toggle.flex-spacer{flex:1 1 auto;display:flex;flex-direction:column;justify-content:flex-end}ion-menu ion-content ion-list ion-item.primary{--ion-item-icon-color:var(--ion-color-primary-tint);--ion-item-text-color:var(--ion-color-primary-tint)}ion-menu ion-content ion-list ion-item.secondary{--ion-item-icon-color:var(--ion-color-secondary-tint);--ion-item-text-color:var(--ion-color-secondary-tint)}ion-menu ion-content ion-list ion-item.tertiary{--ion-item-icon-color:var(--ion-color-tertiary-tint);--ion-item-text-color:var(--ion-color-tertiary-tint)}ion-menu ion-content ion-list ion-item.danger{--ion-item-icon-color:var(--ion-color-danger-tint);--ion-item-text-color:var(--ion-color-danger-tint)}ion-menu ion-content ion-list ion-item.medium{--ion-item-icon-color:var(--ion-color-medium-shade);--ion-item-text-color:var(--ion-color-medium-shade)}ion-menu ion-content ion-list ion-item.dark{--ion-item-icon-color:var(--ion-color-dark-tint);--ion-item-text-color:var(--ion-color-dark-tint)}ion-menu ion-content ion-list ion-item ion-icon,ion-menu ion-content ion-list ion-item mat-icon{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-menu ion-content ion-list ion-item ion-label,ion-menu ion-content ion-list ion-item ion-text{color:var(--ion-item-text-color)!important}ion-menu ion-content ion-list ion-item.selected{background-color:var(--ion-item-background-selected)!important;--color-hover:var(--ion-item-background-selected)!important}ion-menu ion-content ion-list ion-item.selected ion-icon,ion-menu ion-content ion-list ion-item.selected mat-icon{color:var(--ion-item-icon-color-selected)!important;fill:currentColor;stroke:currentColor}ion-menu ion-content ion-list ion-item.selected ion-label,ion-menu ion-content ion-list ion-item.selected ion-text{color:var(--ion-item-text-color-selected)!important}ion-menu ion-content ion-list ion-item.selected:hover{--color-hover:var(--ion-item-background-selected)!important;--ion-item-icon-color-selected:var(--ion-item-icon-color)!important;--ion-item-text-color-selected:var(--ion-item-text-color)!important}ion-menu ion-footer{display:block!important}ion-menu ion-footer ion-toolbar ion-title{cursor:pointer;font-size:12pt;font-weight:400;text-align:center;padding:0 8px}ion-menu ion-footer ion-toolbar ion-button{--width:40px}@media screen and (max-width:767px){ion-menu ion-footer{display:none!important;visibility:hidden!important}}@media screen and (min-width:768px){ion-menu ion-scroll{overflow-y:auto!important}ion-menu .user-avatar{font-size:var(--avatar-size,80px)!important;line-height:var(--avatar-size,80px);height:var(--avatar-size,80px)!important;width:var(--avatar-size,80px)!important}ion-menu .user-logo img{max-height:var(--avatar-size,80px)}}"]
@@ -22477,6 +22489,39 @@
22477
22489
  forward: [{ type: i0.Output }]
22478
22490
  };
22479
22491
 
22492
+ var AppIconComponent = /** @class */ (function () {
22493
+ function AppIconComponent() {
22494
+ this.icon = null;
22495
+ this.matIcon = null;
22496
+ this.matSvgIcon = null;
22497
+ this.color = null;
22498
+ }
22499
+ Object.defineProperty(AppIconComponent.prototype, "ref", {
22500
+ set: function (value) {
22501
+ this.icon = value.icon;
22502
+ this.matIcon = value.matIcon;
22503
+ this.matSvgIcon = value.matSvgIcon;
22504
+ },
22505
+ enumerable: false,
22506
+ configurable: true
22507
+ });
22508
+ ;
22509
+ return AppIconComponent;
22510
+ }());
22511
+ AppIconComponent.decorators = [
22512
+ { type: i0.Component, args: [{
22513
+ selector: 'app-icon',
22514
+ template: "<ion-icon *ngIf=\"icon; else matIconTemplate\" slot=\"icon-only\"\n [color]=\"color\"\n [name]=\"icon\"\n></ion-icon>\n<ng-template #matIconTemplate>\n <mat-icon [svgIcon]=\"matSvgIcon\"\n [style.color]=\"'var(--ion-color-'+color+')'\">{{matIcon}}</mat-icon>\n</ng-template>\n\n"
22515
+ },] }
22516
+ ];
22517
+ AppIconComponent.propDecorators = {
22518
+ icon: [{ type: i0.Input }],
22519
+ matIcon: [{ type: i0.Input }],
22520
+ matSvgIcon: [{ type: i0.Input }],
22521
+ color: [{ type: i0.Input }],
22522
+ ref: [{ type: i0.Input }]
22523
+ };
22524
+
22480
22525
  var CoreModule = /** @class */ (function () {
22481
22526
  function CoreModule() {
22482
22527
  }
@@ -22529,7 +22574,8 @@
22529
22574
  EntityMetadataComponent,
22530
22575
  FormButtonsBarComponent,
22531
22576
  AppPropertiesForm,
22532
- AppListForm
22577
+ AppListForm,
22578
+ AppIconComponent
22533
22579
  ],
22534
22580
  exports: [
22535
22581
  SharedModule,
@@ -22555,6 +22601,7 @@
22555
22601
  AppListForm,
22556
22602
  AppInstallUpgradeCard,
22557
22603
  DepartmentToStringPipe,
22604
+ AppIconComponent
22558
22605
  ]
22559
22606
  },] }
22560
22607
  ];
@@ -28334,6 +28381,7 @@
28334
28381
  exports["ɵi"] = RegisterModal;
28335
28382
  exports["ɵj"] = UserSettingsValidatorService;
28336
28383
  exports["ɵk"] = LocalSettingsValidatorService;
28384
+ exports["ɵl"] = AppIconComponent;
28337
28385
 
28338
28386
  Object.defineProperty(exports, '__esModule', { value: true });
28339
28387