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.
@@ -7308,13 +7308,22 @@ class ZgaugeComponent extends FieldBase {
7308
7308
  super(componentService);
7309
7309
  this.componentService = componentService;
7310
7310
  this.isLoading = true;
7311
+ this.value = 0;
7312
+ this.title = "";
7313
+ this.color = [{ color: "#0175c7" }];
7314
+ this.majorTicks = { visible: true, color: '#0000ff' };
7315
+ this.minorTicks = { visible: true, color: '#0000ff' };
7316
+ this.startAngle = 0;
7317
+ this.endAngle = 180;
7318
+ this.minValue = 0;
7319
+ this.maxValue = 200;
7311
7320
  this.options = {
7312
- value: 0,
7313
- title: '',
7321
+ value: this.value,
7322
+ title: this.title,
7314
7323
  chartInnerText1: '',
7315
7324
  chartInnerText2: '',
7316
7325
  scaleMax: 50,
7317
- colors: [],
7326
+ colors: this.color,
7318
7327
  transitions: false,
7319
7328
  majorTicks: { visible: true, color: '#0000ff' },
7320
7329
  minorTicks: { visible: true, color: '#0000ff' },
@@ -7325,12 +7334,12 @@ class ZgaugeComponent extends FieldBase {
7325
7334
  endAngle: 180,
7326
7335
  rangePlaceholderColor: '#e6e5e5',
7327
7336
  labelsColor: '#0000ff',
7328
- rangeFrom: 0,
7329
- rangeTo: 100,
7330
7337
  rangeColor: '#ff6358',
7331
7338
  rangeLineCap: 'round',
7332
7339
  showLabels: true,
7333
7340
  rangeSize: 10,
7341
+ labelStyle: "text-align: center; font-size: 18px;",
7342
+ arcgaugeStyle: "margin-top:50px;width:90% ;height:100%; min-width: 330px;",
7334
7343
  };
7335
7344
  }
7336
7345
  ngOnInit() {
@@ -7359,25 +7368,24 @@ class ZgaugeComponent extends FieldBase {
7359
7368
  }
7360
7369
  getFieldDeclarationForSetup(field, options) {
7361
7370
  if (field.Value.startsWith('group.')) {
7362
- options.value = ZComponentHelper.getGroupEvalValue.call(this, field.Value) || options.value;
7371
+ options.value = ZComponentHelper.getGroupEvalValue.call(this, field.Value) ?? options.value;
7363
7372
  }
7364
7373
  else {
7365
- options.value = this.group.zModel[field.Value] || options.value;
7374
+ options.value = this.group.zModel[field.Value] ?? options.value;
7366
7375
  options.value = parseInt(options.value);
7367
7376
  }
7368
7377
  options.title = ZComponentHelper.getGroupEvalValue.call(this, field.Title) || options.title;
7369
- options.scaleMax = field.Max || options.scaleMax; // not using
7370
7378
  options.minValue = ZComponentHelper.getGroupEvalValue.call(this, field.MinValue) || options.minValue || 0;
7371
7379
  options.maxValue = ZComponentHelper.getGroupEvalValue.call(this, field.MaxValue) || options.maxValue || 100;
7372
- options.colors = ZComponentHelper.getGroupEvalValue.call(this, field.Color) || options.colors || { color: "#0175c7" };
7380
+ options.colors = ZComponentHelper.getGroupEvalValue.call(this, field.Color) || options.colors;
7373
7381
  options.transitions = field.Transitions || options.transitions;
7374
- options.majorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MajorTicks) || options.majorTicks || { visible: true, color: '#0000ff' };
7375
- options.minorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MinorTicks) || options.minorTicks || { visible: true, color: '#0000ff' };
7382
+ options.majorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MajorTicks) || options.majorTicks;
7383
+ options.minorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MinorTicks) || options.minorTicks;
7376
7384
  options.showLabels = field.ShowLabels != undefined ? field.ShowLabels : options.showLabels;
7377
7385
  options.style = field.Style || options.style;
7378
7386
  options.reverse = field.Reverse || options.reverse;
7379
- options.startAngle = ZComponentHelper.getGroupEvalValue.call(this, field.StartAngle) || options.startAngle || 0;
7380
- options.endAngle = ZComponentHelper.getGroupEvalValue.call(this, field.EndAngle) || options.endAngle || 180;
7387
+ options.startAngle = field.StartAngle || options.startAngle || 0;
7388
+ options.endAngle = field.EndAngle || options.endAngle || 180;
7381
7389
  options.rangePlaceholderColor = field.RangePlaceholderColor || options.rangePlaceholderColor;
7382
7390
  options.rangeFrom = ZComponentHelper.getGroupEvalValue.call(this, field['RangeFrom']) || options.rangeFrom;
7383
7391
  options.rangeTo = ZComponentHelper.getGroupEvalValue.call(this, field['RangeTo']) || options.rangeTo;
@@ -7398,10 +7406,10 @@ class ZgaugeComponent extends FieldBase {
7398
7406
  }
7399
7407
  }
7400
7408
  ZgaugeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgaugeComponent, deps: [{ token: ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
7401
- 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]" }] });
7409
+ 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]" }] });
7402
7410
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgaugeComponent, decorators: [{
7403
7411
  type: Component,
7404
- 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: [""] }]
7412
+ 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: [""] }]
7405
7413
  }], ctorParameters: function () { return [{ type: ZComponentService }]; } });
7406
7414
 
