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.
@@ -827,7 +827,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
827
827
 
828
828
  /********** Angular **********/
829
829
  class MainService {
830
- constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandlerService, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalrService, dialogService, oauth2Service, toastService, authService) {
830
+ constructor(router, activatedRoute, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandlerService, webApiService, zcoreService, modalService, storageService, debugService, translationService, signalrService, dialogService, oauth2Service, toastService, authService, menuService) {
831
831
  this.router = router;
832
832
  this.activatedRoute = activatedRoute;
833
833
  this.modalCtrl = modalCtrl;
@@ -848,6 +848,7 @@ class MainService {
848
848
  this.oauth2Service = oauth2Service;
849
849
  this.toastService = toastService;
850
850
  this.authService = authService;
851
+ this.menuService = menuService;
851
852
  this.backNavigationPath = [];
852
853
  this.routeParam = [];
853
854
  this.currentUrl = '';
@@ -893,7 +894,7 @@ class MainService {
893
894
  this.previousUrl = this.currentUrl || window.location.pathname;
894
895
  this.currentUrl = event.url;
895
896
  const triggerType = this.previousUrl === this.currentUrl ? TriggerFromType.refreshStart : TriggerFromType.navigateStart;
896
- this.updateAppMonPerfomance(triggerType, this.previousUrl, true).subscribe();
897
+ this.updateAppMonPerformance(triggerType, this.previousUrl, true).subscribe();
897
898
  this.dismissAllOverlays();
898
899
  if (this.getStartupPage() === event.url) {
899
900
  this.resetRouteParam();
@@ -902,27 +903,44 @@ class MainService {
902
903
  handleNavigationEnd(event) {
903
904
  const duration = performance.now() - this.navigationStartTime;
904
905
  const triggerType = this.previousUrl === this.currentUrl ? TriggerFromType.refreshEnd : TriggerFromType.navigateEnd;
905
- this.updateAppMonPerfomance(triggerType, event.urlAfterRedirects, true, duration).subscribe();
906
+ this.updateAppMonPerformance(triggerType, event.urlAfterRedirects, true, duration).subscribe();
906
907
  this.currentUrl = event.urlAfterRedirects;
907
908
  console.log(event);
908
909
  }
909
910
  handleNavigationError(event) {
910
911
  const duration = performance.now() - this.navigationStartTime;
911
- this.updateAppMonPerfomance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
912
+ this.updateAppMonPerformance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
912
913
  console.log(event.error);
913
914
  this.removeLastNavigateRecord();
914
915
  }
915
- updateAppMonPerfomance(triggerType, url, isSuccess, duration) {
916
+ updateAppMonPerformance(triggerType, url, isSuccess, duration) {
917
+ // Initialize appmonDomainUrl if missing
916
918
  if (!this.resourceApiService.appmonDomainUrl) {
917
- this.resourceApiService.appmonDomainUrl = sessionStorage.getItem('AppmonUrl');
919
+ this.resourceApiService.appmonDomainUrl = sessionStorage.getItem('AppmonDomainUrl') || '';
918
920
  }
919
- const date = new Date();
920
- const pad = (n) => n.toString().padStart(2, '0');
921
- 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')}`;
922
- const currentDomain = window.location.origin; // Extract the current domain
921
+ // Check for required dependencies
923
922
  if (!this.authService.e1Token || !this.resourceApiService.appmonDomainUrl) {
924
923
  return of({});
925
924
  }
925
+ const getCurrentTimestamp = () => {
926
+ const date = new Date();
927
+ const pad = (n) => n.toString().padStart(2, '0');
928
+ 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')}`;
929
+ };
930
+ const timestamp = getCurrentTimestamp();
931
+ const currentDomain = window.location.origin;
932
+ // Determine menu name
933
+ const LOGIN_PAGE = 'LoginPage';
934
+ const HOME_PAGE = 'HomePage';
935
+ const AUTH_PATH = '/auth';
936
+ let menuName = sessionStorage.getItem('menuName') || null;
937
+ if (window.location.pathname === AUTH_PATH) {
938
+ menuName = LOGIN_PAGE;
939
+ }
940
+ else if (window.location.pathname === this.environment.startUpPage) {
941
+ menuName = HOME_PAGE;
942
+ }
943
+ // Build the request payload
926
944
  const params = {
927
945
  Url: `${currentDomain}${url}`,
928
946
  IsAuthenticated: true,
@@ -930,7 +948,7 @@ class MainService {
930
948
  Duration: duration ?? null,
931
949
  RequestMethod: 'POST',
932
950
  UserName: this.authService.userId,
933
- UserId: this.authService.e1Token.userName,
951
+ UserId: this.authService.e1Token?.userName || '',
934
952
  Success: isSuccess,
935
953
  Environment: 'UI',
936
954
  ProjectCode: this.environment.projectCodes[0],
@@ -938,10 +956,13 @@ class MainService {
938
956
  ComponentCode: null,
939
957
  EventId: null,
940
958
  EventType: triggerType,
941
- SessionId: sessionStorage.getItem('sessionTabId')
959
+ SessionId: sessionStorage.getItem('sessionTabId'),
960
+ MenuName: menuName,
942
961
  };
943
- // call the wfs webapi
944
- return this.webApiService.httpPost$(`${this.resourceApiService.appmonDomainUrl}api/ApiSummaryInfos/`, params);
962
+ // API Endpoint
963
+ const apiEndpoint = `${this.resourceApiService.appmonDomainUrl}api/ApiSummaryInfos/`;
964
+ // Call the web API and handle errors
965
+ return this.webApiService.httpPost$(apiEndpoint, params);
945
966
  }
946
967
  dialogOpen(options) {
947
968
  return this.dialogService.open(options);
@@ -1197,6 +1218,46 @@ class MainService {
1197
1218
  }
1198
1219
  return false;
1199
1220
  }
1221
+ menuOnClick(item) {
1222
+ const { AppClientPath: appClientPath, URL: pathName, Name: name } = item;
1223
+ const startupPage = this.zcoreService.getEnvironment().startUpPage.toLowerCase();
1224
+ const LAUNCHER = 'launcher';
1225
+ // Save menu name to sessionStorage
1226
+ this.menuService.setMenuName(name);
1227
+ // Handle app client path navigation
1228
+ if (appClientPath && startupPage === LAUNCHER) {
1229
+ return this.handleAppClientNavigation(pathName, appClientPath);
1230
+ }
1231
+ // Determine navigation path
1232
+ const navigationPath = this.getNavigationPath(startupPage, pathName);
1233
+ // Navigate to the determined path
1234
+ return this.navigateToPath(navigationPath, pathName);
1235
+ }
1236
+ handleAppClientNavigation(pathName, appClientPath) {
1237
+ try {
1238
+ ZComponentHelper.openAppClientPath(pathName, appClientPath, this.authService);
1239
+ return false;
1240
+ }
1241
+ catch (error) {
1242
+ console.warn(`Failed to open App Client Path for ${pathName}:`, error);
1243
+ return false;
1244
+ }
1245
+ }
1246
+ getNavigationPath(startupPage, pathName) {
1247
+ const MENU_PAGE_PREFIX = '_';
1248
+ return startupPage.startsWith(MENU_PAGE_PREFIX) ? [startupPage] : [pathName];
1249
+ }
1250
+ navigateToPath(navigationPath, pathName) {
1251
+ try {
1252
+ this.setNavigationParams(navigationPath);
1253
+ this.router.navigate([pathName]);
1254
+ return true;
1255
+ }
1256
+ catch (error) {
1257
+ console.warn(`Navigation to ${pathName} failed:`, error);
1258
+ return false;
1259
+ }
1260
+ }
1200
1261
  navigateFromMenu(pageName) {
1201
1262
  const { startUpPage } = this.environment;
1202
1263
  this.setRouteParam([`${startUpPage}`]);
@@ -2037,14 +2098,14 @@ class MainService {
2037
2098
  }
2038
2099
  }
2039
2100
  }
2040
- 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 });
2101
+ 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 });
2041
2102
  MainService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, providedIn: 'root' });
2042
2103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: MainService, decorators: [{
2043
2104
  type: Injectable,
2044
2105
  args: [{
2045
2106
  providedIn: 'root',
2046
2107
  }]
2047
- }], 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 }]; } });
2108
+ }], 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 }]; } });
2048
2109
  function refreshGrid(group) {
2049
2110
  const zgridControl = group["gridOptions"];
2050
2111
  if (zgridControl) {
@@ -3186,7 +3247,9 @@ class ZGridBindingDirective extends DataBindingDirective {
3186
3247
  dataSet.forEach(data => {
3187
3248
  ignoreTimeZoneColumns.forEach(col => {
3188
3249
  // Adjust datetime based on the timezone ignoring setting
3189
- data[col.Value] = this.componentService.localizeDateTimeByIgnoringTimeZone(data[col.Value], col);
3250
+ if (data[col.Value]) {
3251
+ data[col.Value] = this.componentService.localizeDateTimeByIgnoringTimeZone(data[col.Value], col);
3252
+ }
3190
3253
  });
3191
3254
  });
3192
3255
  }
@@ -4458,10 +4521,10 @@ class FieldBase {
4458
4521
  this.componentProperties.isRequired = status;
4459
4522
  ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
4460
4523
  if (this.data.Type === 'ztexteditor') {
4461
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
4524
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
4462
4525
  }
4463
4526
  else {
4464
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
4527
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
4465
4528
  }
4466
4529
  };
4467
4530
  }
@@ -5345,32 +5408,25 @@ class UiappmenucontentComponent {
5345
5408
  this.authService = authService;
5346
5409
  this.zcoreService = zcoreService;
5347
5410
  this.mainService = mainService;
5411
+ this.MENU_TYPE_DROPDOWN_SUBMENU = 'dropdown-submenu';
5348
5412
  }
5349
5413
  ngOnInit() {
5350
5414
  }
5351
5415
  getDivClass(item) {
5352
- return (item.Type === 'dropdown-submenu' ? 'flex-show' : 'col-xs-4 col-sm-4 col-md-3 col-xl-2') + " menu-col";
5416
+ if (!item || !item.Type)
5417
+ return 'col-xs-4 col-sm-4 col-md-3 col-xl-2 menu-col';
5418
+ return (item.Type === this.MENU_TYPE_DROPDOWN_SUBMENU ? 'flex-show' : 'col-xs-4 col-sm-4 col-md-3 col-xl-2') + ' menu-col';
5353
5419
  }
5354
5420
  getMenuList(item) {
5355
- return item.Type === 'dropdown-submenu' ? this.menuService.getMenuFolder(item.URL) : null;
5421
+ if (!item || item.Type !== this.MENU_TYPE_DROPDOWN_SUBMENU)
5422
+ return null;
5423
+ return this.menuService.getMenuFolder(item.URL);
5356
5424
  }
5357
- menuOnClick(pathName, appClientPath) {
5358
- const startupPage = this.zcoreService.getEnvironment().startUpPage;
5359
- if (appClientPath && startupPage.toLocaleLowerCase() == 'launcher') {
5360
- ZComponentHelper.openAppClientPath(pathName, appClientPath, this.authService);
5361
- return false;
5362
- }
5363
- else {
5364
- if (startupPage.indexOf('_', 0) == 0) {
5365
- // menu page
5366
- this.mainService.setNavigationParams([startupPage]);
5367
- }
5368
- else {
5369
- // home page
5370
- this.mainService.setNavigationParams([pathName]);
5371
- }
5372
- this.router.navigate([pathName]);
5373
- }
5425
+ trackByFn(index, item) {
5426
+ return item.URL || index.toString(); // Unique identifier or fallback to index
5427
+ }
5428
+ menuOnClick(item) {
5429
+ return this.mainService.menuOnClick(item);
5374
5430
  }
5375
5431
  setMapInput(key, value) {
5376
5432
  const mapInput = document.createElement('input');
@@ -5381,10 +5437,10 @@ class UiappmenucontentComponent {
5381
5437
  }
5382
5438
  }
5383
5439
  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 });
