mmhglobal-dynamicform 2.36.2 → 2.36.5

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.
@@ -832,7 +832,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
832
832
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AlertService }, { type: i2.AuthService }, { type: i2.FieldService }, { type: i2.ResourceApiService }, { type: i2.ComponentErrorHandlerService }, { type: i2.ToastService }, { type: i3.ModalService }, { type: i2.WebApiService }, { type: i2.SignalrService }, { type: i2.ZCoreService }]; } });
833
833
 
834
834
  class MainService {
835
- constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandlerService, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalrService, dialogService, oauth2Service, toastService, authService) {
835
+ constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandlerService, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalrService, dialogService, oauth2Service, toastService, authService, menuService) {
836
836
  this.router = router;
837
837
  this.activatedRoute = activatedRoute;
838
838
  this.modalCtrl = modalCtrl;
@@ -853,6 +853,7 @@ class MainService {
853
853
  this.oauth2Service = oauth2Service;
854
854
  this.toastService = toastService;
855
855
  this.authService = authService;
856
+ this.menuService = menuService;
856
857
  this.backNavigationPath = [];
857
858
  this.routeParam = [];
858
859
  this.currentUrl = '';
@@ -899,7 +900,7 @@ class MainService {
899
900
  this.previousUrl = this.currentUrl || window.location.pathname;
900
901
  this.currentUrl = event.url;
901
902
  const triggerType = this.previousUrl === this.currentUrl ? TriggerFromType.refreshStart : TriggerFromType.navigateStart;
902
- this.updateAppMonPerfomance(triggerType, this.previousUrl, true).subscribe();
903
+ this.updateAppMonPerformance(triggerType, this.previousUrl, true).subscribe();
903
904
  this.dismissAllOverlays();
904
905
  if (this.getStartupPage() === event.url) {
905
906
  this.resetRouteParam();
@@ -908,27 +909,45 @@ class MainService {
908
909
  handleNavigationEnd(event) {
909
910
  const duration = performance.now() - this.navigationStartTime;
910
911
  const triggerType = this.previousUrl === this.currentUrl ? TriggerFromType.refreshEnd : TriggerFromType.navigateEnd;
911
- this.updateAppMonPerfomance(triggerType, event.urlAfterRedirects, true, duration).subscribe();
912
+ this.updateAppMonPerformance(triggerType, event.urlAfterRedirects, true, duration).subscribe();
912
913
  this.currentUrl = event.urlAfterRedirects;
913
914
  console.log(event);
914
915
  }
915
916
  handleNavigationError(event) {
916
917
  const duration = performance.now() - this.navigationStartTime;
917
- this.updateAppMonPerfomance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
918
+ this.updateAppMonPerformance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
918
919
  console.log(event.error);
919
920
  this.removeLastNavigateRecord();
920
921
  }
921
- updateAppMonPerfomance(triggerType, url, isSuccess, duration) {
922
+ updateAppMonPerformance(triggerType, url, isSuccess, duration) {
923
+ var _a;
924
+ // Initialize appmonDomainUrl if missing
922
925
  if (!this.resourceApiService.appmonDomainUrl) {
923
- this.resourceApiService.appmonDomainUrl = sessionStorage.getItem('AppmonUrl');
926
+ this.resourceApiService.appmonDomainUrl = sessionStorage.getItem('AppmonDomainUrl') || '';
924
927
  }
925
- const date = new Date();
926
- const pad = (n) => n.toString().padStart(2, '0');
927
- const timestamp = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${date.getMilliseconds().toString().padStart(7, '0')}`;
928
- const currentDomain = window.location.origin; // Extract the current domain
928
+ // Check for required dependencies
929
929
  if (!this.authService.e1Token || !this.resourceApiService.appmonDomainUrl) {
930
930
  return of({});
931
931
  }
932
+ const getCurrentTimestamp = () => {
933
+ const date = new Date();
934
+ const pad = (n) => n.toString().padStart(2, '0');
935
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${date.getMilliseconds().toString().padStart(7, '0')}`;
936
+ };
937
+ const timestamp = getCurrentTimestamp();
938
+ const currentDomain = window.location.origin;
939
+ // Determine menu name
940
+ const LOGIN_PAGE = 'LoginPage';
941
+ const HOME_PAGE = 'HomePage';
942
+ const AUTH_PATH = '/auth';
943
+ let menuName = sessionStorage.getItem('menuName') || null;
944
+ if (window.location.pathname === AUTH_PATH) {
945
+ menuName = LOGIN_PAGE;
946
+ }
947
+ else if (window.location.pathname === this.environment.startUpPage) {
948
+ menuName = HOME_PAGE;
949
+ }
950
+ // Build the request payload
932
951
  const params = {
933
952
  Url: `${currentDomain}${url}`,
934
953
  IsAuthenticated: true,
@@ -936,7 +955,7 @@ class MainService {
936
955
  Duration: duration !== null && duration !== void 0 ? duration : null,
937
956
  RequestMethod: 'POST',
938
957
  UserName: this.authService.userId,
939
- UserId: this.authService.e1Token.userName,
958
+ UserId: ((_a = this.authService.e1Token) === null || _a === void 0 ? void 0 : _a.userName) || '',
940
959
  Success: isSuccess,
941
960
  Environment: 'UI',
942
961
  ProjectCode: this.environment.projectCodes[0],
@@ -944,10 +963,13 @@ class MainService {
944
963
  ComponentCode: null,
945
964
  EventId: null,
946
965
  EventType: triggerType,
947
- SessionId: sessionStorage.getItem('sessionTabId')
966
+ SessionId: sessionStorage.getItem('sessionTabId'),
967
+ MenuName: menuName,
948
968
  };
949
- // call the wfs webapi
950
- return this.webApiService.httpPost$(`${this.resourceApiService.appmonDomainUrl}api/ApiSummaryInfos/`, params);
969
+ // API Endpoint
970
+ const apiEndpoint = `${this.resourceApiService.appmonDomainUrl}api/ApiSummaryInfos/`;
971
+ // Call the web API and handle errors
972
+ return this.webApiService.httpPost$(apiEndpoint, params);
951
973
  }
952
974
  dialogOpen(options) {
953
975
  return this.dialogService.open(options);
@@ -1204,6 +1226,46 @@ class MainService {
1204
1226
  }
1205
1227
  return false;
1206
1228
  }
1229
+ menuOnClick(item) {
1230
+ const { AppClientPath: appClientPath, URL: pathName, Name: name } = item;
1231
+ const startupPage = this.zcoreService.getEnvironment().startUpPage.toLowerCase();
1232
+ const LAUNCHER = 'launcher';
1233
+ // Save menu name to sessionStorage
1234
+ this.menuService.setMenuName(name);
1235
+ // Handle app client path navigation
1236
+ if (appClientPath && startupPage === LAUNCHER) {
1237
+ return this.handleAppClientNavigation(pathName, appClientPath);
1238
+ }
1239
+ // Determine navigation path
1240
+ const navigationPath = this.getNavigationPath(startupPage, pathName);
1241
+ // Navigate to the determined path
1242
+ return this.navigateToPath(navigationPath, pathName);
1243
+ }
1244
+ handleAppClientNavigation(pathName, appClientPath) {
1245
+ try {
1246
+ ZComponentHelper.openAppClientPath(pathName, appClientPath, this.authService);
1247
+ return false;
1248
+ }
1249
+ catch (error) {
1250
+ console.warn(`Failed to open App Client Path for ${pathName}:`, error);
1251
+ return false;
1252
+ }
1253
+ }
1254
+ getNavigationPath(startupPage, pathName) {
1255
+ const MENU_PAGE_PREFIX = '_';
1256
+ return startupPage.startsWith(MENU_PAGE_PREFIX) ? [startupPage] : [pathName];
1257
+ }
1258
+ navigateToPath(navigationPath, pathName) {
1259
+ try {
1260
+ this.setNavigationParams(navigationPath);
1261
+ this.router.navigate([pathName]);
1262
+ return true;
1263
+ }
1264
+ catch (error) {
1265
+ console.warn(`Navigation to ${pathName} failed:`, error);
1266
+ return false;
1267
+ }
1268
+ }
1207
1269
  navigateFromMenu(pageName) {
1208
1270
  const { startUpPage } = this.environment;
1209
1271
  this.setRouteParam([`${startUpPage}`]);
@@ -2055,14 +2117,14 @@ class MainService {
2055
2117
  }
2056
2118
  }
2057
2119
  }
2058
- MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2$1.ModalController }, { token: i2$1.NavController }, { token: i2.AlertService }, { token: i2.CacheService }, { token: i2.FieldService }, { token: i2.ResourceApiService }, { token: i2.ComponentErrorHandlerService }, { token: i2.WebApiService }, { token: i2.ZCoreService }, { token: i3.ModalService }, { token: i2.StorageSessionService }, { token: ZComponentDebugService }, { token: i2.TranslationService }, { token: i2.SignalrService }, { token: i6.DialogService }, { token: i2.OAuth2Service }, { token: i2.ToastService }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
2120
+ MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2$1.ModalController }, { token: i2$1.NavController }, { token: i2.AlertService }, { token: i2.CacheService }, { token: i2.FieldService }, { token: i2.ResourceApiService }, { token: i2.ComponentErrorHandlerService }, { token: i2.WebApiService }, { token: i2.ZCoreService }, { token: i3.ModalService }, { token: i2.StorageSessionService }, { token: ZComponentDebugService }, { token: i2.TranslationService }, { token: i2.SignalrService }, { token: i6.DialogService }, { token: i2.OAuth2Service }, { token: i2.ToastService }, { token: i2.AuthService }, { token: i2.MenuService }], target: i0.ɵɵFactoryTarget.Injectable });
2059
2121
  MainService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, providedIn: 'root' });
