@kms-ngx-ui/presentational 0.0.24 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +28 -28
  2. package/{esm2015/kms-ngx-ui-presentational.js → esm2020/kms-ngx-ui-presentational.mjs} +4 -4
  3. package/esm2020/lib/directives/directives.module.mjs +40 -0
  4. package/{esm2015/lib/directives/mousewheel.directive.js → esm2020/lib/directives/mousewheel.directive.mjs} +56 -56
  5. package/{esm2015/lib/directives/sum-of-height.directive.js → esm2020/lib/directives/sum-of-height.directive.mjs} +74 -74
  6. package/{esm2015/lib/directives/swipe.directive.js → esm2020/lib/directives/swipe.directive.mjs} +183 -183
  7. package/esm2020/lib/directives/swipe.model.mjs +5 -0
  8. package/{esm2015/lib/directives/tooltip.directive.js → esm2020/lib/directives/tooltip.directive.mjs} +144 -144
  9. package/{esm2015/lib/kms-ngx-ui-presentational.component.js → esm2020/lib/kms-ngx-ui-presentational.component.mjs} +26 -26
  10. package/{esm2015/lib/kms-ngx-ui-presentational.module.js → esm2020/lib/kms-ngx-ui-presentational.module.mjs} +217 -217
  11. package/{esm2015/lib/kms-ngx-ui-presentational.service.js → esm2020/lib/kms-ngx-ui-presentational.service.mjs} +14 -14
  12. package/esm2020/lib/models/address.model.mjs +6 -0
  13. package/{esm2015/lib/models/iconSize.enum.js → esm2020/lib/models/iconSize.enum.mjs} +17 -17
  14. package/{esm2015/lib/models/image-snippet.model.js → esm2020/lib/models/image-snippet.model.mjs} +18 -18
  15. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +5 -5
  16. package/{esm2015/lib/models/is-value.function.js → esm2020/lib/models/is-value.function.mjs} +17 -17
  17. package/{esm2015/lib/models/salutation.enum.js → esm2020/lib/models/salutation.enum.mjs} +8 -8
  18. package/{esm2015/lib/models/types/attached-file-dto.model.js → esm2020/lib/models/types/attached-file-dto.model.mjs} +6 -6
  19. package/{esm2015/lib/models/types/nullable.type.js → esm2020/lib/models/types/nullable.type.mjs} +5 -5
  20. package/{esm2015/lib/parent-components/actions.component.js → esm2020/lib/parent-components/actions.component.mjs} +56 -56
  21. package/esm2020/lib/parent-components/form-control.component.mjs +75 -0
  22. package/esm2020/lib/parent-components/form.component.mjs +78 -0
  23. package/{esm2015/lib/pipes/custom-pipes.module.js → esm2020/lib/pipes/custom-pipes.module.mjs} +71 -71
  24. package/{esm2015/lib/pipes/decode-uri.pipe.js → esm2020/lib/pipes/decode-uri.pipe.mjs} +19 -19
  25. package/{esm2015/lib/pipes/encode-uri.pipe.js → esm2020/lib/pipes/encode-uri.pipe.mjs} +19 -19
  26. package/{esm2015/lib/pipes/integer-currency.pipe.js → esm2020/lib/pipes/integer-currency.pipe.mjs} +27 -27
  27. package/{esm2015/lib/pipes/safe-html.pipe.js → esm2020/lib/pipes/safe-html.pipe.mjs} +23 -23
  28. package/{esm2015/lib/pipes/safe-resource-url.pipe.js → esm2020/lib/pipes/safe-resource-url.pipe.mjs} +23 -23
  29. package/{esm2015/lib/pipes/safe-style.pipe.js → esm2020/lib/pipes/safe-style.pipe.mjs} +23 -23
  30. package/{esm2015/lib/pipes/safe-url.pipe.js → esm2020/lib/pipes/safe-url.pipe.mjs} +23 -23
  31. package/{esm2015/lib/pipes/to-number.pipe.js → esm2020/lib/pipes/to-number.pipe.mjs} +23 -23
  32. package/{esm2015/lib/pipes/trim.pipe.js → esm2020/lib/pipes/trim.pipe.mjs} +20 -20
  33. package/{esm2015/lib/pipes/typeof.pipe.js → esm2020/lib/pipes/typeof.pipe.mjs} +16 -16
  34. package/esm2020/lib/services/viewport.service.mjs +216 -0
  35. package/esm2020/lib/ui/back-to-top/back-to-top.component.mjs +49 -0
  36. package/{esm2015/lib/ui/button-with-confirm-dialog/button-response-types.enum.js → esm2020/lib/ui/button-with-confirm-dialog/button-response-types.enum.mjs} +6 -6
  37. package/esm2020/lib/ui/button-with-confirm-dialog/button-with-confirm-dialog.component.mjs +58 -0
  38. package/{esm2015/lib/ui/button-with-confirm-dialog/dialog-data.model.js → esm2020/lib/ui/button-with-confirm-dialog/dialog-data.model.mjs} +2 -2
  39. package/esm2020/lib/ui/checkbox/checkbox.component.mjs +71 -0
  40. package/esm2020/lib/ui/color-input/color-input.component.mjs +76 -0
  41. package/esm2020/lib/ui/dropdown-from-data/dropdown-from-data.component.mjs +165 -0
  42. package/esm2020/lib/ui/enum-radiogroup/enum-radiogroup.component.mjs +53 -0
  43. package/esm2020/lib/ui/file-input/file-input.component.mjs +232 -0
  44. package/esm2020/lib/ui/flyout/flyout.component.mjs +119 -0
  45. package/esm2020/lib/ui/generic-dialog/generic-dialog.component.mjs +54 -0
  46. package/esm2020/lib/ui/icon/icon.component.mjs +48 -0
  47. package/esm2020/lib/ui/icon/iconSize.enum.mjs +17 -0
  48. package/esm2020/lib/ui/image-slider/image-slider.component.mjs +189 -0
  49. package/esm2020/lib/ui/kms-accordion-item/kms-accordion-item.component.mjs +40 -0
  50. package/esm2020/lib/ui/loader/loader.component.mjs +21 -0
  51. package/esm2020/lib/ui/map/map.component.mjs +116 -0
  52. package/esm2020/lib/ui/radiobutton/radiobutton.component.mjs +73 -0
  53. package/esm2020/lib/ui/salutation-dropdown/salutation-dropdown.component.mjs +55 -0
  54. package/esm2020/lib/ui/salutation-radiogroup/salutation-radiogroup.component.mjs +49 -0
  55. package/esm2020/lib/ui/time-input/time-input.component.mjs +83 -0
  56. package/esm2020/lib/ui/tooltip/tooltip.component.mjs +16 -0
  57. package/esm2020/lib/ui/tooltip-icon/tooltip-icon.component.mjs +35 -0
  58. package/esm2020/lib/ui/yes-no-radiogroup/yes-no-radiogroup.component.mjs +82 -0
  59. package/esm2020/public-api.mjs +49 -0
  60. package/fesm2015/kms-ngx-ui-presentational.mjs +3019 -0
  61. package/fesm2015/kms-ngx-ui-presentational.mjs.map +1 -0
  62. package/{fesm2015/kms-ngx-ui-presentational.js → fesm2020/kms-ngx-ui-presentational.mjs} +2879 -3087
  63. package/fesm2020/kms-ngx-ui-presentational.mjs.map +1 -0
  64. package/kms-ngx-ui-presentational.d.ts +5 -5
  65. package/lib/directives/directives.module.d.ts +11 -13
  66. package/lib/directives/mousewheel.directive.d.ts +15 -15
  67. package/lib/directives/sum-of-height.directive.d.ts +31 -31
  68. package/lib/directives/swipe.directive.d.ts +45 -45
  69. package/lib/directives/swipe.model.d.ts +49 -49
  70. package/lib/directives/tooltip.directive.d.ts +29 -29
  71. package/lib/kms-ngx-ui-presentational.component.d.ts +8 -8
  72. package/lib/kms-ngx-ui-presentational.module.d.ts +47 -47
  73. package/lib/kms-ngx-ui-presentational.service.d.ts +6 -6
  74. package/lib/models/address.model.d.ts +14 -14
  75. package/lib/models/iconSize.enum.d.ts +15 -15
  76. package/lib/models/image-snippet.model.d.ts +15 -15
  77. package/lib/models/index.d.ts +4 -4
  78. package/lib/models/is-value.function.d.ts +9 -9
  79. package/lib/models/salutation.enum.d.ts +5 -5
  80. package/lib/models/types/attached-file-dto.model.d.ts +11 -11
  81. package/lib/models/types/nullable.type.d.ts +4 -4
  82. package/lib/parent-components/actions.component.d.ts +31 -31
  83. package/lib/parent-components/form-control.component.d.ts +27 -27
  84. package/lib/parent-components/form.component.d.ts +34 -40
  85. package/lib/pipes/custom-pipes.module.d.ts +17 -17
  86. package/lib/pipes/decode-uri.pipe.d.ts +10 -10
  87. package/lib/pipes/encode-uri.pipe.d.ts +10 -10
  88. package/lib/pipes/integer-currency.pipe.d.ts +13 -13
  89. package/lib/pipes/safe-html.pipe.d.ts +13 -13
  90. package/lib/pipes/safe-resource-url.pipe.d.ts +13 -13
  91. package/lib/pipes/safe-style.pipe.d.ts +13 -13
  92. package/lib/pipes/safe-url.pipe.d.ts +13 -13
  93. package/lib/pipes/to-number.pipe.d.ts +10 -10
  94. package/lib/pipes/trim.pipe.d.ts +10 -10
  95. package/lib/pipes/typeof.pipe.d.ts +7 -7
  96. package/lib/services/viewport.service.d.ts +74 -83
  97. package/lib/ui/back-to-top/back-to-top.component.d.ts +10 -10
  98. package/lib/ui/button-with-confirm-dialog/button-response-types.enum.d.ts +4 -4
  99. package/lib/ui/button-with-confirm-dialog/button-with-confirm-dialog.component.d.ts +19 -19
  100. package/lib/ui/button-with-confirm-dialog/dialog-data.model.d.ts +9 -9
  101. package/lib/ui/checkbox/checkbox.component.d.ts +31 -31
  102. package/lib/ui/color-input/color-input.component.d.ts +19 -19
  103. package/lib/ui/dropdown-from-data/dropdown-from-data.component.d.ts +55 -55
  104. package/lib/ui/enum-radiogroup/enum-radiogroup.component.d.ts +17 -17
  105. package/lib/ui/file-input/file-input.component.d.ts +89 -89
  106. package/lib/ui/flyout/flyout.component.d.ts +32 -32
  107. package/lib/ui/generic-dialog/generic-dialog.component.d.ts +26 -26
  108. package/lib/ui/icon/icon.component.d.ts +42 -48
  109. package/lib/ui/icon/iconSize.enum.d.ts +15 -25
  110. package/lib/ui/image-slider/image-slider.component.d.ts +62 -62
  111. package/lib/ui/kms-accordion-item/kms-accordion-item.component.d.ts +22 -22
  112. package/lib/ui/loader/loader.component.d.ts +9 -9
  113. package/lib/ui/map/map.component.d.ts +69 -69
  114. package/lib/ui/radiobutton/radiobutton.component.d.ts +26 -27
  115. package/lib/ui/salutation-dropdown/salutation-dropdown.component.d.ts +17 -17
  116. package/lib/ui/salutation-radiogroup/salutation-radiogroup.component.d.ts +15 -15
  117. package/lib/ui/time-input/time-input.component.d.ts +22 -22
  118. package/lib/ui/tooltip/tooltip.component.d.ts +6 -6
  119. package/lib/ui/tooltip-icon/tooltip-icon.component.d.ts +13 -13
  120. package/lib/ui/yes-no-radiogroup/yes-no-radiogroup.component.d.ts +27 -27
  121. package/package.json +25 -12
  122. package/public-api.d.ts +45 -46
  123. package/src/lib/ui/back-to-top/back-to-top.component.scss +46 -45
  124. package/src/lib/ui/button-with-confirm-dialog/button-with-confirm-dialog.component.scss +2 -2
  125. package/src/lib/ui/checkbox/checkbox.component.scss +48 -48
  126. package/src/lib/ui/color-input/color-input.component.scss +38 -38
  127. package/src/lib/ui/file-input/file-input.component.scss +2 -2
  128. package/src/lib/ui/flyout/flyout.component.scss +34 -34
  129. package/src/lib/ui/generic-dialog/generic-dialog.component.scss +59 -59
  130. package/src/lib/ui/icon/icon.component.scss +148 -114
  131. package/src/lib/ui/image-slider/image-slider.component.scss +219 -219
  132. package/src/lib/ui/kms-accordion-item/kms-accordion-item.component.scss +95 -95
  133. package/src/lib/ui/radiobutton/radiobutton.component.scss +31 -31
  134. package/src/lib/ui/time-input/time-input.component.scss +10 -10
  135. package/src/lib/ui/tooltip/tooltip.component.scss +26 -26
  136. package/src/lib/ui/tooltip-icon/tooltip-icon.component.scss +2 -2
  137. package/src/styles/mixins.scss +8 -8
  138. package/src/styles/styles.scss +30 -31
  139. package/bundles/kms-ngx-ui-presentational.umd.js +0 -3751
  140. package/bundles/kms-ngx-ui-presentational.umd.js.map +0 -1
  141. package/esm2015/lib/directives/directives.module.js +0 -45
  142. package/esm2015/lib/directives/size.directive.js +0 -21
  143. package/esm2015/lib/directives/swipe.model.js +0 -5
  144. package/esm2015/lib/models/address.model.js +0 -6
  145. package/esm2015/lib/parent-components/colorable.component.js +0 -35
  146. package/esm2015/lib/parent-components/form-control.component.js +0 -76
  147. package/esm2015/lib/parent-components/form.component.js +0 -99
  148. package/esm2015/lib/services/viewport.service.js +0 -242
  149. package/esm2015/lib/ui/back-to-top/back-to-top.component.js +0 -52
  150. package/esm2015/lib/ui/button-with-confirm-dialog/button-with-confirm-dialog.component.js +0 -62
  151. package/esm2015/lib/ui/checkbox/checkbox.component.js +0 -76
  152. package/esm2015/lib/ui/color-input/color-input.component.js +0 -81
  153. package/esm2015/lib/ui/dropdown-from-data/dropdown-from-data.component.js +0 -169
  154. package/esm2015/lib/ui/enum-radiogroup/enum-radiogroup.component.js +0 -57
  155. package/esm2015/lib/ui/file-input/file-input.component.js +0 -237
  156. package/esm2015/lib/ui/flyout/flyout.component.js +0 -125
  157. package/esm2015/lib/ui/generic-dialog/generic-dialog.component.js +0 -58
  158. package/esm2015/lib/ui/icon/icon.component.js +0 -55
  159. package/esm2015/lib/ui/icon/iconSize.enum.js +0 -28
  160. package/esm2015/lib/ui/image-slider/image-slider.component.js +0 -193
  161. package/esm2015/lib/ui/kms-accordion-item/kms-accordion-item.component.js +0 -44
  162. package/esm2015/lib/ui/loader/loader.component.js +0 -25
  163. package/esm2015/lib/ui/map/map.component.js +0 -120
  164. package/esm2015/lib/ui/radiobutton/radiobutton.component.js +0 -82
  165. package/esm2015/lib/ui/salutation-dropdown/salutation-dropdown.component.js +0 -59
  166. package/esm2015/lib/ui/salutation-radiogroup/salutation-radiogroup.component.js +0 -53
  167. package/esm2015/lib/ui/time-input/time-input.component.js +0 -88
  168. package/esm2015/lib/ui/tooltip/tooltip.component.js +0 -20
  169. package/esm2015/lib/ui/tooltip-icon/tooltip-icon.component.js +0 -40
  170. package/esm2015/lib/ui/yes-no-radiogroup/yes-no-radiogroup.component.js +0 -86
  171. package/esm2015/public-api.js +0 -50
  172. package/fesm2015/kms-ngx-ui-presentational.js.map +0 -1
  173. package/lib/directives/size.directive.d.ts +0 -10
  174. package/lib/parent-components/colorable.component.d.ts +0 -10
  175. package/src/styles/animations.scss +0 -47
