@rlucan/ui 14.2.4 → 14.2.6

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.
Files changed (107) hide show
  1. package/esm2022/lib/action-button/action-button.component.mjs +99 -0
  2. package/esm2022/lib/action-icon/action-icon.component.mjs +37 -0
  3. package/esm2022/lib/autocomplete/autocomplete.component.mjs +391 -0
  4. package/esm2022/lib/avatar/avatar.component.mjs +34 -0
  5. package/esm2022/lib/button/button.component.mjs +57 -0
  6. package/esm2022/lib/checkbox/checkbox.component.mjs +39 -0
  7. package/{esm2020 → esm2022}/lib/checkbox-group/checkbox-group.component.mjs +91 -91
  8. package/esm2022/lib/currency/currency.component.mjs +151 -0
  9. package/esm2022/lib/date/date.component.mjs +68 -0
  10. package/{esm2020 → esm2022}/lib/dialog/dialog.component.mjs +37 -37
  11. package/esm2022/lib/directives/force-visibility/force-visibility.directive.mjs +104 -0
  12. package/esm2022/lib/editor/editor.component.mjs +119 -0
  13. package/{esm2020 → esm2022}/lib/elements/burger/burger.component.mjs +21 -21
  14. package/{esm2020 → esm2022}/lib/elements/expander/expander.component.mjs +28 -28
  15. package/{esm2020 → esm2022}/lib/elements/validation-message/validation-message.component.mjs +47 -47
  16. package/esm2022/lib/file/file.component.mjs +145 -0
  17. package/esm2022/lib/file-uploader/ui-file-uploader.component.mjs +405 -0
  18. package/esm2022/lib/input/input.component.mjs +265 -0
  19. package/esm2022/lib/input-autocomplete/input-autocomplete.component.mjs +277 -0
  20. package/esm2022/lib/layouts/base/ui-base-layout.component.mjs +22 -0
  21. package/esm2022/lib/layouts/base/ui-base.component.mjs +74 -0
  22. package/esm2022/lib/layouts/simple/ui-simple-layout.component.mjs +18 -0
  23. package/esm2022/lib/layouts/simple/ui-simple.component.mjs +166 -0
  24. package/{esm2020 → esm2022}/lib/radio/radio.component.mjs +21 -21
  25. package/esm2022/lib/radio-group/radio-group.component.mjs +53 -0
  26. package/esm2022/lib/select/select.component.mjs +115 -0
  27. package/esm2022/lib/services/message-box.service.mjs +149 -0
  28. package/{esm2020 → esm2022}/lib/services/toast.service.mjs +23 -23
  29. package/{esm2020 → esm2022}/lib/services/ui-file.service.mjs +71 -71
  30. package/{esm2020 → esm2022}/lib/services/ui-translate.service.mjs +32 -32
  31. package/{esm2020 → esm2022}/lib/submit-button/submit-button.component.mjs +72 -72
  32. package/esm2022/lib/table/table.component.mjs +97 -0
  33. package/esm2022/lib/text-area/text-area.component.mjs +46 -0
  34. package/{esm2020 → esm2022}/lib/ui.model.mjs +1 -1
  35. package/esm2022/lib/ui.module.mjs +269 -0
  36. package/esm2022/public-api.mjs +35 -0
  37. package/{esm2020 → esm2022}/rlucan-ui.mjs +4 -4
  38. package/fesm2022/rlucan-ui.mjs +3442 -0
  39. package/fesm2022/rlucan-ui.mjs.map +1 -0
  40. package/index.d.ts +5 -5
  41. package/lib/action-button/action-button.component.d.ts +32 -33
  42. package/lib/action-icon/action-icon.component.d.ts +15 -15
  43. package/lib/autocomplete/autocomplete.component.d.ts +57 -57
  44. package/lib/avatar/avatar.component.d.ts +14 -14
  45. package/lib/button/button.component.d.ts +18 -18
  46. package/lib/checkbox/checkbox.component.d.ts +15 -15
  47. package/lib/checkbox-group/checkbox-group.component.d.ts +18 -18
  48. package/lib/currency/currency.component.d.ts +31 -30
  49. package/lib/date/date.component.d.ts +24 -23
  50. package/lib/dialog/dialog.component.d.ts +13 -13
  51. package/lib/directives/force-visibility/force-visibility.directive.d.ts +22 -20
  52. package/lib/editor/editor.component.d.ts +24 -0
  53. package/lib/elements/burger/burger.component.d.ts +9 -9
  54. package/lib/elements/expander/expander.component.d.ts +10 -10
  55. package/lib/elements/validation-message/validation-message.component.d.ts +12 -12
  56. package/lib/file/file.component.d.ts +35 -29
  57. package/lib/file-uploader/ui-file-uploader.component.d.ts +102 -102
  58. package/lib/input/input.component.d.ts +42 -29
  59. package/lib/input-autocomplete/input-autocomplete.component.d.ts +44 -0
  60. package/lib/{base → layouts/base}/ui-base-layout.component.d.ts +8 -8
  61. package/lib/{base → layouts/base}/ui-base.component.d.ts +23 -23
  62. package/lib/{simple → layouts/simple}/ui-simple-layout.component.d.ts +8 -7
  63. package/lib/{simple → layouts/simple}/ui-simple.component.d.ts +40 -39
  64. package/lib/radio/radio.component.d.ts +8 -8
  65. package/lib/radio-group/radio-group.component.d.ts +18 -18
  66. package/lib/select/select.component.d.ts +35 -33
  67. package/lib/services/message-box.service.d.ts +58 -42
  68. package/lib/services/toast.service.d.ts +13 -13
  69. package/lib/services/ui-file.service.d.ts +33 -33
  70. package/lib/services/ui-translate.service.d.ts +11 -11
  71. package/lib/submit-button/submit-button.component.d.ts +21 -21
  72. package/lib/table/table.component.d.ts +36 -36
  73. package/lib/text-area/text-area.component.d.ts +18 -18
  74. package/lib/ui.model.d.ts +2 -2
  75. package/lib/ui.module.d.ts +59 -56
  76. package/package.json +22 -24
  77. package/public-api.d.ts +29 -27
  78. package/scss/ui-defaults.scss +19 -4
  79. package/src/js/editorjs.mjs +9634 -0
  80. package/ui.scss +70 -20
  81. package/esm2020/lib/action-button/action-button.component.mjs +0 -96
  82. package/esm2020/lib/action-icon/action-icon.component.mjs +0 -37
  83. package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -391
  84. package/esm2020/lib/avatar/avatar.component.mjs +0 -34
  85. package/esm2020/lib/base/ui-base-layout.component.mjs +0 -22
  86. package/esm2020/lib/base/ui-base.component.mjs +0 -74
  87. package/esm2020/lib/button/button.component.mjs +0 -57
  88. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -39
  89. package/esm2020/lib/currency/currency.component.mjs +0 -148
  90. package/esm2020/lib/date/date.component.mjs +0 -64
  91. package/esm2020/lib/directives/force-visibility/force-visibility.directive.mjs +0 -96
  92. package/esm2020/lib/file/file.component.mjs +0 -88
  93. package/esm2020/lib/file-uploader/ui-file-uploader.component.mjs +0 -394
  94. package/esm2020/lib/input/input.component.mjs +0 -258
  95. package/esm2020/lib/radio-group/radio-group.component.mjs +0 -53
  96. package/esm2020/lib/select/select.component.mjs +0 -91
  97. package/esm2020/lib/services/message-box.service.mjs +0 -113
  98. package/esm2020/lib/simple/ui-simple-layout.component.mjs +0 -15
  99. package/esm2020/lib/simple/ui-simple.component.mjs +0 -154
  100. package/esm2020/lib/table/table.component.mjs +0 -97
  101. package/esm2020/lib/text-area/text-area.component.mjs +0 -46
  102. package/esm2020/lib/ui.module.mjs +0 -255
  103. package/esm2020/public-api.mjs +0 -33
  104. package/fesm2015/rlucan-ui.mjs +0 -2918
  105. package/fesm2015/rlucan-ui.mjs.map +0 -1
  106. package/fesm2020/rlucan-ui.mjs +0 -2886
  107. package/fesm2020/rlucan-ui.mjs.map +0 -1
