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