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.
- package/README.md +22 -0
- package/esm2020/lib/services/zcomponent.service.mjs +22 -32
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +11 -11
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +30 -14
- package/esm2020/lib/zgauge/zgauge.component.mjs +24 -16
- package/esm2020/lib/zprogressbar/zprogressbar.component.mjs +3 -3
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +8 -1
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +348 -149
- package/esm2020/lib/zupload/zupload.component.mjs +402 -211
- package/fesm2015/mmhglobal-dynamicform.mjs +863 -429
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +838 -428
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/services/zcomponent.service.d.ts +1 -3
- package/lib/zdatetime/dateParser.pipe.d.ts +1 -1
- package/lib/zdatetime/zdatetime.component.d.ts +5 -0
- package/lib/zgauge/zgauge.component.d.ts +14 -3
- package/lib/ztexteditor/ztexteditor.component.d.ts +59 -18
- package/lib/zupload/zupload.component.d.ts +85 -18
- package/package.json +1 -1
|
@@ -2376,37 +2376,27 @@ class ZComponentService {
|
|
|
2376
2376
|
}
|
|
2377
2377
|
return obsList;
|
|
2378
2378
|
}
|
|
2379
|
-
localizeDateTimeByIgnoringTimeZone(value,
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
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(
|
|
3629
|
-
|
|
3630
|
-
|
|
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
|
-
|
|
3637
|
-
|
|
3623
|
+
// For "ignore timezone" fields, normalize via service
|
|
3624
|
+
if (field.IsIgnoreTimeZone) {
|
|
3625
|
+
return this.componentService.localizeDateTimeByIgnoringTimeZone(rawValue, field);
|
|
3638
3626
|
}
|
|
3639
|
-
|
|
3627
|
+
// Otherwise, just convert to Date
|
|
3628
|
+
const inputDate = new Date(rawValue);
|
|
3629
|
+
return inputDate;
|
|
3640
3630
|
}
|
|
3641
3631
|
catch (error) {
|
|
3642
|
-
console.log(
|
|
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
|
|
7245
|
+
const dateValue = this.convertDateTimeValueToString(value);
|
|
7256
7246
|
if (formControl) {
|
|
7257
|
-
formControl.setValue(
|
|
7247
|
+
formControl.setValue(dateValue);
|
|
7258
7248
|
formControl.markAsTouched();
|
|
7259
7249
|
}
|
|
7260
|
-
|
|
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
|
|
7271
|
+
if (value === undefined || value === null) {
|
|
7281
7272
|
return undefined;
|
|
7282
7273
|
}
|
|
7283
|
-
const
|
|
7274
|
+
const inputDate = new Date(value);
|
|
7275
|
+
// zshortdate → normalize to first day of month
|
|
7284
7276
|
if (this.data.Type === 'zshortdate') {
|
|
7285
|
-
|
|
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
|
-
|
|
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
|
|
7294
|
-
|
|
7295
|
-
|
|
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:
|
|
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)
|
|
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]
|
|
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
|
|
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
|
|
7407
|
-
options.minorTicks = ZComponentHelper.getGroupEvalValue.call(this, field.MinorTicks) || options.minorTicks
|
|
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 =
|
|
7412
|
-
options.endAngle =
|
|
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=\"
|
|
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=\"
|
|
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
|
-
|
|
9145
|
-
|
|
9146
|
-
this.
|
|
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
|
-
//
|
|
9151
|
-
//
|
|
9152
|
-
//
|
|
9153
|
-
|
|
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
|
|
9166
|
-
|
|
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
|
-
|
|
9170
|
-
|
|
9171
|
-
|
|
9172
|
-
|
|
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
|
-
//
|
|
9177
|
-
//
|
|
9178
|
-
|
|
9179
|
-
if (e
|
|
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
|
-
|
|
9183
|
-
|
|
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
|
-
|
|
9186
|
-
|
|
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
|
-
//
|
|
9189
|
-
//
|
|
9190
|
-
|
|
9191
|
-
|
|
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[
|
|
9230
|
+
this.group.zModel[modelKey][existingFileIndex] = file;
|
|
9194
9231
|
}
|
|
9195
9232
|
else {
|
|
9196
|
-
this.group.zModel[
|
|
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[
|
|
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
|
-
|
|
9205
|
-
|
|
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:
|
|
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
|
-
|
|
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 =
|
|
9228
|
-
//
|
|
9229
|
-
const
|
|
9230
|
-
|
|
9231
|
-
|
|
9232
|
-
|
|
9233
|
-
const
|
|
9234
|
-
if (
|
|
9235
|
-
//
|
|
9236
|
-
sizeType =
|
|
9237
|
-
|
|
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
|
-
|
|
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 =
|
|
9322
|
+
sizeByByte = parsedValue;
|
|
9245
9323
|
break;
|
|
9246
9324
|
case "kb":
|
|
9247
|
-
sizeByByte =
|
|
9325
|
+
sizeByByte = parsedValue * 1024;
|
|
9248
9326
|
break;
|
|
9249
9327
|
case "mb":
|
|
9250
|
-
sizeByByte =
|
|
9328
|
+
sizeByByte = parsedValue * 1048576;
|
|
9251
9329
|
break;
|
|
9252
9330
|
case "gb":
|
|
9253
|
-
sizeByByte =
|
|
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
|
-
//
|
|
9259
|
-
|
|
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
|
-
|
|
9365
|
+
var _a, _b;
|
|
9366
|
+
if (!this.isValidUploadedFile(file)) {
|
|
9268
9367
|
e.preventDefault();
|
|
9269
9368
|
return;
|
|
9270
9369
|
}
|
|
9271
|
-
|
|
9272
|
-
|
|
9273
|
-
|
|
9274
|
-
|
|
9275
|
-
|
|
9276
|
-
|
|
9277
|
-
|
|
9278
|
-
|
|
9279
|
-
|
|
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.
|
|
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
|
-
|
|
9296
|
-
//
|
|
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
|
-
|
|
9308
|
-
|
|
9309
|
-
|
|
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
|
-
|
|
9313
|
-
const
|
|
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[
|
|
9429
|
+
this.group[`zupload_${(_b = this.data) === null || _b === void 0 ? void 0 : _b.Value}`] = this.fileList;
|
|
9317
9430
|
}
|
|
9318
|
-
|
|
9319
|
-
|
|
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:
|
|
9322
|
-
data: e
|
|
9435
|
+
target: removedEvent,
|
|
9436
|
+
data: e,
|
|
9323
9437
|
});
|
|
9438
|
+
return;
|
|
9324
9439
|
}
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
|
|
9328
|
-
|
|
9329
|
-
|
|
9330
|
-
|
|
9331
|
-
|
|
9332
|
-
|
|
9333
|
-
|
|
9334
|
-
|
|
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
|
-
|
|
9340
|
-
|
|
9341
|
-
|
|
9342
|
-
|
|
9343
|
-
|
|
9344
|
-
|
|
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
|
-
|
|
9349
|
-
|
|
9350
|
-
|
|
9351
|
-
|
|
9352
|
-
|
|
9353
|
-
|
|
9354
|
-
|
|
9355
|
-
|
|
9356
|
-
|
|
9357
|
-
|
|
9358
|
-
|
|
9359
|
-
}
|
|
9360
|
-
|
|
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
|
-
|
|
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
|
|
9371
|
-
const attachmentSourceUrl = this.zcoreService.getEnvironment().attachmentSourceUrl;
|
|
9372
|
-
|
|
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[
|
|
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) =>
|
|
9378
|
-
if (
|
|
9379
|
-
|
|
9380
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9406
|
-
|
|
9407
|
-
|
|
9408
|
-
|
|
9409
|
-
|
|
9410
|
-
|
|
9411
|
-
|
|
9412
|
-
|
|
9413
|
-
|
|
9414
|
-
|
|
9415
|
-
|
|
9416
|
-
|
|
9417
|
-
|
|
9418
|
-
|
|
9419
|
-
|
|
9420
|
-
|
|
9421
|
-
|
|
9422
|
-
|
|
9423
|
-
|
|
9424
|
-
|
|
9425
|
-
|
|
9426
|
-
|
|
9427
|
-
|
|
9428
|
-
|
|
9429
|
-
|
|
9430
|
-
|
|
9431
|
-
|
|
9432
|
-
|
|
9433
|
-
|
|
9434
|
-
|
|
9435
|
-
|
|
9436
|
-
|
|
9437
|
-
|
|
9438
|
-
|
|
9439
|
-
|
|
9440
|
-
|
|
9441
|
-
|
|
9442
|
-
|
|
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[
|
|
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 = [
|
|
9452
|
-
if (bytes
|
|
9453
|
-
return
|
|
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
|
-
|
|
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.
|
|
9537
|
-
this.
|
|
9538
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
9777
|
+
this.triggerEvent('inputfield-onChange', this.data.OnChange, value);
|
|
9554
9778
|
}
|
|
9555
|
-
|
|
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
|
-
|
|
9558
|
-
|
|
9559
|
-
|
|
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: "&" gets inserted literally causing "&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
|
-
|
|
9584
|
-
|
|
9585
|
-
|
|
9586
|
-
|
|
9587
|
-
|
|
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('&', '&')
|
|
9819
|
+
.replaceAll('<', '<')
|
|
9820
|
+
.replaceAll('>', '>')
|
|
9821
|
+
.replaceAll('"', '"')
|
|
9822
|
+
.replaceAll(''', "'");
|
|
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
|
|
9900
|
+
this.alertService
|
|
9901
|
+
.show(header, message, [buttons.yes, buttons.no], ['col-4'])
|
|
9592
9902
|
.subscribe(reply => {
|
|
9593
|
-
if (reply
|
|
9594
|
-
|
|
9595
|
-
|
|
9596
|
-
|
|
9597
|
-
|
|
9598
|
-
|
|
9599
|
-
|
|
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
|
-
|
|
9621
|
-
|
|
9622
|
-
|
|
9623
|
-
|
|
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
|
|
9626
|
-
|
|
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
|
|
9633
|
-
|
|
9634
|
-
|
|
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
|
-
|
|
9639
|
-
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
|
|
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
|
-
|
|
9671
|
-
|
|
9672
|
-
|
|
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
|
|
9678
|
-
if (
|
|
9679
|
-
console.
|
|
9680
|
-
|
|
9681
|
-
|
|
9682
|
-
|
|
9683
|
-
|
|
9684
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9701
|
-
|
|
9702
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9728
|
-
|
|
9729
|
-
|
|
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
|
-
|
|
9760
|
-
|
|
9761
|
-
|
|
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
|
-
|
|
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') {
|