@@ -0,0 +1,166 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Validators, FormControl } from '@angular/forms';
3
+ import { UiBaseComponent } from '../base/ui-base.component';
4
+ import { Subscription } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ export class UiSimpleComponent extends UiBaseComponent {
8
+ constructor(ngControl, // <-- obsolete
9
+ controlContainer = null) {
10
+ super();
11
+ this.ngControl = ngControl;
12
+ this.controlContainer = controlContainer;
13
+ this.sub = new Subscription();
14
+ this.onChange = (val) => { };
15
+ this.onTouched = () => { };
16
+ this.onValidatorChange = () => { };
17
+ if (ngControl) {
18
+ ngControl.valueAccessor = this;
19
+ }
20
+ else {
21
+ this.componentFormControl = new FormControl();
22
+ // this.componentFormControl.markAsUntouched();
23
+ this.sub.add(this.componentFormControl.valueChanges.subscribe(v => {
24
+ try {
25
+ // console.log(v, this.componentFormControl.value);
26
+ this.onChange(v);
27
+ }
28
+ catch (e) { /*console.error(e);*/
29
+ }
30
+ }));
31
+ }
32
+ // this.ngControl.valueAccessor = this;
33
+ }
34
+ get maxLenRequired() {
35
+ return this.componentFormControl.value && (this.componentFormControl.value.length > (this.validators?.maxLength || 0));
36
+ }
37
+ get isInvalid() {
38
+ // console.log(this.label, this.componentFormControl.touched);
39
+ return this.componentFormControl.touched && !!this.componentFormControl.errors;
40
+ }
41
+ get validationErrors() {
42
+ return this.componentFormControl?.errors;
43
+ }
44
+ ngOnDestroy() {
45
+ this.sub.unsubscribe();
46
+ }
47
+ ngOnInit() {
48
+ if (this.ngControl) {
49
+ if (this.formControl) {
50
+ this.componentFormControl = this.formControl;
51
+ }
52
+ else {
53
+ this.componentFormControl = this.ngControl.control;
54
+ }
55
+ setTimeout(() => this.applyTemplateValidators());
56
+ }
57
+ else {
58
+ this.parentFormControl = this.formControlName ?
59
+ this.controlContainer.control.get(this.formControlName) : this.formControl;
60
+ if (this.parentFormControl) {
61
+ this.componentFormControl.setValidators(this.parentFormControl.validator);
62
+ this.parentFormControl._componentFormControl = this.componentFormControl;
63
+ if (this.parentFormControl._markAsTouched === undefined) {
64
+ this.parentFormControl._markAsTouched = this.parentFormControl.markAsTouched;
65
+ this.parentFormControl._setErrors = this.parentFormControl.setErrors;
66
+ this.parentFormControl.markAsTouched = ({ onlySelf } = {}) => {
67
+ this.parentFormControl._markAsTouched({ onlySelf });
68
+ this.parentFormControl._componentFormControl.markAsTouched({ onlySelf });
69
+ this.componentFormControl.setErrors(this.parentFormControl.errors);
70
+ };
71
+ this.parentFormControl.setErrors = (errors) => {
72
+ this.parentFormControl._setErrors(errors);
73
+ this.parentFormControl._componentFormControl.setErrors(errors);
74
+ };
75
+ }
76
+ setTimeout(() => this.applyTemplateValidators());
77
+ }
78
+ }
79
+ }
80
+ applyTemplateValidators() {
81
+ const inputValidators = this.validators;
82
+ if (inputValidators) {
83
+ const validators = [];
84
+ Object.keys(inputValidators).forEach(v => {
85
+ switch (v) {
86
+ case 'required':
87
+ validators.push(Validators.required);
88
+ this.required = true;
89
+ break;
90
+ case 'maxLength':
91
+ validators.push((c) => {
92
+ const requiredLength = inputValidators.maxLength || 0;
93
+ if (this.inputLength() > requiredLength) {
94
+ return { maxlength: { requiredLength } };
95
+ }
96
+ else {
97
+ return null;
98
+ }
99
+ }); // Validators.maxLength(inputValidators.maxLength || 0));
100
+ break;
101
+ }
102
+ });
103
+ if (this.parentFormControl) {
104
+ this.parentFormControl.setValidators(validators);
105
+ this.parentFormControl.updateValueAndValidity({ emitEvent: false });
106
+ this.componentFormControl.setValidators(this.parentFormControl.validator);
107
+ }
108
+ else {
109
+ this.componentFormControl.addValidators(validators);
110
+ this.componentFormControl.updateValueAndValidity();
111
+ }
112
+ }
113
+ }
114
+ ngOnChanges(changes) {
115
+ if (changes.validators && this.componentFormControl) {
116
+ this.applyTemplateValidators(); // changes.validators.currentValue as UiValidators);
117
+ }
118
+ }
119
+ registerOnChange(fn) {
120
+ this.onChange = fn;
121
+ }
122
+ registerOnTouched(fn) {
123
+ this.onTouched = fn;
124
+ }
125
+ setDisabledState(isDisabled) {
126
+ if (this.componentFormControl) {
127
+ isDisabled ? this.componentFormControl.disable({ emitEvent: false }) : this.componentFormControl.enable({ emitEvent: false });
128
+ }
129
+ }
130
+ writeValue(obj) {
131
+ if (!this.ngControl) {
132
+ if (obj && obj.error) {
133
+ console.log('setting error', obj, obj.error);
134
+ this.componentFormControl.setErrors(obj.error === 'clear' ? null : { custom: obj.error }, { emitEvent: false });
135
+ }
136
+ else {
137
+ this.componentFormControl.setValue(obj);
138
+ }
139
+ }
140
+ }
141
+ registerOnValidatorChange(fn) {
142
+ this.onValidatorChange = fn;
143
+ }
144
+ validate(control) {
145
+ return null;
146
+ }
147
+ inputLength() {
148
+ return this.componentFormControl.value ? this.componentFormControl.value.length : 0;
149
+ }
150
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: UiSimpleComponent, deps: [{ token: i1.NgControl }, { token: i1.ControlContainer }], target: i0.ɵɵFactoryTarget.Component }); }
151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: UiSimpleComponent, selector: "ui-abstract-simple-component", inputs: { validators: "validators", formControl: "formControl", formControlName: "formControlName" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '** abstract **', isInline: true }); }
152
+ }
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: UiSimpleComponent, decorators: [{
154
+ type: Component,
155
+ args: [{
156
+ selector: 'ui-abstract-simple-component',
157
+ template: '** abstract **'
158
+ }]
159
+ }], ctorParameters: function () { return [{ type: i1.NgControl }, { type: i1.ControlContainer }]; }, propDecorators: { validators: [{
160
+ type: Input
161
+ }], formControl: [{
162
+ type: Input
163
+ }], formControlName: [{
164
+ type: Input
165
+ }] } });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktc2ltcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvbGF5b3V0cy9zaW1wbGUvdWktc2ltcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQU9MLFVBQVUsRUFBRSxXQUFXLEVBQ3hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFNcEMsTUFBTSxPQUFnQixpQkFBa0IsU0FBUSxlQUFlO0lBYTdELFlBQW1CLFNBQW9CLEVBQUUsZUFBZTtJQUNsQyxtQkFBcUMsSUFBSTtRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQUZTLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDakIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUgvRCxRQUFHLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFtQ3ZDLGFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRXZCLGNBQVMsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFckIsc0JBQWlCLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBakMzQixJQUFJLFNBQVMsRUFBRTtZQUNiLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQ2hDO2FBQU07WUFDTCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNwRCxvREFBb0Q7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxTQUFTLENB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QUFDLEtBQUssRUFBRTtnQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUNqSDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQseUJBQXlCLENBQUMsRUFBYztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBd0I7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDOytHQWxLbUIsaUJBQWlCO21HQUFqQixpQkFBaUIsc05BRjNCLGdCQUFnQjs7NEZBRU4saUJBQWlCO2tCQUp0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOytIQUlVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgTmdDb250cm9sLFxyXG4gIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvcixcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgRm9ybUdyb3VwRGlyZWN0aXZlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVaUJhc2VDb21wb25lbnQsIFVpVmFsaWRhdG9ycyB9IGZyb20gJy4uL2Jhc2UvdWktYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktYWJzdHJhY3Qtc2ltcGxlLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGU6ICcqKiBhYnN0cmFjdCAqKidcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVpU2ltcGxlQ29tcG9uZW50IGV4dGVuZHMgVWlCYXNlQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHsgLy8gfSwgVmFsaWRhdG9yIHtcclxuXHJcbiAgQElucHV0KCkgdmFsaWRhdG9yczogVWlWYWxpZGF0b3JzIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sO1xyXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTtcclxuXHJcbiAgY29tcG9uZW50Rm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXHJcbiAgcGFyZW50Rm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCAmIHsgX2NvbXBvbmVudEZvcm1Db250cm9sOiBGb3JtQ29udHJvbDsgX21hcmtBc1RvdWNoZWQ6IEZ1bmN0aW9uOyBfc2V0RXJyb3JzOiBGdW5jdGlvbiB9O1xyXG5cclxuICBzdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCAvLyA8LS0gb2Jzb2xldGVcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lciA9IG51bGwpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgaWYgKG5nQ29udHJvbCkge1xyXG4gICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbi8vICAgICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgdGhpcy5zdWIuYWRkKHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codiwgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC52YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLypjb25zb2xlLmVycm9yKGUpOyovXHJcbiAgICAgICAgfVxyXG4gICAgICB9ICkpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4TGVuUmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC52YWx1ZSAmJiAodGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC52YWx1ZS5sZW5ndGggPiAodGhpcy52YWxpZGF0b3JzPy5tYXhMZW5ndGggfHwgMCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzSW52YWxpZCgpOiBib29sZWFuIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubGFiZWwsIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wudG91Y2hlZCk7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC50b3VjaGVkICYmICEhdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5lcnJvcnM7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsaWRhdGlvbkVycm9ycygpOiBWYWxpZGF0aW9uRXJyb3JzIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sPy5lcnJvcnM7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZSA9ICh2YWwpID0+IHt9O1xyXG5cclxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgb25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udHJvbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwcGx5VGVtcGxhdGVWYWxpZGF0b3JzKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXJlbnRGb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xOYW1lID9cclxuICAgICAgICAodGhpcy5jb250cm9sQ29udGFpbmVyIGFzIEZvcm1Hcm91cERpcmVjdGl2ZSkuY29udHJvbC5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIDogdGhpcy5mb3JtQ29udHJvbDtcclxuICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5wYXJlbnRGb3JtQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICAgIHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuX2NvbXBvbmVudEZvcm1Db250cm9sID0gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbDtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtQ29udHJvbC5fbWFya0FzVG91Y2hlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmVudEZvcm1Db250cm9sLl9tYXJrQXNUb3VjaGVkID0gdGhpcy5wYXJlbnRGb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkO1xyXG4gICAgICAgICAgdGhpcy5wYXJlbnRGb3JtQ29udHJvbC5fc2V0RXJyb3JzID0gdGhpcy5wYXJlbnRGb3JtQ29udHJvbC5zZXRFcnJvcnM7XHJcbiAgICAgICAgICB0aGlzLnBhcmVudEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQgPSAoe29ubHlTZWxmfTogeyBvbmx5U2VsZj86IGJvb2xlYW4gfSA9IHt9KTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuX21hcmtBc1RvdWNoZWQoe29ubHlTZWxmfSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuX2NvbXBvbmVudEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuc2V0RXJyb3JzKHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuZXJyb3JzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuc2V0RXJyb3JzID0gKGVycm9yczogYW55KTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUNvbnRyb2wuX3NldEVycm9ycyhlcnJvcnMpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1Db250cm9sLl9jb21wb25lbnRGb3JtQ29udHJvbC5zZXRFcnJvcnMoZXJyb3JzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwcGx5VGVtcGxhdGVWYWxpZGF0b3JzKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseVRlbXBsYXRlVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0VmFsaWRhdG9ycyA9IHRoaXMudmFsaWRhdG9ycztcclxuICAgIGlmIChpbnB1dFZhbGlkYXRvcnMpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBPYmplY3Qua2V5cyhpbnB1dFZhbGlkYXRvcnMpLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgc3dpdGNoICh2KSB7XHJcbiAgICAgICAgICBjYXNlICdyZXF1aXJlZCc6XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbWF4TGVuZ3RoJzpcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRMZW5ndGggPSBpbnB1dFZhbGlkYXRvcnMubWF4TGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRMZW5ndGgoKSA+IHJlcXVpcmVkTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXhsZW5ndGg6IHsgcmVxdWlyZWRMZW5ndGggfX1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pOyAvLyBWYWxpZGF0b3JzLm1heExlbmd0aChpbnB1dFZhbGlkYXRvcnMubWF4TGVuZ3RoIHx8IDApKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICB0aGlzLnBhcmVudEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5wYXJlbnRGb3JtQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMudmFsaWRhdG9ycyAmJiB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUZW1wbGF0ZVZhbGlkYXRvcnMoKTsgLy8gY2hhbmdlcy52YWxpZGF0b3JzLmN1cnJlbnRWYWx1ZSBhcyBVaVZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb21wb25lbnRGb3JtQ29udHJvbCkge1xyXG4gICAgICBpc0Rpc2FibGVkID8gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgaWYgKG9iaiAmJiBvYmouZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc2V0dGluZyBlcnJvcicsIG9iaiwgb2JqLmVycm9yKTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldEVycm9ycyhvYmouZXJyb3IgPT09ICdjbGVhcicgPyBudWxsIDogeyBjdXN0b206IG9iai5lcnJvciB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5zZXRWYWx1ZShvYmopO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGlucHV0TGVuZ3RoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wudmFsdWUgPyB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,21 +1,21 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/radio";
4
- export class RadioComponent {
5
- constructor() {
6
- this.color = 'primary';
7
- }
8
- }
9
- RadioComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
- RadioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: RadioComponent, selector: "ui-radio", inputs: { value: "value", label: "label", color: "color" }, ngImport: i0, template: "<mat-radio-button [value]=\"value\" [color]=\"color\">\r\n {{label}}\r\n</mat-radio-button>\r\n", styles: [""], dependencies: [{ kind: "component", type: i1.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }] });
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RadioComponent, decorators: [{
12
- type: Component,
13
- args: [{ selector: 'ui-radio', template: "<mat-radio-button [value]=\"value\" [color]=\"color\">\r\n {{label}}\r\n</mat-radio-button>\r\n" }]
14
- }], propDecorators: { value: [{
15
- type: Input
16
- }], label: [{
17
- type: Input
18
- }], color: [{
19
- type: Input
20
- }] } });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9yYWRpby9yYWRpby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3JhZGlvL3JhZGlvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPakQsTUFBTSxPQUFPLGNBQWM7SUFMM0I7UUFTVyxVQUFLLEdBQWtDLFNBQVMsQ0FBQTtLQUsxRDs7MkdBVFksY0FBYzsrRkFBZCxjQUFjLDRHQ1AzQixrR0FHQTsyRkRJYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7OEJBTVgsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXJhZGlvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhZGlvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFJhZGlvQ29tcG9uZW50IHsgLy8gZXh0ZW5kcyBVaVNpbXBsZUNvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpIHZhbHVlO1xyXG4gIEBJbnB1dCgpIGxhYmVsO1xyXG4gIEBJbnB1dCgpIGNvbG9yOiAncHJpbWFyeScgfCAnYWNjZW50JyB8ICd3YXJuJyA9ICdwcmltYXJ5J1xyXG5cclxuICAvLyBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge1xyXG4gIC8vICAgc3VwZXIobmdDb250cm9sKTtcclxuICAvLyB9XHJcbn1cclxuIiwiPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInZhbHVlXCIgW2NvbG9yXT1cImNvbG9yXCI+XHJcbiAge3tsYWJlbH19XHJcbjwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuIl19
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/radio";
4
+ export class RadioComponent {
5
+ constructor() {
6
+ this.color = 'primary';
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: RadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: RadioComponent, selector: "ui-radio", inputs: { value: "value", label: "label", color: "color" }, ngImport: i0, template: "<mat-radio-button [value]=\"value\" [color]=\"color\">\r\n {{label}}\r\n</mat-radio-button>\r\n", styles: [""], dependencies: [{ kind: "component", type: i1.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: RadioComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'ui-radio', template: "<mat-radio-button [value]=\"value\" [color]=\"color\">\r\n {{label}}\r\n</mat-radio-button>\r\n" }]
14
+ }], propDecorators: { value: [{
15
+ type: Input
16
+ }], label: [{
17
+ type: Input
18
+ }], color: [{
19
+ type: Input
20
+ }] } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9yYWRpby9yYWRpby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3JhZGlvL3JhZGlvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPakQsTUFBTSxPQUFPLGNBQWM7SUFMM0I7UUFTVyxVQUFLLEdBQWtDLFNBQVMsQ0FBQTtLQUsxRDsrR0FUWSxjQUFjO21HQUFkLGNBQWMsNEdDUDNCLGtHQUdBOzs0RkRJYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7OEJBTVgsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXJhZGlvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhZGlvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFJhZGlvQ29tcG9uZW50IHsgLy8gZXh0ZW5kcyBVaVNpbXBsZUNvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpIHZhbHVlO1xyXG4gIEBJbnB1dCgpIGxhYmVsO1xyXG4gIEBJbnB1dCgpIGNvbG9yOiAncHJpbWFyeScgfCAnYWNjZW50JyB8ICd3YXJuJyA9ICdwcmltYXJ5J1xyXG5cclxuICAvLyBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge1xyXG4gIC8vICAgc3VwZXIobmdDb250cm9sKTtcclxuICAvLyB9XHJcbn1cclxuIiwiPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInZhbHVlXCIgW2NvbG9yXT1cImNvbG9yXCI+XHJcbiAge3tsYWJlbH19XHJcbjwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuIl19
@@ -0,0 +1,53 @@
1
+ import { Component, Input, Optional, Self } from '@angular/core';
2
+ import { UiSimpleComponent } from '../layouts/simple/ui-simple.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/material/radio";
7
+ import * as i4 from "../layouts/simple/ui-simple-layout.component";
8
+ export class RadioGroupComponent extends UiSimpleComponent {
9
+ constructor(control) {
10
+ super(control);
11
+ this.control = control;
12
+ this.id = Math.round(Math.random() * 999999);
13
+ this.displayAttribute = 'name';
14
+ this.groupName = 'radio-' + this.id;
15
+ this.optionEnabled = (option) => true;
16
+ }
17
+ // ngOnInit(): void {
18
+ // super.ngOnInit();
19
+ // }
20
+ ngOnChanges(changes) {
21
+ super.ngOnChanges(changes);
22
+ if (changes.options) {
23
+ this.cbxs = [];
24
+ changes.options.currentValue.forEach(cv => {
25
+ this.cbxs.push({
26
+ value: this.valueAttribute ? cv[this.valueAttribute] : cv,
27
+ label: cv[this.displayAttribute]
28
+ });
29
+ });
30
+ }
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: RadioGroupComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: RadioGroupComponent, selector: "ui-radio-group", inputs: { options: "options", displayAttribute: "displayAttribute", valueAttribute: "valueAttribute", groupName: "groupName", optionEnabled: "optionEnabled" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ui-simple-layout [ctx]=\"this\">\r\n\r\n <mat-radio-group [formControl]=\"componentFormControl\" [name]=\"groupName\" [class]=\"size\">\r\n\r\n <mat-radio-button *ngFor=\"let cbx of cbxs\" [value]=\"cbx.value\" >{{cbx.label}}</mat-radio-button>\r\n\r\n </mat-radio-group>\r\n\r\n</ui-simple-layout>\r\n", styles: [":host mat-radio-group{display:flex;flex-direction:column}:host mat-radio-button{margin-top:.2em;margin-bottom:.2em}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i3.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i4.UiSimpleLayoutComponent, selector: "ui-simple-layout", inputs: ["ctx"] }] }); }
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: RadioGroupComponent, decorators: [{
36
+ type: Component,
37
+ args: [{ selector: 'ui-radio-group', template: "<ui-simple-layout [ctx]=\"this\">\r\n\r\n <mat-radio-group [formControl]=\"componentFormControl\" [name]=\"groupName\" [class]=\"size\">\r\n\r\n <mat-radio-button *ngFor=\"let cbx of cbxs\" [value]=\"cbx.value\" >{{cbx.label}}</mat-radio-button>\r\n\r\n </mat-radio-group>\r\n\r\n</ui-simple-layout>\r\n", styles: [":host mat-radio-group{display:flex;flex-direction:column}:host mat-radio-button{margin-top:.2em;margin-bottom:.2em}\n"] }]
38
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
39
+ type: Optional
40
+ }, {
41
+ type: Self
42
+ }] }]; }, propDecorators: { options: [{
43
+ type: Input
44
+ }], displayAttribute: [{
45
+ type: Input
46
+ }], valueAttribute: [{
47
+ type: Input
48
+ }], groupName: [{
49
+ type: Input
50
+ }], optionEnabled: [{
51
+ type: Input
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9yYWRpby1ncm91cC9yYWRpby1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7O0FBZTFFLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFheEQsWUFBdUMsT0FBa0I7UUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRHNCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFWekQsT0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRy9CLHFCQUFnQixHQUFHLE1BQU0sQ0FBQztRQUcxQixjQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBRyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBSS9DLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLElBQUk7SUFFSixXQUFXLENBQUMsT0FBc0I7UUFDaEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN6RCxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDakMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7K0dBaENVLG1CQUFtQjttR0FBbkIsbUJBQW1CLGtRQ2hCaEMsc1RBU0E7OzRGRE9hLG1CQUFtQjtrQkFaL0IsU0FBUzsrQkFDRSxnQkFBZ0I7OzBCQXdCYixRQUFROzswQkFBSSxJQUFJOzRDQVJwQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE9wdGlvbmFsLCBTZWxmLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVaVNpbXBsZUNvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dHMvc2ltcGxlL3VpLXNpbXBsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd1aS1yYWRpby1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yYWRpby1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHByb3ZpZGVyczogW1xuICAvLyAgIHtcbiAgLy8gICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIC8vICAgICBtdWx0aTogdHJ1ZSxcbiAgLy8gICAgIHVzZUV4aXN0aW5nOiBDaGVja2JveEdyb3VwQ29tcG9uZW50XG4gIC8vICAgfVxuICAvLyBdXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBDb21wb25lbnQgZXh0ZW5kcyBVaVNpbXBsZUNvbXBvbmVudCBpbXBsZW1lbnRzIC8qT25Jbml0LCAqL09uQ2hhbmdlcyB7XG5cbiAgY2J4czogYW55O1xuICBpZCA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDk5OTk5OSk7XG5cbiAgQElucHV0KCkgb3B0aW9ucztcbiAgQElucHV0KCkgZGlzcGxheUF0dHJpYnV0ZSA9ICduYW1lJztcbiAgQElucHV0KCkgdmFsdWVBdHRyaWJ1dGU7XG5cbiAgQElucHV0KCkgZ3JvdXBOYW1lID0gJ3JhZGlvLScgKyB0aGlzLmlkO1xuXG4gIEBJbnB1dCgpIG9wdGlvbkVuYWJsZWQgPSAob3B0aW9uOiBhbnkpID0+IHRydWU7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgY29udHJvbDogTmdDb250cm9sKSB7XG4gICAgc3VwZXIoY29udHJvbCk7XG4gIH1cblxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgLy8gICBzdXBlci5uZ09uSW5pdCgpO1xuICAvLyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY2J4cyA9IFtdO1xuICAgICAgY2hhbmdlcy5vcHRpb25zLmN1cnJlbnRWYWx1ZS5mb3JFYWNoKGN2ID0+IHtcbiAgICAgICAgdGhpcy5jYnhzLnB1c2goe1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlQXR0cmlidXRlID8gY3ZbdGhpcy52YWx1ZUF0dHJpYnV0ZV0gOiBjdixcbiAgICAgICAgICBsYWJlbDogY3ZbdGhpcy5kaXNwbGF5QXR0cmlidXRlXVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAvLyAgIGlmICh0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sKSB7XG4gIC8vICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbHVlKG9iaik7XG4gIC8vICAgfVxuICAvLyB9XG59XG4iLCI8dWktc2ltcGxlLWxheW91dCBbY3R4XT1cInRoaXNcIj5cclxuXHJcbiAgPG1hdC1yYWRpby1ncm91cCBbZm9ybUNvbnRyb2xdPVwiY29tcG9uZW50Rm9ybUNvbnRyb2xcIiBbbmFtZV09XCJncm91cE5hbWVcIiBbY2xhc3NdPVwic2l6ZVwiPlxyXG5cclxuICAgIDxtYXQtcmFkaW8tYnV0dG9uICpuZ0Zvcj1cImxldCBjYnggb2YgY2J4c1wiIFt2YWx1ZV09XCJjYngudmFsdWVcIiA+e3tjYngubGFiZWx9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuXHJcbiAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcblxyXG48L3VpLXNpbXBsZS1sYXlvdXQ+XHJcbiJdfQ==
@@ -0,0 +1,115 @@
1
+ import { Component, Inject, Input, Optional, Self, ViewChild } from '@angular/core';
2
+ import { UiSimpleComponent } from '../layouts/simple/ui-simple.component';
3
+ import { UI_TRANSLATESERVICE } from '../services/ui-translate.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@angular/material/icon";
8
+ import * as i4 from "@angular/material/select";
9
+ import * as i5 from "@angular/material/core";
10
+ import * as i6 from "../button/button.component";
11
+ import * as i7 from "../layouts/simple/ui-simple-layout.component";
12
+ export class SelectComponent extends UiSimpleComponent {
13
+ constructor(ngControl, translateService) {
14
+ super(ngControl);
15
+ this.ngControl = ngControl;
16
+ this.translateService = translateService;
17
+ this.multiple = false;
18
+ this.options = [];
19
+ this.allowEmptySelection = false;
20
+ this.lastCount = -1;
21
+ this.overoption = false;
22
+ this.optionToValue = (o) => this.valueAttribute ? o[this.valueAttribute] : o;
23
+ }
24
+ ngOnInit() {
25
+ super.ngOnInit();
26
+ if (this.optionFormatter === undefined) {
27
+ this.optionFormatter = o => this.displayAttribute ? o[this.displayAttribute] : o;
28
+ }
29
+ if (this.multiple && this.componentFormControl) {
30
+ this.lastCount = this.componentFormControl.value.length;
31
+ this.componentFormControl.valueChanges.subscribe(v => {
32
+ if (v.length === 1 && this.lastCount === 0 && this.overoption) {
33
+ this.select.selectionChange.emit(this.optionToValue(v));
34
+ this.select.close();
35
+ }
36
+ this.lastCount = v.length;
37
+ });
38
+ }
39
+ if (this.trackBy && this.componentFormControl) {
40
+ const v = this.componentFormControl.value;
41
+ if (v) {
42
+ if (this.multiple) {
43
+ this.componentFormControl.setValue(this.options.filter(o => v.find(v => v[this.trackBy] === o[this.trackBy])), { emitEvent: false });
44
+ }
45
+ else {
46
+ this.componentFormControl.setValue(this.options.find(o => o[this.trackBy] === v[this.trackBy]), { emitEvent: false });
47
+ }
48
+ }
49
+ }
50
+ }
51
+ selectOption(o, select) {
52
+ select.selectionChange.emit(this.optionToValue(o));
53
+ select.close();
54
+ }
55
+ selectAll() {
56
+ this.componentFormControl.setValue(this.options.map(o => this.optionToValue(o)));
57
+ }
58
+ clearAll() {
59
+ this.componentFormControl.setValue([]);
60
+ }
61
+ setDisabledState(isDisabled) {
62
+ }
63
+ writeValue(obj) {
64
+ if (!this.ngControl) {
65
+ if (obj && obj.error) {
66
+ console.log('setting error', obj, obj.error);
67
+ this.componentFormControl.setErrors(obj.error === 'clear' ? null : { custom: obj.error }, { emitEvent: false });
68
+ }
69
+ else {
70
+ this.componentFormControl.setValue(obj);
71
+ }
72
+ }
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SelectComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: UI_TRANSLATESERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
75
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: SelectComponent, selector: "ui-select", inputs: { multiple: "multiple", triggerFormatter: "triggerFormatter", valueAttribute: "valueAttribute", resetText: "resetText", displayAttribute: "displayAttribute", options: "options", optionFormatter: "optionFormatter", optionTemplateRef: "optionTemplateRef", triggerTemplateRef: "triggerTemplateRef", panelClass: "panelClass", allowEmptySelection: "allowEmptySelection", trackBy: "trackBy" }, viewQueries: [{ propertyName: "select", first: true, predicate: ["select"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ui-simple-layout [ctx]=\"this\">\r\n\r\n<mat-select class=\"control-container\" #select [panelClass]=\"panelClass\" [placeholder]=\"placeholder\" [formControl]=\"componentFormControl\" [multiple]=\"multiple\">\r\n\r\n <mat-select-trigger *ngIf=\"triggerTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"triggerTemplateRef\" [ngTemplateOutletContext]=\"{option:componentFormControl?.value}\" ></ng-template>\r\n </mat-select-trigger>\r\n\r\n <mat-select-trigger *ngIf=\"triggerFormatter\">{{componentFormControl?.value ? triggerFormatter(componentFormControl?.value) : ''}}</mat-select-trigger>\r\n\r\n <mat-option *ngIf=\"resetText\">{{resetText}}</mat-option>\r\n\r\n <mat-option *ngFor=\"let o of options\" [value]=\"optionToValue(o)\" >\r\n\r\n <div class=\"option-container\" (mouseenter)=\"overoption = true;\" (mouseleave)=\"overoption = false\">\r\n\r\n <ng-container *ngIf=\"optionTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"optionTemplateRef\" [ngTemplateOutletContext]=\"{option:o}\" ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!optionTemplateRef\">\r\n {{optionFormatter(o)}}\r\n </ng-container>\r\n\r\n <mat-icon class=\"select-one\" *ngIf=\"multiple && componentFormControl?.value?.length === 0\" (click)=\"selectOption(o, select)\">north_west</mat-icon>\r\n </div>\r\n\r\n </mat-option>\r\n\r\n <div class=\"buttons\" *ngIf=\"multiple\">\r\n <ui-button style=\"margin-right: auto;\" [kind]=\"'basic'\" [size]=\"'smaller'\" [label]=\"translateService.instant('ui.controls.ui-select.clear-selection')\" (click)=\"clearAll()\"></ui-button>\r\n <ui-button [size]=\"'smaller'\" [label]=\"translateService.instant('ui.controls.ui-select.all')\" (click)=\"selectAll()\"></ui-button>\r\n <ui-button [size]=\"'smaller'\" style=\"padding-left: 0.2em;\" [disabled]=\"componentFormControl?.value?.length === 0 && !allowEmptySelection\" [label]=\"translateService.instant('ui.controls.ui-select.apply-selection') + (componentFormControl?.value?.length > 0 ? ' (' + componentFormControl.value.length + ')' : '')\" (click)=\"select.close()\"></ui-button>\r\n </div>\r\n\r\n</mat-select>\r\n\r\n</ui-simple-layout>\r\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .control-container{width:100%;position:relative}:host .control-container.has-prefix ::ng-deep input,:host .control-container.has-prefix ::ng-deep textarea,:host .control-container.has-prefix ::ng-deep .mat-mdc-select-trigger{padding-left:1.8em}:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep input,:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep textarea,:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep .mat-mdc-select-trigger{padding-right:1.8em}:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep input,:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep textarea,:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep .mat-mdc-select-trigger{padding-right:1.8em}:host .control-container.has-suffix.has-clear-icon ::ng-deep input,:host .control-container.has-suffix.has-clear-icon ::ng-deep textarea,:host .control-container.has-suffix.has-clear-icon ::ng-deep .mat-mdc-select-trigger{padding-right:3.6em}:host .control-container.has-suffix.has-clear-icon ::ng-deep .clear-icon{right:1.4em!important}:host ::ng-deep [slot=suffix],:host ::ng-deep .clear-icon,:host ::ng-deep .suffix-icon{position:absolute;user-select:none;transition:color .25s;top:calc(50% - .5em);right:.2em;width:1em;height:1em;font-size:1.5em}:host ::ng-deep [slot=suffix]:not(.disabled),:host ::ng-deep .clear-icon:not(.disabled),:host ::ng-deep .suffix-icon:not(.disabled){cursor:pointer}:host ::ng-deep [slot=prefix],:host ::ng-deep .prefix-icon{position:absolute;user-select:none;transition:color .25s;top:calc(50% - .5em);left:.2em;width:1em;height:1em;font-size:1.5em}:host ::ng-deep [slot=prefix]:not(.disabled),:host ::ng-deep .prefix-icon:not(.disabled){cursor:pointer}:host ::ng-deep input,:host ::ng-deep textarea,:host ::ng-deep .mat-mdc-select-trigger,:host ::ng-deep .editor-wrapper{resize:none;width:100%;line-height:1.2em;font-size:1em;outline:none;border-style:solid;transition:border-color 333ms}:host ::ng-deep textarea.autoresize{box-sizing:content-box;width:calc(100% - 1.4em)}:host ::ng-deep ::ng-deep .mat-select-trigger,:host ::ng-deep ::ng-deep .mat-mdc-select-trigger{height:100%}:host ::ng-deep ::ng-deep .mat-select-value,:host ::ng-deep ::ng-deep .mat-mdc-select-value{vertical-align:middle}::ng-deep ui-input{display:block}\n", "::ng-deep .mat-mdc-select-panel{padding:0!important}::ng-deep .mat-mdc-select-arrow-wrapper{height:1px!important}::ng-deep .mat-select-panel .select-one,::ng-deep .mat-mdc-select-panel .select-one{position:absolute;right:0;top:.3em;display:none}::ng-deep .mat-select-panel .mat-option-text:hover .select-one,::ng-deep .mat-select-panel .mat-mdc-option:hover .select-one,::ng-deep .mat-mdc-select-panel .mat-option-text:hover .select-one,::ng-deep .mat-mdc-select-panel .mat-mdc-option:hover .select-one{display:block}::ng-deep .mat-select-panel .buttons,::ng-deep .mat-mdc-select-panel .buttons{padding:.2em;background-color:#fff;display:flex;position:sticky;bottom:0}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i4.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.ButtonComponent, selector: "ui-button", inputs: ["type", "matIconPrefix", "label", "disabled", "busy", "kind", "color", "size", "formInvalid"] }, { kind: "component", type: i7.UiSimpleLayoutComponent, selector: "ui-simple-layout", inputs: ["ctx"] }] }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SelectComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'ui-select', template: "<ui-simple-layout [ctx]=\"this\">\r\n\r\n<mat-select class=\"control-container\" #select [panelClass]=\"panelClass\" [placeholder]=\"placeholder\" [formControl]=\"componentFormControl\" [multiple]=\"multiple\">\r\n\r\n <mat-select-trigger *ngIf=\"triggerTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"triggerTemplateRef\" [ngTemplateOutletContext]=\"{option:componentFormControl?.value}\" ></ng-template>\r\n </mat-select-trigger>\r\n\r\n <mat-select-trigger *ngIf=\"triggerFormatter\">{{componentFormControl?.value ? triggerFormatter(componentFormControl?.value) : ''}}</mat-select-trigger>\r\n\r\n <mat-option *ngIf=\"resetText\">{{resetText}}</mat-option>\r\n\r\n <mat-option *ngFor=\"let o of options\" [value]=\"optionToValue(o)\" >\r\n\r\n <div class=\"option-container\" (mouseenter)=\"overoption = true;\" (mouseleave)=\"overoption = false\">\r\n\r\n <ng-container *ngIf=\"optionTemplateRef\">\r\n <ng-template [ngTemplateOutlet]=\"optionTemplateRef\" [ngTemplateOutletContext]=\"{option:o}\" ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!optionTemplateRef\">\r\n {{optionFormatter(o)}}\r\n </ng-container>\r\n\r\n <mat-icon class=\"select-one\" *ngIf=\"multiple && componentFormControl?.value?.length === 0\" (click)=\"selectOption(o, select)\">north_west</mat-icon>\r\n </div>\r\n\r\n </mat-option>\r\n\r\n <div class=\"buttons\" *ngIf=\"multiple\">\r\n <ui-button style=\"margin-right: auto;\" [kind]=\"'basic'\" [size]=\"'smaller'\" [label]=\"translateService.instant('ui.controls.ui-select.clear-selection')\" (click)=\"clearAll()\"></ui-button>\r\n <ui-button [size]=\"'smaller'\" [label]=\"translateService.instant('ui.controls.ui-select.all')\" (click)=\"selectAll()\"></ui-button>\r\n <ui-button [size]=\"'smaller'\" style=\"padding-left: 0.2em;\" [disabled]=\"componentFormControl?.value?.length === 0 && !allowEmptySelection\" [label]=\"translateService.instant('ui.controls.ui-select.apply-selection') + (componentFormControl?.value?.length > 0 ? ' (' + componentFormControl.value.length + ')' : '')\" (click)=\"select.close()\"></ui-button>\r\n </div>\r\n\r\n</mat-select>\r\n\r\n</ui-simple-layout>\r\n", styles: [":host{display:flex;flex-direction:column;width:100%}:host .control-container{width:100%;position:relative}:host .control-container.has-prefix ::ng-deep input,:host .control-container.has-prefix ::ng-deep textarea,:host .control-container.has-prefix ::ng-deep .mat-mdc-select-trigger{padding-left:1.8em}:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep input,:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep textarea,:host .control-container.has-suffix:not(.has-clear-icon) ::ng-deep .mat-mdc-select-trigger{padding-right:1.8em}:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep input,:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep textarea,:host .control-container.has-clear-icon:not(.has-suffix) ::ng-deep .mat-mdc-select-trigger{padding-right:1.8em}:host .control-container.has-suffix.has-clear-icon ::ng-deep input,:host .control-container.has-suffix.has-clear-icon ::ng-deep textarea,:host .control-container.has-suffix.has-clear-icon ::ng-deep .mat-mdc-select-trigger{padding-right:3.6em}:host .control-container.has-suffix.has-clear-icon ::ng-deep .clear-icon{right:1.4em!important}:host ::ng-deep [slot=suffix],:host ::ng-deep .clear-icon,:host ::ng-deep .suffix-icon{position:absolute;user-select:none;transition:color .25s;top:calc(50% - .5em);right:.2em;width:1em;height:1em;font-size:1.5em}:host ::ng-deep [slot=suffix]:not(.disabled),:host ::ng-deep .clear-icon:not(.disabled),:host ::ng-deep .suffix-icon:not(.disabled){cursor:pointer}:host ::ng-deep [slot=prefix],:host ::ng-deep .prefix-icon{position:absolute;user-select:none;transition:color .25s;top:calc(50% - .5em);left:.2em;width:1em;height:1em;font-size:1.5em}:host ::ng-deep [slot=prefix]:not(.disabled),:host ::ng-deep .prefix-icon:not(.disabled){cursor:pointer}:host ::ng-deep input,:host ::ng-deep textarea,:host ::ng-deep .mat-mdc-select-trigger,:host ::ng-deep .editor-wrapper{resize:none;width:100%;line-height:1.2em;font-size:1em;outline:none;border-style:solid;transition:border-color 333ms}:host ::ng-deep textarea.autoresize{box-sizing:content-box;width:calc(100% - 1.4em)}:host ::ng-deep ::ng-deep .mat-select-trigger,:host ::ng-deep ::ng-deep .mat-mdc-select-trigger{height:100%}:host ::ng-deep ::ng-deep .mat-select-value,:host ::ng-deep ::ng-deep .mat-mdc-select-value{vertical-align:middle}::ng-deep ui-input{display:block}\n", "::ng-deep .mat-mdc-select-panel{padding:0!important}::ng-deep .mat-mdc-select-arrow-wrapper{height:1px!important}::ng-deep .mat-select-panel .select-one,::ng-deep .mat-mdc-select-panel .select-one{position:absolute;right:0;top:.3em;display:none}::ng-deep .mat-select-panel .mat-option-text:hover .select-one,::ng-deep .mat-select-panel .mat-mdc-option:hover .select-one,::ng-deep .mat-mdc-select-panel .mat-option-text:hover .select-one,::ng-deep .mat-mdc-select-panel .mat-mdc-option:hover .select-one{display:block}::ng-deep .mat-select-panel .buttons,::ng-deep .mat-mdc-select-panel .buttons{padding:.2em;background-color:#fff;display:flex;position:sticky;bottom:0}\n"] }]
80
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
81
+ type: Optional
82
+ }, {
83
+ type: Self
84
+ }] }, { type: undefined, decorators: [{
85
+ type: Inject,
86
+ args: [UI_TRANSLATESERVICE]
87
+ }] }]; }, propDecorators: { multiple: [{
88
+ type: Input
89
+ }], triggerFormatter: [{
90
+ type: Input
91
+ }], valueAttribute: [{
92
+ type: Input
93
+ }], resetText: [{
94
+ type: Input
95
+ }], displayAttribute: [{
96
+ type: Input
97
+ }], options: [{
98
+ type: Input
99
+ }], optionFormatter: [{
100
+ type: Input
101
+ }], optionTemplateRef: [{
102
+ type: Input
103
+ }], triggerTemplateRef: [{
104
+ type: Input
105
+ }], panelClass: [{
106
+ type: Input
107
+ }], allowEmptySelection: [{
108
+ type: Input
109
+ }], trackBy: [{
110
+ type: Input
111
+ }], select: [{
112
+ type: ViewChild,
113
+ args: ['select']
114
+ }] } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxJQUFJLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTFFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7O0FBUTVGLE1BQU0sT0FBTyxlQUFnQixTQUFRLGlCQUFpQjtJQXFCcEQsWUFBdUMsU0FBb0IsRUFDWCxnQkFBcUM7UUFDbkYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRm9CLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDWCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBcEI1RSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBTWpCLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFLcEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBS3JDLGNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFrQ25CLGtCQUFhLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQTdCN0UsQ0FBQztJQUVELFFBQVE7UUFDTixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENB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QUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2pIO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekM7U0FDRjtJQUNILENBQUM7K0dBaEZVLGVBQWUsdUVBc0JOLG1CQUFtQjttR0F0QjVCLGVBQWUsc2pCQ1o1QiwwcUVBc0NBOzs0RkQxQmEsZUFBZTtrQkFOM0IsU0FBUzsrQkFDRSxXQUFXOzswQkEwQlIsUUFBUTs7MEJBQUksSUFBSTs7MEJBQ2hCLE1BQU07MkJBQUMsbUJBQW1COzRDQXBCOUIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFZSxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIFNlbGYsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVaVNpbXBsZUNvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dHMvc2ltcGxlL3VpLXNpbXBsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBJVWlUcmFuc2xhdGVTZXJ2aWNlLCBVSV9UUkFOU0xBVEVTRVJWSUNFIH0gZnJvbSAnLi4vc2VydmljZXMvdWktdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWyAnLi4vbGF5b3V0cy9zaW1wbGUvdWktc2ltcGxlLWxheW91dC5jb21wb25lbnQuc2NzcycsICcuL3NlbGVjdC5jb21wb25lbnQuc2NzcycgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBleHRlbmRzIFVpU2ltcGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSB0cmlnZ2VyRm9ybWF0dGVyOiBhbnk7XHJcbiAgQElucHV0KCkgdmFsdWVBdHRyaWJ1dGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSByZXNldFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBkaXNwbGF5QXR0cmlidXRlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgb3B0aW9uRm9ybWF0dGVyOiAoKGFyZzogYW55KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIG9wdGlvblRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSB0cmlnZ2VyVGVtcGxhdGVSZWY/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHBhbmVsQ2xhc3M7XHJcbiAgQElucHV0KCkgYWxsb3dFbXB0eVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRyYWNrQnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdCcpIHNlbGVjdDogTWF0U2VsZWN0O1xyXG5cclxuICBsYXN0Q291bnQgPSAtMTtcclxuICBvdmVyb3B0aW9uID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoVUlfVFJBTlNMQVRFU0VSVklDRSkgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IElVaVRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIHN1cGVyKG5nQ29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25Gb3JtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbkZvcm1hdHRlciA9IG8gPT4gdGhpcy5kaXNwbGF5QXR0cmlidXRlID8gb1t0aGlzLmRpc3BsYXlBdHRyaWJ1dGVdIDogbztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5sYXN0Q291bnQgPSB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnZhbHVlLmxlbmd0aDtcclxuICAgICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhc3RDb3VudCA9PT0gMCAmJiB0aGlzLm92ZXJvcHRpb24pIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0LnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMub3B0aW9uVG9WYWx1ZSh2KSk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxhc3RDb3VudCA9IHYubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRyYWNrQnkgJiYgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbCkge1xyXG4gICAgICBjb25zdCB2ID0gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgICAgaWYgKHYpIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKG8gPT4gdi5maW5kKHYgPT4gdlt0aGlzLnRyYWNrQnldID09PSBvW3RoaXMudHJhY2tCeV0pKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5maW5kKG8gPT4gb1t0aGlzLnRyYWNrQnldID09PSB2W3RoaXMudHJhY2tCeV0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wdGlvblRvVmFsdWUgPSAobzogYW55KSA9PiB0aGlzLnZhbHVlQXR0cmlidXRlID8gb1t0aGlzLnZhbHVlQXR0cmlidXRlXSA6IG87XHJcblxyXG4gIHNlbGVjdE9wdGlvbihvOiBhbnksIHNlbGVjdDogTWF0U2VsZWN0KSB7XHJcbiAgICBzZWxlY3Quc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5vcHRpb25Ub1ZhbHVlKG8pKTtcclxuICAgIHNlbGVjdC5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsKCkge1xyXG4gICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMubWFwKG8gPT4gdGhpcy5vcHRpb25Ub1ZhbHVlKG8pKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbCgpIHtcclxuICAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuc2V0VmFsdWUoW10pO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIGlmIChvYmogJiYgb2JqLmVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3NldHRpbmcgZXJyb3InLCBvYmosIG9iai5lcnJvcik7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5zZXRFcnJvcnMob2JqLmVycm9yID09PSAnY2xlYXInID8gbnVsbCA6IHsgY3VzdG9tOiBvYmouZXJyb3IgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuc2V0VmFsdWUob2JqKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8dWktc2ltcGxlLWxheW91dCBbY3R4XT1cInRoaXNcIj5cclxuXHJcbjxtYXQtc2VsZWN0IGNsYXNzPVwiY29udHJvbC1jb250YWluZXJcIiAjc2VsZWN0IFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbZm9ybUNvbnRyb2xdPVwiY29tcG9uZW50Rm9ybUNvbnRyb2xcIiBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIj5cclxuXHJcbiAgPG1hdC1zZWxlY3QtdHJpZ2dlciAqbmdJZj1cInRyaWdnZXJUZW1wbGF0ZVJlZlwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRyaWdnZXJUZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7b3B0aW9uOmNvbXBvbmVudEZvcm1Db250cm9sPy52YWx1ZX1cIiA+PC9uZy10ZW1wbGF0ZT5cclxuICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgPG1hdC1zZWxlY3QtdHJpZ2dlciAqbmdJZj1cInRyaWdnZXJGb3JtYXR0ZXJcIj57e2NvbXBvbmVudEZvcm1Db250cm9sPy52YWx1ZSA/IHRyaWdnZXJGb3JtYXR0ZXIoY29tcG9uZW50Rm9ybUNvbnRyb2w/LnZhbHVlKSA6ICcnfX08L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJyZXNldFRleHRcIj57e3Jlc2V0VGV4dH19PC9tYXQtb3B0aW9uPlxyXG5cclxuICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBvcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblRvVmFsdWUobylcIiA+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250YWluZXJcIiAobW91c2VlbnRlcik9XCJvdmVyb3B0aW9uID0gdHJ1ZTtcIiAobW91c2VsZWF2ZSk9XCJvdmVyb3B0aW9uID0gZmFsc2VcIj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25UZW1wbGF0ZVJlZlwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25UZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7b3B0aW9uOm99XCIgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFvcHRpb25UZW1wbGF0ZVJlZlwiPlxyXG4gICAgICAgIHt7b3B0aW9uRm9ybWF0dGVyKG8pfX1cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJzZWxlY3Qtb25lXCIgKm5nSWY9XCJtdWx0aXBsZSAmJiBjb21wb25lbnRGb3JtQ29udHJvbD8udmFsdWU/Lmxlbmd0aCA9PT0gMFwiIChjbGljayk9XCJzZWxlY3RPcHRpb24obywgc2VsZWN0KVwiPm5vcnRoX3dlc3Q8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnNcIiAqbmdJZj1cIm11bHRpcGxlXCI+XHJcbiAgICA8dWktYnV0dG9uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiBhdXRvO1wiIFtraW5kXT1cIidiYXNpYydcIiBbc2l6ZV09XCInc21hbGxlcidcIiBbbGFiZWxdPVwidHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy51aS1zZWxlY3QuY2xlYXItc2VsZWN0aW9uJylcIiAoY2xpY2spPVwiY2xlYXJBbGwoKVwiPjwvdWktYnV0dG9uPlxyXG4gICAgPHVpLWJ1dHRvbiBbc2l6ZV09XCInc21hbGxlcidcIiBbbGFiZWxdPVwidHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy51aS1zZWxlY3QuYWxsJylcIiAoY2xpY2spPVwic2VsZWN0QWxsKClcIj48L3VpLWJ1dHRvbj5cclxuICAgIDx1aS1idXR0b24gW3NpemVdPVwiJ3NtYWxsZXInXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDAuMmVtO1wiIFtkaXNhYmxlZF09XCJjb21wb25lbnRGb3JtQ29udHJvbD8udmFsdWU/Lmxlbmd0aCA9PT0gMCAmJiAhYWxsb3dFbXB0eVNlbGVjdGlvblwiIFtsYWJlbF09XCJ0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLXNlbGVjdC5hcHBseS1zZWxlY3Rpb24nKSArIChjb21wb25lbnRGb3JtQ29udHJvbD8udmFsdWU/Lmxlbmd0aCA+IDAgPyAnICgnICsgY29tcG9uZW50Rm9ybUNvbnRyb2wudmFsdWUubGVuZ3RoICsgJyknIDogJycpXCIgKGNsaWNrKT1cInNlbGVjdC5jbG9zZSgpXCI+PC91aS1idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG48L21hdC1zZWxlY3Q+XHJcblxyXG48L3VpLXNpbXBsZS1sYXlvdXQ+XHJcbiJdfQ==