@smartbit4all/ng-client 7.2.10 → 7.2.12
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.
|
@@ -52,6 +52,7 @@ import { MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle } fr
|
|
|
52
52
|
import { Chart, registerables } from 'chart.js';
|
|
53
53
|
import AnnotationPlugin from 'chartjs-plugin-annotation';
|
|
54
54
|
import ZoomPlugin from 'chartjs-plugin-zoom';
|
|
55
|
+
import ChartDataLabels from 'chartjs-plugin-datalabels';
|
|
55
56
|
import { MatToolbar } from '@angular/material/toolbar';
|
|
56
57
|
|
|
57
58
|
/**
|
|
@@ -7622,7 +7623,7 @@ var ToolbarDirection;
|
|
|
7622
7623
|
ToolbarDirection["VERTICAL"] = "VERTICAL";
|
|
7623
7624
|
})(ToolbarDirection || (ToolbarDirection = {}));
|
|
7624
7625
|
|
|
7625
|
-
let ApiModule$
|
|
7626
|
+
let ApiModule$3 = class ApiModule {
|
|
7626
7627
|
static forRoot(configurationFactory) {
|
|
7627
7628
|
return {
|
|
7628
7629
|
ngModule: ApiModule,
|
|
@@ -7642,7 +7643,7 @@ let ApiModule$1 = class ApiModule {
|
|
|
7642
7643
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
7643
7644
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
7644
7645
|
};
|
|
7645
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule$
|
|
7646
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule$3, decorators: [{
|
|
7646
7647
|
type: NgModule,
|
|
7647
7648
|
args: [{
|
|
7648
7649
|
imports: [],
|
|
@@ -7650,7 +7651,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
7650
7651
|
exports: [],
|
|
7651
7652
|
providers: []
|
|
7652
7653
|
}]
|
|
7653
|
-
}], ctorParameters: () => [{ type: ApiModule$
|
|
7654
|
+
}], ctorParameters: () => [{ type: ApiModule$3, decorators: [{
|
|
7654
7655
|
type: Optional
|
|
7655
7656
|
}, {
|
|
7656
7657
|
type: SkipSelf
|
|
@@ -10923,7 +10924,7 @@ class SmartformwidgetComponent {
|
|
|
10923
10924
|
this.valueCleared = output();
|
|
10924
10925
|
this.smartFormWidgetType = SmartFormWidgetType;
|
|
10925
10926
|
this.hasError = false;
|
|
10926
|
-
this.toHighlight =
|
|
10927
|
+
this.toHighlight = "";
|
|
10927
10928
|
this.isEnterPressed = false;
|
|
10928
10929
|
this.isDatePickerRequired = false;
|
|
10929
10930
|
this.SmartWidgetHintPosition = SmartWidgetHintPositionEnum;
|
|
@@ -10959,10 +10960,14 @@ class SmartformwidgetComponent {
|
|
|
10959
10960
|
: [];
|
|
10960
10961
|
}
|
|
10961
10962
|
ngOnInit() {
|
|
10962
|
-
this.form()
|
|
10963
|
+
this.form()
|
|
10964
|
+
.valueChanges.pipe(takeUntil(this._destroy$))
|
|
10965
|
+
.subscribe(() => {
|
|
10963
10966
|
this.getErrorMessage(this.widgetInstance);
|
|
10964
10967
|
});
|
|
10965
|
-
this.onBlur()
|
|
10968
|
+
this.onBlur()
|
|
10969
|
+
?.pipe(takeUntil(this._destroy$))
|
|
10970
|
+
.subscribe(() => {
|
|
10966
10971
|
this.getErrorMessage(this.widgetInstance);
|
|
10967
10972
|
});
|
|
10968
10973
|
// handle initial error message from server
|
|
@@ -10972,8 +10977,8 @@ class SmartformwidgetComponent {
|
|
|
10972
10977
|
if (this.widgetInstance.indicator?.indicatorLength) {
|
|
10973
10978
|
this.indicatorItems = new Array(this.widgetInstance.indicator.indicatorLength);
|
|
10974
10979
|
}
|
|
10975
|
-
this.form()
|
|
10976
|
-
.pipe(takeUntil(this._destroy$))
|
|
10980
|
+
this.form()
|
|
10981
|
+
.controls[this.widgetInstance.indicator.indicateProperty].valueChanges.pipe(takeUntil(this._destroy$))
|
|
10977
10982
|
.subscribe((value) => {
|
|
10978
10983
|
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR) {
|
|
10979
10984
|
this.widgetInstance.indicator.indicatorValue =
|
|
@@ -10986,20 +10991,21 @@ class SmartformwidgetComponent {
|
|
|
10986
10991
|
if (this.onValueChange == undefined) {
|
|
10987
10992
|
this.onValueChange = new Subject();
|
|
10988
10993
|
}
|
|
10989
|
-
this.filteredOptions = this.onValueChange.pipe(startWith(
|
|
10994
|
+
this.filteredOptions = this.onValueChange.pipe(startWith(""), map((value) => this._filter(value || "")), takeUntil(this._destroy$));
|
|
10990
10995
|
}
|
|
10991
10996
|
if (this.widgetInstance.type === SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
10992
10997
|
let videoId = this.parseYoutubeUrl(this.widgetInstance.link);
|
|
10993
10998
|
if (videoId)
|
|
10994
10999
|
this.widgetInstance.videoId = videoId;
|
|
10995
|
-
const tag = document.createElement(
|
|
10996
|
-
tag.src =
|
|
11000
|
+
const tag = document.createElement("script");
|
|
11001
|
+
tag.src = "https://www.youtube.com/iframe_api";
|
|
10997
11002
|
document.body.appendChild(tag);
|
|
10998
11003
|
}
|
|
10999
|
-
let formControls = Object.keys(this.form().controls).filter((key) => key === this.widgetInstance.key ||
|
|
11004
|
+
let formControls = Object.keys(this.form().controls).filter((key) => key === this.widgetInstance.key ||
|
|
11005
|
+
key.startsWith(`${this.widgetInstance.key}.`));
|
|
11000
11006
|
formControls.map((key) => {
|
|
11001
|
-
this.form()
|
|
11002
|
-
.pipe(distinctUntilChanged(), takeUntil(this._destroy$))
|
|
11007
|
+
this.form()
|
|
11008
|
+
.controls[key].valueChanges.pipe(distinctUntilChanged(), takeUntil(this._destroy$))
|
|
11003
11009
|
.subscribe((value) => {
|
|
11004
11010
|
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS &&
|
|
11005
11011
|
this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
@@ -11017,11 +11023,11 @@ class SmartformwidgetComponent {
|
|
|
11017
11023
|
return this.widgetInstance.type === SmartFormWidgetType.SELECT ||
|
|
11018
11024
|
this.widgetInstance.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
11019
11025
|
this.widgetInstance.type === SmartFormWidgetType.RADIO_BUTTON
|
|
11020
|
-
?
|
|
11021
|
-
:
|
|
11026
|
+
? "selection"
|
|
11027
|
+
: "basic";
|
|
11022
11028
|
}
|
|
11023
11029
|
parseYoutubeUrl(url) {
|
|
11024
|
-
url = url.replace(
|
|
11030
|
+
url = url.replace("/shorts/", "/watch?v=");
|
|
11025
11031
|
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
|
|
11026
11032
|
var match = url.match(regExp);
|
|
11027
11033
|
return match && match[7].length == 11 ? match[7] : false;
|
|
@@ -11054,13 +11060,13 @@ class SmartformwidgetComponent {
|
|
|
11054
11060
|
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
11055
11061
|
this.isDatePickerRequired = !!this.widgetInstance.validators?.some((smartValidator) => smartValidator.validator === Validators.required);
|
|
11056
11062
|
this.hasCreated = true;
|
|
11057
|
-
this.form()
|
|
11058
|
-
.pipe(takeUntil(this._destroy$))
|
|
11063
|
+
this.form()
|
|
11064
|
+
.controls[this.widgetInstance.key].valueChanges.pipe(takeUntil(this._destroy$))
|
|
11059
11065
|
.subscribe((_date) => {
|
|
11060
11066
|
this.handleDateChanged(_date);
|
|
11061
11067
|
});
|
|
11062
|
-
this.form()
|
|
11063
|
-
.pipe(takeUntil(this._destroy$))
|
|
11068
|
+
this.form()
|
|
11069
|
+
.controls[`${this.widgetInstance.key}-time`].valueChanges.pipe(takeUntil(this._destroy$))
|
|
11064
11070
|
.subscribe((timeValue) => {
|
|
11065
11071
|
this.handleTimeChanged(timeValue);
|
|
11066
11072
|
});
|
|
@@ -11075,15 +11081,15 @@ class SmartformwidgetComponent {
|
|
|
11075
11081
|
timeFormControl.hasValidator(Validators.required) &&
|
|
11076
11082
|
!_date) {
|
|
11077
11083
|
timeFormControl.removeValidators(Validators.required);
|
|
11078
|
-
timeFormControl.setValue(
|
|
11084
|
+
timeFormControl.setValue("");
|
|
11079
11085
|
}
|
|
11080
11086
|
else if (!this.isDatePickerRequired &&
|
|
11081
11087
|
!timeFormControl.hasValidator(Validators.required) &&
|
|
11082
11088
|
_date) {
|
|
11083
11089
|
timeFormControl.addValidators(Validators.required);
|
|
11084
|
-
if (timeFormControl.value ===
|
|
11090
|
+
if (timeFormControl.value === "") {
|
|
11085
11091
|
const now = new Date();
|
|
11086
|
-
timeFormControl.setValue(now.getHours() +
|
|
11092
|
+
timeFormControl.setValue(now.getHours() + ":" + now.getMinutes());
|
|
11087
11093
|
timeFormControl.markAsUntouched();
|
|
11088
11094
|
}
|
|
11089
11095
|
}
|
|
@@ -11094,7 +11100,7 @@ class SmartformwidgetComponent {
|
|
|
11094
11100
|
this.hasJustChanged = false;
|
|
11095
11101
|
return;
|
|
11096
11102
|
}
|
|
11097
|
-
const timeValue = timeFormControl.value ||
|
|
11103
|
+
const timeValue = timeFormControl.value || "00:00";
|
|
11098
11104
|
this.hasJustChanged = true;
|
|
11099
11105
|
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
11100
11106
|
this.setDateFormControl(dateFormControl, _date, timeValue);
|
|
@@ -11109,7 +11115,7 @@ class SmartformwidgetComponent {
|
|
|
11109
11115
|
dateFormControl.hasValidator(Validators.required) &&
|
|
11110
11116
|
!timeValue) {
|
|
11111
11117
|
dateFormControl.removeValidators(Validators.required);
|
|
11112
|
-
dateFormControl.setValue(dateFormControl.value ??
|
|
11118
|
+
dateFormControl.setValue(dateFormControl.value ?? "");
|
|
11113
11119
|
}
|
|
11114
11120
|
else if (!this.isDatePickerRequired &&
|
|
11115
11121
|
!dateFormControl.hasValidator(Validators.required) &&
|
|
@@ -11181,19 +11187,21 @@ class SmartformwidgetComponent {
|
|
|
11181
11187
|
style: {},
|
|
11182
11188
|
};
|
|
11183
11189
|
}
|
|
11184
|
-
if (!(
|
|
11185
|
-
this.widgetInstance
|
|
11190
|
+
if (!("width" in this.widgetInstance.style.style) &&
|
|
11191
|
+
"minWidth" in this.widgetInstance) {
|
|
11192
|
+
this.widgetInstance.style.style["width"] =
|
|
11193
|
+
`${this.widgetInstance.minWidth}px`;
|
|
11186
11194
|
}
|
|
11187
11195
|
return SmartStyleUtility.getNgStyles(this.widgetInstance.style);
|
|
11188
11196
|
}
|
|
11189
11197
|
getLabelNgClass() {
|
|
11190
|
-
if (
|
|
11198
|
+
if ("labelStyle" in this.widgetInstance) {
|
|
11191
11199
|
return SmartStyleUtility.getNgClasses(this.widgetInstance.labelStyle);
|
|
11192
11200
|
}
|
|
11193
11201
|
return {};
|
|
11194
11202
|
}
|
|
11195
11203
|
getLabelStyle() {
|
|
11196
|
-
if (
|
|
11204
|
+
if ("labelStyle" in this.widgetInstance) {
|
|
11197
11205
|
return SmartStyleUtility.getNgStyles(this.widgetInstance.labelStyle);
|
|
11198
11206
|
}
|
|
11199
11207
|
return {};
|
|
@@ -11220,7 +11228,7 @@ class SmartformwidgetComponent {
|
|
|
11220
11228
|
}
|
|
11221
11229
|
const insertOpCount = change.delta.ops?.filter((it) => !!it.insert).length ?? 0;
|
|
11222
11230
|
if (insertOpCount > 0) {
|
|
11223
|
-
this.quill?.quillEditor.setContents(change.oldDelta,
|
|
11231
|
+
this.quill?.quillEditor.setContents(change.oldDelta, "silent");
|
|
11224
11232
|
}
|
|
11225
11233
|
}
|
|
11226
11234
|
/**
|
|
@@ -11250,18 +11258,18 @@ class SmartformwidgetComponent {
|
|
|
11250
11258
|
return maxLength - this.quill.quillEditor.getText().length;
|
|
11251
11259
|
}
|
|
11252
11260
|
// fallback to the raw HTML content:
|
|
11253
|
-
return maxLength - this.form().controls[this.widgetInstance.key].value.length;
|
|
11261
|
+
return (maxLength - this.form().controls[this.widgetInstance.key].value.length);
|
|
11254
11262
|
}
|
|
11255
11263
|
add(event) {
|
|
11256
11264
|
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS) {
|
|
11257
11265
|
return;
|
|
11258
11266
|
}
|
|
11259
|
-
const value = (event.value ||
|
|
11267
|
+
const value = (event.value || "").trim();
|
|
11260
11268
|
if (this.setTextFieldChipsValue(value)) {
|
|
11261
11269
|
const valueChange = {
|
|
11262
11270
|
key: this.widgetInstance.key,
|
|
11263
11271
|
value: this.form().controls[this.widgetInstance.key].value,
|
|
11264
|
-
kind:
|
|
11272
|
+
kind: "selection",
|
|
11265
11273
|
};
|
|
11266
11274
|
this.sophisticatedValueChange().next(valueChange);
|
|
11267
11275
|
}
|
|
@@ -11279,7 +11287,7 @@ class SmartformwidgetComponent {
|
|
|
11279
11287
|
const valueChange = {
|
|
11280
11288
|
key: this.widgetInstance.key,
|
|
11281
11289
|
value: this.form().controls[this.widgetInstance.key].value,
|
|
11282
|
-
kind:
|
|
11290
|
+
kind: "selection",
|
|
11283
11291
|
};
|
|
11284
11292
|
this.sophisticatedValueChange().next(valueChange);
|
|
11285
11293
|
}
|
|
@@ -11293,7 +11301,7 @@ class SmartformwidgetComponent {
|
|
|
11293
11301
|
const valueChange = {
|
|
11294
11302
|
key: widgetInstance.key,
|
|
11295
11303
|
value: this.form().controls[widgetInstance.key].value,
|
|
11296
|
-
kind:
|
|
11304
|
+
kind: "selection",
|
|
11297
11305
|
};
|
|
11298
11306
|
this.sophisticatedValueChange().next(valueChange);
|
|
11299
11307
|
}
|
|
@@ -11324,16 +11332,16 @@ class SmartformwidgetComponent {
|
|
|
11324
11332
|
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
11325
11333
|
this.widgetInstance.type !== SmartFormWidgetType.CHECK_BOX &&
|
|
11326
11334
|
this.widgetInstance.type !== SmartFormWidgetType.RADIO_BUTTON) {
|
|
11327
|
-
return
|
|
11335
|
+
return "";
|
|
11328
11336
|
}
|
|
11329
11337
|
if (this.widgetInstance.direction === undefined) {
|
|
11330
|
-
return
|
|
11338
|
+
return "direction-row";
|
|
11331
11339
|
}
|
|
11332
11340
|
else if (this.widgetInstance.direction === SmartFormWidgetDirection.COL) {
|
|
11333
|
-
return
|
|
11341
|
+
return "direction-col";
|
|
11334
11342
|
}
|
|
11335
11343
|
else {
|
|
11336
|
-
return
|
|
11344
|
+
return "direction-row";
|
|
11337
11345
|
}
|
|
11338
11346
|
}
|
|
11339
11347
|
smartFormTextFieldButtonIconPosition() {
|
|
@@ -11344,9 +11352,9 @@ class SmartformwidgetComponent {
|
|
|
11344
11352
|
}
|
|
11345
11353
|
getWidgetLabel(widget) {
|
|
11346
11354
|
if (widget.type === SmartFormWidgetType.CONTAINER) {
|
|
11347
|
-
return
|
|
11355
|
+
return "";
|
|
11348
11356
|
}
|
|
11349
|
-
if (widget.label ===
|
|
11357
|
+
if (widget.label === "") {
|
|
11350
11358
|
return widget.label;
|
|
11351
11359
|
}
|
|
11352
11360
|
let isRequired = false;
|
|
@@ -11362,15 +11370,17 @@ class SmartformwidgetComponent {
|
|
|
11362
11370
|
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
11363
11371
|
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
11364
11372
|
widget.type !== SmartFormWidgetType.COMPONENT) {
|
|
11365
|
-
isRequired = widget.validators?.length
|
|
11373
|
+
isRequired = widget.validators?.length
|
|
11374
|
+
? this.fieldIsRequired() && !!widget.showLabel
|
|
11375
|
+
: false;
|
|
11366
11376
|
}
|
|
11367
11377
|
else if (widget.type === SmartFormWidgetType.LABEL) {
|
|
11368
11378
|
isRequired = widget.markAsRequired ? true : false;
|
|
11369
11379
|
}
|
|
11370
|
-
return `${widget.label}${isRequired ?
|
|
11380
|
+
return `${widget.label}${isRequired ? " *" : ""}`;
|
|
11371
11381
|
}
|
|
11372
11382
|
sanitizeHtml(value) {
|
|
11373
|
-
let safeValue = value ??
|
|
11383
|
+
let safeValue = value ?? "";
|
|
11374
11384
|
return this.sanitizer.bypassSecurityTrustHtml(safeValue);
|
|
11375
11385
|
}
|
|
11376
11386
|
isRequired() {
|
|
@@ -11451,7 +11461,8 @@ class SmartformwidgetComponent {
|
|
|
11451
11461
|
widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
11452
11462
|
widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
11453
11463
|
const form = this.form();
|
|
11454
|
-
if (form.controls[widgetInstance.key] &&
|
|
11464
|
+
if (form.controls[widgetInstance.key] &&
|
|
11465
|
+
form.controls[widgetInstance.key].errors) {
|
|
11455
11466
|
if (this.errorKey &&
|
|
11456
11467
|
!Object.keys(form.controls[widgetInstance.key].errors).includes(this.errorKey)) {
|
|
11457
11468
|
this.errorKey = undefined;
|
|
@@ -11496,11 +11507,11 @@ class SmartformwidgetComponent {
|
|
|
11496
11507
|
return `smart-indicator-${index}`;
|
|
11497
11508
|
}
|
|
11498
11509
|
}
|
|
11499
|
-
return
|
|
11510
|
+
return "";
|
|
11500
11511
|
}
|
|
11501
11512
|
getIndicatorStatusLabelColor() {
|
|
11502
11513
|
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
11503
|
-
return
|
|
11514
|
+
return "";
|
|
11504
11515
|
}
|
|
11505
11516
|
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
11506
11517
|
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
@@ -11510,7 +11521,7 @@ class SmartformwidgetComponent {
|
|
|
11510
11521
|
}
|
|
11511
11522
|
getIndicatorStatusLabel() {
|
|
11512
11523
|
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
11513
|
-
return
|
|
11524
|
+
return "";
|
|
11514
11525
|
}
|
|
11515
11526
|
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
11516
11527
|
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
@@ -11528,41 +11539,44 @@ class SmartformwidgetComponent {
|
|
|
11528
11539
|
let params = {
|
|
11529
11540
|
...event.uiAction.params,
|
|
11530
11541
|
_files: event.files,
|
|
11531
|
-
param:
|
|
11542
|
+
param: "_files",
|
|
11532
11543
|
};
|
|
11533
11544
|
event.uiAction.params = params;
|
|
11534
11545
|
this.smartComponent.executeUiAction(event.uiAction);
|
|
11535
11546
|
}
|
|
11536
11547
|
executeUiAction(uiAction) {
|
|
11537
11548
|
let type = this.widgetInstance.type;
|
|
11538
|
-
if (type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
11549
|
+
if (type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
11550
|
+
type !== SmartFormWidgetType.DIV) {
|
|
11539
11551
|
return;
|
|
11540
11552
|
}
|
|
11541
11553
|
this.smartComponent.executeUiAction(uiAction);
|
|
11542
11554
|
}
|
|
11543
11555
|
getButtonType(descriptor) {
|
|
11544
11556
|
switch (descriptor.type) {
|
|
11545
|
-
case
|
|
11546
|
-
return
|
|
11547
|
-
case
|
|
11548
|
-
return
|
|
11549
|
-
case
|
|
11550
|
-
return
|
|
11551
|
-
case
|
|
11552
|
-
return
|
|
11553
|
-
case
|
|
11554
|
-
return
|
|
11555
|
-
case
|
|
11556
|
-
return
|
|
11557
|
-
case
|
|
11558
|
-
return
|
|
11557
|
+
case "NORMAL":
|
|
11558
|
+
return "mat-mdc-button";
|
|
11559
|
+
case "FLAT":
|
|
11560
|
+
return "mat-mdc-flat-button";
|
|
11561
|
+
case "RAISED":
|
|
11562
|
+
return "mat-mdc-raised-button";
|
|
11563
|
+
case "STROKED":
|
|
11564
|
+
return "mat-mdc-stroked-button";
|
|
11565
|
+
case "ICON":
|
|
11566
|
+
return "mat-mdc-icon-button";
|
|
11567
|
+
case "MINI_FAB":
|
|
11568
|
+
return "mat-mdc-mini-fab";
|
|
11569
|
+
case "FAB":
|
|
11570
|
+
return "mat-mdc-fab";
|
|
11559
11571
|
default:
|
|
11560
11572
|
console.log(`Unhandled action button type case: ${descriptor.type}`);
|
|
11561
11573
|
return `mat-button`;
|
|
11562
11574
|
}
|
|
11563
11575
|
}
|
|
11564
11576
|
isOnlyIcon(descriptor) {
|
|
11565
|
-
return (descriptor.type ===
|
|
11577
|
+
return (descriptor.type === "ICON" ||
|
|
11578
|
+
descriptor.type === "MINI_FAB" ||
|
|
11579
|
+
descriptor.type === "FAB");
|
|
11566
11580
|
}
|
|
11567
11581
|
onButtonClicked(instance) {
|
|
11568
11582
|
if (instance.uiAction) {
|
|
@@ -11576,7 +11590,7 @@ class SmartformwidgetComponent {
|
|
|
11576
11590
|
let filterValue = value.target?.value;
|
|
11577
11591
|
this.toHighlight = filterValue;
|
|
11578
11592
|
if (!filterValue) {
|
|
11579
|
-
filterValue =
|
|
11593
|
+
filterValue = "";
|
|
11580
11594
|
this.toHighlight = filterValue;
|
|
11581
11595
|
}
|
|
11582
11596
|
filterValue = filterValue.toLowerCase();
|
|
@@ -11609,12 +11623,12 @@ class SmartformwidgetComponent {
|
|
|
11609
11623
|
});
|
|
11610
11624
|
}
|
|
11611
11625
|
handleYearMonthPicked(yearMonthValue) {
|
|
11612
|
-
this.setDateFormControl(this.form().controls[this.widgetInstance.key], yearMonthValue,
|
|
11626
|
+
this.setDateFormControl(this.form().controls[this.widgetInstance.key], yearMonthValue, "00:00");
|
|
11613
11627
|
}
|
|
11614
11628
|
compareItems(o1, o2) {
|
|
11615
11629
|
function convert(obj) {
|
|
11616
|
-
if (obj && typeof obj ===
|
|
11617
|
-
return obj.replace(/\.v[0-9]+$/,
|
|
11630
|
+
if (obj && typeof obj === "string") {
|
|
11631
|
+
return obj.replace(/\.v[0-9]+$/, "");
|
|
11618
11632
|
}
|
|
11619
11633
|
return obj;
|
|
11620
11634
|
}
|
|
@@ -11625,8 +11639,8 @@ class SmartformwidgetComponent {
|
|
|
11625
11639
|
return deepEqual(v1, v2);
|
|
11626
11640
|
}
|
|
11627
11641
|
truncateUri(uri) {
|
|
11628
|
-
if (uri && typeof uri ===
|
|
11629
|
-
return uri.replace(/\.v[0-9]+$/,
|
|
11642
|
+
if (uri && typeof uri === "string") {
|
|
11643
|
+
return uri.replace(/\.v[0-9]+$/, "");
|
|
11630
11644
|
}
|
|
11631
11645
|
return uri;
|
|
11632
11646
|
}
|
|
@@ -11645,7 +11659,8 @@ class SmartformwidgetComponent {
|
|
|
11645
11659
|
// Only seven of the widget interfaces declare the field, so the union does not.
|
|
11646
11660
|
const toolbarId = this.widgetInstance.toolbarId;
|
|
11647
11661
|
const present = toolbarId !== undefined && toolbarId !== null;
|
|
11648
|
-
if (present &&
|
|
11662
|
+
if (present &&
|
|
11663
|
+
!TYPES_WITH_TOOLBAR_SLOT.includes(this.widgetInstance.type)) {
|
|
11649
11664
|
// Diagnostic, not a rule: the rule is the toolbarId. This says the widget's template
|
|
11650
11665
|
// has nowhere to put it — where it should go is the 7.1 widget breakup's question.
|
|
11651
11666
|
console.warn(`Widget '${this.widgetInstance.key}' of type ${this.widgetInstance.type} has a ` +
|
|
@@ -11654,12 +11669,12 @@ class SmartformwidgetComponent {
|
|
|
11654
11669
|
return present;
|
|
11655
11670
|
}
|
|
11656
11671
|
getChipsValue(value) {
|
|
11657
|
-
if (typeof value ===
|
|
11658
|
-
if (
|
|
11659
|
-
return value[
|
|
11672
|
+
if (typeof value === "object" && !Array.isArray(value) && value !== null) {
|
|
11673
|
+
if ("name" in value) {
|
|
11674
|
+
return value["name"];
|
|
11660
11675
|
}
|
|
11661
|
-
if (
|
|
11662
|
-
return value[
|
|
11676
|
+
if ("displayValue" in value) {
|
|
11677
|
+
return value["displayValue"];
|
|
11663
11678
|
}
|
|
11664
11679
|
}
|
|
11665
11680
|
return value;
|
|
@@ -11680,15 +11695,15 @@ class SmartformwidgetComponent {
|
|
|
11680
11695
|
}
|
|
11681
11696
|
get clearButtonDescriptor() {
|
|
11682
11697
|
return {
|
|
11683
|
-
title:
|
|
11684
|
-
color:
|
|
11698
|
+
title: "",
|
|
11699
|
+
color: "primary",
|
|
11685
11700
|
type: UiActionButtonType.RAISED,
|
|
11686
|
-
icon:
|
|
11701
|
+
icon: "close",
|
|
11687
11702
|
iconPosition: IconPosition.PRE,
|
|
11688
11703
|
};
|
|
11689
11704
|
}
|
|
11690
11705
|
clearField(key) {
|
|
11691
|
-
this.form().controls[key].setValue(
|
|
11706
|
+
this.form().controls[key].setValue("");
|
|
11692
11707
|
this.onBlur()?.next(this.widgetInstance);
|
|
11693
11708
|
}
|
|
11694
11709
|
onTextareaChange(value) {
|
|
@@ -11699,7 +11714,7 @@ class SmartformwidgetComponent {
|
|
|
11699
11714
|
return;
|
|
11700
11715
|
}
|
|
11701
11716
|
requestAnimationFrame(() => {
|
|
11702
|
-
ta.style.height =
|
|
11717
|
+
ta.style.height = "auto";
|
|
11703
11718
|
ta.style.height = `${ta.scrollHeight}px`;
|
|
11704
11719
|
});
|
|
11705
11720
|
}
|
|
@@ -11716,7 +11731,7 @@ class SmartformwidgetComponent {
|
|
|
11716
11731
|
return null;
|
|
11717
11732
|
let parsed = new Date(value);
|
|
11718
11733
|
if (isNaN(parsed.getTime())) {
|
|
11719
|
-
console.error(
|
|
11734
|
+
console.error("Invalid Date:", value);
|
|
11720
11735
|
return null;
|
|
11721
11736
|
}
|
|
11722
11737
|
return new Date(parsed.getFullYear(), parsed.getMonth(), parsed.getDate(), parsed.getHours(), parsed.getMinutes(), parsed.getSeconds());
|
|
@@ -11740,29 +11755,76 @@ class SmartformwidgetComponent {
|
|
|
11740
11755
|
}
|
|
11741
11756
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SmartformwidgetComponent, decorators: [{
|
|
11742
11757
|
type: Component,
|
|
11743
|
-
args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, ReactiveFormsModule, NgClass, TrackCapsDirective, NgStyle, MatHint, MatFormField, MatLabel, MatInput, NgxMaskDirective, MatAutocompleteTrigger, MatIconButton, MatSuffix, MatIcon, MatAutocomplete, MatOption, MatPrefix, SmartIconComponent, UiActionButtonComponent, UiActionToolbarComponent, MatButton, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput, MatChip, CdkTextareaAutosize, MatCheckbox, MatRadioGroup, MatRadioButton, MatDatepickerToggle, MatDatepicker, MatDatepickerInput, SmartMonthPickerComponent, MatSelect, MatOptgroup, MatSlideToggle, SmartVoiceRecorderComponent, SmartFileEditorComponent, SmartMultiFileEditorComponent, SmartHtmlWidgetComponent, QuillEditorComponent, SortableWidgetComponent, YouTubePlayer, AsyncPipe, HighlightPipe], template: "<div class=\"container material\" [formGroup]=\"form()\">\r\n @if (\r\n widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\r\n ) {\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [class.sb4-widget-required]=\"isRequired()\"\r\n class=\"container\"\r\n >\r\n @if (widgetInstance.type === smartFormWidgetType.CONTAINER) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" [ngClass]=\"getDirection()\">\r\n @for (widget of visibleChildren; track widget) {\r\n <smartformwidget\r\n [form]=\"form()\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur()\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange()\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange()\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor()\"\r\n ></smartformwidget>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD) {\r\n <div (capsLock)=\"capsOn = $event\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input textField widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n @if (!widgetInstance.selection) {\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode\r\n ? widgetInstance.inputMode.toLocaleLowerCase()\r\n : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{\r\n widgetInstance.isPassword\r\n ? hidePassword\r\n ? 'password'\r\n : 'text'\r\n : ''\r\n }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n [mask]=\"widgetInstance.mask\"\r\n />\r\n }\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n @if (widgetInstance.selection) {\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n }\r\n @if (widgetInstance.isPassword) {\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{\r\n hidePassword ? \"visibility_off\" : \"visibility\"\r\n }}</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n @for (option of filteredOptions | async; track option) {\r\n <mat-option [value]=\"option.label\">\r\n <span\r\n [innerHTML]=\"option.label | highlight: toHighlight\"\r\n ></span>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (capsOn && widgetInstance.isPassword) {\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n @if (capsOn && widgetInstance.isPassword) {\r\n <smart-icon\r\n [icon]=\"\r\n widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\r\n \"\r\n color=\"warn\"\r\n ></smart-icon>\r\n }\r\n @if (\r\n widgetInstance.icon && widgetInstance.iconPosition === \"PRE\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n }\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (widgetInstance.textFieldButton) {\r\n <button\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"\r\n widgetInstance.textFieldButton.callback(widgetInstance)\r\n \"\r\n >\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n }\r\n {{ widgetInstance.textFieldButton.label }}\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n </button>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint matSuffix align=\"end\">{{\r\n widgetInstance.maxLength -\r\n form().controls[widgetInstance.key].value.length\r\n }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input textField widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (widgetInstance.icon) {\r\n <smart-icon [icon]=\"widgetInstance.icon\" matSuffix> </smart-icon>\r\n }\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (widgetInstance.textFieldButton) {\r\n <button\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"\r\n widgetInstance.textFieldButton.callback(widgetInstance)\r\n \"\r\n >\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n {{ widgetInstance.textFieldButton.label }}\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n @for (value of widgetInstance.value; track value) {\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n @for (item of widgetInstance.valueList; track item) {\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-chip-grid\r\n #chipListLookup\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n >\r\n @for (value of widgetInstance.value; track value) {\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_BOX) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"\r\n widgetInstance.textBoxProperties?.minRows ?? 1\r\n \"\r\n [cdkAutosizeMaxRows]=\"\r\n widgetInstance.textBoxProperties?.maxRows ?? undefined\r\n \"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint matSuffix align=\"end\">{{\r\n widgetInstance.maxLength -\r\n form().controls[widgetInstance.key].value.length\r\n }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance.hint ||\r\n widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.CHECK_BOX) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"input checkbox widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n (change)=\"onBlur()?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.CHECK_BOX_2) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"input checkbox widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n @for (\r\n checkbox of widgetInstance.valueList;\r\n track checkbox;\r\n let i = $index\r\n ) {\r\n <div class=\"checkbox-item-container\">\r\n @if (checkbox.imageUrl) {\r\n <img\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n }\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{\r\n widgetInstance.key + '.' + checkbox.key\r\n }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RADIO_BUTTON) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <div [ngClass]=\"getDirection()\">\r\n @for (radio of widgetInstance.valueList; track radio) {\r\n <div class=\"radio-item-container\">\r\n @if (radio.imageUrl) {\r\n <img\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n }\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n }\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n <div class=\"radio-icon\">\r\n @if (widgetInstance.icon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n >\r\n </smart-icon>\r\n }\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DATE_PICKER) {\r\n <div class=\"datePicker widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n #picker\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n ></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.minDate ?? null\r\n )\r\n \"\r\n [max]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.maxDate ?? null\r\n )\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div class=\"{{ labelColor() }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n #picker\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n ></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.minDate ?? null\r\n )\r\n \"\r\n [max]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.maxDate ?? null\r\n )\r\n \"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n @if (hasCreated) {\r\n <mat-form-field\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SELECT) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null\r\n ? compareItems\r\n : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{\r\n widgetInstance.placeholder ? widgetInstance.placeholder : ''\r\n }}\"\r\n >\r\n @for (option of widgetInstance.valueList; track option) {\r\n <div>\r\n @if (option.type === getType().ITEM_GROUP) {\r\n <mat-optgroup\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @for (\r\n innerOption of option.valueList;\r\n track innerOption\r\n ) {\r\n <mat-option\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n @if (innerOption.icon) {\r\n <smart-icon\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ innerOption.label }}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n @if (option.type === getType().ITEM) {\r\n <mat-option\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @if (option.icon) {\r\n <smart-icon\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ option.label }}</mat-option\r\n >\r\n }\r\n </div>\r\n }\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null\r\n ? compareItems\r\n : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{\r\n widgetInstance.placeholder ? widgetInstance.placeholder : ''\r\n }}\"\r\n >\r\n @for (option of widgetInstance.valueList; track option) {\r\n <div>\r\n @if (option.type === getType().ITEM_GROUP) {\r\n <mat-optgroup\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @for (\r\n innerOption of option.valueList;\r\n track innerOption\r\n ) {\r\n <mat-option\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n @if (innerOption.icon) {\r\n <smart-icon\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ innerOption.label }}</mat-option\r\n >\r\n }\r\n </mat-optgroup>\r\n }\r\n @if (option.type === getType().ITEM) {\r\n <mat-option\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @if (option.icon) {\r\n <smart-icon\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ option.label }}</mat-option\r\n >\r\n }\r\n </div>\r\n }\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.LABEL) {\r\n <div\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div\r\n class=\"label-title labelContainer\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n >\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TIME) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TOGGLE) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{\r\n !widgetInstance.showLabel ? widgetInstance.label : \"\"\r\n }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.INDICATOR) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"{{ labelColor() }} labelContainer {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div class=\"smartIndicator widgetContent\">\r\n <div\r\n class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n >\r\n @for (item of indicatorItems; track item; let i = $index) {\r\n <div\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n }\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n @if (widgetInstance.showLabel && getWidgetLabel(widgetInstance)) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"\r\n $safeNavigationMigration(widgetInstance.imageProperties?.image)\r\n \"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n ></div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.HTML) {\r\n <smart-html-widget\r\n [widgetInstance]=\"widgetInstance\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-html-widget>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SVG) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DIVIDER) {\r\n <div class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.BUTTON) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"\r\n $safeNavigationMigration(\r\n widgetInstance.uiActionDescriptor?.color\r\n )\r\n \"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n @if (isOnlyIcon(widgetInstance.uiActionDescriptor)) {\r\n @if (widgetInstance.uiActionDescriptor?.icon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n } @else {\r\n @if (\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === \"PRE\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n @if (\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === \"POST\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.COMPONENT) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"labelContainer {{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RICH_TEXT) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled\r\n ? emptyQuillToolbar\r\n : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder ?? ''\"\r\n [readOnly]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength ?? 0\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SORTABLE) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MATRIX) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n @for (option of widgetInstance.value.columns; track option) {\r\n <th class=\"optionLabel\">\r\n {{ option.displayValue }}\r\n </th>\r\n }\r\n </tr>\r\n @for (\r\n question of widgetInstance.value.rows;\r\n track question;\r\n let i = $index\r\n ) {\r\n <tr>\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n @for (\r\n option of widgetInstance.value.columns;\r\n track option;\r\n let j = $index\r\n ) {\r\n <td class=\"selectTd\">\r\n @if (!widgetInstance.isMultiple) {\r\n <mat-radio-group\r\n [formControlName]=\"\r\n widgetInstance.key + '.' + question.code\r\n \"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\">\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n }\r\n @if (widgetInstance.isMultiple) {\r\n <div>\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key +\r\n '.data.' +\r\n question.code +\r\n '.' +\r\n option.code\r\n \"\r\n [value]=\"\r\n widgetInstance.value['data'][question.code][\r\n option.code\r\n ]\r\n \"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n }\r\n </td>\r\n }\r\n <br />\r\n @if (widgetInstance.button) {\r\n <button mat-icon-button (click)=\"removeMatrixRow(question)\">\r\n <smart-icon icon=\"close\"></smart-icon>\r\n </button>\r\n }\r\n </tr>\r\n }\r\n </table>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"{{ labelColor() }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked]>.ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked]>.ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li>.ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked]>.ql-ui,.ql-editor li[data-list=unchecked]>.ql-ui{color:#777}.ql-editor li[data-list=bullet]>.ql-ui:before{content:\"\\2022\"}.ql-editor li[data-list=checked]>.ql-ui:before{content:\"\\2611\"}.ql-editor li[data-list=unchecked]>.ql-ui:before{content:\"\\2610\"}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered]>.ql-ui:before{content:counter(list-0,decimal) \". \"}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1>.ql-ui:before{content:counter(list-1,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2>.ql-ui:before{content:counter(list-2,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3>.ql-ui:before{content:counter(list-3,decimal) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4>.ql-ui:before{content:counter(list-4,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5>.ql-ui:before{content:counter(list-5,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6>.ql-ui:before{content:counter(list-6,decimal) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7>.ql-ui:before{content:counter(list-7,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8>.ql-ui:before{content:counter(list-8,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9>.ql-ui:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl>.ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media(pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date,.time{width:100%}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.material .sb4-textarea{resize:vertical!important}.material .smart-form-widget-label{font-weight:700}.material .mat-mdc-form-field-subscript-wrapper{display:none}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.smartDiv{width:100%}.clickable{cursor:pointer}\n/*!\n * Quill Editor v2.0.3\n * https://quilljs.com\n * Copyright (c) 2017-2024, Slab\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"] }]
|
|
11758
|
+
args: [{ selector: "smartformwidget", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
11759
|
+
FormsModule,
|
|
11760
|
+
ReactiveFormsModule,
|
|
11761
|
+
NgClass,
|
|
11762
|
+
TrackCapsDirective,
|
|
11763
|
+
NgStyle,
|
|
11764
|
+
MatHint,
|
|
11765
|
+
MatFormField,
|
|
11766
|
+
MatLabel,
|
|
11767
|
+
MatInput,
|
|
11768
|
+
NgxMaskDirective,
|
|
11769
|
+
MatAutocompleteTrigger,
|
|
11770
|
+
MatIconButton,
|
|
11771
|
+
MatSuffix,
|
|
11772
|
+
MatIcon,
|
|
11773
|
+
MatAutocomplete,
|
|
11774
|
+
MatOption,
|
|
11775
|
+
MatPrefix,
|
|
11776
|
+
SmartIconComponent,
|
|
11777
|
+
UiActionButtonComponent,
|
|
11778
|
+
UiActionToolbarComponent,
|
|
11779
|
+
MatButton,
|
|
11780
|
+
MatChipGrid,
|
|
11781
|
+
MatChipRow,
|
|
11782
|
+
MatChipRemove,
|
|
11783
|
+
MatChipInput,
|
|
11784
|
+
MatChip,
|
|
11785
|
+
CdkTextareaAutosize,
|
|
11786
|
+
MatCheckbox,
|
|
11787
|
+
MatRadioGroup,
|
|
11788
|
+
MatRadioButton,
|
|
11789
|
+
MatDatepickerToggle,
|
|
11790
|
+
MatDatepicker,
|
|
11791
|
+
MatDatepickerInput,
|
|
11792
|
+
SmartMonthPickerComponent,
|
|
11793
|
+
MatSelect,
|
|
11794
|
+
MatOptgroup,
|
|
11795
|
+
MatSlideToggle,
|
|
11796
|
+
SmartVoiceRecorderComponent,
|
|
11797
|
+
SmartFileEditorComponent,
|
|
11798
|
+
SmartMultiFileEditorComponent,
|
|
11799
|
+
SmartHtmlWidgetComponent,
|
|
11800
|
+
QuillEditorComponent,
|
|
11801
|
+
SortableWidgetComponent,
|
|
11802
|
+
YouTubePlayer,
|
|
11803
|
+
AsyncPipe,
|
|
11804
|
+
HighlightPipe,
|
|
11805
|
+
], template: "<div class=\"container material\" [formGroup]=\"form()\">\r\n @if (\r\n widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\r\n ) {\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [class.sb4-widget-required]=\"isRequired()\"\r\n class=\"container\"\r\n >\r\n @if (widgetInstance.type === smartFormWidgetType.CONTAINER) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" [ngClass]=\"getDirection()\">\r\n @for (widget of visibleChildren; track widget) {\r\n <smartformwidget\r\n [form]=\"form()\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur()\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange()\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange()\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor()\"\r\n ></smartformwidget>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD) {\r\n <div (capsLock)=\"capsOn = $event\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input textField widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n @if (!widgetInstance.selection) {\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode\r\n ? widgetInstance.inputMode.toLocaleLowerCase()\r\n : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{\r\n widgetInstance.isPassword\r\n ? hidePassword\r\n ? 'password'\r\n : 'text'\r\n : ''\r\n }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n [mask]=\"widgetInstance.mask\"\r\n />\r\n }\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n @if (widgetInstance.selection) {\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n }\r\n @if (widgetInstance.isPassword) {\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{\r\n hidePassword ? \"visibility_off\" : \"visibility\"\r\n }}</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n @for (option of filteredOptions | async; track option) {\r\n <mat-option [value]=\"option.label\">\r\n <span\r\n [innerHTML]=\"option.label | highlight: toHighlight\"\r\n ></span>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (capsOn && widgetInstance.isPassword) {\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n @if (capsOn && widgetInstance.isPassword) {\r\n <smart-icon\r\n [icon]=\"\r\n widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\r\n \"\r\n color=\"warn\"\r\n ></smart-icon>\r\n }\r\n @if (\r\n widgetInstance.icon && widgetInstance.iconPosition === \"PRE\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n }\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (widgetInstance.textFieldButton) {\r\n <button\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"\r\n widgetInstance.textFieldButton.callback(widgetInstance)\r\n \"\r\n >\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n }\r\n {{ widgetInstance.textFieldButton.label }}\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n </button>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint matSuffix align=\"end\">{{\r\n widgetInstance.maxLength -\r\n form().controls[widgetInstance.key].value.length\r\n }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input textField widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (widgetInstance.icon) {\r\n <smart-icon [icon]=\"widgetInstance.icon\" matSuffix> </smart-icon>\r\n }\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (widgetInstance.textFieldButton) {\r\n <button\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"\r\n widgetInstance.textFieldButton.callback(widgetInstance)\r\n \"\r\n >\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n {{ widgetInstance.textFieldButton.label }}\r\n @if (\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST &&\r\n widgetInstance.textFieldButton.icon\r\n ) {\r\n <smart-icon [icon]=\"widgetInstance.textFieldButton.icon\">\r\n </smart-icon>\r\n }\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n @for (value of widgetInstance.value; track value) {\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n @for (item of widgetInstance.valueList; track item) {\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-chip-grid\r\n #chipListLookup\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n >\r\n @for (value of widgetInstance.value; track value) {\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TEXT_BOX) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"\r\n widgetInstance.textBoxProperties?.minRows ?? 1\r\n \"\r\n [cdkAutosizeMaxRows]=\"\r\n widgetInstance.textBoxProperties?.maxRows ?? undefined\r\n \"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint matSuffix align=\"end\">{{\r\n widgetInstance.maxLength -\r\n form().controls[widgetInstance.key].value.length\r\n }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance.hint ||\r\n widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.CHECK_BOX) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"input checkbox widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n (change)=\"onBlur()?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.CHECK_BOX_2) {\r\n <div [attr.data-testid]=\"widgetInstance.key\" class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"input checkbox widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n @for (\r\n checkbox of widgetInstance.valueList;\r\n track checkbox;\r\n let i = $index\r\n ) {\r\n <div class=\"checkbox-item-container\">\r\n @if (checkbox.imageUrl) {\r\n <img\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n }\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{\r\n widgetInstance.key + '.' + checkbox.key\r\n }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RADIO_BUTTON) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label class=\"radioLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <div [ngClass]=\"getDirection()\">\r\n @for (radio of widgetInstance.valueList; track radio) {\r\n <div class=\"radio-item-container\">\r\n @if (radio.imageUrl) {\r\n <img\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n }\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n }\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n <div class=\"radio-icon\">\r\n @if (widgetInstance.icon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n >\r\n </smart-icon>\r\n }\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DATE_PICKER) {\r\n <div class=\"datePicker widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n #picker\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n ></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.minDate ?? null\r\n )\r\n \"\r\n [max]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.maxDate ?? null\r\n )\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div class=\"{{ labelColor() }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n #picker\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n ></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.minDate ?? null\r\n )\r\n \"\r\n [max]=\"\r\n convertToLocalDateTime(\r\n widgetInstance.dateFieldProperties?.maxDate ?? null\r\n )\r\n \"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n @if (hasCreated) {\r\n <mat-form-field\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n }\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SELECT) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <div\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null\r\n ? compareItems\r\n : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{\r\n widgetInstance.placeholder ? widgetInstance.placeholder : ''\r\n }}\"\r\n >\r\n @for (option of widgetInstance.valueList; track option) {\r\n <div>\r\n @if (option.type === getType().ITEM_GROUP) {\r\n <mat-optgroup\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @for (\r\n innerOption of option.valueList;\r\n track innerOption\r\n ) {\r\n <mat-option\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n @if (innerOption.icon) {\r\n <smart-icon\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ innerOption.label }}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n @if (option.type === getType().ITEM) {\r\n <mat-option\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @if (option.icon) {\r\n <smart-icon\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ option.label }}</mat-option\r\n >\r\n }\r\n </div>\r\n }\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n @if (\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition ||\r\n widgetInstance.iconPosition === \"POST\")\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null\r\n ? compareItems\r\n : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{\r\n widgetInstance.placeholder ? widgetInstance.placeholder : ''\r\n }}\"\r\n >\r\n @for (option of widgetInstance.valueList; track option) {\r\n <div>\r\n @if (option.type === getType().ITEM_GROUP) {\r\n <mat-optgroup\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @for (\r\n innerOption of option.valueList;\r\n track innerOption\r\n ) {\r\n <mat-option\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n @if (innerOption.icon) {\r\n <smart-icon\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ innerOption.label }}</mat-option\r\n >\r\n }\r\n </mat-optgroup>\r\n }\r\n @if (option.type === getType().ITEM) {\r\n <mat-option\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n @if (option.icon) {\r\n <smart-icon\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon>\r\n }\r\n {{ option.label }}</mat-option\r\n >\r\n }\r\n </div>\r\n }\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n @if (isToolbarPresent()) {\r\n <smart-ui-action-toolbar\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </mat-form-field>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.LABEL) {\r\n <div\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div\r\n class=\"label-title labelContainer\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n >\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssClass ?? ''\r\n }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TIME) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n @if (!widgetInstance.showLabel) {\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n }\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.TOGGLE) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <div class=\"labelContainer\">\r\n <h4\r\n class=\"{{ labelColor() }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{\r\n !widgetInstance.showLabel ? widgetInstance.label : \"\"\r\n }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n @if (widgetInstance.error && widgetInstance.errorIcon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.INDICATOR) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"{{ labelColor() }} labelContainer {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div class=\"smartIndicator widgetContent\">\r\n <div\r\n class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n >\r\n @for (item of indicatorItems; track item; let i = $index) {\r\n <div\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n }\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n @if (widgetInstance.showLabel && getWidgetLabel(widgetInstance)) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"\r\n $safeNavigationMigration(widgetInstance.imageProperties?.image)\r\n \"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n ></div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.HTML) {\r\n <smart-html-widget\r\n [widgetInstance]=\"widgetInstance\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-html-widget>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SVG) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.DIVIDER) {\r\n <div class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.BUTTON) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"labelContainer {{ labelColor() }} {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"\r\n $safeNavigationMigration(\r\n widgetInstance.uiActionDescriptor?.color\r\n )\r\n \"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n @if (isOnlyIcon(widgetInstance.uiActionDescriptor)) {\r\n @if (widgetInstance.uiActionDescriptor?.icon) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n } @else {\r\n @if (\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === \"PRE\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n @if (\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === \"POST\"\r\n ) {\r\n <smart-icon\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n }\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.COMPONENT) {\r\n <div class=\"widgetContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"labelContainer {{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.RICH_TEXT) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled\r\n ? emptyQuillToolbar\r\n : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder ?? ''\"\r\n [readOnly]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength ?? 0\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n @if (\r\n widgetInstance.showCharacterLimitSuffix &&\r\n widgetInstance.maxLength\r\n ) {\r\n <mat-hint\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n }\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.SORTABLE) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.MATRIX) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4 class=\"{{ labelColor() }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n @for (option of widgetInstance.value.columns; track option) {\r\n <th class=\"optionLabel\">\r\n {{ option.displayValue }}\r\n </th>\r\n }\r\n </tr>\r\n @for (\r\n question of widgetInstance.value.rows;\r\n track question;\r\n let i = $index\r\n ) {\r\n <tr>\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n @for (\r\n option of widgetInstance.value.columns;\r\n track option;\r\n let j = $index\r\n ) {\r\n <td class=\"selectTd\">\r\n @if (!widgetInstance.isMultiple) {\r\n <mat-radio-group\r\n [formControlName]=\"\r\n widgetInstance.key + '.' + question.code\r\n \"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\">\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n }\r\n @if (widgetInstance.isMultiple) {\r\n <div>\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key +\r\n '.data.' +\r\n question.code +\r\n '.' +\r\n option.code\r\n \"\r\n [value]=\"\r\n widgetInstance.value['data'][question.code][\r\n option.code\r\n ]\r\n \"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n }\r\n </td>\r\n }\r\n <br />\r\n @if (widgetInstance.button) {\r\n <button mat-icon-button (click)=\"removeMatrixRow(question)\">\r\n <smart-icon icon=\"close\"></smart-icon>\r\n </button>\r\n }\r\n </tr>\r\n }\r\n </table>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n @if (widgetInstance.showLabel) {\r\n <h4\r\n class=\"{{ labelColor() }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n }\r\n @if (\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n @if (\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n ) {\r\n <mat-hint>{{ widgetInstance.hint?.text }}</mat-hint>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked]>.ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked]>.ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li>.ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked]>.ql-ui,.ql-editor li[data-list=unchecked]>.ql-ui{color:#777}.ql-editor li[data-list=bullet]>.ql-ui:before{content:\"\\2022\"}.ql-editor li[data-list=checked]>.ql-ui:before{content:\"\\2611\"}.ql-editor li[data-list=unchecked]>.ql-ui:before{content:\"\\2610\"}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered]>.ql-ui:before{content:counter(list-0,decimal) \". \"}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1>.ql-ui:before{content:counter(list-1,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2>.ql-ui:before{content:counter(list-2,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3>.ql-ui:before{content:counter(list-3,decimal) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4>.ql-ui:before{content:counter(list-4,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5>.ql-ui:before{content:counter(list-5,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6>.ql-ui:before{content:counter(list-6,decimal) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7>.ql-ui:before{content:counter(list-7,lower-alpha) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8>.ql-ui:before{content:counter(list-8,lower-roman) \". \"}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9>.ql-ui:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl>.ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media(pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date,.time{width:100%}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.material .sb4-textarea{resize:vertical!important}.material .smart-form-widget-label{font-weight:700}.material .mat-mdc-form-field-subscript-wrapper{display:none}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.smartDiv{width:100%}.clickable{cursor:pointer}\n/*!\n * Quill Editor v2.0.3\n * https://quilljs.com\n * Copyright (c) 2017-2024, Slab\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"] }]
|
|
11744
11806
|
}], ctorParameters: () => [], propDecorators: { form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: true }] }], widgetInstance: [{
|
|
11745
11807
|
type: Input
|
|
11746
11808
|
}], onBlur: [{ type: i0.Input, args: [{ isSignal: true, alias: "onBlur", required: false }] }], onValueChange: [{
|
|
11747
11809
|
type: Input
|
|
11748
11810
|
}], labelColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelColor", required: false }] }], sophisticatedValueChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "sophisticatedValueChange", required: true }] }], blurSophisticatedValueChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "blurSophisticatedValueChange", required: true }] }], valueCleared: [{ type: i0.Output, args: ["valueCleared"] }], chipInputChild: [{
|
|
11749
11811
|
type: ViewChild,
|
|
11750
|
-
args: [
|
|
11812
|
+
args: ["chipInput"]
|
|
11751
11813
|
}], customComponentVcRef: [{
|
|
11752
11814
|
type: ViewChild,
|
|
11753
|
-
args: [
|
|
11815
|
+
args: ["customComponent", { read: ViewContainerRef }]
|
|
11754
11816
|
}], quill: [{
|
|
11755
11817
|
type: ViewChild,
|
|
11756
|
-
args: [
|
|
11818
|
+
args: ["quillEditor"]
|
|
11757
11819
|
}], sb4Textarea: [{
|
|
11758
11820
|
type: ViewChild,
|
|
11759
|
-
args: [
|
|
11821
|
+
args: ["sb4Textarea"]
|
|
11760
11822
|
}], dateInputChild: [{
|
|
11761
11823
|
type: ViewChild,
|
|
11762
|
-
args: [
|
|
11824
|
+
args: ["dateInput"]
|
|
11763
11825
|
}], timeInputChild: [{
|
|
11764
11826
|
type: ViewChild,
|
|
11765
|
-
args: [
|
|
11827
|
+
args: ["timeInput"]
|
|
11766
11828
|
}] } });
|
|
11767
11829
|
|
|
11768
11830
|
class SmartformComponent {
|
|
@@ -18405,7 +18467,7 @@ var GridViewDescriptorKindEnum;
|
|
|
18405
18467
|
})(GridViewDescriptorKindEnum || (GridViewDescriptorKindEnum = {}));
|
|
18406
18468
|
;
|
|
18407
18469
|
|
|
18408
|
-
class ApiModule {
|
|
18470
|
+
let ApiModule$2 = class ApiModule {
|
|
18409
18471
|
static forRoot(configurationFactory) {
|
|
18410
18472
|
return {
|
|
18411
18473
|
ngModule: ApiModule,
|
|
@@ -18424,8 +18486,8 @@ class ApiModule {
|
|
|
18424
18486
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule, deps: [{ token: ApiModule, optional: true, skipSelf: true }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
18425
18487
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
18426
18488
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
18427
|
-
}
|
|
18428
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule, decorators: [{
|
|
18489
|
+
};
|
|
18490
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule$2, decorators: [{
|
|
18429
18491
|
type: NgModule,
|
|
18430
18492
|
args: [{
|
|
18431
18493
|
imports: [],
|
|
@@ -18433,7 +18495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
18433
18495
|
exports: [],
|
|
18434
18496
|
providers: []
|
|
18435
18497
|
}]
|
|
18436
|
-
}], ctorParameters: () => [{ type: ApiModule, decorators: [{
|
|
18498
|
+
}], ctorParameters: () => [{ type: ApiModule$2, decorators: [{
|
|
18437
18499
|
type: Optional
|
|
18438
18500
|
}, {
|
|
18439
18501
|
type: SkipSelf
|
|
@@ -20553,6 +20615,42 @@ var GeoMapTextType;
|
|
|
20553
20615
|
GeoMapTextType["HTML"] = "HTML";
|
|
20554
20616
|
})(GeoMapTextType || (GeoMapTextType = {}));
|
|
20555
20617
|
|
|
20618
|
+
let ApiModule$1 = class ApiModule {
|
|
20619
|
+
static forRoot(configurationFactory) {
|
|
20620
|
+
return {
|
|
20621
|
+
ngModule: ApiModule,
|
|
20622
|
+
providers: [{ provide: Configuration$1, useFactory: configurationFactory }]
|
|
20623
|
+
};
|
|
20624
|
+
}
|
|
20625
|
+
constructor(parentModule, http) {
|
|
20626
|
+
if (parentModule) {
|
|
20627
|
+
throw new Error('ApiModule is already loaded. Import in your base AppModule only.');
|
|
20628
|
+
}
|
|
20629
|
+
if (!http) {
|
|
20630
|
+
throw new Error('You need to import the HttpClientModule in your AppModule! \n' +
|
|
20631
|
+
'See also https://github.com/angular/angular/issues/20575');
|
|
20632
|
+
}
|
|
20633
|
+
}
|
|
20634
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule, deps: [{ token: ApiModule, optional: true, skipSelf: true }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
20635
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
20636
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
20637
|
+
};
|
|
20638
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule$1, decorators: [{
|
|
20639
|
+
type: NgModule,
|
|
20640
|
+
args: [{
|
|
20641
|
+
imports: [],
|
|
20642
|
+
declarations: [],
|
|
20643
|
+
exports: [],
|
|
20644
|
+
providers: []
|
|
20645
|
+
}]
|
|
20646
|
+
}], ctorParameters: () => [{ type: ApiModule$1, decorators: [{
|
|
20647
|
+
type: Optional
|
|
20648
|
+
}, {
|
|
20649
|
+
type: SkipSelf
|
|
20650
|
+
}] }, { type: i1.HttpClient, decorators: [{
|
|
20651
|
+
type: Optional
|
|
20652
|
+
}] }] });
|
|
20653
|
+
|
|
20556
20654
|
class AbstractMap {
|
|
20557
20655
|
constructor(el, cd, itemFactory) {
|
|
20558
20656
|
this.el = el;
|
|
@@ -21799,6 +21897,42 @@ const DrawTime = {
|
|
|
21799
21897
|
AfterDraw: 'afterDraw'
|
|
21800
21898
|
};
|
|
21801
21899
|
|
|
21900
|
+
class ApiModule {
|
|
21901
|
+
static forRoot(configurationFactory) {
|
|
21902
|
+
return {
|
|
21903
|
+
ngModule: ApiModule,
|
|
21904
|
+
providers: [{ provide: Configuration, useFactory: configurationFactory }]
|
|
21905
|
+
};
|
|
21906
|
+
}
|
|
21907
|
+
constructor(parentModule, http) {
|
|
21908
|
+
if (parentModule) {
|
|
21909
|
+
throw new Error('ApiModule is already loaded. Import in your base AppModule only.');
|
|
21910
|
+
}
|
|
21911
|
+
if (!http) {
|
|
21912
|
+
throw new Error('You need to import the HttpClientModule in your AppModule! \n' +
|
|
21913
|
+
'See also https://github.com/angular/angular/issues/20575');
|
|
21914
|
+
}
|
|
21915
|
+
}
|
|
21916
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule, deps: [{ token: ApiModule, optional: true, skipSelf: true }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
21917
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
21918
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule }); }
|
|
21919
|
+
}
|
|
21920
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ApiModule, decorators: [{
|
|
21921
|
+
type: NgModule,
|
|
21922
|
+
args: [{
|
|
21923
|
+
imports: [],
|
|
21924
|
+
declarations: [],
|
|
21925
|
+
exports: [],
|
|
21926
|
+
providers: []
|
|
21927
|
+
}]
|
|
21928
|
+
}], ctorParameters: () => [{ type: ApiModule, decorators: [{
|
|
21929
|
+
type: Optional
|
|
21930
|
+
}, {
|
|
21931
|
+
type: SkipSelf
|
|
21932
|
+
}] }, { type: i1.HttpClient, decorators: [{
|
|
21933
|
+
type: Optional
|
|
21934
|
+
}] }] });
|
|
21935
|
+
|
|
21802
21936
|
function deepMerge(target, source) {
|
|
21803
21937
|
for (const key of Object.keys(source)) {
|
|
21804
21938
|
if (source[key] instanceof Object && target[key]) {
|
|
@@ -22137,7 +22271,7 @@ class SmartDiagramComponent {
|
|
|
22137
22271
|
this.elementSelect = output();
|
|
22138
22272
|
this.canvasClick = output();
|
|
22139
22273
|
this.dataClick = output();
|
|
22140
|
-
this.aspectClass =
|
|
22274
|
+
this.aspectClass = "default-aspect-ratio";
|
|
22141
22275
|
this.viewInitialized = false;
|
|
22142
22276
|
/** The screen component this diagram belongs to; the source of its uuid. (ADR-0005) */
|
|
22143
22277
|
this.smartComponent = injectSmartComponent();
|
|
@@ -22158,14 +22292,16 @@ class SmartDiagramComponent {
|
|
|
22158
22292
|
Chart.register(...registerables);
|
|
22159
22293
|
Chart.register(AnnotationPlugin);
|
|
22160
22294
|
Chart.register(ZoomPlugin);
|
|
22295
|
+
Chart.register(ChartDataLabels);
|
|
22296
|
+
Chart.defaults.set("plugins.datalabels", { display: false });
|
|
22161
22297
|
}
|
|
22162
22298
|
ngOnChanges(changes) {
|
|
22163
|
-
if (changes[
|
|
22164
|
-
this.diagramModel = changes[
|
|
22299
|
+
if (changes["diagramModel"]) {
|
|
22300
|
+
this.diagramModel = changes["diagramModel"].currentValue;
|
|
22165
22301
|
this.setUp();
|
|
22166
22302
|
}
|
|
22167
|
-
if (changes[
|
|
22168
|
-
this.uuid = changes[
|
|
22303
|
+
if (changes["uuid"] && this.uuid !== changes["uuid"].currentValue) {
|
|
22304
|
+
this.uuid = changes["uuid"].currentValue;
|
|
22169
22305
|
this.load();
|
|
22170
22306
|
}
|
|
22171
22307
|
}
|
|
@@ -22199,7 +22335,9 @@ class SmartDiagramComponent {
|
|
|
22199
22335
|
return;
|
|
22200
22336
|
}
|
|
22201
22337
|
let options = undefined;
|
|
22202
|
-
const type = !!this.diagramModel.descriptor?.type
|
|
22338
|
+
const type = !!this.diagramModel.descriptor?.type
|
|
22339
|
+
? this.diagramModel.descriptor.type
|
|
22340
|
+
: "";
|
|
22203
22341
|
const factory = this.diagramOptionProvider.getFactory(type);
|
|
22204
22342
|
this.type = factory.chartJsType;
|
|
22205
22343
|
options = factory.createOptions(this.diagramModel.diagramData);
|
|
@@ -22237,10 +22375,14 @@ class SmartDiagramComponent {
|
|
|
22237
22375
|
}
|
|
22238
22376
|
onCanvasClick(event) {
|
|
22239
22377
|
if (this.chart) {
|
|
22240
|
-
const element = this.chart.getElementsAtEventForMode(event,
|
|
22241
|
-
const dataset = this.chart.getElementsAtEventForMode(event,
|
|
22378
|
+
const element = this.chart.getElementsAtEventForMode(event, "nearest", { intersect: true }, false);
|
|
22379
|
+
const dataset = this.chart.getElementsAtEventForMode(event, "dataset", { intersect: true }, false);
|
|
22242
22380
|
if (element && element[0] && dataset) {
|
|
22243
|
-
this.onDataSelect({
|
|
22381
|
+
this.onDataSelect({
|
|
22382
|
+
originalEvent: event,
|
|
22383
|
+
element: element[0],
|
|
22384
|
+
dataset: dataset,
|
|
22385
|
+
});
|
|
22244
22386
|
}
|
|
22245
22387
|
}
|
|
22246
22388
|
this.handleChartClick(event);
|
|
@@ -22253,17 +22395,30 @@ class SmartDiagramComponent {
|
|
|
22253
22395
|
legend: {
|
|
22254
22396
|
display: descriptor.showLegendForChart ?? true,
|
|
22255
22397
|
},
|
|
22398
|
+
datalabels: {
|
|
22399
|
+
display: descriptor.showDataLabels ?? true,
|
|
22400
|
+
anchor: "end",
|
|
22401
|
+
align: "end",
|
|
22402
|
+
clamp: true,
|
|
22403
|
+
formatter: (value) => {
|
|
22404
|
+
// scatter/bubble values are objects {x, y}
|
|
22405
|
+
if (value !== null && typeof value === "object") {
|
|
22406
|
+
return value.y ?? value.r ?? "";
|
|
22407
|
+
}
|
|
22408
|
+
return value;
|
|
22409
|
+
},
|
|
22410
|
+
},
|
|
22256
22411
|
...(descriptor.title
|
|
22257
22412
|
? {
|
|
22258
22413
|
title: {
|
|
22259
22414
|
display: true,
|
|
22260
|
-
text: descriptor.title.content ??
|
|
22415
|
+
text: descriptor.title.content ?? "",
|
|
22261
22416
|
color: descriptor.title.color
|
|
22262
22417
|
? `rgba(${descriptor.title.color.red ?? 0},
|
|
22263
22418
|
${descriptor.title.color.green ?? 0},
|
|
22264
22419
|
${descriptor.title.color.blue ?? 0},
|
|
22265
22420
|
${descriptor.title.color.alpha ?? 1})`
|
|
22266
|
-
:
|
|
22421
|
+
: "#000000ff",
|
|
22267
22422
|
font: {
|
|
22268
22423
|
size: descriptor.title.size ?? undefined,
|
|
22269
22424
|
weight: descriptor.title.weight ?? undefined,
|
|
@@ -22273,6 +22428,26 @@ class SmartDiagramComponent {
|
|
|
22273
22428
|
},
|
|
22274
22429
|
}
|
|
22275
22430
|
: {}),
|
|
22431
|
+
...(descriptor.subTitle
|
|
22432
|
+
? {
|
|
22433
|
+
subtitle: {
|
|
22434
|
+
display: true,
|
|
22435
|
+
text: descriptor.subTitle.content ?? "",
|
|
22436
|
+
color: descriptor.subTitle.color
|
|
22437
|
+
? `rgba(${descriptor.subTitle.color.red ?? 0},
|
|
22438
|
+
${descriptor.subTitle.color.green ?? 0},
|
|
22439
|
+
${descriptor.subTitle.color.blue ?? 0},
|
|
22440
|
+
${descriptor.subTitle.color.alpha ?? 1})`
|
|
22441
|
+
: "#000000ff",
|
|
22442
|
+
font: {
|
|
22443
|
+
size: descriptor.subTitle.size ?? undefined,
|
|
22444
|
+
weight: descriptor.subTitle.weight ?? undefined,
|
|
22445
|
+
style: descriptor.subTitle.style ?? undefined,
|
|
22446
|
+
family: descriptor.subTitle.family ?? undefined,
|
|
22447
|
+
},
|
|
22448
|
+
},
|
|
22449
|
+
}
|
|
22450
|
+
: {}),
|
|
22276
22451
|
},
|
|
22277
22452
|
scales: {},
|
|
22278
22453
|
};
|
|
@@ -22312,7 +22487,8 @@ class SmartDiagramComponent {
|
|
|
22312
22487
|
if (descriptor.shapes) {
|
|
22313
22488
|
descriptor.shapes.forEach((shape, index) => {
|
|
22314
22489
|
options.plugins.annotation = options.plugins.annotation || {};
|
|
22315
|
-
options.plugins.annotation.annotations =
|
|
22490
|
+
options.plugins.annotation.annotations =
|
|
22491
|
+
options.plugins.annotation.annotations || {};
|
|
22316
22492
|
let borderColor = `rgba(
|
|
22317
22493
|
${shape.borderColor?.red ?? 0},
|
|
22318
22494
|
${shape.borderColor?.green ?? 0},
|
|
@@ -22336,7 +22512,7 @@ class SmartDiagramComponent {
|
|
|
22336
22512
|
borderDash = undefined;
|
|
22337
22513
|
}
|
|
22338
22514
|
const baseAnnotation = {
|
|
22339
|
-
type: shape.shapeType ??
|
|
22515
|
+
type: shape.shapeType ?? "line",
|
|
22340
22516
|
backgroundColor: backgroundColor ?? undefined,
|
|
22341
22517
|
borderColor: borderColor ?? undefined,
|
|
22342
22518
|
borderWidth: shape.borderWidth ?? 1,
|
|
@@ -22344,9 +22520,9 @@ class SmartDiagramComponent {
|
|
|
22344
22520
|
drawTime: shape.drawTime ?? undefined,
|
|
22345
22521
|
};
|
|
22346
22522
|
switch (shape.shapeType) {
|
|
22347
|
-
case
|
|
22348
|
-
case
|
|
22349
|
-
case
|
|
22523
|
+
case "box":
|
|
22524
|
+
case "line":
|
|
22525
|
+
case "ellipse":
|
|
22350
22526
|
options.plugins.annotation.annotations[`shape${index}`] = {
|
|
22351
22527
|
...baseAnnotation,
|
|
22352
22528
|
xMin: shape.xMin ?? undefined,
|
|
@@ -22355,7 +22531,7 @@ class SmartDiagramComponent {
|
|
|
22355
22531
|
yMax: shape.yMax ?? undefined,
|
|
22356
22532
|
};
|
|
22357
22533
|
break;
|
|
22358
|
-
case
|
|
22534
|
+
case "label":
|
|
22359
22535
|
options.plugins.annotation.annotations[`shape${index}`] = {
|
|
22360
22536
|
...baseAnnotation,
|
|
22361
22537
|
xValue: shape.xMin ?? undefined,
|
|
@@ -22368,12 +22544,12 @@ class SmartDiagramComponent {
|
|
|
22368
22544
|
weight: shape.labelText?.weight ?? undefined,
|
|
22369
22545
|
style: shape.labelText?.style ?? undefined,
|
|
22370
22546
|
},
|
|
22371
|
-
backgroundColor:
|
|
22372
|
-
borderColor:
|
|
22547
|
+
backgroundColor: "transparent",
|
|
22548
|
+
borderColor: "transparent",
|
|
22373
22549
|
};
|
|
22374
22550
|
break;
|
|
22375
|
-
case
|
|
22376
|
-
case
|
|
22551
|
+
case "point":
|
|
22552
|
+
case "polygon":
|
|
22377
22553
|
options.plugins.annotation.annotations[`shape${index}`] = {
|
|
22378
22554
|
...baseAnnotation,
|
|
22379
22555
|
xValue: shape.xMin ?? undefined,
|
|
@@ -22393,13 +22569,13 @@ class SmartDiagramComponent {
|
|
|
22393
22569
|
${descriptor.backgroundColor?.green ?? 0},
|
|
22394
22570
|
${descriptor.backgroundColor?.blue ?? 0},
|
|
22395
22571
|
${descriptor.backgroundColor?.alpha ?? 1})`;
|
|
22396
|
-
let id =
|
|
22572
|
+
let id = "customCanvasBackgroundColor";
|
|
22397
22573
|
const plugin = {
|
|
22398
22574
|
id: id,
|
|
22399
22575
|
beforeDraw: (chart, args, options) => {
|
|
22400
22576
|
const { ctx, chartArea } = chart;
|
|
22401
22577
|
ctx.save();
|
|
22402
|
-
ctx.globalCompositeOperation =
|
|
22578
|
+
ctx.globalCompositeOperation = "destination-over";
|
|
22403
22579
|
ctx.fillStyle = backgroundColor;
|
|
22404
22580
|
ctx.fillRect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
|
|
22405
22581
|
ctx.restore();
|
|
@@ -22424,7 +22600,7 @@ class SmartDiagramComponent {
|
|
|
22424
22600
|
const canvas = event.target;
|
|
22425
22601
|
const chart = Chart.getChart(canvas);
|
|
22426
22602
|
if (chart) {
|
|
22427
|
-
const elements = chart.getElementsAtEventForMode(event,
|
|
22603
|
+
const elements = chart.getElementsAtEventForMode(event, "nearest", { intersect: true }, false);
|
|
22428
22604
|
if (elements.length === 0) {
|
|
22429
22605
|
return;
|
|
22430
22606
|
}
|
|
@@ -22482,14 +22658,14 @@ class SmartDiagramComponent {
|
|
|
22482
22658
|
}
|
|
22483
22659
|
applyChartClass() {
|
|
22484
22660
|
switch (this.type) {
|
|
22485
|
-
case
|
|
22486
|
-
case
|
|
22487
|
-
case
|
|
22488
|
-
case
|
|
22489
|
-
this.aspectClass =
|
|
22661
|
+
case "pie":
|
|
22662
|
+
case "doughnut":
|
|
22663
|
+
case "polarArea":
|
|
22664
|
+
case "radar":
|
|
22665
|
+
this.aspectClass = "pie-aspect-ratio";
|
|
22490
22666
|
break;
|
|
22491
22667
|
default:
|
|
22492
|
-
this.aspectClass =
|
|
22668
|
+
this.aspectClass = "default-aspect-ratio";
|
|
22493
22669
|
}
|
|
22494
22670
|
}
|
|
22495
22671
|
calcStyle(style) {
|
|
@@ -22500,10 +22676,10 @@ class SmartDiagramComponent {
|
|
|
22500
22676
|
}
|
|
22501
22677
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SmartDiagramComponent, decorators: [{
|
|
22502
22678
|
type: Component,
|
|
22503
|
-
args: [{ selector:
|
|
22679
|
+
args: [{ selector: "smart-diagram", imports: [NgStyle], template: "<div\r\n class=\"chart-host\"\r\n [class]=\"aspectClass\"\r\n [ngStyle]=\"calcStyle($safeNavigationMigration(diagramModel?.descriptor?.style))\"\r\n>\r\n <div class=\"chart-container\">\r\n <canvas #chartCanvas role=\"img\" (click)=\"onCanvasClick($event)\"></canvas>\r\n </div>\r\n</div>\r\n", styles: [".chart-host{display:flex}.chart-container{position:relative}.default-aspect-ratio .chart-container{width:100%;aspect-ratio:1.78}.pie-aspect-ratio .chart-container{width:100%;aspect-ratio:1}\n"] }]
|
|
22504
22680
|
}], ctorParameters: () => [], propDecorators: { chartCanvas: [{
|
|
22505
22681
|
type: ViewChild,
|
|
22506
|
-
args: [
|
|
22682
|
+
args: ["chartCanvas"]
|
|
22507
22683
|
}], uuid: [{
|
|
22508
22684
|
type: Input
|
|
22509
22685
|
}], identifier: [{ type: i0.Input, args: [{ isSignal: true, alias: "identifier", required: true }] }], diagramModel: [{
|
|
@@ -23256,13 +23432,21 @@ class ExpressionEditorDialogComponent {
|
|
|
23256
23432
|
});
|
|
23257
23433
|
}
|
|
23258
23434
|
ngAfterViewInit() {
|
|
23259
|
-
this.formComponent.sophisticatedValueChange
|
|
23435
|
+
// this.formComponent.sophisticatedValueChange
|
|
23436
|
+
// .pipe(takeUntil(this._destroy$))
|
|
23437
|
+
// .subscribe((change) => {
|
|
23438
|
+
// if (change.key === "expressionData.currentOperation") {
|
|
23439
|
+
// const submittedForm = this.formComponent.submitForm(false);
|
|
23440
|
+
// this.service.onSave(submittedForm.componentModel.data);
|
|
23441
|
+
// }
|
|
23442
|
+
// });
|
|
23443
|
+
this.formComponent.blurSophisticatedValueChange
|
|
23260
23444
|
.pipe(takeUntil(this._destroy$))
|
|
23261
23445
|
.subscribe((change) => {
|
|
23262
|
-
if (change.key ===
|
|
23263
|
-
|
|
23264
|
-
|
|
23265
|
-
}
|
|
23446
|
+
// if (change.key === "expressionData.currentOperation") {
|
|
23447
|
+
const submittedForm = this.formComponent.submitForm(false);
|
|
23448
|
+
this.service.onSave(submittedForm.componentModel.data);
|
|
23449
|
+
// }
|
|
23266
23450
|
});
|
|
23267
23451
|
}
|
|
23268
23452
|
ngOnDestroy() {
|
|
@@ -23270,6 +23454,8 @@ class ExpressionEditorDialogComponent {
|
|
|
23270
23454
|
this._destroy$.complete();
|
|
23271
23455
|
}
|
|
23272
23456
|
cancel() {
|
|
23457
|
+
const submittedForm = this.formComponent.submitForm(false);
|
|
23458
|
+
this.service.onSave(submittedForm.componentModel.data);
|
|
23273
23459
|
this.service.closeDialog(false);
|
|
23274
23460
|
}
|
|
23275
23461
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExpressionEditorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -23277,10 +23463,10 @@ class ExpressionEditorDialogComponent {
|
|
|
23277
23463
|
}
|
|
23278
23464
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExpressionEditorDialogComponent, decorators: [{
|
|
23279
23465
|
type: Component,
|
|
23280
|
-
args: [{ selector:
|
|
23466
|
+
args: [{ selector: "lib-expression-editor-dialog", imports: [SmartformComponent, MatButton], template: "<smartform #form [smartForm]=\"smartForm\"></smartform>\r\n<div class=\"button-container\">\r\n <button (click)=\"cancel()\" mat-raised-button color=\"secondary\">Bez\u00E1r\u00E1s</button>\r\n</div>", styles: [".button-container{display:flex;justify-content:flex-end;gap:1rem}:host{display:flex;flex-direction:column;padding:1rem}:host::ng-deep h4{margin:0}:host::ng-deep .mat-mdc-form-field-infix:has(input){padding:0}\n"] }]
|
|
23281
23467
|
}], ctorParameters: () => [], propDecorators: { formComponent: [{
|
|
23282
23468
|
type: ViewChild,
|
|
23283
|
-
args: [
|
|
23469
|
+
args: ["form", { read: SmartformComponent }]
|
|
23284
23470
|
}] } });
|
|
23285
23471
|
|
|
23286
23472
|
class ExpressionEditorDialogService extends SmartdialogService {
|