7407
7415
  const hideAndShowVerticalAnimation = trigger('hideAndShowAnimation', [
@@ -9047,24 +9055,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
9047
9055
  class MyFileInfo {
9048
9056
  }
9049
9057
  class ZuploadComponent extends InputFieldBase {
9050
- // zModelValue = [{
9051
- // name: "RXJS 01.png",
9052
- // size: 128753,
9053
- // uid: "c96e234d-af61-4587-adcc-3b400ddef884"
9054
- // }];
9055
- // fieldElement = [{
9056
- // Name: 'FileUploadList',
9057
- // Type: 'zupload',
9058
- // Value: 'FileUploadList',
9059
- // SelectionOptions: ['jpg', 'jpeg', 'png', 'bmp', 'pdf'],
9060
- // UploadMetaData: 'group.UploadMetaData',
9061
- // AutoUpload: false,
9062
- // AllowRemove: true,
9063
- // Multiple: false,
9064
- // OnSuccess: 'group.onSuccess()',
9065
- // DivClass: "col-md-12 col-md-6",
9066
- // Visible: true
9067
- // }];
9068
9058
  constructor(componentService, authService, compressImage, zcoreService, ngZone, sharePointService, alertService) {
9069
9059
  super(componentService);
9070
9060
  this.componentService = componentService;
@@ -9074,6 +9064,7 @@ class ZuploadComponent extends InputFieldBase {
9074
9064
  this.ngZone = ngZone;
9075
9065
  this.sharePointService = sharePointService;
9076
9066
  this.alertService = alertService;
9067
+ // NOTE: Naming: `uid` array actually stores preview UIDs. Consider renaming to `previewUids` in future (not changed to preserve API).
9077
9068
  this.uploadAttachmentUrl = null;
9078
9069
  this.uploadSaveUrl = "/Attachment/Chunk_Upload_Save"; // should represent an actual API endpoint
9079
9070
  this.uploadRemoveUrl = "/Attachment/Chunk_Upload_Remove"; // should represent an actual API endpoint
@@ -9081,9 +9072,9 @@ class ZuploadComponent extends InputFieldBase {
9081
9072
  this.getImageUrl = "/Attachment/getImage"; // GET method
9082
9073
  this.isAutoUpload = false;
9083
9074
  this.isMultiple = false;
9075
+ this.showFileList = true;
9084
9076
  this.imagePreviews = [];
9085
9077
  this.uid = [];
9086
- this.showFileList = true;
9087
9078
  this.fileList = [];
9088
9079
  this.restrictions = {
9089
9080
  minFileSize: 1,
@@ -9108,74 +9099,132 @@ class ZuploadComponent extends InputFieldBase {
9108
9099
  size: 102400,
9109
9100
  maxAutoRetries: 3,
9110
9101
  };
9111
- this.uploadAttachmentUrl = this.zcoreService.normalizeUrl(this.zcoreService.getEnvironment().uploadAttachmentUrl);
9112
- this.uploadSaveUrl = this.uploadAttachmentUrl + this.uploadSaveUrl;
9113
- this.uploadRemoveUrl = this.uploadAttachmentUrl + this.uploadRemoveUrl;
9102
+ const env = this.zcoreService.getEnvironment();
9103
+ const normalized = this.zcoreService.normalizeUrl(env?.uploadAttachmentUrl);
9104
+ this.uploadAttachmentUrl = normalized ?? null;
9105
+ if (this.uploadAttachmentUrl) {
9106
+ this.uploadSaveUrl = this.uploadAttachmentUrl + this.uploadSaveUrl;
9107
+ this.uploadRemoveUrl = this.uploadAttachmentUrl + this.uploadRemoveUrl;
9108
+ }
9109
+ else {
9110
+ // Safer logging: avoid silent null URLs that break uploads
9111
+ // NOTE: This indicates a configuration issue.
9112
+ console.warn(`[ZuploadComponent] uploadAttachmentUrl is empty. Upload endpoints may be invalid.`, { uploadAttachmentUrl: env?.uploadAttachmentUrl });
9113
+ }
9114
+ this.defaultUploadSaveUrl = this.uploadSaveUrl;
9115
+ this.defaultUploadRemoveUrl = this.uploadRemoveUrl;
9114
9116
  }
9117
+ /**
9118
+ * Angular lifecycle hook - initializes restrictions and upload behavior from field config.
9119
+ */
9115
9120
  ngOnInit() {
9116
9121
  super.setupInnerField();
9117
- // this.group['UploadMetaData'] = new UploadMetaData(null, '15', 'SO-No-1234', 'SaleOrder');
9118
- // this.uploadSaveUrl = uploadAttachmentUrl + this.uploadSaveUrl;
9119
- // this.uploadRemoveUrl = uploadAttachmentUrl + this.uploadRemoveUrl;
9120
- if (this.data.SelectOptions && !this.data.AllowedFileExtension) {
9122
+ // Allowed extensions:
9123
+ // - If SelectOptions present and AllowedFileExtension not present, override
9124
+ // - Else if AllowedFileExtension present and SelectOptions absent, append
9125
+ // NOTE: Keep original behavior; it may allow duplicates, but prevents unexpected restriction loss.
9126
+ if (this.data?.SelectOptions && !this.data?.AllowedFileExtension) {
9121
9127
  this.restrictions.allowedExtensions = this.data.SelectOptions;
9122
9128
  }
9123
- else if (!this.data.SelectOptions && this.data.AllowedFileExtension) {
9129
+ else if (!this.data?.SelectOptions && this.data?.AllowedFileExtension) {
9124
9130
  this.restrictions.allowedExtensions = this.restrictions.allowedExtensions.concat(this.data.AllowedFileExtension);
9125
9131
  }
9126
- if (this.data.MinFileSize) {
9132
+ if (typeof this.data?.MinFileSize === "number" && this.data.MinFileSize >= 0) {
9127
9133
  this.restrictions.minFileSize = this.data.MinFileSize;
9128
9134
  }
9129
- if (this.data.MaxFileSize) {
9135
+ if (typeof this.data?.MaxFileSize === "number" && this.data.MaxFileSize >= 0) {
9130
9136
  this.restrictions.maxFileSize = this.data.MaxFileSize;
9131
9137
  }
9132
- this.isAutoUpload = this.data.AutoUpload || false;
9133
- if (!this.data.AllowRemove) {
9138
+ this.isAutoUpload = Boolean(this.data?.AutoUpload);
9139
+ // If remove is not allowed, Kendo upload expects empty URL to hide remove request.
9140
+ if (this.data && this.data.AllowRemove === false) {
9134
9141
  this.uploadRemoveUrl = "";
9135
9142
  }
9136
- if (this.data.Multiple) {
9137
- this.isMultiple = this.data.Multiple;
9138
- }
9139
- this.componentProperties.style.style6 = this.componentProperties.style.style6 || "margin: 5px; border: 1px solid gray;";
9143
+ this.isMultiple = Boolean(this.data?.Multiple);
9144
+ // Ensure style6 exists (legacy styling hook).
9145
+ this.componentProperties.style.style6 =
9146
+ this.componentProperties.style.style6 || "margin: 5px; border: 1px solid gray;";
9140
9147
  }
9148
+ /**
9149
+ * Kendo Upload success callback for both upload and remove.
9150
+ * Keeps zModel in sync and emits ZComponent output events.
9151
+ */
9141
9152
  onSuccess(e) {
9142
- // angular kendo upload didn't filter away Sent event for remove, so we have to handle it here
9143
- // upload progress not required for removal, thus it's also removed
9144
- // @ts-ignore
9145
- if (e.operation === "remove" && (e.response.type === HttpEventType.Sent || e.response.type === HttpEventType.UploadProgress)) {
9153
+ // Angular Kendo Upload emits "Sent" and "UploadProgress" for remove; ignore them to avoid double-handling.
9154
+ // @ts-ignore - Kendo types for response differ by runtime usage
9155
+ const responseType = e?.response?.type;
9156
+ if (e?.operation === "remove" &&
9157
+ (responseType === HttpEventType.Sent || responseType === HttpEventType.UploadProgress)) {
9158
+ return;
9159
+ }
9160
+ const modelKey = this.data?.Value;
9161
+ if (!modelKey) {
9162
+ console.warn(`[ZuploadComponent] onSuccess skipped: missing data.Value.`, { event: e });
9163
+ return;
9164
+ }
9165
+ if (!this.group?.zModel) {
9166
+ console.warn(`[ZuploadComponent] onSuccess skipped: missing group.zModel.`, { event: e });
9146
9167
  return;
9147
9168
  }
9148
- if (!Array.isArray(this.group.zModel[this.data.Value])) {
9149
- this.group.zModel[this.data.Value] = [];
9169
+ if (!Array.isArray(this.group.zModel[modelKey])) {
9170
+ this.group.zModel[modelKey] = [];
9171
+ }
9172
+ const file = e?.files?.[0] ?? undefined;
9173
+ if (!file) {
9174
+ console.warn(`[ZuploadComponent] onSuccess: no file found in event.`, { event: e });
9175
+ return;
9150
9176
  }
9151
- const file = e.files[0];
9152
- const existingFileIndex = this.group.zModel[this.data.Value].findIndex(f => f.name === file.name && f.uid === file.uid);
9177
+ const existingFileIndex = this.group.zModel[modelKey].findIndex((f) => f?.name === file.name && f?.uid === file.uid);
9153
9178
  if (e.operation === "upload") {
9154
- // console.log('upload Success: ', e);
9155
- //sharepoint required to read data from fileUid and attachment able to get data from fileUid too.
9156
- file.myUid = e.response?.body?.fileUid ?? file.uid;
9157
- delete file['httpSubscription'];
9179
+ // SharePoint and Attachment use fileUid (server) for later operations.
9180
+ // Prefer fileUid if provided; fallback to file.uid
9181
+ // @ts-ignore - body shape is runtime-dependent
9182
+ file.myUid = e?.response?.body?.fileUid ?? file.uid;
9183
+ // Clean up internal subscription data to avoid circular structures
9184
+ // NOTE: This relies on Kendo attaching internal fields; safe delete.
9185
+ delete file["httpSubscription"];
9158
9186
  if (existingFileIndex !== -1) {
9159
- this.group.zModel[this.data.Value][existingFileIndex] = file;
9187
+ this.group.zModel[modelKey][existingFileIndex] = file;
9160
9188
  }
9161
9189
  else {
9162
- this.group.zModel[this.data.Value].push(file);
9190
+ this.group.zModel[modelKey].push(file);
9163
9191
  }
9192
+ console.info(`[ZuploadComponent] Upload succeeded.`, {
9193
+ name: file.name,
9194
+ uid: file.uid,
9195
+ myUid: file.myUid,
9196
+ });
9164
9197
  }
9165
9198
  else if (e.operation === "remove") {
9166
9199
  if (existingFileIndex !== -1) {
9167
- this.group.zModel[this.data.Value].splice(existingFileIndex, 1);
9200
+ this.group.zModel[modelKey].splice(existingFileIndex, 1);
9168
9201
  }
9202
+ console.info(`[ZuploadComponent] Remove succeeded.`, {
9203
+ name: file.name,
9204
+ uid: file.uid,
9205
+ myUid: file.myUid,
9206
+ });
9169
9207
  }
9170
- ZComponentHelper.setComponentModelValue(this.data, this.group.zModel[this.data.Value], this.group);
9171
- this.group.subject.next({
9208
+ else {
9209
+ // Unknown operation, preserve behavior but log for diagnostics.
9210
+ console.debug(`[ZuploadComponent] onSuccess received unsupported operation.`, { operation: e.operation, event: e });
9211
+ }
9212
+ ZComponentHelper.setComponentModelValue(this.data, this.group.zModel[modelKey], this.group);
9213
+ this.group.subject?.next({
9172
9214
  type: "zupload-onSuccess",
9173
- target: this.data.OnSuccess,
9215
+ target: this.data?.OnSuccess,
9174
9216
  event: e,
9175
- data: { value: e.files[0], field: this.data },
9217
+ data: { value: file, field: this.data },
9176
9218
  });
9177
9219
  }
9220
+ /**
9221
+ * Normalize and enrich image compression config with byte-based thresholds.
9222
+ */
9178
9223
  compressionConfigHandler(imgConfig) {
9224
+ if (!imgConfig) {
9225
+ // NOTE: keep function safe for unexpected null; returns as-is
9226
+ return imgConfig;
9227
+ }
9179
9228
  if (imgConfig.FileSizeMaxSize) {
9180
9229
  imgConfig.FileSizeMaxSizeByte = this.convertSizeToByte(imgConfig.FileSizeMaxSize);
9181
9230
  }
@@ -9187,79 +9236,114 @@ class ZuploadComponent extends InputFieldBase {
9187
9236
  }
9188
9237
  return imgConfig;
9189
9238
  }
9239
+ /**
9240
+ * Convert string size values like "10KB", "2 MB", "1gb", "1024" into bytes.
9241
+ * If unit is omitted, bytes are assumed.
9242
+ *
9243
+ * @param sizeString Human readable size string.
9244
+ * @returns Size in bytes. Returns 0 if parsing fails.
9245
+ */
9190
9246
  convertSizeToByte(sizeString) {
9191
- let _tempFileSizeMaxSize = 0;
9247
+ if (!sizeString || typeof sizeString !== "string") {
9248
+ return 0;
9249
+ }
9250
+ // Remove all spaces
9251
+ const raw = sizeString.replace(/ /g, "").trim();
9252
+ if (!raw) {
9253
+ return 0;
9254
+ }
9255
+ let parsedValue = 0;
9192
9256
  let sizeByByte = 0;
9193
- let sizeType = 'b';
9194
- // remove all space
9195
- const _tempFileSize = sizeString.replace(/ /g, '');
9196
- // check last char is alphabetic
9197
- const lastChar = _tempFileSize.substr(_tempFileSize.length - 1);
9198
- if (isNaN(parseFloat(lastChar))) {
9199
- const secLastChar = _tempFileSize.substr(_tempFileSize.length - 2).slice(0, -1);
9200
- if (isNaN(parseFloat(secLastChar))) {
9201
- // check last 2nd char is alphabetic
9202
- sizeType = secLastChar + sizeType;
9203
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -2));
9257
+ let sizeType = "b";
9258
+ // Check last char is alphabetic
9259
+ const lastChar = raw.substring(raw.length - 1);
9260
+ const lastCharIsNumber = !Number.isNaN(Number.parseFloat(lastChar));
9261
+ if (!lastCharIsNumber) {
9262
+ const secondLastChar = raw.substring(raw.length - 2).slice(0, -1);
9263
+ const secondLastIsNumber = !Number.isNaN(Number.parseFloat(secondLastChar));
9264
+ if (!secondLastIsNumber) {
9265
+ // Last 2nd char is also alphabetic (e.g. "MB", "GB")
9266
+ sizeType = `${secondLastChar}${sizeType}`;
9267
+ parsedValue = Number.parseFloat(raw.slice(0, -2));
9204
9268
  }
9205
9269
  else {
9206
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -1));
9270
+ parsedValue = Number.parseFloat(raw.slice(0, -1));
9271
+ }
9272
+ // If parsing failed, return 0 (SonarQube safe behavior)
9273
+ if (Number.isNaN(parsedValue) || parsedValue < 0) {
9274
+ console.warn(`[ZuploadComponent] convertSizeToByte: invalid size value.`, { sizeString });
9275
+ return 0;
9207
9276
  }
9208
9277
  switch (sizeType.toLowerCase()) {
9209
9278
  case "b":
9210
- sizeByByte = _tempFileSizeMaxSize;
9279
+ sizeByByte = parsedValue;
9211
9280
  break;
9212
9281
  case "kb":
9213
- sizeByByte = _tempFileSizeMaxSize * 1024;
9282
+ sizeByByte = parsedValue * 1024;
9214
9283
  break;
9215
9284
  case "mb":
9216
- sizeByByte = _tempFileSizeMaxSize * 1048576;
9285
+ sizeByByte = parsedValue * 1048576;
9217
9286
  break;
9218
9287
  case "gb":
9219
- sizeByByte = _tempFileSizeMaxSize * 1073741824;
9288
+ sizeByByte = parsedValue * 1073741824;
9289
+ break;
9290
+ default:
9291
+ // Unknown unit => treat as bytes for backward compatibility
9292
+ console.warn(`[ZuploadComponent] convertSizeToByte: unknown unit, defaulting to bytes.`, {
9293
+ sizeString,
9294
+ unit: sizeType,
9295
+ });
9296
+ sizeByByte = parsedValue;
9220
9297
  break;
9221
9298
  }
9222
9299
  }
9223
9300
  else {
9224
- // default using bytes if no size type
9225
- sizeByByte = parseFloat(_tempFileSize);
9301
+ // Default using bytes if no size type
9302
+ const n = Number.parseFloat(raw);
9303
+ if (Number.isNaN(n) || n < 0) {
9304
+ console.warn(`[ZuploadComponent] convertSizeToByte: invalid numeric bytes value.`, { sizeString });
9305
+ return 0;
9306
+ }
9307
+ sizeByByte = n;
9226
9308
  }
9227
9309
  return sizeByByte;
9228
9310
  }
9311
+ /**
9312
+ * Kendo Upload upload event: validates files, builds image previews, injects metadata and auth header.
9313
+ */
9229
9314
  uploadEventHandler(e) {
9315
+ if (!e?.files?.length) {
9316
+ console.warn(`[ZuploadComponent] uploadEventHandler: no files in UploadEvent.`);
9317
+ return;
9318
+ }
9230
9319
  // Image Preview
9231
- const me = this;
9232
9320
  e.files.forEach((file) => {
9233
- if (!me.isValidUploadedFile(me, file)) {
9321
+ if (!this.isValidUploadedFile(file)) {
9234
9322
  e.preventDefault();
9235
9323
  return;
9236
9324
  }
9237
- else {
9238
- if (file.rawFile && file.rawFile.type.includes("image")) {
9239
- if (!file.validationErrors) {
9240
- const reader = new FileReader();
9241
- reader.onload = function (ev) {
9242
- if (me.data.EnableImagePreview) {
9243
- if (!me.uid.includes(file.uid)) {
9244
- me.uid.push(file.uid);
9245
- me.imagePreviews.push({ ...file, src: reader.result });
9246
- }
9247
- }
9248
- };
9249
- reader.readAsDataURL(file.rawFile);
9325
+ if (file?.rawFile?.type?.includes("image") && !file.validationErrors) {
9326
+ const reader = new FileReader();
9327
+ reader.onload = () => {
9328
+ if (this.data?.EnableImagePreview) {
9329
+ if (!this.uid.includes(file.uid)) {
9330
+ this.uid.push(file.uid);
9331
+ this.imagePreviews.push({ ...file, src: reader.result });
9332
+ }
9250
9333
  }
9251
- }
9334
+ };
9335
+ reader.readAsDataURL(file.rawFile);
9252
9336
  }
9253
9337
  });
9254
9338
  // Add metadata to the upload event
9255
- let additional = ZComponentHelper.getGroupEvalValue.call(this, this.data.UploadMetaData);
9339
+ let additional = ZComponentHelper.getGroupEvalValue.call(this, this.data?.UploadMetaData);
9256
9340
  if (!(additional instanceof UploadMetaData)) {
9257
- console.error("UploadMetaData defined at " + this.data.UploadMetaData + " is invalid: ", additional);
9341
+ console.warn(`[ZuploadComponent] Invalid UploadMetaData at "${this.data?.UploadMetaData}". Fallback to default metadata.`, additional);
9258
9342
  additional = new UploadMetaData(null, "0");
9259
9343
  }
9260
9344
  //#region sharepoint
9261
- let attachmentInfo = this.sharePointService.getAttachmentInfo(this.data["DownloadFileConfig"]);
9262
- //add tagging into metadata
9345
+ const attachmentInfo = this.sharePointService.getAttachmentInfo(this.data?.["DownloadFileConfig"]);
9346
+ // Add tagging into metadata
9263
9347
  if (attachmentInfo) {
9264
9348
  if (attachmentInfo.tag) {
9265
9349
  const tag = this.sharePointService.generateTagging(this.group, attachmentInfo.tag);
@@ -9270,155 +9354,270 @@ class ZuploadComponent extends InputFieldBase {
9270
9354
  additional[AttachmentConfig.isSaveToSharePoint] = attachmentInfo.isSaveToSharePoint;
9271
9355
  }
9272
9356
  //#endregion
9273
- const str = JSON.stringify(additional);
9274
- e.data = { additional: str, };
9275
- e.headers = e.headers.append("Authorization", "Bearer " + this.authService.e1AccessToken);
9357
+ additional[AttachmentConfig.projectCode] = this.data?.ProjectCode;
9358
+ additional[AttachmentConfig.moduleCode] = this.data?.ModuleCode;
9359
+ const payload = JSON.stringify(additional);
9360
+ e.data = { additional: payload };
9361
+ // NOTE: Potentially unsafe: assumes token is always present. Keep behavior but add clearer logging.
9362
+ const token = this.authService?.e1AccessToken;
9363
+ if (!token) {
9364
+ console.warn(`[ZuploadComponent] Missing e1AccessToken. Upload may fail due to authorization.`);
9365
+ }
9366
+ e.headers = e.headers.append("Authorization", `Bearer ${token ?? ""}`);
9276
9367
  }
9368
+ /**
9369
+ * Kendo Upload remove event: updates component memory, fires project event if defined,
9370
+ * otherwise attaches required payload and authorization headers.
9371
+ */
9277
9372
  onRemove(e) {
9278
- // remove file from component memory
9279
- const index = this.fileList.findIndex((item) => item.uid === e.files[0].uid);
9373
+ const file = e?.files?.[0];
9374
+ if (!file) {
9375
+ console.warn(`[ZuploadComponent] onRemove: no file found in RemoveEvent.`, { event: e });
9376
+ return;
9377
+ }
9378
+ // Remove file from component memory (for SelectFileOnly flow)
9379
+ const index = this.fileList.findIndex((item) => item.uid === file.uid);
9280
9380
  if (index >= 0) {
9281
9381
  this.fileList.splice(index, 1);
9282
- this.group['zupload_' + this.data.Value] = this.fileList;
9382
+ this.group[`zupload_${this.data?.Value}`] = this.fileList;
9283
9383
  }
9284
- if (this.data['FileRemovedEvent']) {
9285
- this.group.subject.next({
9384
+ const removedEvent = this.data?.["FileRemovedEvent"];
9385
+ if (removedEvent) {
9386
+ this.group.subject?.next({
9286
9387
  type: "zupload-fileRemovedEvent",
9287
- target: this.data['FileRemovedEvent'],
9288
- data: e
9388
+ target: removedEvent,
9389
+ data: e,
9289
9390
  });
9391
+ return;
9290
9392
  }
9291
- else {
9292
- const myFile = e.files[0];
9293
- // console.log('remove done: ', e);
9294
- e.data = {
9295
- id: myFile.myUid,
9296
- };
9297
- e.headers = e.headers.append("Authorization", "Bearer " + this.authService.e1AccessToken);
9298
- if (this.data.EnableImagePreview) {
9299
- e.files.forEach((file) => {
9300
- this.imagePreviews = this.imagePreviews.filter(f => f.uid !== file.uid);
9301
- });
9302
- }
9393
+ const myFile = file;
9394
+ // Attach remove payload
9395
+ e.data = { id: myFile.myUid };
9396
+ const token = this.authService?.e1AccessToken;
9397
+ if (!token) {
9398
+ console.warn(`[ZuploadComponent] Missing e1AccessToken. Remove may fail due to authorization.`);
9399
+ }
9400
+ e.headers = e.headers.append("Authorization", `Bearer ${token ?? ""}`);
9401
+ // Remove preview if enabled
9402
+ if (this.data?.EnableImagePreview) {
9403
+ e.files.forEach((f) => {
9404
+ this.imagePreviews = this.imagePreviews.filter((p) => p?.["uid"] !== f.uid);
9405
+ });
9303
9406
  }
9407
+ console.info(`[ZuploadComponent] Remove requested.`, { name: myFile.name, uid: myFile.uid, myUid: myFile.myUid });
9304
9408
  }
9305
- onChange(file) {
9306
- if (this.data['FileChangedEvent']) {
9307
- this.group.subject.next({
9308
- type: "zupload-fileChangedEvent",
9309
- target: this.data['FileChangedEvent'],
9310
- data: file
9311
- });
9409
+ /**
9410
+ * Kendo Upload change event handler. Emits project event if configured.
9411
+ */
9412
+ onChange(files) {
9413
+ const changedEvent = this.data?.["FileChangedEvent"];
9414
+ if (!changedEvent) {
9415
+ return;
9312
9416
  }
9417
+ this.group.subject?.next({
9418
+ type: "zupload-fileChangedEvent",
9419
+ target: changedEvent,
9420
+ data: files,
9421
+ });
9313
9422
  }
9314
- isValidUploadedFile(me, file) {
9315
- const fileSize = file.rawFile.size;
9316
- const fileExtension = file.rawFile.name.split('.').pop().toLowerCase();
9317
- // Check if file size and extension are valid
9318
- if (fileSize > me.restrictions.maxFileSize || !me.restrictions.allowedExtensions.includes(fileExtension)) {
9319
- let errorMessage = 'Error: ';
9320
- if (!me.restrictions.allowedExtensions.includes(fileExtension)) {
9321
- errorMessage = `Invalid file type. Allowed types are: ${me.restrictions.allowedExtensions.join(', ')}.`;
9322
- }
9323
- else if (fileSize > me.restrictions.maxFileSize) {
9324
- errorMessage = `File size cannot exceeds ${me.formatFileSize(me.restrictions.maxFileSize)}.`;
9325
- }
9326
- me.alertService.showOkay('Failed to upload', errorMessage, ['col-4']);
9423
+ /**
9424
+ * Validate a selected/uploaded file against configured restrictions (size + extension).
9425
+ *
9426
+ * @param file Kendo FileInfo
9427
+ * @returns true if file passes restrictions, otherwise false (and shows alert).
9428
+ */
9429
+ isValidUploadedFile(file) {
9430
+ const rawFile = file?.rawFile;
9431
+ if (!rawFile) {
9432
+ // NOTE: Kendo can provide FileInfo without rawFile in some events. Preserve behavior: treat as invalid.
9433
+ console.warn(`[ZuploadComponent] File validation failed: rawFile is missing.`, { file });
9434
+ this.alertService.showOkay("Failed to upload", "File is not available for upload.", ["col-4"]);
9435
+ return false;
9436
+ }
9437
+ const fileSize = rawFile.size ?? 0;
9438
+ // Keep original behavior: uses last segment after dot.
9439
+ // NOTE: Potentially unsafe for files without extension; will result in empty extension.
9440
+ const fileExtension = (rawFile.name?.split(".").pop() ?? "").toLowerCase();
9441
+ const max = this.restrictions?.maxFileSize ?? 0;
9442
+ const allowed = this.restrictions?.allowedExtensions ?? [];
9443
+ const isExtensionAllowed = allowed.includes(fileExtension);
9444
+ const isSizeAllowed = fileSize <= max;
9445
+ if (!isExtensionAllowed || !isSizeAllowed) {
9446
+ let errorMessage = "Error:";
9447
+ if (!isExtensionAllowed) {
9448
+ errorMessage = `Invalid file type "${fileExtension || "unknown"}". Allowed types: ${allowed.join(", ")}.`;
9449
+ }
9450
+ else if (!isSizeAllowed) {
9451
+ errorMessage = `File size cannot exceed ${this.formatFileSize(max)}.`;
9452
+ }
9453
+ console.warn(`[ZuploadComponent] File rejected by restrictions.`, {
9454
+ name: rawFile.name,
9455
+ size: fileSize,
9456
+ extension: fileExtension,
9457
+ maxAllowedBytes: max,
9458
+ allowedExtensions: allowed,
9459
+ });
9460
+ this.alertService.showOkay("Failed to upload", errorMessage, ["col-4"]);
9327
9461
  return false;
9328
9462
  }
9329
9463
  return true;
9330
9464
  }
9465
+ /**
9466
+ * Kendo Upload select event handler:
9467
+ * - Handles SharePoint endpoint switching
9468
+ * - Supports SelectFileOnly mode (read file content into memory and emit event)
9469
+ * - Supports image compression when AutoUpload is false
9470
+ */
9331
9471
  selectEventHandler(e) {
9332
- const me = this;
9472
+ if (!e?.files?.length) {
9473
+ console.warn(`[ZuploadComponent] selectEventHandler: no files in SelectEvent.`);
9474
+ return;
9475
+ }
9476
+ // Reset to default every selection to avoid SharePoint URL "sticking" permanently.
9477
+ this.uploadSaveUrl = this.defaultUploadSaveUrl;
9478
+ this.uploadRemoveUrl = this.defaultUploadRemoveUrl;
9333
9479
  //#region sharepoint
9334
- const attachmentInfo = this.sharePointService.getAttachmentInfo(this.data["DownloadFileConfig"]);
9480
+ const attachmentInfo = this.sharePointService.getAttachmentInfo(this.data?.["DownloadFileConfig"]);
9335
9481
  // Change uploadSaveUrl if saving to SharePoint
9336
- if (attachmentInfo && attachmentInfo.isSaveToSharePoint && attachmentInfo.siteName) {
9337
- const attachmentSourceUrl = this.zcoreService.getEnvironment().attachmentSourceUrl;
9338
- this.uploadSaveUrl = attachmentSourceUrl + '/Chunk_Upload_Save';
9482
+ if (attachmentInfo?.isSaveToSharePoint && attachmentInfo.siteName) {
9483
+ const attachmentSourceUrl = this.zcoreService.getEnvironment()?.attachmentSourceUrl;
9484
+ if (attachmentSourceUrl) {
9485
+ this.uploadSaveUrl = `${attachmentSourceUrl}/Chunk_Upload_Save`;
9486
+ console.info(`[ZuploadComponent] Upload endpoint switched to SharePoint mode.`, { uploadSaveUrl: this.uploadSaveUrl });
9487
+ }
9488
+ else {
9489
+ console.warn(`[ZuploadComponent] attachmentSourceUrl is missing. Cannot switch to SharePoint upload endpoint.`);
9490
+ }
9339
9491
  }
9340
9492
  //#endregion
9341
- if (this.data['SelectFileOnly']) {
9493
+ if (this.data?.["SelectFileOnly"]) {
9342
9494
  // Append all files to component memory
9343
- e.files.forEach(async (file) => {
9344
- if (me.isValidUploadedFile(me, file)) {
9345
- if (file.rawFile) {
9346
- const reader = new FileReader();
9347
- reader.onload = function (ev) {
9348
- // Clone the data and also add the read file to the object
9349
- const fileData = Object.assign({}, file);
9350
- fileData['file'] = ev.target["result"];
9351
- // Push to component fileList
9352
- me.fileList.push(fileData);
9353
- me.group['zupload_' + me.data.Value] = me.fileList;
9354
- if (me.data['FileSelectedEvent']) {
9355
- // Call the project event
9356
- me.group.subject.next({
9357
- type: "zupload-fileSelectedEvent",
9358
- target: me.data['FileSelectedEvent'],
9359
- data: me.fileList
9360
- });
9361
- }
9362
- };
9363
- await reader.readAsDataURL(file.rawFile);
9364
- }
9495
+ e.files.forEach((file) => {
9496
+ if (!this.isValidUploadedFile(file)) {
9497
+ e.preventDefault();
9498
+ return;
9365
9499
  }
9366
- else {
9500
+ if (!file.rawFile) {
9367
9501
  e.preventDefault();
9502
+ return;
9368
9503
  }
9504
+ const reader = new FileReader();
9505
+ reader.onload = (ev) => {
9506
+ // Clone the data and also add the read file to the object
9507
+ const fileData = {
9508
+ ...file,
9509
+ file: ev?.target?.result ?? null,
9510
+ };
9511
+ fileData["file"] = ev?.target?.result;
9512
+ // Push to component fileList
9513
+ this.fileList.push(fileData);
9514
+ this.group[`zupload_${this.data?.Value}`] = this.fileList;
9515
+ const selectedEvent = this.data?.["FileSelectedEvent"];
9516
+ if (selectedEvent) {
9517
+ this.group.subject?.next({
9518
+ type: "zupload-fileSelectedEvent",
9519
+ target: selectedEvent,
9520
+ data: this.fileList,
9521
+ });
9522
+ }
9523
+ };
9524
+ reader.onerror = () => {
9525
+ console.warn(`[ZuploadComponent] Failed to read file as base64.`, {
9526
+ name: file.rawFile?.name,
9527
+ uid: file.uid,
9528
+ error: reader.error,
9529
+ });
9530
+ };
9531
+ reader.readAsDataURL(file.rawFile);
9369
9532
  });
9533
+ return;
9370
9534
  }
9371
- else {
9372
- // Only workable for Auto Upload = false
9373
- if (!this.data.AutoUpload) {
9374
- // Compression for image file
9375
- const imageCompressionEnabled = this.data.Compression ? true : false;
9376
- //Check if Image Compression is enabled.
9377
- if (imageCompressionEnabled === true) {
9378
- e.files.forEach((file) => {
9379
- if (me.isValidUploadedFile(me, file)) {
9380
- // Compress only if it is an image file
9381
- if (file.rawFile && file.rawFile.type.includes("image")) {
9382
- if (!file.validationErrors) {
9383
- const imgConfig = this.compressionConfigHandler(this.data.Compression);
9384
- if (file.size > imgConfig.FileSizeMinSizeByte) {
9385
- me.compressImage.compress(file.rawFile, imgConfig) //Pass in parameter to set the Compression Options
9386
- .pipe(take(1))
9387
- .subscribe(compressFile => {
9388
- this.ngZone.run(() => {
9389
- file.rawFile = compressFile;
9390
- file.size = compressFile.size;
9391
- // Push to component fileList
9392
- me.fileList.push(Object.assign({}, file));
9393
- const reader = new FileReader();
9394
- reader.readAsDataURL(file.rawFile);
9395
- });
9396
- console.log(`Compressed file size: ${(file.rawFile.size / 1024).toFixed(2)}KB`);
9397
- });
9398
- } // file size check
9399
- } // validationErrors check
9400
- } // file type check
9401
- }
9402
- else {
9403
- e.preventDefault();
9404
- }
9405
- }); // loop each file
9406
- } // imagecompression check
9407
- // add to group scope
9408
- me.group['zupload_' + me.data.Value] = e.files;
9409
- }
9535
+ // Only workable for Auto Upload = false
9536
+ if (this.data?.AutoUpload) {
9537
+ return;
9538
+ }
9539
+ // Compression for image file
9540
+ const imageCompressionEnabled = Boolean(this.data?.Compression);
9541
+ // Check if Image Compression is enabled.
9542
+ if (imageCompressionEnabled) {
9543
+ e.files.forEach((file) => {
9544
+ if (!this.isValidUploadedFile(file)) {
9545
+ e.preventDefault();
9546
+ return;
9547
+ }
9548
+ // Compress only if it is an image file
9549
+ if (!file?.rawFile?.type?.includes("image") || file.validationErrors) {
9550
+ return;
9551
+ }
9552
+ const imgConfig = this.compressionConfigHandler(this.data.Compression);
9553
+ const minBytes = imgConfig?.FileSizeMinSizeByte ?? 0;
9554
+ // Original behavior: only compress if file size > minBytes
9555
+ if (file.size <= minBytes) {
9556
+ return;
9557
+ }
9558
+ this.compressImage
9559
+ .compress(file.rawFile, imgConfig) // Pass in parameter to set the Compression Options
9560
+ .pipe(take(1))
9561
+ .subscribe({
9562
+ next: (compressFile) => {
9563
+ this.ngZone.run(() => {
9564
+ file.rawFile = compressFile;
9565
+ file.size = compressFile.size;
9566
+ // Push to component fileList (kept as original intent)
9567
+ const fileData = { ...file };
9568
+ this.fileList.push(fileData);
9569
+ // Keep original: read to data URL (side effect)
9570
+ const reader = new FileReader();
9571
+ reader.readAsDataURL(file.rawFile);
9572
+ });
9573
+ console.info(`[ZuploadComponent] Image compressed successfully.`, {
9574
+ name: file?.rawFile?.name,
9575
+ newSizeKB: Number((file.rawFile.size / 1024).toFixed(2)),
9576
+ });
9577
+ },
9578
+ error: (err) => {
9579
+ // Preserve flow (do not block selection), but provide clearer diagnostic
9580
+ console.error(`[ZuploadComponent] Image compression failed. Upload will continue with original file.`, {
9581
+ name: file?.rawFile?.name,
9582
+ error: err,
9583
+ });
9584
+ },
9585
+ });
9586
+ });
9410
9587
  }
9588
+ // Add to group scope (original behavior: store selected files)
9589
+ this.group[`zupload_${this.data?.Value}`] = e.files;
9411
9590
  }
9591
+ /**
9592
+ * Clears UI-selected files and syncs group state.
9593
+ * NOTE: Original behavior sets group value to fileList (not empty); preserved.
9594
+ */
9412
9595
  clearFiles() {
9596
+ if (!this.uploadComponent) {
9597
+ console.warn(`[ZuploadComponent] clearFiles: uploadComponent is not ready.`);
9598
+ return;
9599
+ }
9413
9600
  this.uploadComponent.clearFiles();
9414
- this.group['zupload_' + this.data.Value] = this.fileList;
9601
+ this.group[`zupload_${this.data?.Value}`] = this.fileList;
9602
+ console.info(`[ZuploadComponent] Files cleared from UI.`, {
9603
+ storedFileListCount: this.fileList.length,
9604
+ });
9415
9605
  }
9606
+ /**
9607
+ * Format bytes into human-readable string.
9608
+ *
9609
+ * @param bytes Raw byte size
9610
+ * @returns Formatted file size string (e.g. "12.5MB")
9611
+ */
9416
9612
  formatFileSize(bytes) {
9417
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
9418
- if (bytes === 0)
9419
- return '0 Byte';
9613
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
9614
+ if (!Number.isFinite(bytes) || bytes <= 0) {
9615
+ return "0 Byte";
9616
+ }
9420
9617
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
9421
- return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + sizes[i];
9618
+ const value = bytes / Math.pow(1024, i);
9619
+ // NOTE: Original output had no space between number and unit; preserved.
9620
+ return `${Number.parseFloat(value.toFixed(2))}${sizes[i]}`;
9422
9621
  }
9423
9622
  }
9424
9623
  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 });
@@ -9428,7 +9627,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
9428
9627
  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"] }]
9429
9628
  }], 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: [{
9430
9629
  type: ViewChild,
9431
- args: ["uploadComponent"]
9630
+ args: ["uploadComponent", { static: false }]
9432
9631
  }] } });
9433
9632
 
9434
9633
  /********** Angular **********/
@@ -9500,73 +9699,174 @@ class ZtexteditorComponent extends InputFieldBase {
9500
9699
  };
9501
9700
  this.isCompressModeOn = false;
9502
9701
  this.CloseEnlargeBtn = false;
9503
- this.style = "";
9504
- this.CompressionEnableIcon = 'k-i-zoom-best-fit';
9505
- this.CompressionDisabledIcon = 'k-i-zoom-actual-size';
9702
+ this.originalInlineStyle = '';
9703
+ this.compressionEnableIcon = 'k-i-zoom-best-fit';
9704
+ this.compressionDisabledIcon = 'k-i-zoom-actual-size';
9506
9705
  }
9706
+ /** Initialize component state and editor configuration. */
9507
9707
  ngOnInit() {
9508
9708
  super.setupInnerField();
9509
- this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer'; // || 'default';
9709
+ // Backward-compatible default: when not provided, use explorer.
9710
+ this.data.ToolBarUploadImageMethod = this.data.ToolBarUploadImageMethod || 'explorer';
9510
9711
  this.setupPasteCleanupSettings();
9511
9712
  super.setupComponentSettings(this.componentSettings);
9512
9713
  super.focusOnDefault(this.focus.bind(this));
9513
- this.isCompressModeOn = !!this.data.Compression;
9714
+ // Safe cast to boolean.
9715
+ this.isCompressModeOn = !!this.data?.Compression;
9514
9716
  }
9717
+ /** Notify component service once view is ready. */
9515
9718
  ngAfterViewInit() {
9516
9719
  this.componentService.decrementComponentCounterForField(this.data);
9517
9720
  }
9721
+ /** Sync editor content to zModel and trigger configured change handler. */
9518
9722
  onChange(value) {
9519
9723
  ZComponentHelper.setToZModel(this.data.Value, value, this.group, this.data);
9520
- this.triggerEvent("inputfield-onChange", this.data.OnChange, value);
9521
- }
9522
- async onPaste($event) {
9523
- const imageCompressionEnabled = !!this.data.Compression;
9524
- if (imageCompressionEnabled && this.isCompressModeOn) {
9525
- let beforeSize = 0;
9526
- let afterSize = 0;
9527
- const parser = new DOMParser();
9528
- const doc = parser.parseFromString($event.cleanedHtml, 'text/html');
9529
- const imgElements = Array.from(doc.querySelectorAll('img')).filter(dom => dom.src.startsWith('data:image/'));
9530
- await Promise.all(imgElements.map(async (imgTags, index) => {
9531
- const file = await this.base64ToFile(imgTags.src, "image" + index.toString());
9532
- beforeSize += file.size;
9533
- const compress = await this.ImageCompression(file);
9534
- if (compress != null) {
9535
- const base64 = await this.readFileAsDataURL(compress);
9536
- afterSize += compress.size;
9537
- imgTags.src = base64;
9538
- }
9539
- else {
9540
- console.log('Image compress failed');
9541
- }
9542
- }));
9543
- console.log(`Before Image compress size: ${(beforeSize / 1024).toFixed(2)}KB`);
9544
- console.log(`After Image compress size: ${(afterSize / 1024).toFixed(2)}KB`);
9545
- this.editor.value = doc.body.innerHTML;
9724
+ this.triggerEvent('inputfield-onChange', this.data.OnChange, value);
9725
+ }
9726
+ /** Handle paste: normalize plain-text special entities, then optionally compress pasted base64 images. */
9727
+ async onPaste(e) {
9728
+ if (!e) {
9729
+ console.warn('[Ztexteditor] Paste event is undefined. Paste ignored.');
9730
+ return;
9546
9731
  }
9732
+ // Common Excel/plain-text issue: "&amp;" gets inserted literally causing "&amp;amp;" in HTML.
9733
+ this.handleCommonSymbolTags(e);
9734
+ // Compress only if enabled and base64 images exist.
9735
+ await this.handleImageCompression(e);
9547
9736
  }
9548
- OnOffCompressMode($event) {
9549
- debugger;
9550
- const alertHeader = `Confirmation`;
9551
- 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.`;
9552
- const buttonConfig = {
9737
+ /**
9738
+ * If the paste is plain text (no HTML tags and no images), normalize common entities and insert as real text.
9739
+ * Returns true when the event is handled and default paste is prevented.
9740
+ */
9741
+ handleCommonSymbolTags(e) {
9742
+ const editor = this.editor;
9743
+ if (!editor) {
9744
+ console.warn('[Ztexteditor] Editor is not ready. Cannot handle plain-text normalization.');
9745
+ return false;
9746
+ }
9747
+ const clipboard = e.originalEvent?.clipboardData;
9748
+ const plainText = clipboard?.getData('text/plain') ?? '';
9749
+ const htmlText = clipboard?.getData('text/html') ?? '';
9750
+ const cleanedHtml = e.cleanedHtml ?? '';
9751
+ const htmlHasImg = /<img\b/i.test(htmlText);
9752
+ const cleanedHasTags = /<[^>]+>/.test(cleanedHtml);
9753
+ // If paste has HTML tags or images, do NOT interfere (let Kendo handle it).
9754
+ if (htmlHasImg || cleanedHasTags) {
9755
+ return false;
9756
+ }
9757
+ // Plain-text paste: prevent Kendo from inserting encoded entities as literal text.
9758
+ e.preventDefault();
9759
+ // Decode common entities once so user sees correct characters.
9760
+ // This is intentionally limited to common entities to avoid unexpected transformations.
9761
+ const normalized = (plainText || cleanedHtml)
9762
+ .replaceAll('&amp;', '&')
9763
+ .replaceAll('&lt;', '<')
9764
+ .replaceAll('&gt;', '>')
9765
+ .replaceAll('&quot;', '"')
9766
+ .replaceAll('&#39;', "'");
9767
+ editor.exec('insertText', { text: normalized });
9768
+ return true;
9769
+ }
9770
+ /**
9771
+ * If compression is enabled and compress mode is ON, compress any pasted base64 images (data:image/*).
9772
+ * IMPORTANT: modifies e.cleanedHtml (what gets pasted), not editor.value.
9773
+ */
9774
+ async handleImageCompression(e) {
9775
+ const compressionConfig = this.data?.Compression;
9776
+ const isCompressionEnabled = !!compressionConfig;
9777
+ if (!isCompressionEnabled || !this.isCompressModeOn) {
9778
+ return;
9779
+ }
9780
+ const cleaned = e.cleanedHtml ?? '';
9781
+ if (!cleaned) {
9782
+ return;
9783
+ }
9784
+ let doc;
9785
+ try {
9786
+ doc = new DOMParser().parseFromString(cleaned, 'text/html');
9787
+ }
9788
+ catch (err) {
9789
+ console.warn('[Ztexteditor] Failed to parse pasted HTML for image compression. Paste will continue.', err);
9790
+ return;
9791
+ }
9792
+ const imgElements = Array.from(doc.querySelectorAll('img'))
9793
+ .map(img => img)
9794
+ .filter(img => typeof img?.src === 'string' && img.src.startsWith('data:image/'));
9795
+ if (imgElements.length === 0) {
9796
+ return;
9797
+ }
9798
+ let beforeSizeBytes = 0;
9799
+ let afterSizeBytes = 0;
9800
+ let failedCount = 0;
9801
+ await Promise.all(imgElements.map(async (img, index) => {
9802
+ const src = img.src;
9803
+ try {
9804
+ const file = await this.base64ToFile(src, `pasted-image-${index}`);
9805
+ beforeSizeBytes += file.size;
9806
+ const compressed = await this.imageCompression(file);
9807
+ if (!compressed) {
9808
+ failedCount++;
9809
+ console.warn(`[Ztexteditor] Image compression skipped/failed for pasted image #${index + 1}.`);
9810
+ return;
9811
+ }
9812
+ const base64 = await this.readFileAsDataURL(compressed);
9813
+ afterSizeBytes += compressed.size;
9814
+ img.src = base64;
9815
+ }
9816
+ catch (err) {
9817
+ failedCount++;
9818
+ console.warn(`[Ztexteditor] Error compressing pasted image #${index + 1}.`, err);
9819
+ }
9820
+ }));
9821
+ // Helpful console logs for troubleshooting.
9822
+ const beforeKb = (beforeSizeBytes / 1024).toFixed(2);
9823
+ const afterKb = (afterSizeBytes / 1024).toFixed(2);
9824
+ console.log(`[Ztexteditor] Pasted image compression completed. Images=${imgElements.length}, Failed=${failedCount}, Before=${beforeKb}KB, After=${afterKb}KB`);
9825
+ // Modify what gets pasted, not editor.value.
9826
+ e.cleanedHtml = doc.body.innerHTML;
9827
+ }
9828
+ /**
9829
+ * Toggle compress mode via confirmation dialog.
9830
+ */
9831
+ onOffCompressMode(event) {
9832
+ const header = 'Confirmation';
9833
+ const actionText = this.isCompressModeOn ? 'disable' : 'enable';
9834
+ // Keep existing behavior: toggling resets content.
9835
+ const message = `Do you want to <b>${actionText}</b> image compression when input content?` +
9836
+ `<br/>Note: Click "Yes" the content will be reset to blank.`;
9837
+ const buttons = {
9553
9838
  yes: { text: 'Yes', cssClass: 'primary' },
9554
- no: { text: 'No', cssClass: 'secondary' }
9839
+ no: { text: 'No', cssClass: 'secondary' },
9555
9840
  };
9556
- this.alertService.show(alertHeader, alertMessage, [buttonConfig.yes, buttonConfig.no], ['col-4'])
9841
+ this.alertService
9842
+ .show(header, message, [buttons.yes, buttons.no], ['col-4'])
9557
9843
  .subscribe(reply => {
9558
- if (reply === 'Yes') {
9559
- this.editor.value = "";
9560
- this.isCompressModeOn = !this.isCompressModeOn;
9561
- let button = $event.target;
9562
- button.classList.remove(this.CompressionEnableIcon);
9563
- button.classList.remove(this.CompressionDisabledIcon);
9564
- button.classList.add(this.isCompressModeOn ? this.CompressionDisabledIcon : this.CompressionEnableIcon);
9844
+ if (reply !== 'Yes') {
9845
+ return;
9846
+ }
9847
+ const editor = this.editor;
9848
+ if (!editor) {
9849
+ console.warn('[Ztexteditor] Editor is not ready. Cannot toggle compression mode.');
9850
+ return;
9851
+ }
9852
+ editor.value = '';
9853
+ this.isCompressModeOn = !this.isCompressModeOn;
9854
+ // Update toolbar icon classes safely.
9855
+ const buttonEl = this.getEventTargetElement(event);
9856
+ if (!buttonEl) {
9857
+ console.warn('[Ztexteditor] Unable to resolve toolbar button element from event.');
9858
+ }
9859
+ else {
9860
+ buttonEl.classList.remove(this.compressionEnableIcon, this.compressionDisabledIcon);
9861
+ buttonEl.classList.add(this.isCompressModeOn ? this.compressionDisabledIcon : this.compressionEnableIcon);
9862
+ }
9863
+ if (this.compress_btn) {
9565
9864
  this.compress_btn.title = `${this.isCompressModeOn ? 'Disable' : 'Enable'} image compression`;
9566
- this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, "success");
9567
9865
  }
9866
+ this.toastService.show(`${this.isCompressModeOn ? 'Enable' : 'Disable'} image compression successfully.`, 'top', false, 2500, 'success');
9568
9867
  });
9569
9868
  }
9869
+ /** Focus editor if available. Returns true if focus succeeded. */
9570
9870
  focus() {
9571
9871
  if (this.editor) {
9572
9872
  this.editor.focus();
@@ -9581,96 +9881,182 @@ class ZtexteditorComponent extends InputFieldBase {
9581
9881
  }
9582
9882
  return iconName;
9583
9883
  }
9884
+ /** Merge paste cleanup options from data.Options (string expression or object) into pasteCleanupSettings. */
9584
9885
  setupPasteCleanupSettings() {
9585
- if (this.data.Options) {
9586
- if (typeof this.data.Options == 'string') {
9587
- const option = ZComponentHelper.getGroupValue(this.data.Options, this.group);
9588
- Object.assign(this.pasteCleanupSettings, option);
9886
+ const options = this.data?.Options;
9887
+ if (!options) {
9888
+ return;
9889
+ }
9890
+ if (typeof options === 'string') {
9891
+ const resolved = ZComponentHelper.getGroupValue(options, this.group);
9892
+ if (resolved && typeof resolved === 'object') {
9893
+ Object.assign(this.pasteCleanupSettings, resolved);
9589
9894
  }
9590
- else if (typeof this.data.Options == 'object') {
9591
- Object.assign(this.pasteCleanupSettings, this.data.Options);
9895
+ else {
9896
+ console.warn('[Ztexteditor] data.Options resolved value is not an object. Paste cleanup settings unchanged.', {
9897
+ resolved,
9898
+ });
9592
9899
  }
9900
+ return;
9901
+ }
9902
+ if (typeof options === 'object') {
9903
+ Object.assign(this.pasteCleanupSettings, options);
9904
+ return;
9593
9905
  }
9906
+ console.warn('[Ztexteditor] Unsupported data.Options type. Paste cleanup settings unchanged.', {
9907
+ type: typeof options,
9908
+ });
9594
9909
  }
9595
- // #region Custom Image Upload
9910
+ // #region Custom Image Upload / Enlarge
9911
+ /** Trigger hidden file input click for image upload. */
9596
9912
  openFileExplorer() {
9597
- const input = document.getElementById(`${this.data.Value}-upload-file`);
9598
- if (input) {
9599
- input.click();
9913
+ const id = `${this.data.Value}-upload-file`;
9914
+ const input = document.getElementById(id);
9915
+ if (!input) {
9916
+ console.warn(`[Ztexteditor] Upload input element not found (id="${id}").`);
9917
+ return;
9600
9918
  }
9919
+ input.click();
9601
9920
  }
9921
+ /** Open an enlarged popup editor. */
9602
9922
  openPopup() {
9603
- if (this.editor) {
9604
- // Open the popup
9605
- this.dialogRef = this.dialogService.open({
9606
- content: ZtexteditorComponent,
9607
- width: '98%',
9608
- height: '97%'
9609
- });
9610
- const texteditor = this.dialogRef.content.instance;
9611
- texteditor.data = this.data;
9612
- texteditor.data.AllowEnlarge = false;
9613
- texteditor.dialogRef = this.dialogRef;
9614
- texteditor.CloseEnlargeBtn = true;
9615
- texteditor.componentProperties = this.componentProperties;
9616
- this.style = this.componentProperties.style.style1;
9617
- texteditor.componentProperties.style.style1 += "height:" + (window.innerHeight * 0.8).toString() + "px";
9618
- texteditor.group = this.group;
9619
- texteditor.componentSettings = this.componentSettings;
9620
- texteditor.form = this.form;
9621
- //To set the html back into the target ztext editor.
9622
- this.dialogRef.result.subscribe(() => {
9623
- this.data.AllowEnlarge = true;
9624
- this.componentProperties.style.style1 = this.style;
9625
- this.editor.value = this.group.zModel[this.data.Value];
9626
- this.onChange(this.group.zModel[this.data.Value]);
9627
- this.focus();
9628
- });
9923
+ const editor = this.editor;
9924
+ if (!editor) {
9925
+ console.warn('[Ztexteditor] Editor is not ready. Cannot open popup.');
9926
+ return;
9629
9927
  }
9928
+ // Open dialog
9929
+ this.dialogRef = this.dialogService.open({
9930
+ content: ZtexteditorComponent,
9931
+ width: '98%',
9932
+ height: '97%',
9933
+ });
9934
+ const popupComponent = this.dialogRef.content.instance;
9935
+ popupComponent.data = this.data;
9936
+ popupComponent.data.AllowEnlarge = false;
9937
+ popupComponent.dialogRef = this.dialogRef;
9938
+ popupComponent.CloseEnlargeBtn = true;
9939
+ popupComponent.componentProperties = this.componentProperties;
9940
+ // Preserve style so we can restore it on close.
9941
+ this.originalInlineStyle = this.componentProperties?.style?.style1 ?? '';
9942
+ if (popupComponent.componentProperties?.style) {
9943
+ popupComponent.componentProperties.style.style1 =
9944
+ (popupComponent.componentProperties.style.style1 ?? '') +
9945
+ `height:${(window.innerHeight * 0.8).toString()}px`;
9946
+ }
9947
+ popupComponent.group = this.group;
9948
+ popupComponent.componentSettings = this.componentSettings;
9949
+ popupComponent.form = this.form;
9950
+ // Restore state and push value back into editor on close.
9951
+ this.dialogRef.result.subscribe(() => {
9952
+ this.data.AllowEnlarge = true;
9953
+ if (this.componentProperties?.style) {
9954
+ this.componentProperties.style.style1 = this.originalInlineStyle;
9955
+ }
9956
+ // Pull current zModel into editor and trigger onChange (existing behavior).
9957
+ const newValue = this.group?.zModel?.[this.data.Value];
9958
+ editor.value = newValue;
9959
+ this.onChange(newValue);
9960
+ this.focus();
9961
+ });
9630
9962
  }
9963
+ /** Close the popup editor if open. */
9631
9964
  onPopupClose() {
9965
+ if (!this.dialogRef) {
9966
+ return;
9967
+ }
9632
9968
  this.dialogRef.close();
9633
9969
  }
9970
+ /**
9971
+ * Handle <input type="file"> change and insert selected image into editor.
9972
+ * NOTE: Prefer typing fileInput as Event for better safety.
9973
+ */
9634
9974
  uploadImage(fileInput) {
9635
- const uploadedImage = fileInput.target.files[0];
9636
- if (uploadedImage) {
9637
- this.insertImageIntoEditor(uploadedImage);
9975
+ const input = fileInput?.target;
9976
+ const file = input?.files?.[0];
9977
+ if (!file) {
9978
+ console.warn('[Ztexteditor] No image selected for upload.');
9979
+ return;
9638
9980
  }
9981
+ void this.insertImageIntoEditor(file);
9639
9982
  }
9983
+ /** Insert image into editor, optionally compressing first. */
9640
9984
  async insertImageIntoEditor(file) {
9641
- const imageCompressionEnabled = !!this.data.Compression;
9642
- if (imageCompressionEnabled) {
9643
- console.log(`Before Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
9644
- file = await this.ImageCompression(file);
9645
- console.log(`After Image compress size: ${(file.size / 1024).toFixed(2)}KB`);
9985
+ const editor = this.editor;
9986
+ if (!editor) {
9987
+ console.warn('[Ztexteditor] Editor is not ready. Cannot insert image.');
9988
+ return;
9989
+ }
9990
+ let workingFile = file;
9991
+ const compressionConfig = this.data?.Compression;
9992
+ const compressionEnabled = !!compressionConfig;
9993
+ if (compressionEnabled) {
9994
+ console.log(`[Ztexteditor] Upload image before compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
9995
+ workingFile = await this.imageCompression(workingFile);
9996
+ if (!workingFile) {
9997
+ console.warn('[Ztexteditor] Image compression failed. Upload image insertion aborted.');
9998
+ return;
9999
+ }
10000
+ console.log(`[Ztexteditor] Upload image after compression: ${(workingFile.size / 1024).toFixed(2)}KB`);
10001
+ }
10002
+ try {
10003
+ const base64 = await this.readFileAsDataURL(workingFile);
10004
+ editor.exec('insertImage', { src: base64 });
10005
+ }
10006
+ catch (err) {
10007
+ console.warn('[Ztexteditor] Failed to read uploaded image as base64.', err);
9646
10008
  }
9647
- var base64str = await this.readFileAsDataURL(file);
9648
- this.editor.exec("insertImage", { src: base64str });
9649
10009
  }
10010
+ /** Convert base64 (data URL) to File. */
9650
10011
  async base64ToFile(base64String, fileName) {
10012
+ // Using fetch on data URL is supported by modern browsers; keep existing logic.
9651
10013
  const response = await fetch(base64String);
9652
10014
  const blob = await response.blob();
9653
- const file = new File([blob], fileName, {
10015
+ return new File([blob], fileName, {
9654
10016
  type: blob.type,
9655
10017
  lastModified: Date.now(),
9656
10018
  });
9657
- return file;
9658
- }
9659
- async ImageCompression(file) {
9660
- //Check if Image Compression is enabled.
9661
- if (file && file.type.includes("image")) {
9662
- const imgConfig = this.compressionConfigHandler(this.data.Compression);
9663
- if (file.size > imgConfig.FileSizeMinSizeByte) {
9664
- const compressed$ = this.compressImage.compress(file, imgConfig);
9665
- const compressFile = await firstValueFrom(compressed$);
9666
- return compressFile;
9667
- } // file size check
10019
+ }
10020
+ /**
10021
+ * Compress an image file if it is an image and above min threshold.
10022
+ * Returns the compressed file, or null if not compressible / compression skipped.
10023
+ */
10024
+ async imageCompression(file) {
10025
+ if (!file) {
10026
+ console.warn('[Ztexteditor] imageCompression called with empty file.');
10027
+ return null;
9668
10028
  }
9669
- else {
10029
+ if (!file.type || !file.type.includes('image')) {
10030
+ console.warn('[Ztexteditor] Skipping compression: file is not an image.', { type: file.type });
10031
+ return null;
10032
+ }
10033
+ const config = this.data?.Compression;
10034
+ if (!config) {
10035
+ // Compression not configured.
10036
+ return null;
10037
+ }
10038
+ const imgConfig = this.compressionConfigHandler(config);
10039
+ // If file is below threshold, keep existing behavior: skip compression (return null).
10040
+ if (file.size <= imgConfig.FileSizeMinSizeByte) {
10041
+ console.log(`[Ztexteditor] Skipping compression: file size ${(file.size / 1024).toFixed(2)}KB is below threshold ${(imgConfig.FileSizeMinSizeByte / 1024).toFixed(2)}KB.`);
10042
+ return null;
10043
+ }
10044
+ try {
10045
+ const compressed$ = this.compressImage.compress(file, imgConfig);
10046
+ const compressedFile = await firstValueFrom(compressed$);
10047
+ return compressedFile ?? null;
10048
+ }
10049
+ catch (err) {
10050
+ console.warn('[Ztexteditor] Compression service threw an error.', err);
9670
10051
  return null;
9671
10052
  }
9672
10053
  }
10054
+ /** Normalize image compression config into byte-based thresholds. */
9673
10055
  compressionConfigHandler(imgConfig) {
10056
+ if (!imgConfig) {
10057
+ // Defensive: should never happen because caller checks.
10058
+ return imgConfig;
10059
+ }
9674
10060
  if (imgConfig.FileSizeMaxSize) {
9675
10061
  imgConfig.FileSizeMaxSizeByte = this.convertSizeToByte(imgConfig.FileSizeMaxSize);
9676
10062
  }
@@ -9682,63 +10068,74 @@ class ZtexteditorComponent extends InputFieldBase {
9682
10068
  }
9683
10069
  return imgConfig;
9684
10070
  }
10071
+ /**
10072
+ * Convert size string like "100kb", "1 MB", "2gb" to bytes.
10073
+ * If no unit is provided, bytes are assumed.
10074
+ */
9685
10075
  convertSizeToByte(sizeString) {
9686
- let _tempFileSizeMaxSize = 0;
9687
- let sizeByByte = 0;
9688
- let sizeType = 'b';
9689
- // remove all space
9690
- const _tempFileSize = sizeString.replace(/ /g, '');
9691
- // check last char is alphabetic
9692
- const lastChar = _tempFileSize.substr(_tempFileSize.length - 1);
9693
- if (isNaN(parseFloat(lastChar))) {
9694
- const secLastChar = _tempFileSize.substr(_tempFileSize.length - 2).slice(0, -1);
9695
- if (isNaN(parseFloat(secLastChar))) {
9696
- // check last 2nd char is alphabetic
9697
- sizeType = secLastChar + sizeType;
9698
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -2));
9699
- }
9700
- else {
9701
- _tempFileSizeMaxSize = parseFloat(_tempFileSize.slice(0, -1));
9702
- }
9703
- switch (sizeType.toLowerCase()) {
9704
- case "b":
9705
- sizeByByte = _tempFileSizeMaxSize;
9706
- break;
9707
- case "kb":
9708
- sizeByByte = _tempFileSizeMaxSize * 1024;
9709
- break;
9710
- case "mb":
9711
- sizeByByte = _tempFileSizeMaxSize * 1048576;
9712
- break;
9713
- case "gb":
9714
- sizeByByte = _tempFileSizeMaxSize * 1073741824;
9715
- break;
9716
- }
10076
+ if (!sizeString || typeof sizeString !== 'string') {
10077
+ console.warn('[Ztexteditor] convertSizeToByte received invalid sizeString. Defaulting to 0.', { sizeString });
10078
+ return 0;
9717
10079
  }
9718
- else {
9719
- // default using bytes if no size type
9720
- sizeByByte = parseFloat(_tempFileSize);
10080
+ // Remove all spaces, e.g. "1 MB" -> "1MB"
10081
+ const trimmed = sizeString.replace(/ /g, '').trim();
10082
+ if (!trimmed) {
10083
+ return 0;
10084
+ }
10085
+ // Extract numeric part and unit part (letters).
10086
+ // Example: "1.5MB" => number=1.5, unit="mb"
10087
+ const match = /^([0-9]*\.?[0-9]+)([a-zA-Z]*)$/.exec(trimmed);
10088
+ if (!match) {
10089
+ console.warn('[Ztexteditor] Unable to parse sizeString. Defaulting to 0.', { sizeString });
10090
+ return 0;
10091
+ }
10092
+ const numeric = Number(match[1]);
10093
+ const unit = (match[2] || 'b').toLowerCase();
10094
+ if (Number.isNaN(numeric) || numeric < 0) {
10095
+ console.warn('[Ztexteditor] Invalid numeric size in sizeString. Defaulting to 0.', { sizeString });
10096
+ return 0;
10097
+ }
10098
+ switch (unit) {
10099
+ case 'b':
10100
+ case '':
10101
+ return numeric;
10102
+ case 'kb':
10103
+ return numeric * 1024;
10104
+ case 'mb':
10105
+ return numeric * 1024 * 1024;
10106
+ case 'gb':
10107
+ return numeric * 1024 * 1024 * 1024;
10108
+ default:
10109
+ console.warn('[Ztexteditor] Unknown unit in sizeString. Defaulting to bytes.', { sizeString, unit });
10110
+ return numeric;
9721
10111
  }
9722
- return sizeByByte;
9723
10112
  }
10113
+ /** Read a File as base64 data URL. */
9724
10114
  readFileAsDataURL(file) {
9725
10115
  return new Promise((resolve, reject) => {
10116
+ if (!file) {
10117
+ reject(new Error('File is required.'));
10118
+ return;
10119
+ }
9726
10120
  const reader = new FileReader();
9727
10121
  reader.readAsDataURL(file);
9728
- reader.onload = () => {
9729
- resolve(reader.result);
9730
- };
9731
- reader.onerror = (error) => {
9732
- reject(error);
9733
- };
10122
+ reader.onload = () => resolve(reader.result);
10123
+ reader.onerror = (error) => reject(error);
9734
10124
  });
9735
10125
  }
10126
+ // #endregion
10127
+ // #region Small helpers
10128
+ /** Extract event target as HTMLElement safely. */
10129
+ getEventTargetElement(event) {
10130
+ const target = event?.target;
10131
+ return target instanceof HTMLElement ? target : null;
10132
+ }
9736
10133
  }
9737
10134
  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 });
9738
- 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]" }] });
10135
+ 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]" }] });
9739
10136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, decorators: [{
9740
10137
  type: Component,
9741
- 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"] }]
10138
+ 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"] }]
9742
10139
  }], ctorParameters: function () { return [{ type: ZComponentService }, { type: i2.FontAweSomeService }, { type: i6.DialogService }, { type: i2.AlertService }, { type: i2.CompressImageService }, { type: i2.ToastService }]; }, propDecorators: { editor: [{
9743
10140
  type: ViewChild,
9744
10141
  args: ['editor']
@@ -12070,6 +12467,13 @@ class ZschedulerComponent {
12070
12467
  }
12071
12468
  //Set session values
12072
12469
  this.group["selectedDate"] = args.selectedDate;
12470
+ if (this.data.OnDateChange) {
12471
+ const func = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnDateChange);
12472
+ if (typeof func === 'function') {
12473
+ const callFunc = func.bind(this.group.ctrlScope);
12474
+ callFunc(args);
12475
+ }
12476
+ }
12073
12477
  console.log("zschedule component date-change selection: ", args.dateRange);
12074
12478
  // this.local.selectedDate = args.dateRange.start;
12075
12479
  this.group.subject.next({
@@ -14670,8 +15074,8 @@ class ZprogressbarComponent extends FieldBase {
14670
15074
  ngOnInit() {
14671
15075
  super.initComponent().subscribe(() => {
14672
15076
  this.value = this.group.zModel[this.data.Value];
14673
- this.minValue = this.data.MinValue || this.minValue;
14674
- this.maxValue = this.data.MaxValue || this.maxValue;
15077
+ this.minValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.MinValue) || this.minValue;
15078
+ this.maxValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.MaxValue) || this.maxValue;
14675
15079
  if (this.data.Options) {
14676
15080
  const optionType = typeof (this.data.Options);
14677
15081
  if (optionType === 'object') {