2060
2122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, decorators: [{
2061
2123
  type: Injectable,
2062
2124
  args: [{
2063
2125
  providedIn: 'root',
2064
2126
  }]
2065
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2$1.ModalController }, { type: i2$1.NavController }, { type: i2.AlertService }, { type: i2.CacheService }, { type: i2.FieldService }, { type: i2.ResourceApiService }, { type: i2.ComponentErrorHandlerService }, { type: i2.WebApiService }, { type: i2.ZCoreService }, { type: i3.ModalService }, { type: i2.StorageSessionService }, { type: ZComponentDebugService }, { type: i2.TranslationService }, { type: i2.SignalrService }, { type: i6.DialogService }, { type: i2.OAuth2Service }, { type: i2.ToastService }, { type: i2.AuthService }]; } });
2127
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2$1.ModalController }, { type: i2$1.NavController }, { type: i2.AlertService }, { type: i2.CacheService }, { type: i2.FieldService }, { type: i2.ResourceApiService }, { type: i2.ComponentErrorHandlerService }, { type: i2.WebApiService }, { type: i2.ZCoreService }, { type: i3.ModalService }, { type: i2.StorageSessionService }, { type: ZComponentDebugService }, { type: i2.TranslationService }, { type: i2.SignalrService }, { type: i6.DialogService }, { type: i2.OAuth2Service }, { type: i2.ToastService }, { type: i2.AuthService }, { type: i2.MenuService }]; } });
2066
2128
  function refreshGrid(group) {
2067
2129
  const zgridControl = group["gridOptions"];
2068
2130
  if (zgridControl) {
@@ -3205,7 +3267,9 @@ class ZGridBindingDirective extends DataBindingDirective {
3205
3267
  dataSet.forEach(data => {
3206
3268
  ignoreTimeZoneColumns.forEach(col => {
3207
3269
  // Adjust datetime based on the timezone ignoring setting
3208
- data[col.Value] = this.componentService.localizeDateTimeByIgnoringTimeZone(data[col.Value], col);
3270
+ if (data[col.Value]) {
3271
+ data[col.Value] = this.componentService.localizeDateTimeByIgnoringTimeZone(data[col.Value], col);
3272
+ }
3209
3273
  });
3210
3274
  });
3211
3275
  }
@@ -4481,10 +4545,10 @@ class FieldBase {
4481
4545
  this.componentProperties.isRequired = status;
4482
4546
  ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
4483
4547
  if (this.data.Type === 'ztexteditor') {
4484
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
4548
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
4485
4549
  }
4486
4550
  else {
4487
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
4551
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
4488
4552
  }
4489
4553
  };
4490
4554
  }
@@ -5369,32 +5433,25 @@ class UiappmenucontentComponent {
5369
5433
  this.authService = authService;
5370
5434
  this.zcoreService = zcoreService;
5371
5435
  this.mainService = mainService;
5436
+ this.MENU_TYPE_DROPDOWN_SUBMENU = 'dropdown-submenu';
5372
5437
  }
5373
5438
  ngOnInit() {
5374
5439
  }
5375
5440
  getDivClass(item) {
5376
- return (item.Type === 'dropdown-submenu' ? 'flex-show' : 'col-xs-4 col-sm-4 col-md-3 col-xl-2') + " menu-col";
5441
+ if (!item || !item.Type)
5442
+ return 'col-xs-4 col-sm-4 col-md-3 col-xl-2 menu-col';
5443
+ return (item.Type === this.MENU_TYPE_DROPDOWN_SUBMENU ? 'flex-show' : 'col-xs-4 col-sm-4 col-md-3 col-xl-2') + ' menu-col';
5377
5444
  }
5378
5445
  getMenuList(item) {
5379
- return item.Type === 'dropdown-submenu' ? this.menuService.getMenuFolder(item.URL) : null;
5446
+ if (!item || item.Type !== this.MENU_TYPE_DROPDOWN_SUBMENU)
5447
+ return null;
5448
+ return this.menuService.getMenuFolder(item.URL);
5380
5449
  }
5381
- menuOnClick(pathName, appClientPath) {
5382
- const startupPage = this.zcoreService.getEnvironment().startUpPage;
5383
- if (appClientPath && startupPage.toLocaleLowerCase() == 'launcher') {
5384
- ZComponentHelper.openAppClientPath(pathName, appClientPath, this.authService);
5385
- return false;
5386
- }
5387
- else {
5388
- if (startupPage.indexOf('_', 0) == 0) {
5389
- // menu page
5390
- this.mainService.setNavigationParams([startupPage]);
5391
- }
5392
- else {
5393
- // home page
5394
- this.mainService.setNavigationParams([pathName]);
5395
- }
5396
- this.router.navigate([pathName]);
5397
- }
5450
+ trackByFn(index, item) {
5451
+ return item.URL || index.toString(); // Unique identifier or fallback to index
5452
+ }
5453
+ menuOnClick(item) {
5454
+ return this.mainService.menuOnClick(item);
5398
5455
  }
5399
5456
  setMapInput(key, value) {
5400
5457
  const mapInput = document.createElement('input');
@@ -5405,10 +5462,10 @@ class UiappmenucontentComponent {
5405
5462
  }
5406
5463
  }
5407
5464
  UiappmenucontentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: UiappmenucontentComponent, deps: [{ token: i1.Router }, { token: i2.MenuService }, { token: i2.AuthService }, { token: i2.ZCoreService }, { token: MainService }], target: i0.ɵɵFactoryTarget.Component });