@@ -0,0 +1,165 @@
1
+ import { Component, forwardRef, Input, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { EnumValues } from 'enum-values/src/enumValues';
4
+ //import { EnumValues } from 'enum-values';
5
+ import { FormControlParentComponent } from '../../parent-components/form-control.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "@angular/material/form-field";
9
+ import * as i3 from "@angular/material/select";
10
+ import * as i4 from "@angular/material/core";
11
+ import * as i5 from "@angular/common";
12
+ /**
13
+ * Dropdown from data component {@link https://leaseplan-dev.rentoffice.de/styleguide#ui-elements}
14
+ */
15
+ export class DropdownFromDataComponent extends FormControlParentComponent {
16
+ constructor(formBuilder, renderer) {
17
+ super(formBuilder, renderer);
18
+ this.formBuilder = formBuilder;
19
+ this.renderer = renderer;
20
+ // options for the dropdown have a null value at the beginning of the array
21
+ this.hasNullOption = false;
22
+ this.placeholder = '';
23
+ this.label = '';
24
+ this.required = false;
25
+ this.useEnumIndexAsValue = false;
26
+ // multiple selection
27
+ this.multiple = false;
28
+ this.keys = [];
29
+ this.values = [];
30
+ this.Object = Object;
31
+ }
32
+ /**
33
+ * Hook used to sync changes on set Label and Type
34
+ * @param changes
35
+ */
36
+ ngOnChanges(changes) {
37
+ if (changes.optionsPlainArray) {
38
+ this.keys = this.optionsPlainArray;
39
+ this.values = this.optionsPlainArray;
40
+ }
41
+ this.setKeyValues();
42
+ }
43
+ ngOnInit() {
44
+ this.form = this.formBuilder.group({
45
+ dropdownData: [],
46
+ });
47
+ this.formInitialized = true;
48
+ this.form.valueChanges.subscribe((value) => {
49
+ this.internalValue = value.dropdownData;
50
+ this.onChange(value.dropdownData);
51
+ });
52
+ super.ngOnInit();
53
+ }
54
+ /**
55
+ * transofrms the data values to the correct format for be used by the template
56
+ * @param value
57
+ */
58
+ setKeyValues() {
59
+ if (this.optionsObjArray && this.mapKey && this.mapValue) {
60
+ this.keys = this.optionsObjArray.map((obj) => obj[`${this.mapKey}`]);
61
+ this.values = this.optionsObjArray.map((obj) => obj[`${this.mapValue}`]);
62
+ }
63
+ else if (this.optionsObjArray && this.mapKey) {
64
+ this.keys = this.optionsObjArray.map((obj) => obj[`${this.mapKey}`]);
65
+ this.values = this.optionsObjArray.map((obj) => obj[`${this.mapKey}`]);
66
+ }
67
+ if (this.optionsEnum) {
68
+ this.keys = EnumValues.getNames(this.optionsEnum);
69
+ if (this.optionsPlainArray) {
70
+ this.values = this.optionsPlainArray;
71
+ }
72
+ else {
73
+ const values = EnumValues.getValues(this.optionsEnum);
74
+ // var who defines if enum is componed just with keys or keyValues. E.g enum KeyEnum { VALUE1, VALUE2 } or enum KeyValueEnum { VALUE4 = 'V4', VALUE5 = 'V5' }
75
+ let keyValueEnum = false;
76
+ for (let i = 0; i < this.keys.length; i++) {
77
+ if (i !== values[i]) {
78
+ keyValueEnum = true;
79
+ }
80
+ }
81
+ if (keyValueEnum || this.useEnumIndexAsValue) {
82
+ this.values = values;
83
+ }
84
+ else {
85
+ this.values = EnumValues.getNames(this.optionsEnum);
86
+ }
87
+ }
88
+ }
89
+ if (this.hasNullOption === true)
90
+ this.keys.unshift(null);
91
+ if (this.hasNullOption === true)
92
+ this.values.unshift(null);
93
+ }
94
+ /**
95
+ * set the value of the dropdown based if translation is set
96
+ * @param key
97
+ */
98
+ setDisplayKey(key) {
99
+ /*
100
+ if (this.translation && key !== null) {
101
+ if (this.translation.isPrefix) {
102
+ return this.translationService.instant(this.translation.path + '.' + key);
103
+ } else if (this.translation.useKey) {
104
+ return this.translationService.instant(this.translation.path, { key: key });
105
+ } else if (!this.translation?.useKey && !this.translation?.isPrefix) {
106
+ return this.translationService.instant(this.translation.path);
107
+ }
108
+ } else if (key == null) {
109
+ return '';
110
+ } else if (!this.translation) {
111
+ return key;
112
+ }
113
+ */
114
+ return key;
115
+ }
116
+ valueChanged(value) {
117
+ this.form.patchValue({
118
+ dropdownData: value,
119
+ });
120
+ this.onSelectItemEmitter.emit(value);
121
+ }
122
+ }
123
+ DropdownFromDataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DropdownFromDataComponent, deps: [{ token: i1.FormBuilder }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
124
+ DropdownFromDataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DropdownFromDataComponent, selector: "kms-dropdown-from-data", inputs: { optionsEnum: "optionsEnum", optionsPlainArray: "optionsPlainArray", optionsObjArray: "optionsObjArray", mapKey: "mapKey", mapValue: "mapValue", hasNullOption: "hasNullOption", translation: "translation", placeholder: "placeholder", label: "label", required: "required", useEnumIndexAsValue: "useEnumIndexAsValue", multiple: "multiple" }, providers: [
125
+ {
126
+ provide: NG_VALUE_ACCESSOR,
127
+ useExisting: forwardRef(() => DropdownFromDataComponent),
128
+ multi: true,
129
+ },
130
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-form-field [attr.required]=\"required\" [floatLabel]=\"placeholder ? 'always' : 'auto'\">\n <mat-label>{{ label }}</mat-label>\n <mat-select\n placeholder=\"{{ placeholder }}\"\n disableOptionCentering\n [(value)]=\"value\"\n (selectionChange)=\"valueChanged($event?.value)\"\n #child\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n >\n <mat-option *ngFor=\"let key of keys; let i = index\" [value]=\"values[i]\">\n <span>{{ setDisplayKey(key) }}</span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n", components: [{ type: i2.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }], 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: i2.MatLabel, selector: "mat-label" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DropdownFromDataComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'kms-dropdown-from-data', providers: [
134
+ {
135
+ provide: NG_VALUE_ACCESSOR,
136
+ useExisting: forwardRef(() => DropdownFromDataComponent),
137
+ multi: true,
138
+ },
139
+ ], template: "<form [formGroup]=\"form\">\n <mat-form-field [attr.required]=\"required\" [floatLabel]=\"placeholder ? 'always' : 'auto'\">\n <mat-label>{{ label }}</mat-label>\n <mat-select\n placeholder=\"{{ placeholder }}\"\n disableOptionCentering\n [(value)]=\"value\"\n (selectionChange)=\"valueChanged($event?.value)\"\n #child\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n >\n <mat-option *ngFor=\"let key of keys; let i = index\" [value]=\"values[i]\">\n <span>{{ setDisplayKey(key) }}</span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n" }]
140
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.Renderer2 }]; }, propDecorators: { optionsEnum: [{
141
+ type: Input
142
+ }], optionsPlainArray: [{
143
+ type: Input
144
+ }], optionsObjArray: [{
145
+ type: Input
146
+ }], mapKey: [{
147
+ type: Input
148
+ }], mapValue: [{
149
+ type: Input
150
+ }], hasNullOption: [{
151
+ type: Input
152
+ }], translation: [{
153
+ type: Input
154
+ }], placeholder: [{
155
+ type: Input
156
+ }], label: [{
157
+ type: Input
158
+ }], required: [{
159
+ type: Input
160
+ }], useEnumIndexAsValue: [{
161
+ type: Input
162
+ }], multiple: [{
163
+ type: Input
164
+ }] } });
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZnJvbS1kYXRhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ttcy1uZ3gtdWktcHJlc2VudGF0aW9uYWwvc3JjL2xpYi91aS9kcm9wZG93bi1mcm9tLWRhdGEvZHJvcGRvd24tZnJvbS1kYXRhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ttcy1uZ3gtdWktcHJlc2VudGF0aW9uYWwvc3JjL2xpYi91aS9kcm9wZG93bi1mcm9tLWRhdGEvZHJvcGRvd24tZnJvbS1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7OztBQUU1Rjs7R0FFRztBQVlILE1BQU0sT0FBTyx5QkFDWCxTQUFRLDBCQUEwQjtJQWlDbEMsWUFBbUIsV0FBd0IsRUFBUyxRQUFtQjtRQUNyRSxLQUFLLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRFosZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBakJ2RSwyRUFBMkU7UUFDbEUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHdEIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRXJDLHFCQUFxQjtRQUNaLGFBQVEsR0FB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LENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjswSEFPUSxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFbnVtVmFsdWVzIH0gZnJvbSAnZW51bS12YWx1ZXMvc3JjL2VudW1WYWx1ZXMnO1xuLy9pbXBvcnQgeyBFbnVtVmFsdWVzIH0gZnJvbSAnZW51bS12YWx1ZXMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xQYXJlbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYXJlbnQtY29tcG9uZW50cy9mb3JtLWNvbnRyb2wuY29tcG9uZW50JztcblxuLyoqXG4gKiBEcm9wZG93biBmcm9tIGRhdGEgY29tcG9uZW50IHtAbGluayBodHRwczovL2xlYXNlcGxhbi1kZXYucmVudG9mZmljZS5kZS9zdHlsZWd1aWRlI3VpLWVsZW1lbnRzfVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrbXMtZHJvcGRvd24tZnJvbS1kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWZyb20tZGF0YS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHJvcGRvd25Gcm9tRGF0YUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkZyb21EYXRhQ29tcG9uZW50XG4gIGV4dGVuZHMgRm9ybUNvbnRyb2xQYXJlbnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXNcbntcbiAgLy8gc3RydWN0dXJlZCBkYXRhIGFzIGEgZW51bSBzZXQuIENhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggJ29wdGlvbnNQbGFpbkFycmF5JyB0byBzZXQgZGlmZXJlbnQgdmFsdWVzIGJ5IGluZGV4XG4gIEBJbnB1dCgpIG9wdGlvbnNFbnVtOiBhbnk7XG5cbiAgLy8gc3RydWN0dXJlZCBkYXRhIGFzIGEgc2ltcGxlIGFycmF5IG9mIGVsZW1lbnRzXG4gIEBJbnB1dCgpIG9wdGlvbnNQbGFpbkFycmF5OiBhbnk7XG5cbiAgLy8gc3RydWN0dXJlZCBkYXRhIGFzIGFuIGFycmF5IG9mIG9iamVjdHMgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBpbnB1dCAnbWFwS2V5JyBhbmQgJ21hcFZhbHVlJ1xuICBASW5wdXQoKSBvcHRpb25zT2JqQXJyYXk6IGFueTtcbiAgLy8ga2V5IGlkZW50aWZpZXIgb2YgdGhlIG9iai4gSWYgbWFwVmFsdWUgZG9lc250IGV4aXN0LCBtYXBLZXkgaXMgYWxzbyB0aGUgdmFsdWVcbiAgQElucHV0KCkgbWFwS2V5PzogYW55O1xuICAvLyB2YWx1ZSBpZGVudGlmaWVyIG9mIHRoZSBvYmpcbiAgQElucHV0KCkgbWFwVmFsdWU/OiBhbnk7XG5cbiAgLy8gb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duIGhhdmUgYSBudWxsIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gIEBJbnB1dCgpIGhhc051bGxPcHRpb24gPSBmYWxzZTtcblxuICBASW5wdXQoKSB0cmFuc2xhdGlvbj86IElUcmFuc2xhdGlvbjtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgdXNlRW51bUluZGV4QXNWYWx1ZSA9IGZhbHNlO1xuXG4gIC8vIG11bHRpcGxlIHNlbGVjdGlvblxuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBrZXlzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgdmFsdWVzOiBhbnlbXSA9IFtdO1xuXG4gIE9iamVjdCA9IE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKGZvcm1CdWlsZGVyLCByZW5kZXJlcik7XG4gIH1cblxuICAvKipcbiAgICogSG9vayB1c2VkIHRvIHN5bmMgY2hhbmdlcyBvbiBzZXQgTGFiZWwgYW5kIFR5cGVcbiAgICogQHBhcmFtIGNoYW5nZXNcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zUGxhaW5BcnJheSkge1xuICAgICAgdGhpcy5rZXlzID0gdGhpcy5vcHRpb25zUGxhaW5BcnJheTtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy5vcHRpb25zUGxhaW5BcnJheTtcbiAgICB9XG4gICAgdGhpcy5zZXRLZXlWYWx1ZXMoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZHJvcGRvd25EYXRhOiBbXSxcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1Jbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmRyb3Bkb3duRGF0YTtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUuZHJvcGRvd25EYXRhKTtcbiAgICB9KTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogdHJhbnNvZnJtcyB0aGUgZGF0YSB2YWx1ZXMgdG8gdGhlIGNvcnJlY3QgZm9ybWF0IGZvciBiZSB1c2VkIGJ5IHRoZSB0ZW1wbGF0ZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgc2V0S2V5VmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnNPYmpBcnJheSAmJiB0aGlzLm1hcEtleSAmJiB0aGlzLm1hcFZhbHVlKSB7XG4gICAgICB0aGlzLmtleXMgPSB0aGlzLm9wdGlvbnNPYmpBcnJheS5tYXAoKG9iajogYW55KSA9PiBvYmpbYCR7dGhpcy5tYXBLZXl9YF0pO1xuICAgICAgdGhpcy52YWx1ZXMgPSB0aGlzLm9wdGlvbnNPYmpBcnJheS5tYXAoXG4gICAgICAgIChvYmo6IGFueSkgPT4gb2JqW2Ake3RoaXMubWFwVmFsdWV9YF1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnNPYmpBcnJheSAmJiB0aGlzLm1hcEtleSkge1xuICAgICAgdGhpcy5rZXlzID0gdGhpcy5vcHRpb25zT2JqQXJyYXkubWFwKChvYmo6IGFueSkgPT4gb2JqW2Ake3RoaXMubWFwS2V5fWBdKTtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy5vcHRpb25zT2JqQXJyYXkubWFwKFxuICAgICAgICAob2JqOiBhbnkpID0+IG9ialtgJHt0aGlzLm1hcEtleX1gXVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9uc0VudW0pIHtcbiAgICAgIHRoaXMua2V5cyA9IEVudW1WYWx1ZXMuZ2V0TmFtZXModGhpcy5vcHRpb25zRW51bSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zUGxhaW5BcnJheSkge1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHRoaXMub3B0aW9uc1BsYWluQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBFbnVtVmFsdWVzLmdldFZhbHVlcyh0aGlzLm9wdGlvbnNFbnVtKTtcblxuICAgICAgICAvLyB2YXIgd2hvIGRlZmluZXMgaWYgZW51bSBpcyBjb21wb25lZCBqdXN0IHdpdGgga2V5cyBvciBrZXlWYWx1ZXMuIEUuZyBlbnVtIEtleUVudW0geyBWQUxVRTEsIFZBTFVFMiB9IG9yIGVudW0gS2V5VmFsdWVFbnVtIHsgVkFMVUU0ID0gJ1Y0JywgVkFMVUU1ID0gJ1Y1JyB9XG4gICAgICAgIGxldCBrZXlWYWx1ZUVudW0gPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMua2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChpICE9PSB2YWx1ZXNbaV0pIHtcbiAgICAgICAgICAgIGtleVZhbHVlRW51bSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlWYWx1ZUVudW0gfHwgdGhpcy51c2VFbnVtSW5kZXhBc1ZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZXMgPSBFbnVtVmFsdWVzLmdldE5hbWVzKHRoaXMub3B0aW9uc0VudW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc051bGxPcHRpb24gPT09IHRydWUpIHRoaXMua2V5cy51bnNoaWZ0KG51bGwpO1xuICAgIGlmICh0aGlzLmhhc051bGxPcHRpb24gPT09IHRydWUpIHRoaXMudmFsdWVzLnVuc2hpZnQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gYmFzZWQgaWYgdHJhbnNsYXRpb24gaXMgc2V0XG4gICAqIEBwYXJhbSBrZXlcbiAgICovXG4gIHB1YmxpYyBzZXREaXNwbGF5S2V5KGtleTogYW55KSB7XG4gICAgLypcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRpb24gJiYga2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2xhdGlvbi5pc1ByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5pbnN0YW50KHRoaXMudHJhbnNsYXRpb24ucGF0aCArICcuJyArIGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNsYXRpb24udXNlS2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQodGhpcy50cmFuc2xhdGlvbi5wYXRoLCB7IGtleToga2V5IH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50cmFuc2xhdGlvbj8udXNlS2V5ICYmICF0aGlzLnRyYW5zbGF0aW9uPy5pc1ByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5pbnN0YW50KHRoaXMudHJhbnNsYXRpb24ucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgICAqL1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICB2YWx1ZUNoYW5nZWQodmFsdWU6IGFueSkge1xuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGRyb3Bkb3duRGF0YTogdmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5vblNlbGVjdEl0ZW1FbWl0dGVyLmVtaXQodmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgdHJhbnNsYXRpb24gb2JqZWN0IGluIHRlbXBsYXRlXG4gKi9cbmludGVyZmFjZSBJVHJhbnNsYXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHVzZUtleT86IGJvb2xlYW47XG4gIGlzUHJlZml4PzogYm9vbGVhbjtcbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBbYXR0ci5yZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtmbG9hdExhYmVsXT1cInBsYWNlaG9sZGVyID8gJ2Fsd2F5cycgOiAnYXV0bydcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBwbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInZhbHVlQ2hhbmdlZCgkZXZlbnQ/LnZhbHVlKVwiXG4gICAgICAgICAgICAjY2hpbGRcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGtleSBvZiBrZXlzOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cInZhbHVlc1tpXVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNldERpc3BsYXlLZXkoa2V5KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Zvcm0+XG4iXX0=
@@ -0,0 +1,53 @@
1
+ import { Component, forwardRef, Input } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FormControlParentComponent } from './../../parent-components/form-control.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "@angular/material/radio";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "@ngx-translate/core";
9
+ export class EnumRadiogroupComponent extends FormControlParentComponent {
10
+ constructor(formBuilder, renderer) {
11
+ super(formBuilder, renderer);
12
+ this.formBuilder = formBuilder;
13
+ this.renderer = renderer;
14
+ this.translationPrefix = '';
15
+ }
16
+ ngOnInit() {
17
+ this.optionValues = Object.keys(this.optionsEnum).filter(x => !(parseInt(x) >= 0));
18
+ this.form = this.formBuilder.group({
19
+ enumData: [],
20
+ });
21
+ this.formInitialized = true;
22
+ this.form.valueChanges.subscribe((value) => {
23
+ this.internalValue = value.enumData;
24
+ this.onChange(value.enumData);
25
+ });
26
+ super.ngOnInit();
27
+ }
28
+ }
29
+ EnumRadiogroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: EnumRadiogroupComponent, deps: [{ token: i1.FormBuilder }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
30
+ EnumRadiogroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: EnumRadiogroupComponent, selector: "kms-enum-radiogroup", inputs: { header: "header", optionsEnum: "optionsEnum", translationPrefix: "translationPrefix" }, providers: [
31
+ {
32
+ provide: NG_VALUE_ACCESSOR,
33
+ useExisting: forwardRef(() => EnumRadiogroupComponent),
34
+ multi: true,
35
+ },
36
+ ], usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <div>{{ header }}</div>\n <mat-radio-group [formControl]=\"form.controls['enumData']\" [disabled]=\"disabled\" #child>\n <mat-radio-button [value]=\"choice\" [checked]=\"value === choice\" *ngFor=\"let choice of optionValues\">{{ translationPrefix + '.' + choice | translate }}</mat-radio-button>\n </mat-radio-group>\n</form>", components: [{ type: i2.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], 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: i2.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i4.TranslatePipe } });
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: EnumRadiogroupComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ selector: 'kms-enum-radiogroup', providers: [
40
+ {
41
+ provide: NG_VALUE_ACCESSOR,
42
+ useExisting: forwardRef(() => EnumRadiogroupComponent),
43
+ multi: true,
44
+ },
45
+ ], template: "<form [formGroup]=\"form\">\n <div>{{ header }}</div>\n <mat-radio-group [formControl]=\"form.controls['enumData']\" [disabled]=\"disabled\" #child>\n <mat-radio-button [value]=\"choice\" [checked]=\"value === choice\" *ngFor=\"let choice of optionValues\">{{ translationPrefix + '.' + choice | translate }}</mat-radio-button>\n </mat-radio-group>\n</form>" }]
46
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.Renderer2 }]; }, propDecorators: { header: [{
47
+ type: Input
48
+ }], optionsEnum: [{
49
+ type: Input
50
+ }], translationPrefix: [{
51
+ type: Input
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS1yYWRpb2dyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ttcy1uZ3gtdWktcHJlc2VudGF0aW9uYWwvc3JjL2xpYi91aS9lbnVtLXJhZGlvZ3JvdXAvZW51bS1yYWRpb2dyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ttcy1uZ3gtdWktcHJlc2VudGF0aW9uYWwvc3JjL2xpYi91aS9lbnVtLXJhZGlvZ3JvdXAvZW51bS1yYWRpb2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7QUFhOUYsTUFBTSxPQUFPLHVCQUF3QixTQUFRLDBCQUEwQjtJQU9uRSxZQUFtQixXQUF3QixFQUFTLFFBQW1CO1FBQ25FLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFEZCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVc7UUFKOUQsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO0lBTWhDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUMvQixRQUFRLEVBQUUsRUFBRTtTQUNmLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQixDQUFDOztvSEF4QlEsdUJBQXVCO3dHQUF2Qix1QkFBdUIsZ0pBUnJCO1FBQ1A7WUFDSSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7WUFDdEQsS0FBSyxFQUFFLElBQUk7U0FDZDtLQUNKLGlEQ2ZMLHNYQUtPOzJGRFlNLHVCQUF1QjtrQkFYbkMsU0FBUzsrQkFDSSxxQkFBcUIsYUFFcEI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKOzBIQUdRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUJ1aWxkZXIsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnVsbEFibGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5pbXBvcnQgeyBGb3JtQ29udHJvbFBhcmVudENvbXBvbmVudCB9IGZyb20gJy4vLi4vLi4vcGFyZW50LWNvbXBvbmVudHMvZm9ybS1jb250cm9sLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna21zLWVudW0tcmFkaW9ncm91cCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VudW0tcmFkaW9ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRW51bVJhZGlvZ3JvdXBDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW51bVJhZGlvZ3JvdXBDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbFBhcmVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIGhlYWRlcjogTnVsbEFibGU8U3RyaW5nPjtcbiAgICBASW5wdXQoKSBvcHRpb25zRW51bTogYW55O1xuICAgIEBJbnB1dCgpIHRyYW5zbGF0aW9uUHJlZml4ID0gJyc7XG5cbiAgICBwdWJsaWMgb3B0aW9uVmFsdWVzOiBhbnk7XG4gICAgXG4gICAgY29uc3RydWN0b3IocHVibGljIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICAgICAgc3VwZXIoZm9ybUJ1aWxkZXIsIHJlbmRlcmVyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpe1xuICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9uc0VudW0pLmZpbHRlcih4ID0+ICEocGFyc2VJbnQoeCkgPj0gMCkpO1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGVudW1EYXRhOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9ybUluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmVudW1EYXRhO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZS5lbnVtRGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPGRpdj57eyBoZWFkZXIgfX08L2Rpdj5cbiAgICA8bWF0LXJhZGlvLWdyb3VwIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzWydlbnVtRGF0YSddXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2NoaWxkPlxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbdmFsdWVdPVwiY2hvaWNlXCIgW2NoZWNrZWRdPVwidmFsdWUgPT09IGNob2ljZVwiICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2Ygb3B0aW9uVmFsdWVzXCI+e3sgdHJhbnNsYXRpb25QcmVmaXggKyAnLicgKyBjaG9pY2UgfCB0cmFuc2xhdGUgfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG48L2Zvcm0+Il19
@@ -0,0 +1,232 @@
1
+ import { Component, Input, forwardRef, ViewChild, EventEmitter, Output } from '@angular/core';
2
+ import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ //import { TranslateService } from '@ngx-translate/core';
4
+ import { IconSize } from '../../models/iconSize.enum';
5
+ import { isValue } from '../../models/is-value.function';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "../icon/icon.component";
9
+ import * as i3 from "@angular/material/button";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@ngx-translate/core";
12
+ // Max size in bytes of uploaded image
13
+ const MAX_SIZE_BYTES = 2097152;
14
+ export class FileInputComponent {
15
+ /**
16
+ * Constructor
17
+ * @param formBuilder
18
+ * @param appRef
19
+ * @param cd
20
+ * @param translateService
21
+ * @param renderer
22
+ */
23
+ constructor(formBuilder, appRef, cd,
24
+ //private translateService: TranslateService,
25
+ renderer) {
26
+ this.formBuilder = formBuilder;
27
+ this.appRef = appRef;
28
+ this.cd = cd;
29
+ this.renderer = renderer;
30
+ this.label = '';
31
+ this.previewImage = true;
32
+ this.allowRemove = true;
33
+ this.previewImageText = '';
34
+ this.maxSizeBytes = MAX_SIZE_BYTES;
35
+ this.resizePixels = 0;
36
+ this.acceptedFileMimetypes = 'image/jpeg, image/jpg, image/png';
37
+ this.form = this.formBuilder.group({
38
+ ImageIdent: new FormControl(''),
39
+ ImageLink: new FormControl(''),
40
+ Filename: new FormControl(''),
41
+ ImageAsDataURL: new FormControl(''),
42
+ Text: new FormControl(''),
43
+ });
44
+ this.subscriptions = [];
45
+ this.newImageLoading = false;
46
+ this.IconSize = IconSize;
47
+ this.formDataChanged = new EventEmitter();
48
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
49
+ this.onChange = () => { };
50
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
51
+ this.onTouch = () => { };
52
+ }
53
+ /**
54
+ * Click on button triggers file-input to open OS file dialog
55
+ */
56
+ selectImageOverlay() {
57
+ this.fileInput.nativeElement.click();
58
+ }
59
+ /**
60
+ * Function to manage the input image
61
+ * Returns an error if the file exceeds maximum wanted filesize (Mb).
62
+ * @param ev
63
+ * @returns
64
+ */
65
+ selectImage(ev) {
66
+ if (ev.target.files && ev.target.files[0]) {
67
+ const file = ev.target.files[0];
68
+ if (file.size > this.maxSizeBytes) {
69
+ this.clearInputValue(ev);
70
+ //alert(this.translateService.instant('errors.fileTooBig'));
71
+ return;
72
+ }
73
+ else {
74
+ this.newImageLoading = true;
75
+ if (this.resizePixels > 0) {
76
+ const logoUrl = URL.createObjectURL(file);
77
+ const imgEl = document.createElement('img');
78
+ imgEl.addEventListener('load', () => {
79
+ const resizedLogo = this.resizeImage(imgEl, this.resizePixels);
80
+ const newFile = this.generateModel(file.name, resizedLogo, this.value.ImageIdent, this.value.ImageLink, this.value.Text);
81
+ this.value = newFile;
82
+ this.newImageLoading = false;
83
+ this.cd.markForCheck();
84
+ });
85
+ imgEl.src = logoUrl;
86
+ }
87
+ else {
88
+ const reader = new FileReader();
89
+ reader.readAsDataURL(file);
90
+ reader.onload = (e) => {
91
+ const newFile = this.generateModel(file.name, e.target.result, this.value.ImageIdent, this.value.ImageLink, this.value.Text);
92
+ this.value = newFile;
93
+ this.newImageLoading = false;
94
+ this.cd.markForCheck();
95
+ };
96
+ }
97
+ }
98
+ }
99
+ else {
100
+ console.warn("No file selected");
101
+ }
102
+ }
103
+ /**
104
+ * Resize an image
105
+ * @param imgEl
106
+ * @param wantedWidth as number
107
+ * @returns string
108
+ */
109
+ resizeImage(imgEl, wantedWidth) {
110
+ const canvas = document.createElement('canvas');
111
+ const ctx = canvas.getContext('2d');
112
+ const aspect = imgEl.width / imgEl.height;
113
+ canvas.width = wantedWidth;
114
+ canvas.height = wantedWidth / aspect;
115
+ if (isValue(ctx))
116
+ ctx.drawImage(imgEl, 0, 0, canvas.width, canvas.height);
117
+ return canvas.toDataURL();
118
+ }
119
+ /**
120
+ * Generate default object
121
+ * @param name as string
122
+ * @param content as string
123
+ * @returns AttachedFileDTO
124
+ */
125
+ generateModel(name, content, ident, imageLink, text) {
126
+ return {
127
+ ImageIdent: ident ? ident : '',
128
+ Filename: name ? name : '',
129
+ ImageAsDataURL: content ? content : '',
130
+ ImageLink: imageLink ? imageLink : '',
131
+ Text: text ? text : ''
132
+ };
133
+ }
134
+ /**
135
+ * Remove image
136
+ */
137
+ removeFromList() {
138
+ this.value = this.generateModel('', '', '', '');
139
+ }
140
+ /**
141
+ * get value
142
+ */
143
+ get value() {
144
+ return this.form.value;
145
+ }
146
+ /**
147
+ * set value
148
+ */
149
+ set value(value) {
150
+ this.form.setValue(value);
151
+ this.onChange(value);
152
+ this.formDataChanged.emit(this.form);
153
+ }
154
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
155
+ ngOnInit() { }
156
+ ngOnDestroy() {
157
+ this.subscriptions.forEach(s => s.unsubscribe());
158
+ }
159
+ registerOnChange(fn) {
160
+ this.onChange = fn;
161
+ }
162
+ registerOnTouched(fn) {
163
+ this.onTouch = fn;
164
+ }
165
+ writeValue(value) {
166
+ if (value) {
167
+ this.value = value;
168
+ }
169
+ if (value === null) {
170
+ this.form.reset();
171
+ }
172
+ }
173
+ // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures
174
+ validate(_) {
175
+ return this.form.valid ? null : { styles: { valid: false } };
176
+ }
177
+ /**
178
+ * OnClick event listener of input#fileInput to clear his input value
179
+ */
180
+ clearInputValue(ev) {
181
+ const element = ev.target;
182
+ element.value = '';
183
+ }
184
+ }
185
+ FileInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ApplicationRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
186
+ FileInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FileInputComponent, selector: "kms-file-input", inputs: { label: "label", previewImage: "previewImage", allowRemove: "allowRemove", previewImageText: "previewImageText", maxSizeBytes: "maxSizeBytes", resizePixels: "resizePixels", acceptedFileMimetypes: "acceptedFileMimetypes" }, outputs: { formDataChanged: "formDataChanged" }, providers: [
187
+ {
188
+ provide: NG_VALUE_ACCESSOR,
189
+ useExisting: forwardRef(() => FileInputComponent),
190
+ multi: true,
191
+ },
192
+ {
193
+ provide: NG_VALIDATORS,
194
+ useExisting: forwardRef(() => FileInputComponent),
195
+ multi: true,
196
+ },
197
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"form\" (change)=\"newImageLoading=true\" class=\"fileInput\"> \n\n <div *ngIf=\"form.value.Filename && previewImage\">\n <div *ngIf=\"newImageLoading\">\n {{ 'file-input.loading' | translate }}\n </div>\n <div *ngIf=\"!newImageLoading\">\n <div class=\"\">\n <div class=\"\">\n <img *ngIf=\"form.value.ImageLink && form.value.ImageLink !== '' && !(form.value.ImageAsDataURL && form.value.ImageAsDataURL !== '')\" [src]=\"form.value.ImageAsDataURL\" [src]=\"form.value.ImageLink\" style=\"height: 40px; width: fit-content;\" />\n <img *ngIf=\"form.value.ImageAsDataURL && form.value.ImageAsDataURL !== ''\" [src]=\"form.value.ImageAsDataURL\" style=\"height: 40px; width: fit-content;\" />\n </div>\n <div class=\"\">{{form.value.Filename}}</div>\n <div class=\"\">\n <div (click)=\"removeFromList()\" *ngIf=\"allowRemove\">\n <kms-icon icon=\"trash\" [iconSize]=\"IconSize.TINY\" iconClass=\"color-black\"></kms-icon> \n {{ 'file-input.remove' }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!previewImage\">\n <div class=\"\">{{form.value.Filename}}</div>\n </div>\n\n <button (click)=\"selectImageOverlay()\" class=\"button-primary-font-color\" mat-stroked-button>\n <span>{{ label }}</span>\n </button>\n <input\n type=\"file\"\n [accept]=\"acceptedFileMimetypes\"\n style=\"display: none\"\n #fileInput\n (click)=\"clearInputValue($event)\"\n (change)=\"selectImage($event)\"\n />\n\n <input type=\"hidden\" [formControl]=\"form.controls['ImageIdent']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['ImageLink']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['Filename']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['ImageAsDataURL']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['Text']\" />\n\n</form>", styles: [""], components: [{ type: i2.IconComponent, selector: "kms-icon", inputs: ["icon", "iconClass", "iconStyle", "iconSize", "dontUseSprite"] }, { type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], 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: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], pipes: { "translate": i5.TranslatePipe } });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FileInputComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ selector: 'kms-file-input', providers: [
201
+ {
202
+ provide: NG_VALUE_ACCESSOR,
203
+ useExisting: forwardRef(() => FileInputComponent),
204
+ multi: true,
205
+ },
206
+ {
207
+ provide: NG_VALIDATORS,
208
+ useExisting: forwardRef(() => FileInputComponent),
209
+ multi: true,
210
+ },
211
+ ], template: "<form [formGroup]=\"form\" (change)=\"newImageLoading=true\" class=\"fileInput\"> \n\n <div *ngIf=\"form.value.Filename && previewImage\">\n <div *ngIf=\"newImageLoading\">\n {{ 'file-input.loading' | translate }}\n </div>\n <div *ngIf=\"!newImageLoading\">\n <div class=\"\">\n <div class=\"\">\n <img *ngIf=\"form.value.ImageLink && form.value.ImageLink !== '' && !(form.value.ImageAsDataURL && form.value.ImageAsDataURL !== '')\" [src]=\"form.value.ImageAsDataURL\" [src]=\"form.value.ImageLink\" style=\"height: 40px; width: fit-content;\" />\n <img *ngIf=\"form.value.ImageAsDataURL && form.value.ImageAsDataURL !== ''\" [src]=\"form.value.ImageAsDataURL\" style=\"height: 40px; width: fit-content;\" />\n </div>\n <div class=\"\">{{form.value.Filename}}</div>\n <div class=\"\">\n <div (click)=\"removeFromList()\" *ngIf=\"allowRemove\">\n <kms-icon icon=\"trash\" [iconSize]=\"IconSize.TINY\" iconClass=\"color-black\"></kms-icon> \n {{ 'file-input.remove' }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!previewImage\">\n <div class=\"\">{{form.value.Filename}}</div>\n </div>\n\n <button (click)=\"selectImageOverlay()\" class=\"button-primary-font-color\" mat-stroked-button>\n <span>{{ label }}</span>\n </button>\n <input\n type=\"file\"\n [accept]=\"acceptedFileMimetypes\"\n style=\"display: none\"\n #fileInput\n (click)=\"clearInputValue($event)\"\n (change)=\"selectImage($event)\"\n />\n\n <input type=\"hidden\" [formControl]=\"form.controls['ImageIdent']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['ImageLink']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['Filename']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['ImageAsDataURL']\" />\n <input type=\"hidden\" [formControl]=\"form.controls['Text']\" />\n\n</form>", styles: [""] }]
212
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ApplicationRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { fileInput: [{
213
+ type: ViewChild,
214
+ args: ['fileInput']
215
+ }], label: [{
216
+ type: Input
217
+ }], previewImage: [{
218
+ type: Input
219
+ }], allowRemove: [{
220
+ type: Input
221
+ }], previewImageText: [{
222
+ type: Input
223
+ }], maxSizeBytes: [{
224
+ type: Input
225
+ }], resizePixels: [{
226
+ type: Input
227
+ }], acceptedFileMimetypes: [{
228
+ type: Input
229
+ }], formDataChanged: [{
230
+ type: Output
231
+ }] } });
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rbXMtbmd4LXVpLXByZXNlbnRhdGlvbmFsL3NyYy9saWIvdWkvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ttcy1uZ3gtdWktcHJlc2VudGF0aW9uYWwvc3JjL2xpYi91aS9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFVLFNBQVMsRUFBYSxZQUFZLEVBQUUsTUFBTSxFQUFxQyxNQUFNLGVBQWUsQ0FBQztBQUVwSixPQUFPLEVBR0gsV0FBVyxFQUVYLGFBQWEsRUFDYixpQkFBaUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4Qix5REFBeUQ7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQUV6RCxzQ0FBc0M7QUFDdEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBb0IvQixNQUFNLE9BQU8sa0JBQWtCO0lBNEIzQjs7Ozs7OztPQU9HO0lBQ0gsWUFDVyxXQUF3QixFQUN4QixNQUFzQixFQUN0QixFQUFxQjtJQUM1Qiw2Q0FBNkM7SUFDdEMsUUFBbUI7UUFKbkIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFFckIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXJDckIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsSUFB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bkNMLHdtRUE0Q087MkZETk0sa0JBQWtCO2tCQWxCOUIsU0FBUzsrQkFDSSxnQkFBZ0IsYUFHZjt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDOzRCQUNqRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjt1TEFLOEIsU0FBUztzQkFBdkMsU0FBUzt1QkFBQyxXQUFXO2dCQUViLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBZUksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIGZvcndhcmRSZWYsIE9uSW5pdCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBBcHBsaWNhdGlvblJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3JtQnVpbGRlcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBGb3JtR3JvdXAsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8vaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSWNvblNpemUgfSBmcm9tICcuLi8uLi9tb2RlbHMvaWNvblNpemUuZW51bSc7XG5pbXBvcnQgeyBBdHRhY2hlZEZpbGVEVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvdHlwZXMvYXR0YWNoZWQtZmlsZS1kdG8ubW9kZWwnO1xuaW1wb3J0IHsgaXNWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9pcy12YWx1ZS5mdW5jdGlvbic7XG5cbi8vIE1heCBzaXplIGluIGJ5dGVzIG9mIHVwbG9hZGVkIGltYWdlXG5jb25zdCBNQVhfU0laRV9CWVRFUyA9IDIwOTcxNTI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna21zLWZpbGUtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9maWxlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gICAgXG4gICAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgcHVibGljIGZpbGVJbnB1dDogYW55O1xuXG4gICAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgICBcbiAgICBASW5wdXQoKSBwcmV2aWV3SW1hZ2UgPSB0cnVlOyBcbiAgICBASW5wdXQoKSBhbGxvd1JlbW92ZSA9IHRydWU7IFxuICAgIEBJbnB1dCgpIHByZXZpZXdJbWFnZVRleHQgPSAnJzsgXG4gICAgQElucHV0KCkgbWF4U2l6ZUJ5dGVzID0gTUFYX1NJWkVfQllURVM7IFxuICAgIEBJbnB1dCgpIHJlc2l6ZVBpeGVscyA9IDA7IFxuICAgIEBJbnB1dCgpIGFjY2VwdGVkRmlsZU1pbWV0eXBlcyA9ICdpbWFnZS9qcGVnLCBpbWFnZS9qcGcsIGltYWdlL3BuZyc7IFxuXG4gICAgZm9ybT0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIEltYWdlSWRlbnQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgIEltYWdlTGluazogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgRmlsZW5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgIEltYWdlQXNEYXRhVVJMOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICBUZXh0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIH0pO1xuXG4gICAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgICBuZXdJbWFnZUxvYWRpbmcgPSBmYWxzZVxuXG4gICAgSWNvblNpemUgPSBJY29uU2l6ZTtcblxuICAgIEBPdXRwdXQoKSBmb3JtRGF0YUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXIgXG4gICAgICogQHBhcmFtIGFwcFJlZiBcbiAgICAgKiBAcGFyYW0gY2QgXG4gICAgICogQHBhcmFtIHRyYW5zbGF0ZVNlcnZpY2UgXG4gICAgICogQHBhcmFtIHJlbmRlcmVyIFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBcbiAgICAgICAgcHVibGljIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHB1YmxpYyBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIC8vcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICAgICkge1xuICAgICAgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQ2xpY2sgb24gYnV0dG9uIHRyaWdnZXJzIGZpbGUtaW5wdXQgdG8gb3BlbiBPUyBmaWxlIGRpYWxvZ1xuICAgICAqL1xuICAgIHNlbGVjdEltYWdlT3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIG1hbmFnZSB0aGUgaW5wdXQgaW1hZ2VcbiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBmaWxlIGV4Y2VlZHMgbWF4aW11bSB3YW50ZWQgZmlsZXNpemUgKE1iKS4gXG4gICAgICogQHBhcmFtIGV2XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBzZWxlY3RJbWFnZShldjogYW55KSB7XG4gICAgICAgIGlmIChldi50YXJnZXQuZmlsZXMgJiYgZXYudGFyZ2V0LmZpbGVzWzBdKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlOkZpbGUgPSBldi50YXJnZXQuZmlsZXNbMF07XG5cbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLm1heFNpemVCeXRlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dFZhbHVlKGV2KTtcbiAgICAgICAgICAgICAgICAvL2FsZXJ0KHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdlcnJvcnMuZmlsZVRvb0JpZycpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3SW1hZ2VMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmKHRoaXMucmVzaXplUGl4ZWxzID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICAgICAgICAgICAgICBpbWdFbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzaXplZExvZ28gPSB0aGlzLnJlc2l6ZUltYWdlKGltZ0VsLCB0aGlzLnJlc2l6ZVBpeGVscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWxlID0gdGhpcy5nZW5lcmF0ZU1vZGVsKGZpbGUubmFtZSwgcmVzaXplZExvZ28sIHRoaXMudmFsdWUuSW1hZ2VJZGVudCwgdGhpcy52YWx1ZS5JbWFnZUxpbmssIHRoaXMudmFsdWUuVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlPW5ld0ZpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ltYWdlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGltZ0VsLnNyYyA9IGxvZ29Vcmw7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RmlsZSA9IHRoaXMuZ2VuZXJhdGVNb2RlbChmaWxlLm5hbWUsIGUudGFyZ2V0LnJlc3VsdCwgdGhpcy52YWx1ZS5JbWFnZUlkZW50LCB0aGlzLnZhbHVlLkltYWdlTGluaywgdGhpcy52YWx1ZS5UZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWU9bmV3RmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV3SW1hZ2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJObyBmaWxlIHNlbGVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIGFuIGltYWdlXG4gICAgICogQHBhcmFtIGltZ0VsXG4gICAgICogQHBhcmFtIHdhbnRlZFdpZHRoIGFzIG51bWJlclxuICAgICAqIEByZXR1cm5zIHN0cmluZyBcbiAgICAgKi9cbiAgICAgcHJpdmF0ZSByZXNpemVJbWFnZShpbWdFbDogYW55LCB3YW50ZWRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgY29uc3QgYXNwZWN0ID0gaW1nRWwud2lkdGggLyBpbWdFbC5oZWlnaHQ7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdhbnRlZFdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gd2FudGVkV2lkdGggLyBhc3BlY3Q7XG4gICAgICAgIGlmIChpc1ZhbHVlKGN0eCkpIGN0eC5kcmF3SW1hZ2UoaW1nRWwsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgZGVmYXVsdCBvYmplY3RcbiAgICAgKiBAcGFyYW0gbmFtZSBhcyBzdHJpbmdcbiAgICAgKiBAcGFyYW0gY29udGVudCBhcyBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyBBdHRhY2hlZEZpbGVEVE9cbiAgICAgKi9cbiAgICBnZW5lcmF0ZU1vZGVsKG5hbWU/OiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcsIGlkZW50Pzogc3RyaW5nLCBpbWFnZUxpbms/OiBzdHJpbmcsIHRleHQ/OiBzdHJpbmcpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgSW1hZ2VJZGVudDogaWRlbnQgPyBpZGVudCA6ICcnLFxuICAgICAgICAgICAgRmlsZW5hbWU6IG5hbWUgPyBuYW1lIDogJycsXG4gICAgICAgICAgICBJbWFnZUFzRGF0YVVSTDogY29udGVudCA/IGNvbnRlbnQgOiAnJyxcbiAgICAgICAgICAgIEltYWdlTGluazogaW1hZ2VMaW5rID8gaW1hZ2VMaW5rIDogJycsXG4gICAgICAgICAgICBUZXh0OiB0ZXh0ID8gdGV4dCA6ICcnXG4gICAgICAgIH0gYXMgQXR0YWNoZWRGaWxlRFRPO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpbWFnZSBcbiAgICAgKi9cbiAgICAgcmVtb3ZlRnJvbUxpc3QoKXtcbiAgICAgICAgdGhpcy52YWx1ZT0gdGhpcy5nZW5lcmF0ZU1vZGVsKCcnLCcnLCAnJywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCB2YWx1ZVxuICAgICAqL1xuICAgICAgICBnZXQgdmFsdWUoKTogQXR0YWNoZWRGaWxlRFRPIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXQgdmFsdWVcbiAgICAgKi9cbiAgICBzZXQgdmFsdWUodmFsdWU6IEF0dGFjaGVkRmlsZURUTykge1xuICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtRGF0YUNoYW5nZWQuZW1pdCh0aGlzLmZvcm0pO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgb25Ub3VjaDogYW55ID0gKCkgPT4ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgbmdPbkluaXQoKSB7fVxuXG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH0gICBcblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgICAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBBdHRhY2hlZEZpbGVEVE8gfCBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYWRqYWNlbnQtb3ZlcmxvYWQtc2lnbmF0dXJlc1xuICAgIHZhbGlkYXRlKF86IEZvcm1Db250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0udmFsaWQgPyBudWxsIDogeyBzdHlsZXM6IHsgdmFsaWQ6IGZhbHNlIH0gfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbkNsaWNrIGV2ZW50IGxpc3RlbmVyIG9mIGlucHV0I2ZpbGVJbnB1dCB0byBjbGVhciBoaXMgaW5wdXQgdmFsdWVcbiAgICAgKi9cbiAgICBjbGVhcklucHV0VmFsdWUoZXY6IGFueSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZXYudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoY2hhbmdlKT1cIm5ld0ltYWdlTG9hZGluZz10cnVlXCIgY2xhc3M9XCJmaWxlSW5wdXRcIj4gXG5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybS52YWx1ZS5GaWxlbmFtZSAmJiBwcmV2aWV3SW1hZ2VcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm5ld0ltYWdlTG9hZGluZ1wiPlxuICAgICAgICAgICAge3sgJ2ZpbGUtaW5wdXQubG9hZGluZycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbmV3SW1hZ2VMb2FkaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZm9ybS52YWx1ZS5JbWFnZUxpbmsgJiYgZm9ybS52YWx1ZS5JbWFnZUxpbmsgIT09ICcnICYmICEoZm9ybS52YWx1ZS5JbWFnZUFzRGF0YVVSTCAmJiBmb3JtLnZhbHVlLkltYWdlQXNEYXRhVVJMICE9PSAnJylcIiBbc3JjXT1cImZvcm0udmFsdWUuSW1hZ2VBc0RhdGFVUkxcIiBbc3JjXT1cImZvcm0udmFsdWUuSW1hZ2VMaW5rXCIgc3R5bGU9XCJoZWlnaHQ6IDQwcHg7IHdpZHRoOiBmaXQtY29udGVudDtcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZm9ybS52YWx1ZS5JbWFnZUFzRGF0YVVSTCAmJiBmb3JtLnZhbHVlLkltYWdlQXNEYXRhVVJMICE9PSAnJ1wiIFtzcmNdPVwiZm9ybS52YWx1ZS5JbWFnZUFzRGF0YVVSTFwiIHN0eWxlPVwiaGVpZ2h0OiA0MHB4OyB3aWR0aDogZml0LWNvbnRlbnQ7XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tmb3JtLnZhbHVlLkZpbGVuYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInJlbW92ZUZyb21MaXN0KClcIiAqbmdJZj1cImFsbG93UmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8a21zLWljb24gaWNvbj1cInRyYXNoXCIgW2ljb25TaXplXT1cIkljb25TaXplLlRJTllcIiBpY29uQ2xhc3M9XCJjb2xvci1ibGFja1wiPjwva21zLWljb24+IFxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2ZpbGUtaW5wdXQucmVtb3ZlJyB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIXByZXZpZXdJbWFnZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+e3tmb3JtLnZhbHVlLkZpbGVuYW1lfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gKGNsaWNrKT1cInNlbGVjdEltYWdlT3ZlcmxheSgpXCIgY2xhc3M9XCJidXR0b24tcHJpbWFyeS1mb250LWNvbG9yXCIgbWF0LXN0cm9rZWQtYnV0dG9uPlxuICAgICAgICA8c3Bhbj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICBbYWNjZXB0XT1cImFjY2VwdGVkRmlsZU1pbWV0eXBlc1wiXG4gICAgICAgIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gICAgICAgICNmaWxlSW5wdXRcbiAgICAgICAgKGNsaWNrKT1cImNsZWFySW5wdXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJbWFnZSgkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9sc1snSW1hZ2VJZGVudCddXCIgLz5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzWydJbWFnZUxpbmsnXVwiIC8+XG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9sc1snRmlsZW5hbWUnXVwiIC8+XG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9sc1snSW1hZ2VBc0RhdGFVUkwnXVwiIC8+XG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9sc1snVGV4dCddXCIgLz5cblxuPC9mb3JtPiJdfQ==