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