mmhglobal-dynamicform 2.42.0 → 2.43.0

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.
@@ -7346,13 +7346,22 @@ class ZgaugeComponent extends FieldBase {
7346
7346
  super(componentService);
7347
7347
  this.componentService = componentService;
7348
7348
  this.isLoading = true;
7349
+ this.value = 0;
7350
+ this.title = "";
7351
+ this.color = [{ color: "#0175c7" }];
7352
+ this.majorTicks = { visible: true, color: '#0000ff' };
7353
+ this.minorTicks = { visible: true, color: '#0000ff' };
7354
+ this.startAngle = 0;
7355
+ this.endAngle = 180;
7356
+ this.minValue = 0;
7357
+ this.maxValue = 200;
7349
7358
  this.options = {
7350
- value: 0,
7351
- title: '',
7359
+ value: this.value,
7360
+ title: this.title,
7352
7361
  chartInnerText1: '',
7353
7362
  chartInnerText2: '',
7354
7363
  scaleMax: 50,
7355
- colors: [],
7364
+ colors: this.color,
7356
7365
  transitions: false,
7357
7366
  majorTicks: { visible: true, color: '#0000ff' },
7358
7367
  minorTicks: { visible: true, color: '#0000ff' },
@@ -7363,12 +7372,12 @@ class ZgaugeComponent extends FieldBase {
7363
7372
  endAngle: 180,
7364
7373
  rangePlaceholderColor: '#e6e5e5',
7365
7374
  labelsColor: '#0000ff',
7366
- rangeFrom: 0,
7367
- rangeTo: 100,
7368
7375
  rangeColor: '#ff6358',
7369
7376
  rangeLineCap: 'round',
7370
7377
  showLabels: true,
7371
7378
  rangeSize: 10,
7379
+ labelStyle: "text-align: center; font-size: 18px;",
7380
+ arcgaugeStyle: "margin-top:50px;width:90% ;height:100%; min-width: 330px;",
7372
7381
  };
7373
7382
  }
7374
7383
  ngOnInit() {
@@ -7396,26 +7405,26 @@ class ZgaugeComponent extends FieldBase {
7396
7405
  return this.componentProperties.style.style3 ? this.componentService.convertStyleStringToObject(this.componentProperties.style.style3) : { 'white-space': 'initial' };
7397
7406
  }
7398
7407
  getFieldDeclarationForSetup(field, options) {
7408
+ var _a, _b;
7399
7409
  if (field.Value.startsWith('group.')) {
7400
- options.value = ZComponentHelper.getGroupEvalValue.call(this, field.Value) || options.value;
7410
+ options.value = (_a = ZComponentHelper.getGroupEvalValue.call(this, field.Value)) !== null && _a !== void 0 ? _a : options.value;
7401
7411
  }
7402
7412
  else {
7403
- options.value = this.group.zModel[field.Value] || options.value;
7413
+ options.value = (_b = this.group.zModel[field.Value]) !== null && _b !== void 0 ? _b : options.value;
7404
7414
  options.value = parseInt(options.value);
7405
7415
  }
7406
7416
  options.title = ZComponentHelper.getGroupEvalValue.call(this, field.Title) || options.title;
7407
- options.scaleMax = field.Max || options.scaleMax; // not using
7408
7417
  options.minValue = ZComponentHelper.getGroupEvalValue.call(this, field.MinValue) || options.minValue || 0;
7409
7418
  options.maxValue = ZComponentHelper.getGroupEvalValue.call(this, field.MaxValue) || options.maxValue || 100;
7410
- options.colors = ZComponentHelper.getGroupEvalValue.call(this, field.Color) || options.colors || { color: "#0175c7" };
7419
+ options.colors = ZComponentHelper.getGroupEvalValue.call(this, field.Color) || options.colors;
7411
7420
  options.transitions = field.Transitions || options.transitions;
7412
- options.majorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MajorTicks) || options.majorTicks || { visible: true, color: '#0000ff' };
7413
- options.minorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MinorTicks) || options.minorTicks || { visible: true, color: '#0000ff' };
7421
+ options.majorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MajorTicks) || options.majorTicks;
7422
+ options.minorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MinorTicks) || options.minorTicks;
7414
7423
  options.showLabels = field.ShowLabels != undefined ? field.ShowLabels : options.showLabels;
7415
7424
  options.style = field.Style || options.style;
7416
7425
  options.reverse = field.Reverse || options.reverse;
7417
- options.startAngle = ZComponentHelper.getGroupEvalValue.call(this, field.StartAngle) || options.startAngle || 0;
7418
- options.endAngle = ZComponentHelper.getGroupEvalValue.call(this, field.EndAngle) || options.endAngle || 180;
7426
+ options.startAngle = field.StartAngle || options.startAngle || 0;
7427
+ options.endAngle = field.EndAngle || options.endAngle || 180;
7419
7428
  options.rangePlaceholderColor = field.RangePlaceholderColor || options.rangePlaceholderColor;
7420
7429
  options.rangeFrom = ZComponentHelper.getGroupEvalValue.call(this, field['RangeFrom']) || options.rangeFrom;
7421
7430
  options.rangeTo = ZComponentHelper.getGroupEvalValue.call(this, field['RangeTo']) || options.rangeTo;
@@ -7436,10 +7445,10 @@ class ZgaugeComponent extends FieldBase {
7436
7445
  }
7437
7446
  }
7438
7447
  ZgaugeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgaugeComponent, deps: [{ token: ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
7439
- ZgaugeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZgaugeComponent, selector: "app-zgauge", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\" style=\"text-align: center;\">\r\n <div id=\"marketShareContainer\" class=\"ion-row\" class=\"col-xs-12 stats-graph\" *ngIf=\"options.title\">\r\n <h6 style=\"color: gray;\">{{ options.title }}</h6>\r\n </div>\r\n <div [ngStyle]='alignment()'>\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\" style=\"margin-top:50px;width:90% ;height:100%; min-width: 330px;\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <span [style.color]=\"color\">{{ value }}</span>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>\r\n\r\n<!--<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n <div class=\"chart-top-title e1tag-style1\" [style]=\"componentProperties.style.style1\" *ngIf=\"options.title\">\r\n {{options.title}}\r\n </div>\r\n <div [style]=\"componentProperties.style.style2\" class=\"e1tag-style2\">\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\"\r\n [style]=\"getGaugeStyle()\" class=\"e1tag-style3\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <div *ngIf=\"options.chartInnerText1\" [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\">{{ options.chartInnerText1 }}</div>\r\n <div *ngIf=\"options.chartInnerText2\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">{{ options.chartInnerText2 }}</div>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>-->\r\n\r\n", styles: [""], components: [{ type: i2$8.ArcGaugeComponent, selector: "kendo-arcgauge", inputs: ["value", "color", "colors", "opacity", "scale"], exportAs: ["kendoArcGauge"] }, { type: i2$8.ArcScaleComponent, selector: "kendo-arcgauge-scale", inputs: ["labels", "rangeDistance", "rangeLineCap", "startAngle", "endAngle"] }, { type: i2$8.ArcLabelsComponent, selector: "kendo-arcgauge-scale-labels" }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i2$8.ArcCenterTemplateDirective, selector: "[kendoArcGaugeCenterTemplate]" }] });
7448
+ ZgaugeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZgaugeComponent, selector: "app-zgauge", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\" [style]=\"componentProperties.style.style\">\r\n <div id=\"marketShareContainer\" class=\"ion-row\" class=\"col-xs-12 stats-graph\" *ngIf=\"options.title\">\r\n <h6 style=\"color: gray;\">{{ options.title }}</h6>\r\n </div>\r\n <div [ngStyle]='alignment()'>\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\" [style]=\"componentProperties.style.style1\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <span [style.color]=\"color\" [style]=\"componentProperties.style.style2\">{{ value }}</span>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>\r\n\r\n<!--<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n <div class=\"chart-top-title e1tag-style1\" [style]=\"componentProperties.style.style1\" *ngIf=\"options.title\">\r\n {{options.title}}\r\n </div>\r\n <div [style]=\"componentProperties.style.style2\" class=\"e1tag-style2\">\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\"\r\n [style]=\"getGaugeStyle()\" class=\"e1tag-style3\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <div *ngIf=\"options.chartInnerText1\" [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\">{{ options.chartInnerText1 }}</div>\r\n <div *ngIf=\"options.chartInnerText2\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">{{ options.chartInnerText2 }}</div>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>-->\r\n\r\n", styles: [""], components: [{ type: i2$8.ArcGaugeComponent, selector: "kendo-arcgauge", inputs: ["value", "color", "colors", "opacity", "scale"], exportAs: ["kendoArcGauge"] }, { type: i2$8.ArcScaleComponent, selector: "kendo-arcgauge-scale", inputs: ["labels", "rangeDistance", "rangeLineCap", "startAngle", "endAngle"] }, { type: i2$8.ArcLabelsComponent, selector: "kendo-arcgauge-scale-labels" }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i2$8.ArcCenterTemplateDirective, selector: "[kendoArcGaugeCenterTemplate]" }] });
7440
7449
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgaugeComponent, decorators: [{
7441
7450
  type: Component,
7442
- args: [{ selector: 'app-zgauge', template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\" style=\"text-align: center;\">\r\n <div id=\"marketShareContainer\" class=\"ion-row\" class=\"col-xs-12 stats-graph\" *ngIf=\"options.title\">\r\n <h6 style=\"color: gray;\">{{ options.title }}</h6>\r\n </div>\r\n <div [ngStyle]='alignment()'>\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\" style=\"margin-top:50px;width:90% ;height:100%; min-width: 330px;\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <span [style.color]=\"color\">{{ value }}</span>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>\r\n\r\n<!--<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n <div class=\"chart-top-title e1tag-style1\" [style]=\"componentProperties.style.style1\" *ngIf=\"options.title\">\r\n {{options.title}}\r\n </div>\r\n <div [style]=\"componentProperties.style.style2\" class=\"e1tag-style2\">\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\"\r\n [style]=\"getGaugeStyle()\" class=\"e1tag-style3\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <div *ngIf=\"options.chartInnerText1\" [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\">{{ options.chartInnerText1 }}</div>\r\n <div *ngIf=\"options.chartInnerText2\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">{{ options.chartInnerText2 }}</div>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>-->\r\n\r\n", styles: [""] }]
7451
+ args: [{ selector: 'app-zgauge', template: "<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\" [style]=\"componentProperties.style.style\">\r\n <div id=\"marketShareContainer\" class=\"ion-row\" class=\"col-xs-12 stats-graph\" *ngIf=\"options.title\">\r\n <h6 style=\"color: gray;\">{{ options.title }}</h6>\r\n </div>\r\n <div [ngStyle]='alignment()'>\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\" [style]=\"componentProperties.style.style1\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <span [style.color]=\"color\" [style]=\"componentProperties.style.style2\">{{ value }}</span>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>\r\n\r\n<!--<div *ngIf=\"!isLoading && (!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n <div class=\"chart-top-title e1tag-style1\" [style]=\"componentProperties.style.style1\" *ngIf=\"options.title\">\r\n {{options.title}}\r\n </div>\r\n <div [style]=\"componentProperties.style.style2\" class=\"e1tag-style2\">\r\n <kendo-arcgauge [value]=\"options.value\" [transitions]=\"options.transitions\" [colors]=\"options.colors\"\r\n [style]=\"getGaugeStyle()\" class=\"e1tag-style3\">\r\n <kendo-arcgauge-scale [majorTicks]=\"options.majorTicks\"\r\n [minorTicks]=\"options.minorTicks\"\r\n [reverse]=\"options.reverse\"\r\n [startAngle]=\"options.startAngle\"\r\n [endAngle]=\"options.endAngle\"\r\n [min]=\"options.minValue\"\r\n [max]=\"options.maxValue\"\r\n [rangePlaceholderColor]=\"options.rangePlaceholderColor\"\r\n [rangeSize]=\"options.rangeSize\"\r\n [rangeLineCap]=\"options.rangeLineCap\">\r\n <kendo-arcgauge-scale-labels format=\"l\" [color]=\"options.labelsColor\" [visible]=\"options.showLabels\">\r\n </kendo-arcgauge-scale-labels>\r\n </kendo-arcgauge-scale>\r\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\" let-color=\"color\">\r\n <div *ngIf=\"options.chartInnerText1\" [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\">{{ options.chartInnerText1 }}</div>\r\n <div *ngIf=\"options.chartInnerText2\" [style]=\"componentProperties.style.style5\" class=\"e1tag-style5\">{{ options.chartInnerText2 }}</div>\r\n </ng-template>\r\n </kendo-arcgauge>\r\n </div>\r\n</div>-->\r\n\r\n", styles: [""] }]
7443
7452
  }], ctorParameters: function () { return [{ type: ZComponentService }]; } });
7444
7453
 
7445
7454
  const hideAndShowVerticalAnimation = trigger('hideAndShowAnimation', [
@@ -9083,27 +9092,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
9083
9092
  args: ["textarea"]
9084
9093
  }] } });