5384
- 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]" }] });
5440
+ 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]" }] });
5385
5441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: UiappmenucontentComponent, decorators: [{
5386
5442
  type: Component,
5387
- 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"] }]
5443
+ 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"] }]
5388
5444
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MenuService }, { type: i2.AuthService }, { type: i2.ZCoreService }, { type: MainService }]; }, propDecorators: { items: [{
5389
5445
  type: Input
5390
5446
  }] } });
@@ -8567,11 +8623,8 @@ class ZtextareaComponent extends InputFieldBase {
8567
8623
  }
8568
8624
  setCharCounterDisplayStr() {
8569
8625
  let characterCount = 0;
8570
- if (!!this.data.MinLengthIgnoreSpace) {
8571
- characterCount = ZComponentHelper.getValueWithoutSpaces(this.group.zModel[this.data.Value]).length;
8572
- }
8573
- else {
8574
- characterCount = ZComponentHelper.getValueWithoutContinuousSpaces(this.group.zModel[this.data.Value]).length;
8626
+ if (this.group.zModel && this.group.zModel[this.data.Value]) {
8627
+ characterCount = this.group.zModel[this.data.Value].length;
8575
8628
  }
8576
8629
  this.charCounterDisplayStr = `${characterCount} ${this.data.MaxLength ? (' / ' + this.data.MaxLength) : ''}`;
8577
8630
  }
@@ -10234,10 +10287,10 @@ class ZgridComponent extends DataListingFieldBase {
10234
10287
  if (col.IsRequired) {
10235
10288
  validators.push(Validators.required);
10236
10289
  if (col.Type === 'ztexteditor') {
10237
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
10290
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
10238
10291
  }
10239
10292
  else {
10240
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
10293
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
10241
10294
  }
10242
10295
  }
10243
10296
  if (col.ValidatorPattern) {
@@ -10307,10 +10360,10 @@ class ZgridComponent extends DataListingFieldBase {
10307
10360
  if (col.IsRequired) {
10308
10361
  validators.push(Validators.required);
10309
10362
  if (col.Type === 'ztexteditor') {
10310
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
10363
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
10311
10364
  }
10312
10365
  else {
10313
- validators.push(ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
10366
+ validators.push(ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
10314
10367
  }
10315
10368
  }
10316
10369
  if (col.ValidatorPattern) {
@@ -12849,10 +12902,10 @@ class ZudfComponent extends ContainerFieldBase {
12849
12902
  this.componentProperties.isRequired = status;
12850
12903
  ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
12851
12904
  if (this.data.Type === 'ztexteditor') {
12852
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces_TextEditor);
12905
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpacesAndHTMLTags);
12853
12906
  }
12854
12907
  else {
12855
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_WithoutWhiteSpaces);
12908
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, ZComponentHelper.requiredValidator_ExcludeWhiteSpaces);
12856
12909
  }
12857
12910
  };
12858
12911
  }