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