9085
9094
 
9095
+ /********** Angular **********/
9086
9096
  class MyFileInfo {
9087
9097
  }
9088
9098
  class ZuploadComponent extends InputFieldBase {
9089
- // zModelValue = [{
9090
- // name: "RXJS 01.png",
9091
- // size: 128753,
9092
- // uid: "c96e234d-af61-4587-adcc-3b400ddef884"
9093
- // }];
9094
- // fieldElement = [{
9095
- // Name: 'FileUploadList',
9096
- // Type: 'zupload',
9097
- // Value: 'FileUploadList',
9098
- // SelectionOptions: ['jpg', 'jpeg', 'png', 'bmp', 'pdf'],
9099
- // UploadMetaData: 'group.UploadMetaData',
9100
- // AutoUpload: false,
9101
- // AllowRemove: true,
9102
- // Multiple: false,
9103
- // OnSuccess: 'group.onSuccess()',
9104
- // DivClass: "col-md-12 col-md-6",
9105
- // Visible: true
9106
- // }];
9107
9099
  constructor(componentService, authService, compressImage, zcoreService, ngZone, sharePointService, alertService) {
9108
9100
  super(componentService);
9109
9101
  this.componentService = componentService;
@@ -9113,6 +9105,7 @@ class ZuploadComponent extends InputFieldBase {
9113
9105
  this.ngZone = ngZone;
9114
9106
  this.sharePointService = sharePointService;
9115
9107
  this.alertService = alertService;
9108
+ // NOTE: Naming: `uid` array actually stores preview UIDs. Consider renaming to `previewUids` in future (not changed to preserve API).
9116
9109
  this.uploadAttachmentUrl = null;
9117
9110
  this.uploadSaveUrl = "/Attachment/Chunk_Upload_Save"; // should represent an actual API endpoint
9118
9111
  this.uploadRemoveUrl = "/Attachment/Chunk_Upload_Remove"; // should represent an actual API endpoint
@@ -9120,9 +9113,9 @@ class ZuploadComponent extends InputFieldBase {
9120
9113
  this.getImageUrl = "/Attachment/getImage"; // GET method
9121
9114
  this.isAutoUpload = false;
9122
9115
  this.isMultiple = false;
9116
+ this.showFileList = true;
9123
9117
  this.imagePreviews = [];
9124
9118
  this.uid = [];
9125
- this.showFileList = true;
9126
9119
  this.fileList = [];
9127
9120
  this.restrictions = {
9128
9121
  minFileSize: 1,
@@ -9147,75 +9140,134 @@ class ZuploadComponent extends InputFieldBase {
9147
9140
  size: 102400,
9148
9141
  maxAutoRetries: 3,
9149
9142
  };
9150
- this.uploadAttachmentUrl = this.zcoreService.normalizeUrl(this.zcoreService.getEnvironment().uploadAttachmentUrl);
9151
- this.uploadSaveUrl = this.uploadAttachmentUrl + this.uploadSaveUrl;
9152
- this.uploadRemoveUrl = this.uploadAttachmentUrl + this.uploadRemoveUrl;
9143
+ const env = this.zcoreService.getEnvironment();
9144
+ const normalized = this.zcoreService.normalizeUrl(env === null || env === void 0 ? void 0 : env.uploadAttachmentUrl);
9145
+ this.uploadAttachmentUrl = normalized !== null && normalized !== void 0 ? normalized : null;
9146
+ if (this.uploadAttachmentUrl) {
9147
+ this.uploadSaveUrl = this.uploadAttachmentUrl + this.uploadSaveUrl;
9148
+ this.uploadRemoveUrl = this.uploadAttachmentUrl + this.uploadRemoveUrl;
9149
+ }
9150
+ else {
9151
+ // Safer logging: avoid silent null URLs that break uploads
9152
+ // NOTE: This indicates a configuration issue.
9153
+ console.warn(`[ZuploadComponent] uploadAttachmentUrl is empty. Upload endpoints may be invalid.`, { uploadAttachmentUrl: env === null || env === void 0 ? void 0 : env.uploadAttachmentUrl });
9154
+ }
9155
+ this.defaultUploadSaveUrl = this.uploadSaveUrl;
9156
+ this.defaultUploadRemoveUrl = this.uploadRemoveUrl;
9153
9157
  }
9158
+ /**
9159
+ * Angular lifecycle hook - initializes restrictions and upload behavior from field config.
9160
+ */
9154
9161
  ngOnInit() {
9162
+ var _a, _b, _c, _d, _e, _f, _g, _h;
9155
9163
  super.setupInnerField();
9156
- // this.group['UploadMetaData'] = new UploadMetaData(null, '15', 'SO-No-1234', 'SaleOrder');
9157
- // this.uploadSaveUrl = uploadAttachmentUrl + this.uploadSaveUrl;
9158
- // this.uploadRemoveUrl = uploadAttachmentUrl + this.uploadRemoveUrl;
9159
- if (this.data.SelectOptions && !this.data.AllowedFileExtension) {
9164
+ // Allowed extensions:
9165
+ // - If SelectOptions present and AllowedFileExtension not present, override
9166
+ // - Else if AllowedFileExtension present and SelectOptions absent, append
9167
+ // NOTE: Keep original behavior; it may allow duplicates, but prevents unexpected restriction loss.
9168
+ if (((_a = this.data) === null || _a === void 0 ? void 0 : _a.SelectOptions) && !((_b = this.data) === null || _b === void 0 ? void 0 : _b.AllowedFileExtension)) {
9160
9169
  this.restrictions.allowedExtensions = this.data.SelectOptions;
9161
9170
  }
9162
- else if (!this.data.SelectOptions && this.data.AllowedFileExtension) {
9171
+ else if (!((_c = this.data) === null || _c === void 0 ? void 0 : _c.SelectOptions) && ((_d = this.data) === null || _d === void 0 ? void 0 : _d.AllowedFileExtension)) {
9163
9172
  this.restrictions.allowedExtensions = this.restrictions.allowedExtensions.concat(this.data.AllowedFileExtension);
9164
9173
  }
9165
- if (this.data.MinFileSize) {
9174
+ if (typeof ((_e = this.data) === null || _e === void 0 ? void 0 : _e.MinFileSize) === "number" && this.data.MinFileSize >= 0) {
9166
9175
  this.restrictions.minFileSize = this.data.MinFileSize;
9167
9176
  }
9168
- if (this.data.MaxFileSize) {
9177
+ if (typeof ((_f = this.data) === null || _f === void 0 ? void 0 : _f.MaxFileSize) === "number" && this.data.MaxFileSize >= 0) {
9169
9178
  this.restrictions.maxFileSize = this.data.MaxFileSize;
9170
9179
  }
9171
- this.isAutoUpload = this.data.AutoUpload || false;
9172
- if (!this.data.AllowRemove) {
9180
+ this.isAutoUpload = Boolean((_g = this.data) === null || _g === void 0 ? void 0 : _g.AutoUpload);
9181
+ // If remove is not allowed, Kendo upload expects empty URL to hide remove request.
9182
+ if (this.data && this.data.AllowRemove === false) {
9173
9183
  this.uploadRemoveUrl = "";
9174
9184
  }
9175
- if (this.data.Multiple) {
9176
- this.isMultiple = this.data.Multiple;
9177
- }
9178
- this.componentProperties.style.style6 = this.componentProperties.style.style6 || "margin: 5px; border: 1px solid gray;";
9185
+ this.isMultiple = Boolean((_h = this.data) === null || _h === void 0 ? void 0 : _h.Multiple);
9186
+ // Ensure style6 exists (legacy styling hook).
9187
+ this.componentProperties.style.style6 =
9188
+ this.componentProperties.style.style6 || "margin: 5px; border: 1px solid gray;";
9179
9189
  }
9190
+ /**
9191
+ * Kendo Upload success callback for both upload and remove.
9192
+ * Keeps zModel in sync and emits ZComponent output events.
9193
+ */
9180
9194
  onSuccess(e) {
9181
- var _a, _b, _c;
9182
- // angular kendo upload didn't filter away Sent event for remove, so we have to handle it here
9183
- // upload progress not required for removal, thus it's also removed
9184
- // @ts-ignore
9185
- if (e.operation === "remove" && (e.response.type === HttpEventType.Sent || e.response.type === HttpEventType.UploadProgress)) {
9195
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
9196
+ // Angular Kendo Upload emits "Sent" and "UploadProgress" for remove; ignore them to avoid double-handling.
9197
+ // @ts-ignore - Kendo types for response differ by runtime usage
9198
+ const responseType = (_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.type;
9199
+ if ((e === null || e === void 0 ? void 0 : e.operation) === "remove" &&
9200
+ (responseType === HttpEventType.Sent || responseType === HttpEventType.UploadProgress)) {
9201
+ return;
9202
+ }
9203
+ const modelKey = (_b = this.data) === null || _b === void 0 ? void 0 : _b.Value;
9204
+ if (!modelKey) {
9205
+ console.warn(`[ZuploadComponent] onSuccess skipped: missing data.Value.`, { event: e });
9186
9206
  return;
9187
9207
  }
9188
- if (!Array.isArray(this.group.zModel[this.data.Value])) {
9189
- this.group.zModel[this.data.Value] = [];
9208
+ if (!((_c = this.group) === null || _c === void 0 ? void 0 : _c.zModel)) {
9209
+ console.warn(`[ZuploadComponent] onSuccess skipped: missing group.zModel.`, { event: e });
9210
+ return;
9211
+ }
9212
+ if (!Array.isArray(this.group.zModel[modelKey])) {
9213
+ this.group.zModel[modelKey] = [];
9214
+ }
9215
+ const file = (_e = (_d = e === null || e === void 0 ? void 0 : e.files) === null || _d === void 0 ? void 0 : _d[0]) !== null && _e !== void 0 ? _e : undefined;
9216
+ if (!file) {
9217
+ console.warn(`[ZuploadComponent] onSuccess: no file found in event.`, { event: e });
9218
+ return;
9190
9219
  }
9191
- const file = e.files[0];
9192
- const existingFileIndex = this.group.zModel[this.data.Value].findIndex(f => f.name === file.name && f.uid === file.uid);
9220
+ const existingFileIndex = this.group.zModel[modelKey].findIndex((f) => (f === null || f === void 0 ? void 0 : f.name) === file.name && (f === null || f === void 0 ? void 0 : f.uid) === file.uid);
9193
9221
  if (e.operation === "upload") {
9194
- // console.log('upload Success: ', e);
9195
- //sharepoint required to read data from fileUid and attachment able to get data from fileUid too.
9196
- file.myUid = (_c = (_b = (_a = e.response) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.fileUid) !== null && _c !== void 0 ? _c : file.uid;
9197
- delete file['httpSubscription'];
9222
+ // SharePoint and Attachment use fileUid (server) for later operations.
9223
+ // Prefer fileUid if provided; fallback to file.uid
9224
+ // @ts-ignore - body shape is runtime-dependent
9225
+ file.myUid = (_h = (_g = (_f = e === null || e === void 0 ? void 0 : e.response) === null || _f === void 0 ? void 0 : _f.body) === null || _g === void 0 ? void 0 : _g.fileUid) !== null && _h !== void 0 ? _h : file.uid;
9226
+ // Clean up internal subscription data to avoid circular structures
9227
+ // NOTE: This relies on Kendo attaching internal fields; safe delete.
9228
+ delete file["httpSubscription"];
9198
9229
  if (existingFileIndex !== -1) {
9199
- this.group.zModel[this.data.Value][existingFileIndex] = file;
9230
+ this.group.zModel[modelKey][existingFileIndex] = file;
9200
9231
  }
9201
9232
  else {
9202
- this.group.zModel[this.data.Value].push(file);
9233
+ this.group.zModel[modelKey].push(file);
9203
9234
  }
9235
+ console.info(`[ZuploadComponent] Upload succeeded.`, {
9236
+ name: file.name,
9237
+ uid: file.uid,
9238
+ myUid: file.myUid,
9239
+ });
9204
9240
  }
9205
9241
  else if (e.operation === "remove") {
9206
9242
  if (existingFileIndex !== -1) {
9207
- this.group.zModel[this.data.Value].splice(existingFileIndex, 1);
9243
+ this.group.zModel[modelKey].splice(existingFileIndex, 1);
9208
9244
  }
9245
+ console.info(`[ZuploadComponent] Remove succeeded.`, {
9246
+ name: file.name,
9247
+ uid: file.uid,
9248
+ myUid: file.myUid,
9249
+ });
9209
9250
  }
9210
- ZComponentHelper.setComponentModelValue(this.data, this.group.zModel[this.data.Value], this.group);
9211
- this.group.subject.next({
9251
+ else {
9252
+ // Unknown operation, preserve behavior but log for diagnostics.
9253
+ console.debug(`[ZuploadComponent] onSuccess received unsupported operation.`, { operation: e.operation, event: e });
9254
+ }
9255
+ ZComponentHelper.setComponentModelValue(this.data, this.group.zModel[modelKey], this.group);
9256
+ (_j = this.group.subject) === null || _j === void 0 ? void 0 : _j.next({
9212
9257
  type: "zupload-onSuccess",
9213
- target: this.data.OnSuccess,
9258
+ target: (_k = this.data) === null || _k === void 0 ? void 0 : _k.OnSuccess,
9214
9259
  event: e,
9215
- data: { value: e.files[0], field: this.data },
9260
+ data: { value: file, field: this.data },
9216
9261
  });
9217
9262
  }
9263
+ /**
9264
+ * Normalize and enrich image compression config with byte-based thresholds.
9265
+ */
9218
9266
  compressionConfigHandler(imgConfig) {
9267
+ if (!imgConfig) {
9268
+ // NOTE: keep function safe for unexpected null; returns as-is
9269
+ return imgConfig;
9270
+ }
9219
9271
  if (imgConfig.FileSizeMaxSize) {
9220
9272
  imgConfig.FileSizeMaxSizeByte = this.convertSizeToByte(imgConfig.FileSizeMaxSize);
9221
9273
  }
@@ -9227,79 +9279,117 @@ class ZuploadComponent extends InputFieldBase {
9227
9279
  }
9228
9280
  return imgConfig;
9229
9281
  }
9282
+ /**
9283
+ * Convert string size values like "10KB", "2 MB", "1gb", "1024" into bytes.
9284
+ * If unit is omitted, bytes are assumed.
9285
+ *
9286
+ * @param sizeString Human readable size string.
9287
+ * @returns Size in bytes. Returns 0 if parsing fails.
9288
+ */
9230
9289
  convertSizeToByte(sizeString) {
9231
- let _tempFileSizeMaxSize = 0;
9290
+ if (!sizeString || typeof sizeString !== "string") {
9291
+ return 0;
9292
+ }
9293
+ // Remove all spaces
9294
+ const raw = sizeString.replace(/ /g, "").trim();
9295
+ if (!raw) {
9296
+ return 0;
9297
+ }
9298
+ let parsedValue = 0;
9232
9299
  let sizeByByte = 0;
9233
- let sizeType = 'b';
9234
- // remove all space
9235
- const _tempFileSize = sizeString.replace(/ /g, '');
9236
- // check last char is alphabetic
9237
- const lastChar = _tempFileSize.substr(_tempFileSize.length - 1);
9238
- if (isNaN(parseFloat(lastChar))) {
9239
- const secLastChar = _tempFileSize.substr(_tempFileSize.length - 2).slice(0, -1);
9240
- if (isNaN(parseFloat(secLastChar))) {
9241
- // check last 2nd char is alphabetic
9242
- sizeType = secLastChar + sizeType;
9243
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -2));
9300
+ let sizeType = "b";
9301
+ // Check last char is alphabetic
9302
+ const lastChar = raw.substring(raw.length - 1);
9303
+ const lastCharIsNumber = !Number.isNaN(Number.parseFloat(lastChar));
9304
+ if (!lastCharIsNumber) {
9305
+ const secondLastChar = raw.substring(raw.length - 2).slice(0, -1);
9306
+ const secondLastIsNumber = !Number.isNaN(Number.parseFloat(secondLastChar));
9307
+ if (!secondLastIsNumber) {
9308
+ // Last 2nd char is also alphabetic (e.g. "MB", "GB")
9309
+ sizeType = `${secondLastChar}${sizeType}`;
9310
+ parsedValue = Number.parseFloat(raw.slice(0, -2));
9244
9311
  }
9245
9312
  else {
9246
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -1));
9313
+ parsedValue = Number.parseFloat(raw.slice(0, -1));
9314
+ }
9315
+ // If parsing failed, return 0 (SonarQube safe behavior)
9316
+ if (Number.isNaN(parsedValue) || parsedValue < 0) {
9317
+ console.warn(`[ZuploadComponent] convertSizeToByte: invalid size value.`, { sizeString });
9318
+ return 0;
9247
9319
  }
9248
9320
  switch (sizeType.toLowerCase()) {
9249
9321
  case "b":
9250
- sizeByByte = _tempFileSizeMaxSize;
9322
+ sizeByByte = parsedValue;
9251
9323
  break;
9252
9324
  case "kb":
9253
- sizeByByte = _tempFileSizeMaxSize * 1024;
9325
+ sizeByByte = parsedValue * 1024;
9254
9326
  break;
9255
9327
  case "mb":
9256
- sizeByByte = _tempFileSizeMaxSize * 1048576;
9328
+ sizeByByte = parsedValue * 1048576;
9257
9329
  break;
9258
9330
  case "gb":
9259
- sizeByByte = _tempFileSizeMaxSize * 1073741824;
9331
+ sizeByByte = parsedValue * 1073741824;
9332
+ break;
9333
+ default:
9334
+ // Unknown unit => treat as bytes for backward compatibility
9335
+ console.warn(`[ZuploadComponent] convertSizeToByte: unknown unit, defaulting to bytes.`, {
9336
+ sizeString,
9337
+ unit: sizeType,
9338
+ });
9339
+ sizeByByte = parsedValue;
9260
9340
  break;
9261
9341
  }
9262
9342
  }
9263
9343
  else {
9264
- // default using bytes if no size type
9265
- sizeByByte = parseFloat(_tempFileSize);
9344
+ // Default using bytes if no size type
9345
+ const n = Number.parseFloat(raw);
9346
+ if (Number.isNaN(n) || n < 0) {
9347
+ console.warn(`[ZuploadComponent] convertSizeToByte: invalid numeric bytes value.`, { sizeString });
9348
+ return 0;
9349
+ }
9350
+ sizeByByte = n;
9266
9351
  }
9267
9352
  return sizeByByte;
9268
9353
  }
9354
+ /**
9355
+ * Kendo Upload upload event: validates files, builds image previews, injects metadata and auth header.
9356
+ */
9269
9357
  uploadEventHandler(e) {
9358
+ var _a, _b, _c, _d, _e, _f, _g;
9359
+ if (!((_a = e === null || e === void 0 ? void 0 : e.files) === null || _a === void 0 ? void 0 : _a.length)) {
9360
+ console.warn(`[ZuploadComponent] uploadEventHandler: no files in UploadEvent.`);
9361
+ return;
9362
+ }
9270
9363
  // Image Preview
9271
- const me = this;
9272
9364
  e.files.forEach((file) => {
9273
- if (!me.isValidUploadedFile(me, file)) {
9365
+ var _a, _b;
9366
+ if (!this.isValidUploadedFile(file)) {
9274
9367
  e.preventDefault();
9275
9368
  return;
9276
9369
  }
9277
- else {
9278
- if (file.rawFile && file.rawFile.type.includes("image")) {
9279
- if (!file.validationErrors) {
9280
- const reader = new FileReader();
9281
- reader.onload = function (ev) {
9282
- if (me.data.EnableImagePreview) {
9283
- if (!me.uid.includes(file.uid)) {
9284
- me.uid.push(file.uid);
9285
- me.imagePreviews.push(Object.assign(Object.assign({}, file), { src: reader.result }));
9286
- }
9287
- }
9288
- };
9289
- reader.readAsDataURL(file.rawFile);
9370
+ if (((_b = (_a = file === null || file === void 0 ? void 0 : file.rawFile) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.includes("image")) && !file.validationErrors) {
9371
+ const reader = new FileReader();
9372
+ reader.onload = () => {
9373
+ var _a;
9374
+ if ((_a = this.data) === null || _a === void 0 ? void 0 : _a.EnableImagePreview) {
9375
+ if (!this.uid.includes(file.uid)) {
9376
+ this.uid.push(file.uid);
9377
+ this.imagePreviews.push(Object.assign(Object.assign({}, file), { src: reader.result }));
9378
+ }
9290
9379
  }
9291
- }
9380
+ };
9381
+ reader.readAsDataURL(file.rawFile);
9292
9382
  }
9293
9383
  });
9294
9384
  // Add metadata to the upload event
9295
- let additional = ZComponentHelper.getGroupEvalValue.call(this, this.data.UploadMetaData);
9385
+ let additional = ZComponentHelper.getGroupEvalValue.call(this, (_b = this.data) === null || _b === void 0 ? void 0 : _b.UploadMetaData);
9296
9386
  if (!(additional instanceof UploadMetaData)) {
9297
- console.error("UploadMetaData defined at " + this.data.UploadMetaData + " is invalid: ", additional);
9387
+ console.warn(`[ZuploadComponent] Invalid UploadMetaData at "${(_c = this.data) === null || _c === void 0 ? void 0 : _c.UploadMetaData}". Fallback to default metadata.`, additional);
9298
9388
  additional = new UploadMetaData(null, "0");
9299
9389
  }
9300
9390
  //#region sharepoint
9301
- let attachmentInfo = this.sharePointService.getAttachmentInfo(this.data["DownloadFileConfig"]);
9302
- //add tagging into metadata
9391
+ const attachmentInfo = this.sharePointService.getAttachmentInfo((_d = this.data) === null || _d === void 0 ? void 0 : _d["DownloadFileConfig"]);
9392
+ // Add tagging into metadata
9303
9393
  if (attachmentInfo) {
9304
9394
  if (attachmentInfo.tag) {
9305
9395
  const tag = this.sharePointService.generateTagging(this.group, attachmentInfo.tag);
@@ -9310,155 +9400,277 @@ class ZuploadComponent extends InputFieldBase {
9310
9400
  additional[AttachmentConfig.isSaveToSharePoint] = attachmentInfo.isSaveToSharePoint;
9311
9401
  }
9312
9402
  //#endregion
9313
- const str = JSON.stringify(additional);
9314
- e.data = { additional: str, };
9315
- e.headers = e.headers.append("Authorization", "Bearer " + this.authService.e1AccessToken);
9403
+ additional[AttachmentConfig.projectCode] = (_e = this.data) === null || _e === void 0 ? void 0 : _e.ProjectCode;
9404
+ additional[AttachmentConfig.moduleCode] = (_f = this.data) === null || _f === void 0 ? void 0 : _f.ModuleCode;
9405
+ const payload = JSON.stringify(additional);
9406
+ e.data = { additional: payload };
9407
+ // NOTE: Potentially unsafe: assumes token is always present. Keep behavior but add clearer logging.
9408
+ const token = (_g = this.authService) === null || _g === void 0 ? void 0 : _g.e1AccessToken;
9409
+ if (!token) {
9410
+ console.warn(`[ZuploadComponent] Missing e1AccessToken. Upload may fail due to authorization.`);
9411
+ }
9412
+ e.headers = e.headers.append("Authorization", `Bearer ${token !== null && token !== void 0 ? token : ""}`);
9316
9413
  }
9414
+ /**
9415
+ * Kendo Upload remove event: updates component memory, fires project event if defined,
9416
+ * otherwise attaches required payload and authorization headers.
9417
+ */
9317
9418
  onRemove(e) {
9318
- // remove file from component memory
9319
- const index = this.fileList.findIndex((item) => item.uid === e.files[0].uid);
9419
+ var _a, _b, _c, _d, _e, _f;
9420
+ const file = (_a = e === null || e === void 0 ? void 0 : e.files) === null || _a === void 0 ? void 0 : _a[0];
9421
+ if (!file) {
9422
+ console.warn(`[ZuploadComponent] onRemove: no file found in RemoveEvent.`, { event: e });
9423
+ return;
9424
+ }
9425
+ // Remove file from component memory (for SelectFileOnly flow)
9426
+ const index = this.fileList.findIndex((item) => item.uid === file.uid);
9320
9427
  if (index >= 0) {
9321
9428
  this.fileList.splice(index, 1);
9322
- this.group['zupload_' + this.data.Value] = this.fileList;
9429
+ this.group[`zupload_${(_b = this.data) === null || _b === void 0 ? void 0 : _b.Value}`] = this.fileList;
9323
9430
  }
9324
- if (this.data['FileRemovedEvent']) {
9325
- this.group.subject.next({
9431
+ const removedEvent = (_c = this.data) === null || _c === void 0 ? void 0 : _c["FileRemovedEvent"];
9432
+ if (removedEvent) {
9433
+ (_d = this.group.subject) === null || _d === void 0 ? void 0 : _d.next({
9326
9434
  type: "zupload-fileRemovedEvent",
9327
- target: this.data['FileRemovedEvent'],
9328
- data: e
9435
+ target: removedEvent,
9436
+ data: e,
9329
9437
  });
9438
+ return;
9330
9439
  }
9331
- else {
9332
- const myFile = e.files[0];
9333
- // console.log('remove done: ', e);
9334
- e.data = {
9335
- id: myFile.myUid,
9336
- };
9337
- e.headers = e.headers.append("Authorization", "Bearer " + this.authService.e1AccessToken);
9338
- if (this.data.EnableImagePreview) {
9339
- e.files.forEach((file) => {
9340
- this.imagePreviews = this.imagePreviews.filter(f => f.uid !== file.uid);
9341
- });
9342
- }
9440
+ const myFile = file;
9441
+ // Attach remove payload
9442
+ e.data = { id: myFile.myUid };
9443
+ const token = (_e = this.authService) === null || _e === void 0 ? void 0 : _e.e1AccessToken;
9444
+ if (!token) {
9445
+ console.warn(`[ZuploadComponent] Missing e1AccessToken. Remove may fail due to authorization.`);
9446
+ }
9447
+ e.headers = e.headers.append("Authorization", `Bearer ${token !== null && token !== void 0 ? token : ""}`);
9448
+ // Remove preview if enabled
9449
+ if ((_f = this.data) === null || _f === void 0 ? void 0 : _f.EnableImagePreview) {
9450
+ e.files.forEach((f) => {
9451
+ this.imagePreviews = this.imagePreviews.filter((p) => (p === null || p === void 0 ? void 0 : p["uid"]) !== f.uid);
9452
+ });
9343
9453
  }
9454
+ console.info(`[ZuploadComponent] Remove requested.`, { name: myFile.name, uid: myFile.uid, myUid: myFile.myUid });
9344
9455
  }
9345
- onChange(file) {
9346
- if (this.data['FileChangedEvent']) {
9347
- this.group.subject.next({
9348
- type: "zupload-fileChangedEvent",
9349
- target: this.data['FileChangedEvent'],
9350
- data: file
9351
- });
9456
+ /**
9457
+ * Kendo Upload change event handler. Emits project event if configured.
9458
+ */
9459
+ onChange(files) {
9460
+ var _a, _b;
9461
+ const changedEvent = (_a = this.data) === null || _a === void 0 ? void 0 : _a["FileChangedEvent"];
9462
+ if (!changedEvent) {
9463
+ return;
9352
9464
  }
9465
+ (_b = this.group.subject) === null || _b === void 0 ? void 0 : _b.next({
9466
+ type: "zupload-fileChangedEvent",
9467
+ target: changedEvent,
9468
+ data: files,
9469
+ });
9353
9470
  }
9354
- isValidUploadedFile(me, file) {
9355
- const fileSize = file.rawFile.size;
9356
- const fileExtension = file.rawFile.name.split('.').pop().toLowerCase();
9357
- // Check if file size and extension are valid
9358
- if (fileSize > me.restrictions.maxFileSize || !me.restrictions.allowedExtensions.includes(fileExtension)) {
9359
- let errorMessage = 'Error: ';
9360
- if (!me.restrictions.allowedExtensions.includes(fileExtension)) {
9361
- errorMessage = `Invalid file type. Allowed types are: ${me.restrictions.allowedExtensions.join(', ')}.`;
9362
- }
9363
- else if (fileSize > me.restrictions.maxFileSize) {
9364
- errorMessage = `File size cannot exceeds ${me.formatFileSize(me.restrictions.maxFileSize)}.`;
9365
- }
9366
- me.alertService.showOkay('Failed to upload', errorMessage, ['col-4']);
9471
+ /**
9472
+ * Validate a selected/uploaded file against configured restrictions (size + extension).
9473
+ *
9474
+ * @param file Kendo FileInfo
9475
+ * @returns true if file passes restrictions, otherwise false (and shows alert).
9476
+ */
9477
+ isValidUploadedFile(file) {
9478
+ var _a, _b, _c, _d, _e, _f, _g;
9479
+ const rawFile = file === null || file === void 0 ? void 0 : file.rawFile;
9480
+ if (!rawFile) {
9481
+ // NOTE: Kendo can provide FileInfo without rawFile in some events. Preserve behavior: treat as invalid.
9482
+ console.warn(`[ZuploadComponent] File validation failed: rawFile is missing.`, { file });
9483
+ this.alertService.showOkay("Failed to upload", "File is not available for upload.", ["col-4"]);
9484
+ return false;
9485
+ }
9486
+ const fileSize = (_a = rawFile.size) !== null && _a !== void 0 ? _a : 0;
9487
+ // Keep original behavior: uses last segment after dot.
9488
+ // NOTE: Potentially unsafe for files without extension; will result in empty extension.
9489
+ const fileExtension = ((_c = (_b = rawFile.name) === null || _b === void 0 ? void 0 : _b.split(".").pop()) !== null && _c !== void 0 ? _c : "").toLowerCase();
9490
+ const max = (_e = (_d = this.restrictions) === null || _d === void 0 ? void 0 : _d.maxFileSize) !== null && _e !== void 0 ? _e : 0;
9491
+ const allowed = (_g = (_f = this.restrictions) === null || _f === void 0 ? void 0 : _f.allowedExtensions) !== null && _g !== void 0 ? _g : [];
9492
+ const isExtensionAllowed = allowed.includes(fileExtension);
9493
+ const isSizeAllowed = fileSize <= max;
9494
+ if (!isExtensionAllowed || !isSizeAllowed) {
9495
+ let errorMessage = "Error:";
9496
+ if (!isExtensionAllowed) {
9497
+ errorMessage = `Invalid file type "${fileExtension || "unknown"}". Allowed types: ${allowed.join(", ")}.`;
9498
+ }
9499
+ else if (!isSizeAllowed) {
9500
+ errorMessage = `File size cannot exceed ${this.formatFileSize(max)}.`;
9501
+ }
9502
+ console.warn(`[ZuploadComponent] File rejected by restrictions.`, {
9503
+ name: rawFile.name,
9504
+ size: fileSize,
9505
+ extension: fileExtension,
9506
+ maxAllowedBytes: max,
9507
+ allowedExtensions: allowed,
9508
+ });
9509
+ this.alertService.showOkay("Failed to upload", errorMessage, ["col-4"]);
9367
9510
  return false;
9368
9511
  }
9369
9512
  return true;
9370
9513
  }
9514
+ /**
9515
+ * Kendo Upload select event handler:
9516
+ * - Handles SharePoint endpoint switching
9517
+ * - Supports SelectFileOnly mode (read file content into memory and emit event)
9518
+ * - Supports image compression when AutoUpload is false
9519
+ */
9371
9520
  selectEventHandler(e) {
9372
- const me = this;
9521
+ var _a, _b, _c, _d, _e, _f, _g;
9522
+ if (!((_a = e === null || e === void 0 ? void 0 : e.files) === null || _a === void 0 ? void 0 : _a.length)) {
9523
+ console.warn(`[ZuploadComponent] selectEventHandler: no files in SelectEvent.`);
9524
+ return;
9525
+ }
9526
+ // Reset to default every selection to avoid SharePoint URL "sticking" permanently.
9527
+ this.uploadSaveUrl = this.defaultUploadSaveUrl;
9528
+ this.uploadRemoveUrl = this.defaultUploadRemoveUrl;
9373
9529
  //#region sharepoint
9374
- const attachmentInfo = this.sharePointService.getAttachmentInfo(this.data["DownloadFileConfig"]);
9530
+ const attachmentInfo = this.sharePointService.getAttachmentInfo((_b = this.data) === null || _b === void 0 ? void 0 : _b["DownloadFileConfig"]);
9375
9531
  // Change uploadSaveUrl if saving to SharePoint
9376
- if (attachmentInfo && attachmentInfo.isSaveToSharePoint && attachmentInfo.siteName) {
9377
- const attachmentSourceUrl = this.zcoreService.getEnvironment().attachmentSourceUrl;
9378
- this.uploadSaveUrl = attachmentSourceUrl + '/Chunk_Upload_Save';
9532
+ if ((attachmentInfo === null || attachmentInfo === void 0 ? void 0 : attachmentInfo.isSaveToSharePoint) && attachmentInfo.siteName) {
9533
+ const attachmentSourceUrl = (_c = this.zcoreService.getEnvironment()) === null || _c === void 0 ? void 0 : _c.attachmentSourceUrl;
9534
+ if (attachmentSourceUrl) {
9535
+ this.uploadSaveUrl = `${attachmentSourceUrl}/Chunk_Upload_Save`;
9536
+ console.info(`[ZuploadComponent] Upload endpoint switched to SharePoint mode.`, { uploadSaveUrl: this.uploadSaveUrl });
9537
+ }
9538
+ else {
9539
+ console.warn(`[ZuploadComponent] attachmentSourceUrl is missing. Cannot switch to SharePoint upload endpoint.`);
9540
+ }
9379
9541
  }
9380
9542
  //#endregion
9381
- if (this.data['SelectFileOnly']) {
9543
+ if ((_d = this.data) === null || _d === void 0 ? void 0 : _d["SelectFileOnly"]) {
9382
9544
  // Append all files to component memory
9383
- e.files.forEach((file) => __awaiter(this, void 0, void 0, function* () {
9384
- if (me.isValidUploadedFile(me, file)) {
9385
- if (file.rawFile) {
9386
- const reader = new FileReader();
9387
- reader.onload = function (ev) {
9388
- // Clone the data and also add the read file to the object
9389
- const fileData = Object.assign({}, file);
9390
- fileData['file'] = ev.target["result"];
9391
- // Push to component fileList
9392
- me.fileList.push(fileData);
9393
- me.group['zupload_' + me.data.Value] = me.fileList;
9394
- if (me.data['FileSelectedEvent']) {
9395
- // Call the project event
9396
- me.group.subject.next({
9397
- type: "zupload-fileSelectedEvent",
9398
- target: me.data['FileSelectedEvent'],
9399
- data: me.fileList
9400
- });
9401
- }
9402
- };
9403
- yield reader.readAsDataURL(file.rawFile);
9404
- }
9545
+ e.files.forEach((file) => {
9546
+ if (!this.isValidUploadedFile(file)) {
9547
+ e.preventDefault();
9548
+ return;
9405
9549
  }
9406
- else {
9550
+ if (!file.rawFile) {
9407
9551
  e.preventDefault();
9552
+ return;
9408
9553
  }
9409
- }));
9554
+ const reader = new FileReader();
9555
+ reader.onload = (ev) => {
9556
+ var _a, _b, _c, _d, _e, _f;
9557
+ // Clone the data and also add the read file to the object
9558
+ const fileData = Object.assign(Object.assign({}, file), { file: (_b = (_a = ev === null || ev === void 0 ? void 0 : ev.target) === null || _a === void 0 ? void 0 : _a.result) !== null && _b !== void 0 ? _b : null });
9559
+ fileData["file"] = (_c = ev === null || ev === void 0 ? void 0 : ev.target) === null || _c === void 0 ? void 0 : _c.result;
9560
+ // Push to component fileList
9561
+ this.fileList.push(fileData);
9562
+ this.group[`zupload_${(_d = this.data) === null || _d === void 0 ? void 0 : _d.Value}`] = this.fileList;
9563
+ const selectedEvent = (_e = this.data) === null || _e === void 0 ? void 0 : _e["FileSelectedEvent"];
9564
+ if (selectedEvent) {
9565
+ (_f = this.group.subject) === null || _f === void 0 ? void 0 : _f.next({
9566
+ type: "zupload-fileSelectedEvent",
9567
+ target: selectedEvent,
9568
+ data: this.fileList,
9569
+ });
9570
+ }
9571
+ };
9572
+ reader.onerror = () => {
9573
+ var _a;
9574
+ console.warn(`[ZuploadComponent] Failed to read file as base64.`, {
9575
+ name: (_a = file.rawFile) === null || _a === void 0 ? void 0 : _a.name,
9576
+ uid: file.uid,
9577
+ error: reader.error,
9578
+ });
9579
+ };
9580
+ reader.readAsDataURL(file.rawFile);
9581
+ });
9582
+ return;
9410
9583
  }
9411
- else {
9412
- // Only workable for Auto Upload = false
9413
- if (!this.data.AutoUpload) {
9414
- // Compression for image file
9415
- const imageCompressionEnabled = this.data.Compression ? true : false;
9416
- //Check if Image Compression is enabled.
9417
- if (imageCompressionEnabled === true) {
9418
- e.files.forEach((file) => {
9419
- if (me.isValidUploadedFile(me, file)) {
9420
- // Compress only if it is an image file
9421
- if (file.rawFile && file.rawFile.type.includes("image")) {
9422
- if (!file.validationErrors) {
9423
- const imgConfig = this.compressionConfigHandler(this.data.Compression);
9424
- if (file.size > imgConfig.FileSizeMinSizeByte) {
9425
- me.compressImage.compress(file.rawFile, imgConfig) //Pass in parameter to set the Compression Options
9426
- .pipe(take(1))
9427
- .subscribe(compressFile => {
9428
- this.ngZone.run(() => {
9429
- file.rawFile = compressFile;
9430
- file.size = compressFile.size;
9431
- // Push to component fileList
9432
- me.fileList.push(Object.assign({}, file));
9433
- const reader = new FileReader();
9434
- reader.readAsDataURL(file.rawFile);
9435
- });
9436
- console.log(`Compressed file size: ${(file.rawFile.size / 1024).toFixed(2)}KB`);
9437
- });
9438
- } // file size check
9439
- } // validationErrors check
9440
- } // file type check
9441
- }
9442
- else {
9443
- e.preventDefault();
9444
- }
9445
- }); // loop each file
9446
- } // imagecompression check
9447
- // add to group scope
9448
- me.group['zupload_' + me.data.Value] = e.files;
9449
- }
9584
+ // Only workable for Auto Upload = false
9585
+ if ((_e = this.data) === null || _e === void 0 ? void 0 : _e.AutoUpload) {
9586
+ return;
9587
+ }
9588
+ // Compression for image file
9589
+ const imageCompressionEnabled = Boolean((_f = this.data) === null || _f === void 0 ? void 0 : _f.Compression);
9590
+ // Check if Image Compression is enabled.
9591
+ if (imageCompressionEnabled) {
9592
+ e.files.forEach((file) => {
9593
+ var _a, _b, _c;
9594
+ if (!this.isValidUploadedFile(file)) {
9595
+ e.preventDefault();
9596
+ return;
9597
+ }
9598
+ // Compress only if it is an image file
9599
+ if (!((_b = (_a = file === null || file === void 0 ? void 0 : file.rawFile) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.includes("image")) || file.validationErrors) {
9600
+ return;
9601
+ }
9602
+ const imgConfig = this.compressionConfigHandler(this.data.Compression);
9603
+ const minBytes = (_c = imgConfig === null || imgConfig === void 0 ? void 0 : imgConfig.FileSizeMinSizeByte) !== null && _c !== void 0 ? _c : 0;
9604
+ // Original behavior: only compress if file size > minBytes
9605
+ if (file.size <= minBytes) {
9606
+ return;
9607
+ }
9608
+ this.compressImage
9609
+ .compress(file.rawFile, imgConfig) // Pass in parameter to set the Compression Options
9610
+ .pipe(take(1))
9611
+ .subscribe({
9612
+ next: (compressFile) => {
9613
+ var _a;
9614
+ this.ngZone.run(() => {
9615
+ file.rawFile = compressFile;
9616
+ file.size = compressFile.size;
9617
+ // Push to component fileList (kept as original intent)
9618
+ const fileData = Object.assign({}, file);
9619
+ this.fileList.push(fileData);
9620
+ // Keep original: read to data URL (side effect)
9621
+ const reader = new FileReader();
9622
+ reader.readAsDataURL(file.rawFile);
9623
+ });
9624
+ console.info(`[ZuploadComponent] Image compressed successfully.`, {
9625
+ name: (_a = file === null || file === void 0 ? void 0 : file.rawFile) === null || _a === void 0 ? void 0 : _a.name,
9626
+ newSizeKB: Number((file.rawFile.size / 1024).toFixed(2)),
9627
+ });
9628
+ },
9629
+ error: (err) => {
9630
+ var _a;
9631
+ // Preserve flow (do not block selection), but provide clearer diagnostic
9632
+ console.error(`[ZuploadComponent] Image compression failed. Upload will continue with original file.`, {
9633
+ name: (_a = file === null || file === void 0 ? void 0 : file.rawFile) === null || _a === void 0 ? void 0 : _a.name,
9634
+ error: err,
9635
+ });
9636
+ },
9637
+ });
9638
+ });
9450
9639
  }
9640
+ // Add to group scope (original behavior: store selected files)
9641
+ this.group[`zupload_${(_g = this.data) === null || _g === void 0 ? void 0 : _g.Value}`] = e.files;
9451
9642
  }
9643
+ /**
9644
+ * Clears UI-selected files and syncs group state.
9645
+ * NOTE: Original behavior sets group value to fileList (not empty); preserved.
9646
+ */
9452
9647
  clearFiles() {
9648
+ var _a;
9649
+ if (!this.uploadComponent) {
9650
+ console.warn(`[ZuploadComponent] clearFiles: uploadComponent is not ready.`);
9651
+ return;
9652
+ }
9453
9653
  this.uploadComponent.clearFiles();
9454
- this.group['zupload_' + this.data.Value] = this.fileList;
9654
+ this.group[`zupload_${(_a = this.data) === null || _a === void 0 ? void 0 : _a.Value}`] = this.fileList;
9655
+ console.info(`[ZuploadComponent] Files cleared from UI.`, {
9656
+ storedFileListCount: this.fileList.length,
9657
+ });
9455
9658
  }
9659
+ /**
9660
+ * Format bytes into human-readable string.
9661
+ *
9662
+ * @param bytes Raw byte size
9663
+ * @returns Formatted file size string (e.g. "12.5MB")
9664
+ */
9456
9665
  formatFileSize(bytes) {
9457
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
9458
- if (bytes === 0)
9459
- return '0 Byte';
9666
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
9667
+ if (!Number.isFinite(bytes) || bytes <= 0) {
9668
+ return "0 Byte";
9669
+ }
9460
9670
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
9461
- return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + sizes[i];
9671
+ const value = bytes / Math.pow(1024, i);
9672
+ // NOTE: Original output had no space between number and unit; preserved.
9673
+ return `${Number.parseFloat(value.toFixed(2))}${sizes[i]}`;
9462
9674
  }
9463
9675
  }
9464
9676
  ZuploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZuploadComponent, deps: [{ token: ZComponentService }, { token: i2.AuthService }, { token: i2.CompressImageService }, { token: i2.ZCoreService }, { token: i0.NgZone }, { token: i2.SharePointService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component });
@@ -9468,7 +9680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
9468
9680
  args: [{ selector: "app-zupload", template: "<div [formGroup]=\"form\" class=\"zupload-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <kendo-upload\r\n *ngIf=\"!data.SelectFileOnly\"\r\n #uploadComponent\r\n [id]=\"data.Value\"\r\n [autoUpload]=\"isAutoUpload\"\r\n [saveUrl]=\"uploadSaveUrl\"\r\n [removeUrl]=\"uploadRemoveUrl\"\r\n [restrictions]=\"restrictions\"\r\n [multiple]=\"isMultiple\"\r\n [chunkable]=\"chunkSettings\"\r\n [showFileList]=\"showFileList\"\r\n (select)=\"selectEventHandler($event)\"\r\n (remove)=\"onRemove($event)\"\r\n (success)=\"onSuccess($event)\"\r\n (upload)=\"uploadEventHandler($event)\"\r\n [style]=\"componentProperties.style.style1\"\r\n class=\"e1tag-style1\">\r\n </kendo-upload>\r\n\r\n <kendo-fileselect\r\n *ngIf=\"data.SelectFileOnly\"\r\n #uploadComponent\r\n [id]=\"data.Value\"\r\n (select)=\"selectEventHandler($event)\"\r\n (remove)=\"onRemove($event)\"\r\n [formControlName]=\"data.Value\"\r\n (valueChange)=\"onChange($event)\" \r\n [restrictions]=\"restrictions\"\r\n [style]=\"componentProperties.style.style1\"\r\n class=\"e1tag-style1\">\r\n </kendo-fileselect>\r\n\r\n <div\r\n *ngIf=\"imagePreviews.length\"\r\n class=\"image-preview-container e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <div\r\n class=\"label-container e1tag-style3\"\r\n [style]=\"componentProperties.style.style3\">\r\n Image Preview:\r\n </div>\r\n <div\r\n class=\"image-container e1tag-style4\"\r\n [style]=\"componentProperties.style.style4\">\r\n <img\r\n *ngFor=\"let image of imagePreviews\"\r\n [src]=\"image.src\"\r\n alt=\"image preview\"\r\n height=\"100\"\r\n class=\"e1tag-style5\"\r\n [style]=\"componentProperties.style.style5\" />\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".image-preview-container{border:1px solid rgba(0,0,0,.08)}.image-preview-container>.label-container{margin:5px}\n"] }]
9469
9681
  }], ctorParameters: function () { return [{ type: ZComponentService }, { type: i2.AuthService }, { type: i2.CompressImageService }, { type: i2.ZCoreService }, { type: i0.NgZone }, { type: i2.SharePointService }, { type: i2.AlertService }]; }, propDecorators: { uploadComponent: [{
9470
9682
  type: ViewChild,
9471
- args: ["uploadComponent"]
9683
+ args: ["uploadComponent", { static: false }]
9472
9684
  }] } });
9473
9685
 
9474
9686
  /********** Angular **********/
@@ -9539,75 +9751,181 @@ class ZtexteditorComponent extends InputFieldBase {
9539
9751
  };
9540
9752
  this.isCompressModeOn = false;
9541
9753
  this.CloseEnlargeBtn = false;
9542
- this.style = "";
9543
- this.CompressionEnableIcon = 'k-i-zoom-best-fit';
9544
- this.CompressionDisabledIcon = 'k-i-zoom-actual-size';
9754
+ this.originalInlineStyle = '';
9755
+ this.compressionEnableIcon = 'k-i-zoom-best-fit';
9756
+ this.compressionDisabledIcon = 'k-i-zoom-actual-size';
9545
9757
  }
9758
+ /** Initialize component state and editor configuration. */
9546
9759
  ngOnInit() {
9760
+ var _a;
9547
9761
  super.setupInnerField();
9548
- this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer'; // || 'default';
9762
+ // Backward-compatible default: when not provided, use explorer.
9763
+ this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer';
9549
9764
  this.setupPasteCleanupSettings();
9550
9765
  super.setupComponentSettings(this.componentSettings);
9551
9766
  super.focusOnDefault(this.focus.bind(this));
9552
- this.isCompressModeOn = !!this.data.Compression;
9767
+ // Safe cast to boolean.
9768
+ this.isCompressModeOn = !!((_a = this.data) === null || _a === void 0 ? void 0 : _a.Compression);
9553
9769
  }
9770
+ /** Notify component service once view is ready. */
9554
9771
  ngAfterViewInit() {
9555
9772
  this.componentService.decrementComponentCounterForField(this.data);
9556
9773
  }
9774
+ /** Sync editor content to zModel and trigger configured change handler. */
9557
9775
  onChange(value) {
9558
9776
  ZComponentHelper.setToZModel(this.data.Value, value, this.group, this.data);
9559
- this.triggerEvent("inputfield-onChange", this.data.OnChange, value);
9777
+ this.triggerEvent('inputfield-onChange', this.data.OnChange, value);
9560
9778
  }
9561
- onPaste($event) {
9779
+ /** Handle paste: normalize plain-text special entities, then optionally compress pasted base64 images. */
9780
+ onPaste(e) {
9562
9781
  return __awaiter(this, void 0, void 0, function* () {
9563
- const imageCompressionEnabled = !!this.data.Compression;
9564
- if (imageCompressionEnabled && this.isCompressModeOn) {
9565
- let beforeSize = 0;
9566
- let afterSize = 0;
9567
- const parser = new DOMParser();
9568
- const doc = parser.parseFromString($event.cleanedHtml, 'text/html');
9569
- const imgElements = Array.from(doc.querySelectorAll('img')).filter(dom => dom.src.startsWith('data:image/'));
9570
- yield Promise.all(imgElements.map((imgTags, index) => __awaiter(this, void 0, void 0, function* () {
9571
- const file = yield this.base64ToFile(imgTags.src, "image" + index.toString());
9572
- beforeSize += file.size;
9573
- const compress = yield this.ImageCompression(file);
9574
- if (compress != null) {
9575
- const base64 = yield this.readFileAsDataURL(compress);
9576
- afterSize += compress.size;
9577
- imgTags.src = base64;
9578
- }
9579
- else {
9580
- console.log('Image compress failed');
9581
- }
9582
- })));
9583
- console.log(`Before Image compress size: ${(beforeSize / 1024).toFixed(2)}KB`);
9584
- console.log(`After Image compress size: ${(afterSize / 1024).toFixed(2)}KB`);
9585
- this.editor.value = doc.body.innerHTML;
9782
+ if (!e) {
9783
+ console.warn('[Ztexteditor] Paste event is undefined. Paste ignored.');
9784
+ return;
9586
9785
  }
9786
+ // Common Excel/plain-text issue: "&amp;" gets inserted literally causing "&amp;amp;" in HTML.
9787
+ this.handleCommonSymbolTags(e);
9788
+ // Compress only if enabled and base64 images exist.
9789
+ yield this.handleImageCompression(e);
9587
9790
  });
9588
9791
  }
9589
- OnOffCompressMode($event) {
9590
- debugger;
9591
- const alertHeader = `Confirmation`;
9592
- const alertMessage = `Do you want to <b>${this.isCompressModeOn ? 'disable' : 'enable'}</b> image compression when input content? <br/> Note: Click "Yes" the content will be reset to blank.`;
9593
- const buttonConfig = {
9792
+ /**
9793
+ * If the paste is plain text (no HTML tags and no images), normalize common entities and insert as real text.
9794
+ * Returns true when the event is handled and default paste is prevented.
9795
+ */
9796
+ handleCommonSymbolTags(e) {
9797
+ var _a, _b, _c, _d;
9798
+ const editor = this.editor;
9799
+ if (!editor) {
9800
+ console.warn('[Ztexteditor] Editor is not ready. Cannot handle plain-text normalization.');
9801
+ return false;
9802
+ }
9803
+ const clipboard = (_a = e.originalEvent) === null || _a === void 0 ? void 0 : _a.clipboardData;
9804
+ const plainText = (_b = clipboard === null || clipboard === void 0 ? void 0 : clipboard.getData('text/plain')) !== null && _b !== void 0 ? _b : '';
9805
+ const htmlText = (_c = clipboard === null || clipboard === void 0 ? void 0 : clipboard.getData('text/html')) !== null && _c !== void 0 ? _c : '';
9806
+ const cleanedHtml = (_d = e.cleanedHtml) !== null && _d !== void 0 ? _d : '';
9807
+ const htmlHasImg = /<img\b/i.test(htmlText);
9808
+ const cleanedHasTags = /<[^>]+>/.test(cleanedHtml);
9809
+ // If paste has HTML tags or images, do NOT interfere (let Kendo handle it).
9810
+ if (htmlHasImg || cleanedHasTags) {
9811
+ return false;
9812
+ }
9813
+ // Plain-text paste: prevent Kendo from inserting encoded entities as literal text.
9814
+ e.preventDefault();
9815
+ // Decode common entities once so user sees correct characters.
9816
+ // This is intentionally limited to common entities to avoid unexpected transformations.
9817
+ const normalized = (plainText || cleanedHtml)
9818
+ .replaceAll('&amp;', '&')
9819
+ .replaceAll('&lt;', '<')
9820
+ .replaceAll('&gt;', '>')
9821
+ .replaceAll('&quot;', '"')
9822
+ .replaceAll('&#39;', "'");
9823
+ editor.exec('insertText', { text: normalized });
9824
+ return true;
9825
+ }
9826
+ /**
9827
+ * If compression is enabled and compress mode is ON, compress any pasted base64 images (data:image/*).
9828
+ * IMPORTANT: modifies e.cleanedHtml (what gets pasted), not editor.value.
9829
+ */
9830
+ handleImageCompression(e) {
9831
+ var _a, _b;
9832
+ return __awaiter(this, void 0, void 0, function* () {
9833
+ const compressionConfig = (_a = this.data) === null || _a === void 0 ? void 0 : _a.Compression;
9834
+ const isCompressionEnabled = !!compressionConfig;
9835
+ if (!isCompressionEnabled || !this.isCompressModeOn) {
9836
+ return;
9837
+ }
9838
+ const cleaned = (_b = e.cleanedHtml) !== null && _b !== void 0 ? _b : '';
9839
+ if (!cleaned) {
9840
+ return;
9841
+ }
9842
+ let doc;
9843
+ try {
9844
+ doc = new DOMParser().parseFromString(cleaned, 'text/html');
9845
+ }
9846
+ catch (err) {
9847
+ console.warn('[Ztexteditor] Failed to parse pasted HTML for image compression. Paste will continue.', err);
9848
+ return;
9849
+ }
9850
+ const imgElements = Array.from(doc.querySelectorAll('img'))
9851
+ .map(img => img)
9852
+ .filter(img => typeof (img === null || img === void 0 ? void 0 : img.src) === 'string' && img.src.startsWith('data:image/'));
9853
+ if (imgElements.length === 0) {
9854
+ return;
9855
+ }
9856
+ let beforeSizeBytes = 0;
9857
+ let afterSizeBytes = 0;
9858
+ let failedCount = 0;
9859
+ yield Promise.all(imgElements.map((img, index) => __awaiter(this, void 0, void 0, function* () {
9860
+ const src = img.src;
9861
+ try {
9862
+ const file = yield this.base64ToFile(src, `pasted-image-${index}`);
9863
+ beforeSizeBytes += file.size;
9864
+ const compressed = yield this.imageCompression(file);
9865
+ if (!compressed) {
9866
+ failedCount++;
9867
+ console.warn(`[Ztexteditor] Image compression skipped/failed for pasted image #${index + 1}.`);
9868
+ return;
9869
+ }
9870
+ const base64 = yield this.readFileAsDataURL(compressed);
9871
+ afterSizeBytes += compressed.size;
9872
+ img.src = base64;
9873
+ }
9874
+ catch (err) {
9875
+ failedCount++;
9876
+ console.warn(`[Ztexteditor] Error compressing pasted image #${index + 1}.`, err);
9877
+ }
9878
+ })));
9879
+ // Helpful console logs for troubleshooting.
9880
+ const beforeKb = (beforeSizeBytes / 1024).toFixed(2);
9881
+ const afterKb = (afterSizeBytes / 1024).toFixed(2);
9882
+ console.log(`[Ztexteditor] Pasted image compression completed. Images=${imgElements.length}, Failed=${failedCount}, Before=${beforeKb}KB, After=${afterKb}KB`);
9883
+ // Modify what gets pasted, not editor.value.
9884
+ e.cleanedHtml = doc.body.innerHTML;
9885
+ });
9886
+ }
9887
+ /**
9888
+ * Toggle compress mode via confirmation dialog.
9889
+ */
9890
+ onOffCompressMode(event) {
9891
+ const header = 'Confirmation';
9892
+ const actionText = this.isCompressModeOn ? 'disable' : 'enable';
9893
+ // Keep existing behavior: toggling resets content.
9894
+ const message = `Do you want to <b>${actionText}</b> image compression when input content?` +
9895
+ `<br/>Note: Click "Yes" the content will be reset to blank.`;
9896
+ const buttons = {
9594
9897
  yes: { text: 'Yes', cssClass: 'primary' },
9595
- no: { text: 'No', cssClass: 'secondary' }
9898
+ no: { text: 'No', cssClass: 'secondary' },
9596
9899
  };
9597
- this.alertService.show(alertHeader, alertMessage, [buttonConfig.yes, buttonConfig.no], ['col-4'])
9900
+ this.alertService
9901
+ .show(header, message, [buttons.yes, buttons.no], ['col-4'])
9598
9902
  .subscribe(reply => {
9599
- if (reply === 'Yes') {
9600
- this.editor.value = "";
9601
- this.isCompressModeOn = !this.isCompressModeOn;
9602
- let button = $event.target;
9603
- button.classList.remove(this.CompressionEnableIcon);
9604
- button.classList.remove(this.CompressionDisabledIcon);
9605
- button.classList.add(this.isCompressModeOn ? this.CompressionDisabledIcon : this.CompressionEnableIcon);
9903
+ if (reply !== 'Yes') {
9904
+ return;
9905
+ }
9906
+ const editor = this.editor;
9907
+ if (!editor) {
9908
+ console.warn('[Ztexteditor] Editor is not ready. Cannot toggle compression mode.');
9909
+ return;
9910
+ }
9911
+ editor.value = '';
9912
+ this.isCompressModeOn = !this.isCompressModeOn;
9913
+ // Update toolbar icon classes safely.
9914
+ const buttonEl = this.getEventTargetElement(event);
9915
+ if (!buttonEl) {
9916
+ console.warn('[Ztexteditor] Unable to resolve toolbar button element from event.');
9917
+ }
9918
+ else {
9919
+ buttonEl.classList.remove(this.compressionEnableIcon, this.compressionDisabledIcon);
9920
+ buttonEl.classList.add(this.isCompressModeOn ? this.compressionDisabledIcon : this.compressionEnableIcon);
9921
+ }
9922
+ if (this.compress_btn) {
9606
9923
  this.compress_btn.title = `${this.isCompressModeOn ? 'Disable' : 'Enable'} image compression`;
9607
- this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, "success");
9608
9924
  }
9925
+ this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, 'success');
9609
9926
  });
9610
9927
  }
9928
+ /** Focus editor if available. Returns true if focus succeeded. */
9611
9929
  focus() {
9612
9930
  if (this.editor) {
9613
9931
  this.editor.focus();
@@ -9622,102 +9940,194 @@ class ZtexteditorComponent extends InputFieldBase {
9622
9940
  }
9623
9941
  return iconName;
9624
9942
  }
9943
+ /** Merge paste cleanup options from data.Options (string expression or object) into pasteCleanupSettings. */
9625
9944
  setupPasteCleanupSettings() {
9626
- if (this.data.Options) {
9627
- if (typeof this.data.Options == 'string') {
9628
- const option = ZComponentHelper.getGroupValue(this.data.Options, this.group);
9629
- Object.assign(this.pasteCleanupSettings, option);
9945
+ var _a;
9946
+ const options = (_a = this.data) === null || _a === void 0 ? void 0 : _a.Options;
9947
+ if (!options) {
9948
+ return;
9949
+ }
9950
+ if (typeof options === 'string') {
9951
+ const resolved = ZComponentHelper.getGroupValue(options, this.group);
9952
+ if (resolved && typeof resolved === 'object') {
9953
+ Object.assign(this.pasteCleanupSettings, resolved);
9630
9954
  }
9631
- else if (typeof this.data.Options == 'object') {
9632
- Object.assign(this.pasteCleanupSettings, this.data.Options);
9955
+ else {
9956
+ console.warn('[Ztexteditor] data.Options resolved value is not an object. Paste cleanup settings unchanged.', {
9957
+ resolved,
9958
+ });
9633
9959
  }
9960
+ return;
9961
+ }
9962
+ if (typeof options === 'object') {
9963
+ Object.assign(this.pasteCleanupSettings, options);
9964
+ return;
9634
9965
  }
9966
+ console.warn('[Ztexteditor] Unsupported data.Options type. Paste cleanup settings unchanged.', {
9967
+ type: typeof options,
9968
+ });
9635
9969
  }
9636
- // #region Custom Image Upload
9970
+ // #region Custom Image Upload / Enlarge
9971
+ /** Trigger hidden file input click for image upload. */
9637
9972
  openFileExplorer() {
9638
- const input = document.getElementById(`${this.data.Value}-upload-file`);
9639
- if (input) {
9640
- input.click();
9973
+ const id = `${this.data.Value}-upload-file`;
9974
+ const input = document.getElementById(id);
9975
+ if (!input) {
9976
+ console.warn(`[Ztexteditor] Upload input element not found (id="${id}").`);
9977
+ return;
9641
9978
  }
9979
+ input.click();
9642
9980
  }
9981
+ /** Open an enlarged popup editor. */
9643
9982
  openPopup() {
9644
- if (this.editor) {
9645
- // Open the popup
9646
- this.dialogRef = this.dialogService.open({
9647
- content: ZtexteditorComponent,
9648
- width: '98%',
9649
- height: '97%'
9650
- });
9651
- const texteditor = this.dialogRef.content.instance;
9652
- texteditor.data = this.data;
9653
- texteditor.data.AllowEnlarge = false;
9654
- texteditor.dialogRef = this.dialogRef;
9655
- texteditor.CloseEnlargeBtn = true;
9656
- texteditor.componentProperties = this.componentProperties;
9657
- this.style = this.componentProperties.style.style1;
9658
- texteditor.componentProperties.style.style1 += "height:" + (window.innerHeight * 0.8).toString() + "px";
9659
- texteditor.group = this.group;
9660
- texteditor.componentSettings = this.componentSettings;
9661
- texteditor.form = this.form;
9662
- //To set the html back into the target ztext editor.
9663
- this.dialogRef.result.subscribe(() => {
9664
- this.data.AllowEnlarge = true;
9665
- this.componentProperties.style.style1 = this.style;
9666
- this.editor.value = this.group.zModel[this.data.Value];
9667
- this.onChange(this.group.zModel[this.data.Value]);
9668
- this.focus();
9669
- });
9983
+ var _a, _b, _c, _d, _e;
9984
+ const editor = this.editor;
9985
+ if (!editor) {
9986
+ console.warn('[Ztexteditor] Editor is not ready. Cannot open popup.');
9987
+ return;
9670
9988
  }
9989
+ // Open dialog
9990
+ this.dialogRef = this.dialogService.open({
9991
+ content: ZtexteditorComponent,
9992
+ width: '98%',
9993
+ height: '97%',
9994
+ });
9995
+ const popupComponent = this.dialogRef.content.instance;
9996
+ popupComponent.data = this.data;
9997
+ popupComponent.data.AllowEnlarge = false;
9998
+ popupComponent.dialogRef = this.dialogRef;
9999
+ popupComponent.CloseEnlargeBtn = true;
10000
+ popupComponent.componentProperties = this.componentProperties;
10001
+ // Preserve style so we can restore it on close.
10002
+ this.originalInlineStyle = (_c = (_b = (_a = this.componentProperties) === null || _a === void 0 ? void 0 : _a.style) === null || _b === void 0 ? void 0 : _b.style1) !== null && _c !== void 0 ? _c : '';
10003
+ if ((_d = popupComponent.componentProperties) === null || _d === void 0 ? void 0 : _d.style) {
10004
+ popupComponent.componentProperties.style.style1 =
10005
+ ((_e = popupComponent.componentProperties.style.style1) !== null && _e !== void 0 ? _e : '') +
10006
+ `height:${(window.innerHeight * 0.8).toString()}px`;
10007
+ }
10008
+ popupComponent.group = this.group;
10009
+ popupComponent.componentSettings = this.componentSettings;
10010
+ popupComponent.form = this.form;
10011
+ // Restore state and push value back into editor on close.
10012
+ this.dialogRef.result.subscribe(() => {
10013
+ var _a, _b, _c;
10014
+ this.data.AllowEnlarge = true;
10015
+ if ((_a = this.componentProperties) === null || _a === void 0 ? void 0 : _a.style) {
10016
+ this.componentProperties.style.style1 = this.originalInlineStyle;
10017
+ }
10018
+ // Pull current zModel into editor and trigger onChange (existing behavior).
10019
+ const newValue = (_c = (_b = this.group) === null || _b === void 0 ? void 0 : _b.zModel) === null || _c === void 0 ? void 0 : _c[this.data.Value];
10020
+ editor.value = newValue;
10021
+ this.onChange(newValue);
10022
+ this.focus();
10023
+ });
9671
10024
  }
10025
+ /** Close the popup editor if open. */
9672
10026
  onPopupClose() {
10027
+ if (!this.dialogRef) {
10028
+ return;
10029
+ }
9673
10030
  this.dialogRef.close();
9674
10031
  }
10032
+ /**
10033
+ * Handle <input type="file"> change and insert selected image into editor.
10034
+ * NOTE: Prefer typing fileInput as Event for better safety.
10035
+ */
9675
10036
  uploadImage(fileInput) {
9676
- const uploadedImage = fileInput.target.files[0];
9677
- if (uploadedImage) {
9678
- this.insertImageIntoEditor(uploadedImage);
10037
+ var _a;
10038
+ const input = fileInput === null || fileInput === void 0 ? void 0 : fileInput.target;
10039
+ const file = (_a = input === null || input === void 0 ? void 0 : input.files) === null || _a === void 0 ? void 0 : _a[0];
10040
+ if (!file) {
10041
+ console.warn('[Ztexteditor] No image selected for upload.');
10042
+ return;
9679
10043
  }
10044
+ void this.insertImageIntoEditor(file);
9680
10045
  }
10046
+ /** Insert image into editor, optionally compressing first. */
9681
10047
  insertImageIntoEditor(file) {
10048
+ var _a;
9682
10049
  return __awaiter(this, void 0, void 0, function* () {
9683
- const imageCompressionEnabled = !!this.data.Compression;
9684
- if (imageCompressionEnabled) {
9685
- console.log(`Before Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
9686
- file = yield this.ImageCompression(file);
9687
- console.log(`After Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
9688
- }
9689
- var base64str = yield this.readFileAsDataURL(file);
9690
- this.editor.exec("insertImage", { src: base64str });
10050
+ const editor = this.editor;
10051
+ if (!editor) {
10052
+ console.warn('[Ztexteditor] Editor is not ready. Cannot insert image.');
10053
+ return;
10054
+ }
10055
+ let workingFile = file;
10056
+ const compressionConfig = (_a = this.data) === null || _a === void 0 ? void 0 : _a.Compression;
10057
+ const compressionEnabled = !!compressionConfig;
10058
+ if (compressionEnabled) {
10059
+ console.log(`[Ztexteditor] Upload image before compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
10060
+ workingFile = yield this.imageCompression(workingFile);
10061
+ if (!workingFile) {
10062
+ console.warn('[Ztexteditor] Image compression failed. Upload image insertion aborted.');
10063
+ return;
10064
+ }
10065
+ console.log(`[Ztexteditor] Upload image after compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
10066
+ }
10067
+ try {
10068
+ const base64 = yield this.readFileAsDataURL(workingFile);
10069
+ editor.exec('insertImage', { src: base64 });
10070
+ }
10071
+ catch (err) {
10072
+ console.warn('[Ztexteditor] Failed to read uploaded image as base64.', err);
10073
+ }
9691
10074
  });
9692
10075
  }
10076
+ /** Convert base64 (data URL) to File. */
9693
10077
  base64ToFile(base64String, fileName) {
9694
10078
  return __awaiter(this, void 0, void 0, function* () {
10079
+ // Using fetch on data URL is supported by modern browsers; keep existing logic.
9695
10080
  const response = yield fetch(base64String);
9696
10081
  const blob = yield response.blob();
9697
- const file = new File([blob], fileName, {
10082
+ return new File([blob], fileName, {
9698
10083
  type: blob.type,
9699
10084
  lastModified: Date.now(),
9700
10085
  });
9701
- return file;
9702
10086
  });
9703
10087
  }
9704
- ImageCompression(file) {
10088
+ /**
10089
+ * Compress an image file if it is an image and above min threshold.
10090
+ * Returns the compressed file, or null if not compressible / compression skipped.
10091
+ */
10092
+ imageCompression(file) {
10093
+ var _a;
9705
10094
  return __awaiter(this, void 0, void 0, function* () {
9706
- //Check if Image Compression is enabled.
9707
- if (file && file.type.includes("image")) {
9708
- const imgConfig = this.compressionConfigHandler(this.data.Compression);
9709
- if (file.size > imgConfig.FileSizeMinSizeByte) {
9710
- const compressed$ = this.compressImage.compress(file, imgConfig);
9711
- const compressFile = yield firstValueFrom(compressed$);
9712
- return compressFile;
9713
- } // file size check
10095
+ if (!file) {
10096
+ console.warn('[Ztexteditor] imageCompression called with empty file.');
10097
+ return null;
9714
10098
  }
9715
- else {
10099
+ if (!file.type || !file.type.includes('image')) {
10100
+ console.warn('[Ztexteditor] Skipping compression: file is not an image.', { type: file.type });
10101
+ return null;
10102
+ }
10103
+ const config = (_a = this.data) === null || _a === void 0 ? void 0 : _a.Compression;
10104
+ if (!config) {
10105
+ // Compression not configured.
10106
+ return null;
10107
+ }
10108
+ const imgConfig = this.compressionConfigHandler(config);
10109
+ // If file is below threshold, keep existing behavior: skip compression (return null).
10110
+ if (file.size <= imgConfig.FileSizeMinSizeByte) {
10111
+ console.log(`[Ztexteditor] Skipping compression: file size ${(file.size / 1024).toFixed(2)}KB is below threshold ${(imgConfig.FileSizeMinSizeByte / 1024).toFixed(2)}KB.`);
10112
+ return null;
10113
+ }
10114
+ try {
10115
+ const compressed$ = this.compressImage.compress(file, imgConfig);
10116
+ const compressedFile = yield firstValueFrom(compressed$);
10117
+ return compressedFile !== null && compressedFile !== void 0 ? compressedFile : null;
10118
+ }
10119
+ catch (err) {
10120
+ console.warn('[Ztexteditor] Compression service threw an error.', err);
9716
10121
  return null;
9717
10122
  }
9718
10123
  });
9719
10124
  }
10125
+ /** Normalize image compression config into byte-based thresholds. */
9720
10126
  compressionConfigHandler(imgConfig) {
10127
+ if (!imgConfig) {
10128
+ // Defensive: should never happen because caller checks.
10129
+ return imgConfig;
10130
+ }
9721
10131
  if (imgConfig.FileSizeMaxSize) {
9722
10132
  imgConfig.FileSizeMaxSizeByte = this.convertSizeToByte(imgConfig.FileSizeMaxSize);
9723
10133
  }
@@ -9729,63 +10139,74 @@ class ZtexteditorComponent extends InputFieldBase {
9729
10139
  }
9730
10140
  return imgConfig;
9731
10141
  }
10142
+ /**
10143
+ * Convert size string like "100kb", "1 MB", "2gb" to bytes.
10144
+ * If no unit is provided, bytes are assumed.
10145
+ */
9732
10146
  convertSizeToByte(sizeString) {
9733
- let _tempFileSizeMaxSize = 0;
9734
- let sizeByByte = 0;
9735
- let sizeType = 'b';
9736
- // remove all space
9737
- const _tempFileSize = sizeString.replace(/ /g, '');
9738
- // check last char is alphabetic
9739
- const lastChar = _tempFileSize.substr(_tempFileSize.length - 1);
9740
- if (isNaN(parseFloat(lastChar))) {
9741
- const secLastChar = _tempFileSize.substr(_tempFileSize.length - 2).slice(0, -1);
9742
- if (isNaN(parseFloat(secLastChar))) {
9743
- // check last 2nd char is alphabetic
9744
- sizeType = secLastChar + sizeType;
9745
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -2));
9746
- }
9747
- else {
9748
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -1));
9749
- }
9750
- switch (sizeType.toLowerCase()) {
9751
- case "b":
9752
- sizeByByte = _tempFileSizeMaxSize;
9753
- break;
9754
- case "kb":
9755
- sizeByByte = _tempFileSizeMaxSize * 1024;
9756
- break;
9757
- case "mb":
9758
- sizeByByte = _tempFileSizeMaxSize * 1048576;
9759
- break;
9760
- case "gb":
9761
- sizeByByte = _tempFileSizeMaxSize * 1073741824;
9762
- break;
9763
- }
10147
+ if (!sizeString || typeof sizeString !== 'string') {
10148
+ console.warn('[Ztexteditor] convertSizeToByte received invalid sizeString. Defaulting to 0.', { sizeString });
10149
+ return 0;
9764
10150
  }
9765
- else {
9766
- // default using bytes if no size type
9767
- sizeByByte = parseFloat(_tempFileSize);
10151
+ // Remove all spaces, e.g. "1 MB" -> "1MB"
10152
+ const trimmed = sizeString.replace(/ /g, '').trim();
10153
+ if (!trimmed) {
10154
+ return 0;
10155
+ }
10156
+ // Extract numeric part and unit part (letters).
10157
+ // Example: "1.5MB" => number=1.5, unit="mb"
10158
+ const match = /^([0-9]*\.?[0-9]+)([a-zA-Z]*)$/.exec(trimmed);
10159
+ if (!match) {
10160
+ console.warn('[Ztexteditor] Unable to parse sizeString. Defaulting to 0.', { sizeString });
10161
+ return 0;
10162
+ }
10163
+ const numeric = Number(match[1]);
10164
+ const unit = (match[2] || 'b').toLowerCase();
10165
+ if (Number.isNaN(numeric) || numeric < 0) {
10166
+ console.warn('[Ztexteditor] Invalid numeric size in sizeString. Defaulting to 0.', { sizeString });
10167
+ return 0;
10168
+ }
10169
+ switch (unit) {
10170
+ case 'b':
10171
+ case '':
10172
+ return numeric;
10173
+ case 'kb':
10174
+ return numeric * 1024;
10175
+ case 'mb':
10176
+ return numeric * 1024 * 1024;
10177
+ case 'gb':
10178
+ return numeric * 1024 * 1024 * 1024;
10179
+ default:
10180
+ console.warn('[Ztexteditor] Unknown unit in sizeString. Defaulting to bytes.', { sizeString, unit });
10181
+ return numeric;
9768
10182
  }
9769
- return sizeByByte;
9770
10183
  }
10184
+ /** Read a File as base64 data URL. */
9771
10185
  readFileAsDataURL(file) {
9772
10186
  return new Promise((resolve, reject) => {
10187
+ if (!file) {
10188
+ reject(new Error('File is required.'));
10189
+ return;
10190
+ }
9773
10191
  const reader = new FileReader();
9774
10192
  reader.readAsDataURL(file);
9775
- reader.onload = () => {
9776
- resolve(reader.result);
9777
- };
9778
- reader.onerror = (error) => {
9779
- reject(error);
9780
- };
10193
+ reader.onload = () => resolve(reader.result);
10194
+ reader.onerror = (error) => reject(error);
9781
10195
  });
9782
10196
  }
10197
+ // #endregion
10198
+ // #region Small helpers
10199
+ /** Extract event target as HTMLElement safely. */
10200
+ getEventTargetElement(event) {
10201
+ const target = event === null || event === void 0 ? void 0 : event.target;
10202
+ return target instanceof HTMLElement ? target : null;
10203
+ }
9783
10204
  }
9784
10205
  ZtexteditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, deps: [{ token: ZComponentService }, { token: i2.FontAweSomeService }, { token: i6.DialogService }, { token: i2.AlertService }, { token: i2.CompressImageService }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component });
9785
- ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "compress_btn", first: true, predicate: ["compressButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i2$1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { 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: i6$2.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7$3.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7$3.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7$3.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6$2.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6$2.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6$2.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6$2.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6$2.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6$2.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6$2.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6$2.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6$2.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6$2.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6$2.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6$2.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6$2.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6$2.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6$2.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6$2.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6$2.EditorInsertUnorderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertUnorderedListButton]" }, { type: i6$2.EditorInsertOrderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertOrderedListButton]" }, { type: i6$2.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6$2.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6$2.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6$2.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6$2.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6$2.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6$2.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6$2.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6$2.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6$2.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6$2.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6$2.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6$2.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6$2.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6$2.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6$2.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
10206
+ ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "compress_btn", first: true, predicate: ["compressButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i2$1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { 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: i6$2.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7$3.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7$3.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7$3.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6$2.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6$2.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6$2.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6$2.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6$2.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6$2.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6$2.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6$2.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6$2.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6$2.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6$2.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6$2.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6$2.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6$2.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6$2.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6$2.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6$2.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6$2.EditorInsertUnorderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertUnorderedListButton]" }, { type: i6$2.EditorInsertOrderedListButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertOrderedListButton]" }, { type: i6$2.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6$2.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6$2.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6$2.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6$2.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6$2.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6$2.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6$2.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6$2.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6$2.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6$2.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6$2.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6$2.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6$2.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6$2.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6$2.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
9786
10207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, decorators: [{
9787
10208
  type: Component,
9788
- args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"OnOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
10209
+ args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'basic' ? 'inherit' : 'none'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-zoom-actual-size\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar [style.display]=\"data.ToolBarStyle === 'full' ? 'inherit' : 'none'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" icon=\"k-i-image k-i-file-image\" (click)=\"onOffCompressMode($event)\" #compressButton title=\"Disable Image Compression\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
9789
10210
  }], ctorParameters: function () { return [{ type: ZComponentService }, { type: i2.FontAweSomeService }, { type: i6.DialogService }, { type: i2.AlertService }, { type: i2.CompressImageService }, { type: i2.ToastService }]; }, propDecorators: { editor: [{
9790
10211
  type: ViewChild,
9791
10212
  args: ['editor']
@@ -12115,6 +12536,13 @@ class ZschedulerComponent {
12115
12536
  }
12116
12537
  //Set session values
12117
12538
  this.group["selectedDate"] = args.selectedDate;
12539
+ if (this.data.OnDateChange) {
12540
+ const func = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnDateChange);
12541
+ if (typeof func === 'function') {
12542
+ const callFunc = func.bind(this.group.ctrlScope);
12543
+ callFunc(args);
12544
+ }
12545
+ }
12118
12546
  console.log("zschedule component date-change selection: ", args.dateRange);
12119
12547
  // this.local.selectedDate = args.dateRange.start;
12120
12548
  this.group.subject.next({
@@ -14727,8 +15155,8 @@ class ZprogressbarComponent extends FieldBase {
14727
15155
  ngOnInit() {
14728
15156
  super.initComponent().subscribe(() => {
14729
15157
  this.value = this.group.zModel[this.data.Value];
14730
- this.minValue = this.data.MinValue || this.minValue;
14731
- this.maxValue = this.data.MaxValue || this.maxValue;
15158
+ this.minValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.MinValue) || this.minValue;
15159
+ this.maxValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.MaxValue) || this.maxValue;
14732
15160
  if (this.data.Options) {
14733
15161
  const optionType = typeof (this.data.Options);
14734
15162
  if (optionType === 'object') {