5408
- UiappmenucontentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: UiappmenucontentComponent, selector: "app-uiappmenucontent", inputs: { items: "items" }, ngImport: i0, template: "<ion-grid>\r\n <ion-row>\r\n <ion-col [ngClass]=\"getDivClass(item)\" *ngFor=\"let item of items; index as i\">\r\n <div *ngIf=\"item.Type !== 'dropdown-submenu'\" class=\"menu-btn ion-activatable ripple-parent\"\r\n (click)=\"menuOnClick(item.URL, item.AppClientPath)\">\r\n <ion-label class=\"menu-btn-label menu-btn-icon\">\r\n <fa-icon class=\"menu-icon\" [icon]=\"['fas', item.Icon ]\" [inverse]=\"true\"></fa-icon>\r\n <ion-badge color=\"danger\" class=\"pending-counter\"\r\n *ngIf=\"item['PendingCounter'] && item['PendingCounter'] > 0\">\r\n {{item['PendingCounter']}}\r\n </ion-badge>\r\n </ion-label>\r\n <ion-label class=\"menu-btn-label-text\">{{item.Label}}</ion-label>\r\n <ion-label *ngIf=\"item.Description\" class=\"menu-btn-label-text menu-btn-label-text-desc\">\r\n {{item.Description}}\r\n </ion-label>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </div>\r\n\r\n <kendo-card *ngIf=\"item.Type === 'dropdown-submenu'\">\r\n <kendo-card-header class=\"k-hstack\">\r\n <ion-label class=\"card-title\" kendoCardTitle>{{item.Label}}</ion-label>\r\n </kendo-card-header>\r\n <kendo-card-body>\r\n <div>\r\n <app-uiappmenucontent [items]=\"getMenuList(item)\"></app-uiappmenucontent>\r\n </div>\r\n </kendo-card-body>\r\n </kendo-card>\r\n\r\n <!-- <kendo-panelbar class=\"menu-panel\" *ngIf=\"item.Type === 'dropdown-submenu'\" keepItemContent=\"true\">\r\n <kendo-panelbar-item [expanded]=\"true\">\r\n <ng-template kendoPanelBarItemTitle>\r\n <span *ngIf=\"item.Icon\">\r\n <fa-icon [icon]=\"item.Icon\" class=\"zcard-header-icon\"></fa-icon>\r\n </span>\r\n <span *ngIf=\"!item.Icon\">\r\n <i class=\"fas fa-folder\" style=\"color: #000000\"></i>\r\n </span>\r\n <ion-label class=\"zcard-header-title\">{{item.Label}}</ion-label>\r\n </ng-template>\r\n <ng-template kendoPanelBarContent class=\"menu-content-temp\">\r\n <app-uiappmenucontent [items]=\"getMenuList(item)\"></app-uiappmenucontent>\r\n </ng-template>\r\n </kendo-panelbar-item>\r\n </kendo-panelbar> -->\r\n </ion-col>\r\n </ion-row>\r\n</ion-grid>\r\n", styles: ["ion-grid{max-width:2000px;margin-top:10px}:host ::ng-deep kendo-card{width:95%!important;margin:auto auto 10px;border-radius:var(--ion-container-border-radius);border-left:5px solid var(--ion-color-primary)}:host ::ng-deep kendo-card .k-card-body{padding-top:0}.menu-col{padding:10px}.menu-btn{margin:0;padding:0;border:0px;display:flex;flex-flow:column;justify-content:center;align-items:stretch;background-color:#fff;cursor:pointer;border-radius:5px;box-shadow:1px 1px 4px #797979;min-width:180px;max-width:250px;min-height:120px;max-height:120px;color:#fff;background:var(--ion-color-primary)}.menu-btn:hover{box-shadow:0 0 2px 2px var(--ion-color-secondary)}.menu-btn:hover .menu-btn-label-text-desc{bottom:0;transition:.5s ease bottom;width:100%}.menu-btn-label-text{text-align:center;font-size:16px;font-weight:600;padding:10px 5px}.menu-btn-label-text-desc{bottom:-100%;transition:.5s ease bottom;display:block;position:absolute;color:#000;font-size:16px;background-color:#fff;padding:8px 10px;border:1px solid #797979;border-radius:5px;text-shadow:0px 0px black;width:100%;text-align:left;font-size:14px;font-weight:500}.ripple-parent{position:relative;overflow:hidden}.menu-btn-label{text-align:center;font-size:15px}.menu-icon{zoom:3;position:relative;top:2px}.menu-btn-icon{background-size:100%}.pending-counter{background-color:#ff243a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;text-overflow:ellipsis;top:12px;display:inline-block;position:absolute;text-align:center;font-size:1.4em;right:32%}\n"], components: [{ type: i2$1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { type: i2$1.IonRow, selector: "ion-row" }, { type: i2$1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { type: i2$1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i2$1.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { type: i2$1.IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { type: i2$5.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { type: i2$5.CardHeaderComponent, selector: "kendo-card-header" }, { type: i2$5.CardBodyComponent, selector: "kendo-card-body" }, { type: UiappmenucontentComponent, selector: "app-uiappmenucontent", inputs: ["items"] }], directives: [{ type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$5.CardTitleDirective, selector: "[kendoCardTitle]" }] });
5465
+ UiappmenucontentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: UiappmenucontentComponent, selector: "app-uiappmenucontent", inputs: { items: "items" }, ngImport: i0, template: "<ion-grid>\r\n <ion-row>\r\n <ion-col\r\n [ngClass]=\"getDivClass(item)\"\r\n *ngFor=\"let item of items; index as i; trackBy: trackByFn\"\r\n >\r\n\r\n <!-- Regular Menu Item (non-submenu) -->\r\n <div\r\n *ngIf=\"item.Type !== MENU_TYPE_DROPDOWN_SUBMENU\"\r\n class=\"menu-btn ion-activatable ripple-parent\"\r\n (click)=\"menuOnClick(item)\">\r\n <ion-label class=\"menu-btn-label menu-btn-icon\">\r\n <fa-icon\r\n class=\"menu-icon\"\r\n [icon]=\"['fas', item.Icon]\"\r\n [inverse]=\"true\"\r\n ></fa-icon>\r\n\r\n <!-- 1) Spinner if loading -->\r\n <ion-badge \r\n class=\"pending-counter\"\r\n *ngIf=\"item.counterLoading\">\r\n <ion-spinner name=\"bubbles\"></ion-spinner>\r\n </ion-badge>\r\n\r\n <!-- 2) Numeric badge if loaded & > 0 -->\r\n <ion-badge\r\n class=\"pending-counter\"\r\n *ngIf=\"!item.counterLoading && item.PendingCounter && item.PendingCounter > 0\">\r\n {{ item.PendingCounter }}\r\n </ion-badge>\r\n </ion-label>\r\n\r\n <ion-label class=\"menu-btn-label-text\">\r\n {{ item.Label }}\r\n </ion-label>\r\n\r\n <ion-label\r\n *ngIf=\"item.Description\"\r\n class=\"menu-btn-label-text menu-btn-label-text-desc\"\r\n >\r\n {{ item.Description }}\r\n </ion-label>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </div>\r\n\r\n <!-- Dropdown Submenu -->\r\n <kendo-card *ngIf=\"item.Type === MENU_TYPE_DROPDOWN_SUBMENU\">\r\n <kendo-card-header class=\"k-hstack\">\r\n <ion-label class=\"card-title\" kendoCardTitle>\r\n {{ item.Label }}\r\n </ion-label>\r\n </kendo-card-header>\r\n <kendo-card-body>\r\n <div>\r\n <app-uiappmenucontent [items]=\"getMenuList(item) || []\"></app-uiappmenucontent>\r\n </div>\r\n </kendo-card-body>\r\n </kendo-card>\r\n </ion-col>\r\n </ion-row>\r\n</ion-grid>\r\n", styles: ["ion-grid{max-width:2000px;margin-top:10px}:host ::ng-deep kendo-card{width:95%!important;margin:auto auto 10px;border-radius:var(--ion-container-border-radius);border-left:5px solid var(--ion-color-primary)}:host ::ng-deep kendo-card .k-card-body{padding-top:0}.menu-col{padding:10px}.menu-btn{margin:0;padding:0;border:0px;display:flex;flex-flow:column;align-items:stretch;background-color:#fff;cursor:pointer;border-radius:5px;box-shadow:1px 1px 4px #797979;min-width:180px;max-width:250px;min-height:123px;max-height:123px;color:#fff;background:var(--ion-color-primary)}.menu-btn:hover{box-shadow:0 0 2px 2px var(--ion-color-secondary)}.menu-btn:hover .menu-btn-label-text-desc{bottom:0;transition:.5s ease bottom;width:100%}.menu-btn-label-text{text-align:center;font-size:16px;font-weight:600;padding:10px 5px}.menu-btn-label-text-desc{bottom:-100%;transition:.5s ease bottom;display:block;position:absolute;color:#000;font-size:16px;background-color:#fff;padding:8px 10px;border:1px solid #797979;border-radius:5px;text-shadow:0px 0px black;width:100%;text-align:left;font-size:14px;font-weight:500}.ripple-parent{position:relative;overflow:hidden}.menu-btn-label{text-align:center;font-size:15px}.menu-icon{zoom:3;position:relative;top:2px}.menu-btn-icon{position:relative;background-size:100%;text-align:center;font-size:15px;top:.4em}.pending-counter{position:absolute;top:.4em;right:.4em;background-color:#ff243a;color:#fff;border-radius:1em;min-width:2.5em;max-width:6em;height:1.5em;display:inline-flex;align-items:center;justify-content:center;text-align:center;padding:0 .5em;box-sizing:border-box;font-size:1.2rem;line-height:1.1}\n"], components: [{ type: i2$1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { type: i2$1.IonRow, selector: "ion-row" }, { type: i2$1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { type: i2$1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i2$1.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { type: i2$1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { type: i2$1.IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { type: i2$5.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { type: i2$5.CardHeaderComponent, selector: "kendo-card-header" }, { type: i2$5.CardBodyComponent, selector: "kendo-card-body" }, { type: UiappmenucontentComponent, selector: "app-uiappmenucontent", inputs: ["items"] }], directives: [{ type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$5.CardTitleDirective, selector: "[kendoCardTitle]" }] });
5409
5466
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: UiappmenucontentComponent, decorators: [{
5410
5467
  type: Component,
5411
- args: [{ selector: 'app-uiappmenucontent', template: "<ion-grid>\r\n <ion-row>\r\n <ion-col [ngClass]=\"getDivClass(item)\" *ngFor=\"let item of items; index as i\">\r\n <div *ngIf=\"item.Type !== 'dropdown-submenu'\" class=\"menu-btn ion-activatable ripple-parent\"\r\n (click)=\"menuOnClick(item.URL, item.AppClientPath)\">\r\n <ion-label class=\"menu-btn-label menu-btn-icon\">\r\n <fa-icon class=\"menu-icon\" [icon]=\"['fas', item.Icon ]\" [inverse]=\"true\"></fa-icon>\r\n <ion-badge color=\"danger\" class=\"pending-counter\"\r\n *ngIf=\"item['PendingCounter'] && item['PendingCounter'] > 0\">\r\n {{item['PendingCounter']}}\r\n </ion-badge>\r\n </ion-label>\r\n <ion-label class=\"menu-btn-label-text\">{{item.Label}}</ion-label>\r\n <ion-label *ngIf=\"item.Description\" class=\"menu-btn-label-text menu-btn-label-text-desc\">\r\n {{item.Description}}\r\n </ion-label>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </div>\r\n\r\n <kendo-card *ngIf=\"item.Type === 'dropdown-submenu'\">\r\n <kendo-card-header class=\"k-hstack\">\r\n <ion-label class=\"card-title\" kendoCardTitle>{{item.Label}}</ion-label>\r\n </kendo-card-header>\r\n <kendo-card-body>\r\n <div>\r\n <app-uiappmenucontent [items]=\"getMenuList(item)\"></app-uiappmenucontent>\r\n </div>\r\n </kendo-card-body>\r\n </kendo-card>\r\n\r\n <!-- <kendo-panelbar class=\"menu-panel\" *ngIf=\"item.Type === 'dropdown-submenu'\" keepItemContent=\"true\">\r\n <kendo-panelbar-item [expanded]=\"true\">\r\n <ng-template kendoPanelBarItemTitle>\r\n <span *ngIf=\"item.Icon\">\r\n <fa-icon [icon]=\"item.Icon\" class=\"zcard-header-icon\"></fa-icon>\r\n </span>\r\n <span *ngIf=\"!item.Icon\">\r\n <i class=\"fas fa-folder\" style=\"color: #000000\"></i>\r\n </span>\r\n <ion-label class=\"zcard-header-title\">{{item.Label}}</ion-label>\r\n </ng-template>\r\n <ng-template kendoPanelBarContent class=\"menu-content-temp\">\r\n <app-uiappmenucontent [items]=\"getMenuList(item)\"></app-uiappmenucontent>\r\n </ng-template>\r\n </kendo-panelbar-item>\r\n </kendo-panelbar> -->\r\n </ion-col>\r\n </ion-row>\r\n</ion-grid>\r\n", styles: ["ion-grid{max-width:2000px;margin-top:10px}:host ::ng-deep kendo-card{width:95%!important;margin:auto auto 10px;border-radius:var(--ion-container-border-radius);border-left:5px solid var(--ion-color-primary)}:host ::ng-deep kendo-card .k-card-body{padding-top:0}.menu-col{padding:10px}.menu-btn{margin:0;padding:0;border:0px;display:flex;flex-flow:column;justify-content:center;align-items:stretch;background-color:#fff;cursor:pointer;border-radius:5px;box-shadow:1px 1px 4px #797979;min-width:180px;max-width:250px;min-height:120px;max-height:120px;color:#fff;background:var(--ion-color-primary)}.menu-btn:hover{box-shadow:0 0 2px 2px var(--ion-color-secondary)}.menu-btn:hover .menu-btn-label-text-desc{bottom:0;transition:.5s ease bottom;width:100%}.menu-btn-label-text{text-align:center;font-size:16px;font-weight:600;padding:10px 5px}.menu-btn-label-text-desc{bottom:-100%;transition:.5s ease bottom;display:block;position:absolute;color:#000;font-size:16px;background-color:#fff;padding:8px 10px;border:1px solid #797979;border-radius:5px;text-shadow:0px 0px black;width:100%;text-align:left;font-size:14px;font-weight:500}.ripple-parent{position:relative;overflow:hidden}.menu-btn-label{text-align:center;font-size:15px}.menu-icon{zoom:3;position:relative;top:2px}.menu-btn-icon{background-size:100%}.pending-counter{background-color:#ff243a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;text-overflow:ellipsis;top:12px;display:inline-block;position:absolute;text-align:center;font-size:1.4em;right:32%}\n"] }]
5468
+ args: [{ selector: 'app-uiappmenucontent', template: "<ion-grid>\r\n <ion-row>\r\n <ion-col\r\n [ngClass]=\"getDivClass(item)\"\r\n *ngFor=\"let item of items; index as i; trackBy: trackByFn\"\r\n >\r\n\r\n <!-- Regular Menu Item (non-submenu) -->\r\n <div\r\n *ngIf=\"item.Type !== MENU_TYPE_DROPDOWN_SUBMENU\"\r\n class=\"menu-btn ion-activatable ripple-parent\"\r\n (click)=\"menuOnClick(item)\">\r\n <ion-label class=\"menu-btn-label menu-btn-icon\">\r\n <fa-icon\r\n class=\"menu-icon\"\r\n [icon]=\"['fas', item.Icon]\"\r\n [inverse]=\"true\"\r\n ></fa-icon>\r\n\r\n <!-- 1) Spinner if loading -->\r\n <ion-badge \r\n class=\"pending-counter\"\r\n *ngIf=\"item.counterLoading\">\r\n <ion-spinner name=\"bubbles\"></ion-spinner>\r\n </ion-badge>\r\n\r\n <!-- 2) Numeric badge if loaded & > 0 -->\r\n <ion-badge\r\n class=\"pending-counter\"\r\n *ngIf=\"!item.counterLoading && item.PendingCounter && item.PendingCounter > 0\">\r\n {{ item.PendingCounter }}\r\n </ion-badge>\r\n </ion-label>\r\n\r\n <ion-label class=\"menu-btn-label-text\">\r\n {{ item.Label }}\r\n </ion-label>\r\n\r\n <ion-label\r\n *ngIf=\"item.Description\"\r\n class=\"menu-btn-label-text menu-btn-label-text-desc\"\r\n >\r\n {{ item.Description }}\r\n </ion-label>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </div>\r\n\r\n <!-- Dropdown Submenu -->\r\n <kendo-card *ngIf=\"item.Type === MENU_TYPE_DROPDOWN_SUBMENU\">\r\n <kendo-card-header class=\"k-hstack\">\r\n <ion-label class=\"card-title\" kendoCardTitle>\r\n {{ item.Label }}\r\n </ion-label>\r\n </kendo-card-header>\r\n <kendo-card-body>\r\n <div>\r\n <app-uiappmenucontent [items]=\"getMenuList(item) || []\"></app-uiappmenucontent>\r\n </div>\r\n </kendo-card-body>\r\n </kendo-card>\r\n </ion-col>\r\n </ion-row>\r\n</ion-grid>\r\n", styles: ["ion-grid{max-width:2000px;margin-top:10px}:host ::ng-deep kendo-card{width:95%!important;margin:auto auto 10px;border-radius:var(--ion-container-border-radius);border-left:5px solid var(--ion-color-primary)}:host ::ng-deep kendo-card .k-card-body{padding-top:0}.menu-col{padding:10px}.menu-btn{margin:0;padding:0;border:0px;display:flex;flex-flow:column;align-items:stretch;background-color:#fff;cursor:pointer;border-radius:5px;box-shadow:1px 1px 4px #797979;min-width:180px;max-width:250px;min-height:123px;max-height:123px;color:#fff;background:var(--ion-color-primary)}.menu-btn:hover{box-shadow:0 0 2px 2px var(--ion-color-secondary)}.menu-btn:hover .menu-btn-label-text-desc{bottom:0;transition:.5s ease bottom;width:100%}.menu-btn-label-text{text-align:center;font-size:16px;font-weight:600;padding:10px 5px}.menu-btn-label-text-desc{bottom:-100%;transition:.5s ease bottom;display:block;position:absolute;color:#000;font-size:16px;background-color:#fff;padding:8px 10px;border:1px solid #797979;border-radius:5px;text-shadow:0px 0px black;width:100%;text-align:left;font-size:14px;font-weight:500}.ripple-parent{position:relative;overflow:hidden}.menu-btn-label{text-align:center;font-size:15px}.menu-icon{zoom:3;position:relative;top:2px}.menu-btn-icon{position:relative;background-size:100%;text-align:center;font-size:15px;top:.4em}.pending-counter{position:absolute;top:.4em;right:.4em;background-color:#ff243a;color:#fff;border-radius:1em;min-width:2.5em;max-width:6em;height:1.5em;display:inline-flex;align-items:center;justify-content:center;text-align:center;padding:0 .5em;box-sizing:border-box;font-size:1.2rem;line-height:1.1}\n"] }]
5412
5469
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MenuService }, { type: i2.AuthService }, { type: i2.ZCoreService }, { type: MainService }]; }, propDecorators: { items: [{
5413
5470
  type: Input
5414
5471
  }] } });
@@ -8597,11 +8654,8 @@ class ZtextareaComponent extends InputFieldBase {
8597
8654
  }
8598
8655
  setCharCounterDisplayStr() {
8599
8656
  let characterCount = 0;
8600
- if (!!this.data.MinLengthIgnoreSpace) {
8601
- characterCount = ZComponentHelper.getValueWithoutSpaces(this.group.zModel[this.data.Value]).length;
8602
- }
8603
- else {
8604
- characterCount = ZComponentHelper.getValueWithoutContinuousSpaces(this.group.zModel[this.data.Value]).length;
8657
+ if (this.group.zModel && this.group.zModel[this.data.Value]) {
8658
+ characterCount = this.group.zModel[this.data.Value].length;
8605
8659
  }
8606
8660
  this.charCounterDisplayStr = `${characterCount} ${this.data.MaxLength ? (' / ' + this.data.MaxLength) : ''}`;
8607
8661
  }
@@ -10267,10 +10321,10 @@ class ZgridComponent extends DataListingFieldBase {
10267
10321
  if (col.IsRequired) {
10268
10322
  validators.push(Validators.required);
10269
10323
  if (col.Type === 'ztexteditor') {
10270
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
10324
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
10271
10325
  }
10272
10326
  else {
10273
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
10327
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
10274
10328
  }
10275
10329
  }
10276
10330
  if (col.ValidatorPattern) {
@@ -10340,10 +10394,10 @@ class ZgridComponent extends DataListingFieldBase {
10340
10394
  if (col.IsRequired) {
10341
10395
  validators.push(Validators.required);
10342
10396
  if (col.Type === 'ztexteditor') {
10343
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
10397
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
10344
10398
  }
10345
10399
  else {
10346
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
10400
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
10347
10401
  }
10348
10402
  }
10349
10403
  if (col.ValidatorPattern) {
@@ -12879,10 +12933,10 @@ class ZudfComponent extends ContainerFieldBase {
12879
12933
  this.componentProperties.isRequired = status;
12880
12934
  ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
12881
12935
  if (this.data.Type === 'ztexteditor') {
12882
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
12936
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
12883
12937
  }
12884
12938
  else {
12885
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
12939
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
12886
12940
  }
12887
12941
  };
12888
12942
  }