kwikid-forms 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/kwikid-forms.umd.js +3672 -2968
- package/bundles/kwikid-forms.umd.js.map +1 -1
- package/esm2015/lib/builder/builder.component.js +236 -104
- package/esm2015/lib/builder/builder.module.js +42 -5
- package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +302 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +135 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +542 -0
- package/esm2015/lib/builder/element-config-editor/element-config-editor.component.js +89 -0
- package/esm2015/lib/builder/shared/elements.js +44 -0
- package/esm2015/lib/builder/shared/helpers.js +6 -0
- package/esm2015/lib/renderer/config-converter.helper.js +661 -0
- package/esm2015/lib/renderer/form-view/definitions/form-view.apis.definition.js +1 -1
- package/esm2015/lib/renderer/form-view/form-view.component.js +73 -91
- package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +22 -12
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +4 -1
- package/esm2015/lib/renderer/renderer.component.js +74 -24
- package/fesm2015/kwikid-forms.js +3379 -2071
- package/fesm2015/kwikid-forms.js.map +1 -1
- package/lib/builder/builder.component.d.ts +21 -53
- package/lib/builder/builder.module.d.ts +9 -4
- package/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.d.ts +25 -0
- package/lib/builder/element-config-editor/editors/basic/text-config.editor.component.d.ts +16 -0
- package/lib/builder/element-config-editor/editors/basic-element-config.editor.component.d.ts +20 -0
- package/lib/builder/element-config-editor/element-config-editor.component.d.ts +20 -0
- package/lib/builder/shared/elements.d.ts +32 -0
- package/lib/builder/shared/helpers.d.ts +1 -0
- package/lib/renderer/{renderer.config-converter.helper.d.ts → config-converter.helper.d.ts} +2 -0
- package/lib/renderer/form-view/definitions/form-view.apis.definition.d.ts +2 -1
- package/lib/renderer/form-view/form-view.component.d.ts +8 -5
- package/lib/renderer/renderer.component.d.ts +2 -2
- package/package.json +3 -3
- package/esm2015/lib/renderer/renderer.config-converter.helper.js +0 -641
package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
3
|
+
import { FormArray, FormControl, FormGroup } from "@angular/forms";
|
|
4
|
+
import { logMethod, setMissingKeyValue } from "kwikid-toolkit";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
export class BasicRadioConfigEditor {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.optionType = {
|
|
11
|
+
label: "",
|
|
12
|
+
disabled: false,
|
|
13
|
+
description: ""
|
|
14
|
+
};
|
|
15
|
+
this.saveBasicClickCounter = 0;
|
|
16
|
+
this.elementConfig = {
|
|
17
|
+
properties: {
|
|
18
|
+
orientation: "horizontal"
|
|
19
|
+
},
|
|
20
|
+
options: []
|
|
21
|
+
};
|
|
22
|
+
this.updateElement = new EventEmitter();
|
|
23
|
+
this.basicRadioFormGroup = undefined;
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
this.createBasicRadioFormGroup();
|
|
27
|
+
}
|
|
28
|
+
ngOnChanges(changes) {
|
|
29
|
+
const verifyChange = (key) => {
|
|
30
|
+
return changes.hasOwnProperty(key) && !changes[key].firstChange;
|
|
31
|
+
};
|
|
32
|
+
if (verifyChange("elementConfig")) {
|
|
33
|
+
this.elementConfig = changes.elementConfig.currentValue;
|
|
34
|
+
this.createBasicRadioFormGroup();
|
|
35
|
+
}
|
|
36
|
+
if (verifyChange("saveBasicClickCounter")) {
|
|
37
|
+
if (changes.saveBasicClickCounter.previousValue !==
|
|
38
|
+
changes.saveBasicClickCounter.currentValue) {
|
|
39
|
+
this.saveBasicClickCounter = changes.saveBasicClickCounter.currentValue;
|
|
40
|
+
this.handleOnSave();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
createBasicRadioFormGroup() {
|
|
45
|
+
let optionsFormArray = [];
|
|
46
|
+
this.elementConfig = setMissingKeyValue(this.elementConfig, "options", [
|
|
47
|
+
this.optionType
|
|
48
|
+
]);
|
|
49
|
+
for (let option of this.elementConfig.options) {
|
|
50
|
+
optionsFormArray.push(this.createOptionConfigFormGroup(option));
|
|
51
|
+
}
|
|
52
|
+
this.basicRadioFormGroup = new FormGroup({
|
|
53
|
+
properties: new FormGroup({
|
|
54
|
+
orientation: new FormControl(this.elementConfig.properties.orientation, {
|
|
55
|
+
updateOn: "change"
|
|
56
|
+
})
|
|
57
|
+
}),
|
|
58
|
+
options: new FormArray(optionsFormArray)
|
|
59
|
+
});
|
|
60
|
+
this.basicRadioFormGroup.updateValueAndValidity();
|
|
61
|
+
}
|
|
62
|
+
handleOnSave() {
|
|
63
|
+
let basicElementConfig = this.basicRadioFormGroup.getRawValue();
|
|
64
|
+
this.updateElement.emit({
|
|
65
|
+
basicElementConfig: basicElementConfig
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
get optionsArray() {
|
|
69
|
+
return this.basicRadioFormGroup.get("options");
|
|
70
|
+
}
|
|
71
|
+
createOptionConfigFormGroup(optionConfig) {
|
|
72
|
+
const optionFormGroup = new FormGroup({
|
|
73
|
+
label: new FormControl(optionConfig.label, {
|
|
74
|
+
updateOn: "change"
|
|
75
|
+
}),
|
|
76
|
+
disabled: new FormControl(optionConfig.disabled, {
|
|
77
|
+
updateOn: "change"
|
|
78
|
+
}),
|
|
79
|
+
description: new FormControl(optionConfig.description, {
|
|
80
|
+
updateOn: "change"
|
|
81
|
+
})
|
|
82
|
+
});
|
|
83
|
+
return optionFormGroup;
|
|
84
|
+
}
|
|
85
|
+
addOption() {
|
|
86
|
+
const options = this.basicRadioFormGroup.get("options");
|
|
87
|
+
options.push(this.createOptionConfigFormGroup(this.optionType));
|
|
88
|
+
}
|
|
89
|
+
removeOption(optionIndex) {
|
|
90
|
+
const options = this.basicRadioFormGroup.get("options");
|
|
91
|
+
if (options.length > 1) {
|
|
92
|
+
options.removeAt(optionIndex);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.addOption();
|
|
96
|
+
// options.reset();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** @nocollapse */ BasicRadioConfigEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicRadioConfigEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
/** @nocollapse */ BasicRadioConfigEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BasicRadioConfigEditor, selector: "basic-radio-config-editor", inputs: { saveBasicClickCounter: "saveBasicClickCounter", elementConfig: "elementConfig" }, outputs: { updateElement: "updateElement" }, usesOnChanges: true, ngImport: i0, template: `
|
|
102
|
+
<form [formGroup]="basicRadioFormGroup">
|
|
103
|
+
<fieldset formArrayName="options">
|
|
104
|
+
<legend>Options</legend>
|
|
105
|
+
<ng-container
|
|
106
|
+
*ngFor="let option of optionsArray.controls; let i = index"
|
|
107
|
+
>
|
|
108
|
+
<div [formGroupName]="i">
|
|
109
|
+
<div class="form-group">
|
|
110
|
+
<label for="basic-radio-config-placeholder">label</label>
|
|
111
|
+
<input
|
|
112
|
+
class="form-control"
|
|
113
|
+
formControlName="label"
|
|
114
|
+
id="basic-radio-config-placeholder"
|
|
115
|
+
type="text"
|
|
116
|
+
/>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="form-group">
|
|
119
|
+
<label for="basic-radio-config-disabled">disabled</label>
|
|
120
|
+
<select
|
|
121
|
+
class="form-control"
|
|
122
|
+
formControlName="disabled"
|
|
123
|
+
id="basic-radio-config-disabled"
|
|
124
|
+
>
|
|
125
|
+
<option
|
|
126
|
+
[ngValue]="null"
|
|
127
|
+
disabled
|
|
128
|
+
>Select Disability</option
|
|
129
|
+
>
|
|
130
|
+
<option
|
|
131
|
+
*ngFor="let disabled of [true, false]"
|
|
132
|
+
[ngValue]="disabled"
|
|
133
|
+
>
|
|
134
|
+
{{ disabled }}
|
|
135
|
+
</option>
|
|
136
|
+
</select>
|
|
137
|
+
</div>
|
|
138
|
+
<div class="form-group">
|
|
139
|
+
<label for="basic-radio-config-description">description</label>
|
|
140
|
+
<input
|
|
141
|
+
class="form-control"
|
|
142
|
+
formControlName="description"
|
|
143
|
+
id="basic-radio-config-description"
|
|
144
|
+
type="text"
|
|
145
|
+
/>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="form-array-actions">
|
|
149
|
+
<button (click)="removeOption(i)">Remove</button>
|
|
150
|
+
<button (click)="addOption()">Add</button>
|
|
151
|
+
</div>
|
|
152
|
+
</ng-container>
|
|
153
|
+
</fieldset>
|
|
154
|
+
<fieldset formGroupName="properties">
|
|
155
|
+
<legend>Miscellaneous</legend>
|
|
156
|
+
<div class="form-group">
|
|
157
|
+
<label for="basic-radio-config-orientation">Orientation</label>
|
|
158
|
+
<select
|
|
159
|
+
class="form-control"
|
|
160
|
+
formControlName="orientation"
|
|
161
|
+
id="basic-radio-config-orientation"
|
|
162
|
+
>
|
|
163
|
+
<option
|
|
164
|
+
[ngValue]="null"
|
|
165
|
+
disabled
|
|
166
|
+
>Select Orientation</option
|
|
167
|
+
>
|
|
168
|
+
<option
|
|
169
|
+
*ngFor="let orientation of ['horizontal', 'vertical']"
|
|
170
|
+
[ngValue]="orientation"
|
|
171
|
+
>
|
|
172
|
+
{{ orientation }}
|
|
173
|
+
</option>
|
|
174
|
+
</select>
|
|
175
|
+
</div>
|
|
176
|
+
</fieldset>
|
|
177
|
+
</form>
|
|
178
|
+
`, isInline: true, styles: ["\n .form-array-actions {\n display: flex;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n }\n "], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
|
|
179
|
+
__decorate([
|
|
180
|
+
logMethod
|
|
181
|
+
], BasicRadioConfigEditor.prototype, "ngOnInit", null);
|
|
182
|
+
__decorate([
|
|
183
|
+
logMethod
|
|
184
|
+
], BasicRadioConfigEditor.prototype, "ngOnChanges", null);
|
|
185
|
+
__decorate([
|
|
186
|
+
logMethod
|
|
187
|
+
], BasicRadioConfigEditor.prototype, "createBasicRadioFormGroup", null);
|
|
188
|
+
__decorate([
|
|
189
|
+
logMethod
|
|
190
|
+
], BasicRadioConfigEditor.prototype, "handleOnSave", null);
|
|
191
|
+
__decorate([
|
|
192
|
+
logMethod
|
|
193
|
+
], BasicRadioConfigEditor.prototype, "createOptionConfigFormGroup", null);
|
|
194
|
+
__decorate([
|
|
195
|
+
logMethod
|
|
196
|
+
], BasicRadioConfigEditor.prototype, "addOption", null);
|
|
197
|
+
__decorate([
|
|
198
|
+
logMethod
|
|
199
|
+
], BasicRadioConfigEditor.prototype, "removeOption", null);
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicRadioConfigEditor, decorators: [{
|
|
201
|
+
type: Component,
|
|
202
|
+
args: [{
|
|
203
|
+
selector: "basic-radio-config-editor",
|
|
204
|
+
template: `
|
|
205
|
+
<form [formGroup]="basicRadioFormGroup">
|
|
206
|
+
<fieldset formArrayName="options">
|
|
207
|
+
<legend>Options</legend>
|
|
208
|
+
<ng-container
|
|
209
|
+
*ngFor="let option of optionsArray.controls; let i = index"
|
|
210
|
+
>
|
|
211
|
+
<div [formGroupName]="i">
|
|
212
|
+
<div class="form-group">
|
|
213
|
+
<label for="basic-radio-config-placeholder">label</label>
|
|
214
|
+
<input
|
|
215
|
+
class="form-control"
|
|
216
|
+
formControlName="label"
|
|
217
|
+
id="basic-radio-config-placeholder"
|
|
218
|
+
type="text"
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="form-group">
|
|
222
|
+
<label for="basic-radio-config-disabled">disabled</label>
|
|
223
|
+
<select
|
|
224
|
+
class="form-control"
|
|
225
|
+
formControlName="disabled"
|
|
226
|
+
id="basic-radio-config-disabled"
|
|
227
|
+
>
|
|
228
|
+
<option
|
|
229
|
+
[ngValue]="null"
|
|
230
|
+
disabled
|
|
231
|
+
>Select Disability</option
|
|
232
|
+
>
|
|
233
|
+
<option
|
|
234
|
+
*ngFor="let disabled of [true, false]"
|
|
235
|
+
[ngValue]="disabled"
|
|
236
|
+
>
|
|
237
|
+
{{ disabled }}
|
|
238
|
+
</option>
|
|
239
|
+
</select>
|
|
240
|
+
</div>
|
|
241
|
+
<div class="form-group">
|
|
242
|
+
<label for="basic-radio-config-description">description</label>
|
|
243
|
+
<input
|
|
244
|
+
class="form-control"
|
|
245
|
+
formControlName="description"
|
|
246
|
+
id="basic-radio-config-description"
|
|
247
|
+
type="text"
|
|
248
|
+
/>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
<div class="form-array-actions">
|
|
252
|
+
<button (click)="removeOption(i)">Remove</button>
|
|
253
|
+
<button (click)="addOption()">Add</button>
|
|
254
|
+
</div>
|
|
255
|
+
</ng-container>
|
|
256
|
+
</fieldset>
|
|
257
|
+
<fieldset formGroupName="properties">
|
|
258
|
+
<legend>Miscellaneous</legend>
|
|
259
|
+
<div class="form-group">
|
|
260
|
+
<label for="basic-radio-config-orientation">Orientation</label>
|
|
261
|
+
<select
|
|
262
|
+
class="form-control"
|
|
263
|
+
formControlName="orientation"
|
|
264
|
+
id="basic-radio-config-orientation"
|
|
265
|
+
>
|
|
266
|
+
<option
|
|
267
|
+
[ngValue]="null"
|
|
268
|
+
disabled
|
|
269
|
+
>Select Orientation</option
|
|
270
|
+
>
|
|
271
|
+
<option
|
|
272
|
+
*ngFor="let orientation of ['horizontal', 'vertical']"
|
|
273
|
+
[ngValue]="orientation"
|
|
274
|
+
>
|
|
275
|
+
{{ orientation }}
|
|
276
|
+
</option>
|
|
277
|
+
</select>
|
|
278
|
+
</div>
|
|
279
|
+
</fieldset>
|
|
280
|
+
</form>
|
|
281
|
+
`,
|
|
282
|
+
styles: [
|
|
283
|
+
`
|
|
284
|
+
.form-array-actions {
|
|
285
|
+
display: flex;
|
|
286
|
+
flex-direction: row;
|
|
287
|
+
align-content: center;
|
|
288
|
+
justify-content: center;
|
|
289
|
+
align-items: center;
|
|
290
|
+
gap: 1rem;
|
|
291
|
+
}
|
|
292
|
+
`
|
|
293
|
+
]
|
|
294
|
+
}]
|
|
295
|
+
}], ctorParameters: function () { return []; }, propDecorators: { saveBasicClickCounter: [{
|
|
296
|
+
type: Input
|
|
297
|
+
}], elementConfig: [{
|
|
298
|
+
type: Input
|
|
299
|
+
}], updateElement: [{
|
|
300
|
+
type: Output
|
|
301
|
+
}], ngOnInit: [], ngOnChanges: [], createBasicRadioFormGroup: [], handleOnSave: [], createOptionConfigFormGroup: [], addOption: [], removeOption: [] } });
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tY29uZmlnLmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2VsZW1lbnQtY29uZmlnLWVkaXRvci9lZGl0b3JzL2Jhc2ljL3JhZGlvLWNvbmZpZy5lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQStGL0QsTUFBTSxPQUFPLHNCQUFzQjtJQXVCakM7UUF0QlMsZUFBVSxHQUFHO1lBQ3BCLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLEtBQUs7WUFDZixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO1FBR0YsMEJBQXFCLEdBQVcsQ0FBQyxDQUFDO1FBR2xDLGtCQUFhLEdBQVE7WUFDbkIsVUFBVSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxZQUFZO2FBQzFCO1lBQ0QsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBR0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXhDLHdCQUFtQixHQUFjLFNBQVMsQ0FBQztJQUU1QixDQUFDO0lBR2hCLFFBQVE7UUFDTixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBR0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDbkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJ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QUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFjLENBQUM7UUFDckUsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsbUJBQW1CO1NBQ3BCO0lBQ0gsQ0FBQzs7dUlBM0hVLHNCQUFzQjsySEFBdEIsc0JBQXNCLCtOQTNGdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkVUO0FBd0NEO0lBREMsU0FBUztzREFHVDtBQUdEO0lBREMsU0FBUzt5REFxQlQ7QUFHRDtJQURDLFNBQVM7dUVBd0JUO0FBR0Q7SUFEQyxTQUFTOzBEQU9UO0FBT0Q7SUFEQyxTQUFTO3lFQWNUO0FBR0Q7SUFEQyxTQUFTO3VEQUlUO0FBR0Q7SUFEQyxTQUFTOzBEQVNUOzRGQTNIVSxzQkFBc0I7a0JBN0ZsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2RVQ7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOOzs7Ozs7Ozs7S0FTQztxQkFDRjtpQkFDRjswRUFTQyxxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixLQUFLO2dCQVNOLGFBQWE7c0JBRFosTUFBTTtnQkFRUCxRQUFRLE1BS1IsV0FBVyxNQXVCWCx5QkFBeUIsTUEwQnpCLFlBQVksTUFhWiwyQkFBMkIsTUFnQjNCLFNBQVMsTUFNVCxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBsb2dNZXRob2QsIHNldE1pc3NpbmdLZXlWYWx1ZSB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYmFzaWMtcmFkaW8tY29uZmlnLWVkaXRvclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYmFzaWNSYWRpb0Zvcm1Hcm91cFwiPlxuICAgICAgPGZpZWxkc2V0IGZvcm1BcnJheU5hbWU9XCJvcHRpb25zXCI+XG4gICAgICAgIDxsZWdlbmQ+T3B0aW9uczwvbGVnZW5kPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWMtcmFkaW8tY29uZmlnLXBsYWNlaG9sZGVyXCI+bGFiZWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgIGlkPVwiYmFzaWMtcmFkaW8tY29uZmlnLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpYy1yYWRpby1jb25maWctZGlzYWJsZWRcIj5kaXNhYmxlZDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIGlkPVwiYmFzaWMtcmFkaW8tY29uZmlnLWRpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgID5TZWxlY3QgRGlzYWJpbGl0eTwvb3B0aW9uXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkaXNhYmxlZCBvZiBbdHJ1ZSwgZmFsc2VdXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBkaXNhYmxlZCB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImJhc2ljLXJhZGlvLWNvbmZpZy1kZXNjcmlwdGlvblwiPmRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBpZD1cImJhc2ljLXJhZGlvLWNvbmZpZy1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tYXJyYXktYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlT3B0aW9uKGkpXCI+UmVtb3ZlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRPcHRpb24oKVwiPkFkZDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8ZmllbGRzZXQgZm9ybUdyb3VwTmFtZT1cInByb3BlcnRpZXNcIj5cbiAgICAgICAgPGxlZ2VuZD5NaXNjZWxsYW5lb3VzPC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImJhc2ljLXJhZGlvLWNvbmZpZy1vcmllbnRhdGlvblwiPk9yaWVudGF0aW9uPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmllbnRhdGlvblwiXG4gICAgICAgICAgICBpZD1cImJhc2ljLXJhZGlvLWNvbmZpZy1vcmllbnRhdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJudWxsXCJcbiAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgPlNlbGVjdCBPcmllbnRhdGlvbjwvb3B0aW9uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcmllbnRhdGlvbiBvZiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXVwiXG4gICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cIm9yaWVudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgb3JpZW50YXRpb24gfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgPC9mb3JtPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZm9ybS1hcnJheS1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxcmVtO1xuICAgICAgfVxuICAgIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBCYXNpY1JhZGlvQ29uZmlnRWRpdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmVhZG9ubHkgb3B0aW9uVHlwZSA9IHtcbiAgICBsYWJlbDogXCJcIixcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfTtcblxuICBASW5wdXQoKVxuICBzYXZlQmFzaWNDbGlja0NvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KClcbiAgZWxlbWVudENvbmZpZzogYW55ID0ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIlxuICAgIH0sXG4gICAgb3B0aW9uczogW11cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljUmFkaW9Gb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZWxlbWVudENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5lbGVtZW50Q29uZmlnID0gY2hhbmdlcy5lbGVtZW50Q29uZmlnLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgdGhpcy5jcmVhdGVCYXNpY1JhZGlvRm9ybUdyb3VwKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJzYXZlQmFzaWNDbGlja0NvdW50ZXJcIikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIucHJldmlvdXNWYWx1ZSAhPT1cbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIuY3VycmVudFZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIgPSBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVPblNhdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbnNGb3JtQXJyYXkgPSBbXTtcblxuICAgIHRoaXMuZWxlbWVudENvbmZpZyA9IHNldE1pc3NpbmdLZXlWYWx1ZSh0aGlzLmVsZW1lbnRDb25maWcsIFwib3B0aW9uc1wiLCBbXG4gICAgICB0aGlzLm9wdGlvblR5cGVcbiAgICBdKTtcblxuICAgIGZvciAobGV0IG9wdGlvbiBvZiB0aGlzLmVsZW1lbnRDb25maWcub3B0aW9ucykge1xuICAgICAgb3B0aW9uc0Zvcm1BcnJheS5wdXNoKHRoaXMuY3JlYXRlT3B0aW9uQ29uZmlnRm9ybUdyb3VwKG9wdGlvbikpO1xuICAgIH1cblxuICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgcHJvcGVydGllczogbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5lbGVtZW50Q29uZmlnLnByb3BlcnRpZXMub3JpZW50YXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXBkYXRlT246IFwiY2hhbmdlXCJcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgICAgb3B0aW9uczogbmV3IEZvcm1BcnJheShvcHRpb25zRm9ybUFycmF5KVxuICAgIH0pO1xuICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uU2F2ZSgpIHtcbiAgICBsZXQgYmFzaWNFbGVtZW50Q29uZmlnID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQuZW1pdCh7XG4gICAgICBiYXNpY0VsZW1lbnRDb25maWc6IGJhc2ljRWxlbWVudENvbmZpZ1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnNBcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmJhc2ljUmFkaW9Gb3JtR3JvdXAuZ2V0KFwib3B0aW9uc1wiKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNyZWF0ZU9wdGlvbkNvbmZpZ0Zvcm1Hcm91cChvcHRpb25Db25maWc6IGFueSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3Qgb3B0aW9uRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBsYWJlbDogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5sYWJlbCwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSksXG4gICAgICBkaXNhYmxlZDogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5kaXNhYmxlZCwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSksXG4gICAgICBkZXNjcmlwdGlvbjogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5kZXNjcmlwdGlvbiwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gb3B0aW9uRm9ybUdyb3VwO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhZGRPcHRpb24oKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgICBvcHRpb25zLnB1c2godGhpcy5jcmVhdGVPcHRpb25Db25maWdGb3JtR3JvdXAodGhpcy5vcHRpb25UeXBlKSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHJlbW92ZU9wdGlvbihvcHRpb25JbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICBvcHRpb25zLnJlbW92ZUF0KG9wdGlvbkluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRPcHRpb24oKTtcbiAgICAgIC8vIG9wdGlvbnMucmVzZXQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
3
|
+
import { FormControl, FormGroup } from "@angular/forms";
|
|
4
|
+
import { logMethod } from "kwikid-toolkit";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
export class BasicTextConfigEditor {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.saveBasicClickCounter = 0;
|
|
11
|
+
this.elementConfig = {
|
|
12
|
+
properties: {
|
|
13
|
+
case: "default"
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
this.updateElement = new EventEmitter();
|
|
17
|
+
this.basicTextFormGroup = undefined;
|
|
18
|
+
}
|
|
19
|
+
ngOnInit() {
|
|
20
|
+
this.createBasicTextFormGroup();
|
|
21
|
+
}
|
|
22
|
+
ngOnChanges(changes) {
|
|
23
|
+
const verifyChange = (key) => {
|
|
24
|
+
return changes.hasOwnProperty(key) && !changes[key].firstChange;
|
|
25
|
+
};
|
|
26
|
+
if (verifyChange("elementConfig")) {
|
|
27
|
+
this.elementConfig = changes.elementConfig.currentValue;
|
|
28
|
+
this.createBasicTextFormGroup();
|
|
29
|
+
}
|
|
30
|
+
if (verifyChange("saveBasicClickCounter")) {
|
|
31
|
+
if (changes.saveBasicClickCounter.previousValue !==
|
|
32
|
+
changes.saveBasicClickCounter.currentValue) {
|
|
33
|
+
this.saveBasicClickCounter = changes.saveBasicClickCounter.currentValue;
|
|
34
|
+
this.handleOnSave();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
createBasicTextFormGroup() {
|
|
39
|
+
this.basicTextFormGroup = new FormGroup({
|
|
40
|
+
properties: new FormGroup({
|
|
41
|
+
case: new FormControl(this.elementConfig.properties.case, {
|
|
42
|
+
updateOn: "change"
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
this.basicTextFormGroup.updateValueAndValidity();
|
|
47
|
+
}
|
|
48
|
+
handleOnSave() {
|
|
49
|
+
let basicElementConfig = this.basicTextFormGroup.getRawValue();
|
|
50
|
+
this.updateElement.emit({
|
|
51
|
+
basicElementConfig: basicElementConfig
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** @nocollapse */ BasicTextConfigEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicTextConfigEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
+
/** @nocollapse */ BasicTextConfigEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BasicTextConfigEditor, selector: "basic-text-config-editor", inputs: { saveBasicClickCounter: "saveBasicClickCounter", elementConfig: "elementConfig" }, outputs: { updateElement: "updateElement" }, usesOnChanges: true, ngImport: i0, template: `
|
|
57
|
+
<form [formGroup]="basicTextFormGroup">
|
|
58
|
+
<fieldset formGroupName="properties">
|
|
59
|
+
<legend>Miscellaneous</legend>
|
|
60
|
+
<div class="form-group">
|
|
61
|
+
<label for="basic-text-config-case">Case</label>
|
|
62
|
+
<select
|
|
63
|
+
class="form-control"
|
|
64
|
+
formControlName="case"
|
|
65
|
+
id="basic-text-config-case"
|
|
66
|
+
>
|
|
67
|
+
<option
|
|
68
|
+
[ngValue]="null"
|
|
69
|
+
disabled
|
|
70
|
+
>Select Case</option
|
|
71
|
+
>
|
|
72
|
+
<option
|
|
73
|
+
*ngFor="let case of ['default', 'upper', 'lower']"
|
|
74
|
+
[ngValue]="case"
|
|
75
|
+
>
|
|
76
|
+
{{ case }}
|
|
77
|
+
</option>
|
|
78
|
+
</select>
|
|
79
|
+
</div>
|
|
80
|
+
</fieldset>
|
|
81
|
+
</form>
|
|
82
|
+
`, isInline: true, styles: [""], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
83
|
+
__decorate([
|
|
84
|
+
logMethod
|
|
85
|
+
], BasicTextConfigEditor.prototype, "ngOnInit", null);
|
|
86
|
+
__decorate([
|
|
87
|
+
logMethod
|
|
88
|
+
], BasicTextConfigEditor.prototype, "ngOnChanges", null);
|
|
89
|
+
__decorate([
|
|
90
|
+
logMethod
|
|
91
|
+
], BasicTextConfigEditor.prototype, "createBasicTextFormGroup", null);
|
|
92
|
+
__decorate([
|
|
93
|
+
logMethod
|
|
94
|
+
], BasicTextConfigEditor.prototype, "handleOnSave", null);
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicTextConfigEditor, decorators: [{
|
|
96
|
+
type: Component,
|
|
97
|
+
args: [{
|
|
98
|
+
selector: "basic-text-config-editor",
|
|
99
|
+
template: `
|
|
100
|
+
<form [formGroup]="basicTextFormGroup">
|
|
101
|
+
<fieldset formGroupName="properties">
|
|
102
|
+
<legend>Miscellaneous</legend>
|
|
103
|
+
<div class="form-group">
|
|
104
|
+
<label for="basic-text-config-case">Case</label>
|
|
105
|
+
<select
|
|
106
|
+
class="form-control"
|
|
107
|
+
formControlName="case"
|
|
108
|
+
id="basic-text-config-case"
|
|
109
|
+
>
|
|
110
|
+
<option
|
|
111
|
+
[ngValue]="null"
|
|
112
|
+
disabled
|
|
113
|
+
>Select Case</option
|
|
114
|
+
>
|
|
115
|
+
<option
|
|
116
|
+
*ngFor="let case of ['default', 'upper', 'lower']"
|
|
117
|
+
[ngValue]="case"
|
|
118
|
+
>
|
|
119
|
+
{{ case }}
|
|
120
|
+
</option>
|
|
121
|
+
</select>
|
|
122
|
+
</div>
|
|
123
|
+
</fieldset>
|
|
124
|
+
</form>
|
|
125
|
+
`,
|
|
126
|
+
styles: [``]
|
|
127
|
+
}]
|
|
128
|
+
}], ctorParameters: function () { return []; }, propDecorators: { saveBasicClickCounter: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], elementConfig: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], updateElement: [{
|
|
133
|
+
type: Output
|
|
134
|
+
}], ngOnInit: [], ngOnChanges: [], createBasicTextFormGroup: [], handleOnSave: [] } });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1jb25maWcuZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL2J1aWxkZXIvZWxlbWVudC1jb25maWctZWRpdG9yL2VkaXRvcnMvYmFzaWMvdGV4dC1jb25maWcuZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWlDM0MsTUFBTSxPQUFPLHFCQUFxQjtJQWdCaEM7UUFkQSwwQkFBcUIsR0FBVyxDQUFDLENBQUM7UUFHbEMsa0JBQWEsR0FBUTtZQUNuQixVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFNBQVM7YUFDaEI7U0FDRixDQUFDO1FBR0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXhDLHVCQUFrQixHQUFjLFNBQVMsQ0FBQztJQUUzQixDQUFDO0lBR2hCLFFBQVE7UUFDTixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBR0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDbkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNsRSxDQUFDLENBQUM7UUFFRixJQUFJLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBRXhELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxZQUFZLENBQUMsdUJBQXVCLENBQUMsRUFBRTtZQUN6QyxJQUNFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhO2dCQUMzQyxPQUFPLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUMxQztnQkFDQSxJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQztnQkFFeEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBR0Qsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUN0QyxVQUFVLEVBQUUsSUFBSSxTQUFTLENBQUM7Z0JBQ3hCLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQ3hELFFBQVEsRUFBRSxRQUFRO2lCQUNuQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFHRCxZQUFZO1FBQ1YsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsa0JBQWtCLEVBQUUsa0JBQWtCO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7O3NJQWpFVSxxQkFBcUI7MEhBQXJCLHFCQUFxQiw4TkE3QnRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVDtBQXNCRDtJQURDLFNBQVM7cURBR1Q7QUFHRDtJQURDLFNBQVM7d0RBcUJUO0FBR0Q7SUFEQyxTQUFTO3FFQVVUO0FBR0Q7SUFEQyxTQUFTO3lEQU9UOzRGQWpFVSxxQkFBcUI7a0JBL0JqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQ7b0JBQ0QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO2lCQUNiOzBFQUdDLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBUU4sYUFBYTtzQkFEWixNQUFNO2dCQVFQLFFBQVEsTUFLUixXQUFXLE1BdUJYLHdCQUF3QixNQVl4QixZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgbG9nTWV0aG9kIH0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJiYXNpYy10ZXh0LWNvbmZpZy1lZGl0b3JcIixcbiAgdGVtcGxhdGU6IGBcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImJhc2ljVGV4dEZvcm1Hcm91cFwiPlxuICAgICAgPGZpZWxkc2V0IGZvcm1Hcm91cE5hbWU9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxsZWdlbmQ+TWlzY2VsbGFuZW91czwvbGVnZW5kPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpYy10ZXh0LWNvbmZpZy1jYXNlXCI+Q2FzZTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY2FzZVwiXG4gICAgICAgICAgICBpZD1cImJhc2ljLXRleHQtY29uZmlnLWNhc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgW25nVmFsdWVdPVwibnVsbFwiXG4gICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgID5TZWxlY3QgQ2FzZTwvb3B0aW9uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXNlIG9mIFsnZGVmYXVsdCcsICd1cHBlcicsICdsb3dlciddXCJcbiAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY2FzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNhc2UgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgPC9mb3JtPlxuICBgLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgQmFzaWNUZXh0Q29uZmlnRWRpdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgc2F2ZUJhc2ljQ2xpY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIGVsZW1lbnRDb25maWc6IGFueSA9IHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBjYXNlOiBcImRlZmF1bHRcIlxuICAgIH1cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljVGV4dEZvcm1Hcm91cDogRm9ybUdyb3VwID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBAbG9nTWV0aG9kXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY3JlYXRlQmFzaWNUZXh0Rm9ybUdyb3VwKCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB2ZXJpZnlDaGFuZ2UgPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2VzLmhhc093blByb3BlcnR5KGtleSkgJiYgIWNoYW5nZXNba2V5XS5maXJzdENoYW5nZTtcbiAgICB9O1xuXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImVsZW1lbnRDb25maWdcIikpIHtcbiAgICAgIHRoaXMuZWxlbWVudENvbmZpZyA9IGNoYW5nZXMuZWxlbWVudENvbmZpZy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuY3JlYXRlQmFzaWNUZXh0Rm9ybUdyb3VwKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJzYXZlQmFzaWNDbGlja0NvdW50ZXJcIikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIucHJldmlvdXNWYWx1ZSAhPT1cbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIuY3VycmVudFZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIgPSBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVPblNhdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNyZWF0ZUJhc2ljVGV4dEZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2ljVGV4dEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgcHJvcGVydGllczogbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGNhc2U6IG5ldyBGb3JtQ29udHJvbCh0aGlzLmVsZW1lbnRDb25maWcucHJvcGVydGllcy5jYXNlLCB7XG4gICAgICAgICAgdXBkYXRlT246IFwiY2hhbmdlXCJcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5iYXNpY1RleHRGb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPblNhdmUoKSB7XG4gICAgbGV0IGJhc2ljRWxlbWVudENvbmZpZyA9IHRoaXMuYmFzaWNUZXh0Rm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQuZW1pdCh7XG4gICAgICBiYXNpY0VsZW1lbnRDb25maWc6IGJhc2ljRWxlbWVudENvbmZpZ1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|