@luftborn/custom-elements 1.4.0 → 2.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 (196) hide show
  1. package/README.md +2 -2
  2. package/assets/style.css +277 -277
  3. package/azure-pipeline.yml +54 -0
  4. package/demo/index.html +585 -585
  5. package/demo/index.js +6109 -0
  6. package/demo/index.min.js +6110 -0
  7. package/demo/index.min.js.map +1 -0
  8. package/demo/index.ts +11 -11
  9. package/demo/old/index.html +586 -586
  10. package/demo/old/index.js +10849 -10849
  11. package/demo/old/index.min.js +10850 -10850
  12. package/demo/old/index.ts +10 -10
  13. package/dist/custom-form.d.ts +20 -20
  14. package/dist/custom-form.js +147 -147
  15. package/dist/elements/Address/AddressElement.d.ts +28 -28
  16. package/dist/elements/Address/AddressElement.js +206 -206
  17. package/dist/elements/BankField/BankFieldElement.d.ts +22 -22
  18. package/dist/elements/BankField/BankFieldElement.js +127 -127
  19. package/dist/elements/CPRElement/CPRElement.d.ts +14 -14
  20. package/dist/elements/CPRElement/CPRElement.js +82 -82
  21. package/dist/elements/CVRElement/CVRElement.d.ts +14 -14
  22. package/dist/elements/CVRElement/CVRElement.js +82 -82
  23. package/dist/elements/CheckBoxElement/CheckBoxElement.d.ts +14 -14
  24. package/dist/elements/CheckBoxElement/CheckBoxElement.js +96 -96
  25. package/dist/elements/CustomRegularExpression/CustomRegularExpressionElement.d.ts +12 -12
  26. package/dist/elements/CustomRegularExpression/CustomRegularExpressionElement.js +82 -82
  27. package/dist/elements/DateField/DateFieldElement.d.ts +12 -12
  28. package/dist/elements/DateField/DateFieldElement.js +85 -85
  29. package/dist/elements/DropDownList/DropDownListElement.d.ts +14 -14
  30. package/dist/elements/DropDownList/DropDownListElement.js +93 -93
  31. package/dist/elements/Elements.d.ts +18 -18
  32. package/dist/elements/Elements.js +37 -37
  33. package/dist/elements/EmailField/EmailFieldElement.d.ts +13 -13
  34. package/dist/elements/EmailField/EmailFieldElement.js +83 -83
  35. package/dist/elements/FileField/FileFieldElement.d.ts +15 -15
  36. package/dist/elements/FileField/FileFieldElement.js +103 -103
  37. package/dist/elements/IdentificationElement/IdentificationElement.d.ts +18 -18
  38. package/dist/elements/IdentificationElement/IdentificationElement.js +94 -94
  39. package/dist/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.d.ts +16 -16
  40. package/dist/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.js +114 -114
  41. package/dist/elements/NumericField/NumericFieldElement.d.ts +12 -12
  42. package/dist/elements/NumericField/NumericFieldElement.js +91 -91
  43. package/dist/elements/RadioButtonGroup/RadioButtonGroupElement.d.ts +14 -14
  44. package/dist/elements/RadioButtonGroup/RadioButtonGroupElement.js +99 -99
  45. package/dist/elements/TextAreaElement/TextAreaElement.d.ts +12 -12
  46. package/dist/elements/TextAreaElement/TextAreaElement.js +79 -79
  47. package/dist/elements/TextField/TextFieldElement.d.ts +12 -12
  48. package/dist/elements/TextField/TextFieldElement.js +79 -79
  49. package/dist/elements/TypeAhead/TypeAheadElement.d.ts +24 -24
  50. package/dist/elements/TypeAhead/TypeAheadElement.js +209 -209
  51. package/dist/framework/CustomEvents.d.ts +21 -21
  52. package/dist/framework/CustomEvents.js +47 -47
  53. package/dist/framework/CustomInputElement.d.ts +50 -50
  54. package/dist/framework/CustomInputElement.js +258 -258
  55. package/dist/framework/Language/Languages/Base/BaseDictionary.d.ts +4 -4
  56. package/dist/framework/Language/Languages/Base/BaseDictionary.js +20 -20
  57. package/dist/framework/Language/Languages/CzechDictionary.d.ts +4 -4
  58. package/dist/framework/Language/Languages/CzechDictionary.js +39 -39
  59. package/dist/framework/Language/Languages/DanishDictionary.d.ts +4 -4
  60. package/dist/framework/Language/Languages/DanishDictionary.js +39 -39
  61. package/dist/framework/Language/Languages/DutchDictionary.d.ts +4 -4
  62. package/dist/framework/Language/Languages/DutchDictionary.js +39 -39
  63. package/dist/framework/Language/Languages/EnglishDictionary.d.ts +4 -4
  64. package/dist/framework/Language/Languages/EnglishDictionary.js +39 -39
  65. package/dist/framework/Language/Languages/EstonianDictionary.d.ts +4 -4
  66. package/dist/framework/Language/Languages/EstonianDictionary.js +39 -39
  67. package/dist/framework/Language/Languages/FinnishDictionary.d.ts +4 -4
  68. package/dist/framework/Language/Languages/FinnishDictionary.js +39 -39
  69. package/dist/framework/Language/Languages/FrenchDictionary.d.ts +4 -4
  70. package/dist/framework/Language/Languages/FrenchDictionary.js +39 -39
  71. package/dist/framework/Language/Languages/GermanDictionary.d.ts +4 -4
  72. package/dist/framework/Language/Languages/GermanDictionary.js +39 -39
  73. package/dist/framework/Language/Languages/GreekDictionary.d.ts +4 -4
  74. package/dist/framework/Language/Languages/GreekDictionary.js +39 -39
  75. package/dist/framework/Language/Languages/HungarianDictionary.d.ts +4 -4
  76. package/dist/framework/Language/Languages/HungarianDictionary.js +39 -39
  77. package/dist/framework/Language/Languages/IcelandicDictionary.d.ts +4 -4
  78. package/dist/framework/Language/Languages/IcelandicDictionary.js +39 -39
  79. package/dist/framework/Language/Languages/ItalianDictionary.d.ts +4 -4
  80. package/dist/framework/Language/Languages/ItalianDictionary.js +39 -39
  81. package/dist/framework/Language/Languages/LatvianDictionary.d.ts +4 -4
  82. package/dist/framework/Language/Languages/LatvianDictionary.js +39 -39
  83. package/dist/framework/Language/Languages/LituanianDictionary.d.ts +4 -4
  84. package/dist/framework/Language/Languages/LituanianDictionary.js +39 -39
  85. package/dist/framework/Language/Languages/NorwegianDictionary.d.ts +4 -4
  86. package/dist/framework/Language/Languages/NorwegianDictionary.js +39 -39
  87. package/dist/framework/Language/Languages/PolishDictionary.d.ts +4 -4
  88. package/dist/framework/Language/Languages/PolishDictionary.js +39 -39
  89. package/dist/framework/Language/Languages/PortugueseDictionary.d.ts +4 -4
  90. package/dist/framework/Language/Languages/PortugueseDictionary.js +39 -39
  91. package/dist/framework/Language/Languages/SpanishDictionary.d.ts +4 -4
  92. package/dist/framework/Language/Languages/SpanishDictionary.js +39 -39
  93. package/dist/framework/Language/Languages/SwedishDictionary.d.ts +4 -4
  94. package/dist/framework/Language/Languages/SwedishDictionary.js +39 -39
  95. package/dist/framework/Language/Translator.d.ts +23 -23
  96. package/dist/framework/Language/Translator.js +115 -115
  97. package/dist/framework/Models/OptionWithDescription.d.ts +6 -6
  98. package/dist/framework/Models/OptionWithDescription.js +9 -9
  99. package/dist/framework/Polyfills/getAttributeNamesPolyfill.d.ts +1 -1
  100. package/dist/framework/Polyfills/getAttributeNamesPolyfill.js +17 -17
  101. package/dist/framework/Translations/CaseConverter.d.ts +5 -5
  102. package/dist/framework/Translations/CaseConverter.js +50 -50
  103. package/dist/framework/Utilities/ArrayUtil.d.ts +6 -6
  104. package/dist/framework/Utilities/ArrayUtil.js +36 -36
  105. package/dist/framework/Utilities/DomUtil.d.ts +21 -21
  106. package/dist/framework/Utilities/DomUtil.js +101 -101
  107. package/dist/framework/Utilities/DomUtility.d.ts +3 -3
  108. package/dist/framework/Utilities/DomUtility.js +12 -12
  109. package/dist/framework/Utilities/MakeRequest.d.ts +8 -8
  110. package/dist/framework/Utilities/MakeRequest.js +48 -48
  111. package/dist/framework/Utilities/StringUtil.d.ts +4 -4
  112. package/dist/framework/Utilities/StringUtil.js +16 -16
  113. package/dist/framework/Utilities/ViewportUtil.d.ts +8 -8
  114. package/dist/framework/Utilities/ViewportUtil.js +42 -42
  115. package/dist/framework/Utilities/debouncer.d.ts +8 -8
  116. package/dist/framework/Utilities/debouncer.js +51 -51
  117. package/dist/framework/Validation/IValidator.interface.d.ts +3 -3
  118. package/dist/framework/Validation/IValidator.interface.js +2 -2
  119. package/dist/framework/Validation/Validators/BankAccount.d.ts +4 -4
  120. package/dist/framework/Validation/Validators/BankAccount.js +12 -12
  121. package/dist/framework/Validation/Validators/BankAccountRegistrationNumber.d.ts +4 -4
  122. package/dist/framework/Validation/Validators/BankAccountRegistrationNumber.js +12 -12
  123. package/dist/framework/Validation/Validators/BankIdNorway.d.ts +5 -5
  124. package/dist/framework/Validation/Validators/BankIdNorway.js +21 -21
  125. package/dist/framework/Validation/Validators/BankIdSweden.d.ts +5 -5
  126. package/dist/framework/Validation/Validators/BankIdSweden.js +21 -21
  127. package/dist/framework/Validation/Validators/CPR.d.ts +9 -9
  128. package/dist/framework/Validation/Validators/CPR.js +75 -75
  129. package/dist/framework/Validation/Validators/CVR.d.ts +5 -5
  130. package/dist/framework/Validation/Validators/CVR.js +30 -30
  131. package/dist/framework/custom-element.decorator.d.ts +9 -9
  132. package/dist/framework/custom-element.decorator.js +51 -51
  133. package/dist/index.d.ts +7 -7
  134. package/dist/index.js +14 -14
  135. package/package.json +38 -38
  136. package/src/custom-form.ts +140 -140
  137. package/src/elements/Address/AddressElement.ts +216 -216
  138. package/src/elements/BankField/BankFieldElement.ts +127 -127
  139. package/src/elements/CPRElement/CPRElement.ts +74 -74
  140. package/src/elements/CVRElement/CVRElement.ts +75 -75
  141. package/src/elements/CheckBoxElement/CheckBoxElement.ts +99 -99
  142. package/src/elements/CustomRegularExpression/CustomRegularExpressionElement.ts +75 -75
  143. package/src/elements/DateField/DateFieldElement.ts +78 -78
  144. package/src/elements/DropDownList/DropDownListElement.ts +100 -100
  145. package/src/elements/Elements.ts +37 -37
  146. package/src/elements/EmailField/EmailFieldElement.ts +78 -78
  147. package/src/elements/FileField/FileFieldElement.ts +96 -96
  148. package/src/elements/IdentificationElement/IdentificationElement.ts +104 -104
  149. package/src/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.ts +116 -116
  150. package/src/elements/NumericField/NumericFieldElement.ts +84 -84
  151. package/src/elements/RadioButtonGroup/RadioButtonGroupElement.ts +103 -103
  152. package/src/elements/TextAreaElement/TextAreaElement.ts +72 -72
  153. package/src/elements/TextField/TextFieldElement.ts +72 -72
  154. package/src/elements/TypeAhead/TypeAheadElement.ts +248 -248
  155. package/src/framework/CustomEvents.ts +47 -47
  156. package/src/framework/CustomInputElement.ts +277 -277
  157. package/src/framework/Language/Languages/Base/BaseDictionary.ts +15 -15
  158. package/src/framework/Language/Languages/CzechDictionary.ts +18 -18
  159. package/src/framework/Language/Languages/DanishDictionary.ts +17 -17
  160. package/src/framework/Language/Languages/DutchDictionary.ts +17 -17
  161. package/src/framework/Language/Languages/EnglishDictionary.ts +18 -18
  162. package/src/framework/Language/Languages/EstonianDictionary.ts +17 -17
  163. package/src/framework/Language/Languages/FinnishDictionary.ts +17 -17
  164. package/src/framework/Language/Languages/FrenchDictionary.ts +17 -17
  165. package/src/framework/Language/Languages/GermanDictionary.ts +17 -17
  166. package/src/framework/Language/Languages/GreekDictionary.ts +17 -17
  167. package/src/framework/Language/Languages/HungarianDictionary.ts +17 -17
  168. package/src/framework/Language/Languages/IcelandicDictionary.ts +17 -17
  169. package/src/framework/Language/Languages/ItalianDictionary.ts +17 -17
  170. package/src/framework/Language/Languages/LatvianDictionary.ts +17 -17
  171. package/src/framework/Language/Languages/LituanianDictionary.ts +17 -17
  172. package/src/framework/Language/Languages/NorwegianDictionary.ts +17 -17
  173. package/src/framework/Language/Languages/PolishDictionary.ts +17 -17
  174. package/src/framework/Language/Languages/PortugueseDictionary.ts +17 -17
  175. package/src/framework/Language/Languages/SpanishDictionary.ts +17 -17
  176. package/src/framework/Language/Languages/SwedishDictionary.ts +17 -17
  177. package/src/framework/Language/Translator.ts +110 -110
  178. package/src/framework/Models/OptionWithDescription.ts +8 -8
  179. package/src/framework/Polyfills/getAttributeNamesPolyfill.ts +13 -13
  180. package/src/framework/Translations/CaseConverter.ts +43 -43
  181. package/src/framework/Utilities/ArrayUtil.ts +31 -31
  182. package/src/framework/Utilities/DomUtil.ts +117 -117
  183. package/src/framework/Utilities/DomUtility.ts +6 -6
  184. package/src/framework/Utilities/MakeRequest.ts +47 -47
  185. package/src/framework/Utilities/StringUtil.ts +8 -8
  186. package/src/framework/Utilities/ViewportUtil.ts +46 -46
  187. package/src/framework/Utilities/debouncer.ts +66 -66
  188. package/src/framework/Validation/IValidator.interface.ts +3 -3
  189. package/src/framework/Validation/Validators/BankAccount.ts +7 -7
  190. package/src/framework/Validation/Validators/BankAccountRegistrationNumber.ts +8 -8
  191. package/src/framework/Validation/Validators/BankIdNorway.ts +21 -21
  192. package/src/framework/Validation/Validators/BankIdSweden.ts +21 -21
  193. package/src/framework/Validation/Validators/CPR.ts +82 -82
  194. package/src/framework/Validation/Validators/CVR.ts +27 -27
  195. package/src/framework/custom-element.decorator.ts +57 -57
  196. package/src/index.ts +12 -12
@@ -1,277 +1,277 @@
1
- import { CustomElementEvent, CustomElementEventArgs } from "./CustomEvents";
2
- import OptionWithDescription from "./Models/OptionWithDescription";
3
- import ArrayUtil from "./Utilities/ArrayUtil";
4
- import DomUtil from "./Utilities/DomUtil";
5
-
6
- class IDictionary<TValue> {
7
- [index: string]: TValue;
8
- }
9
- export abstract class CustomInputElement extends HTMLElement {
10
- private dependentOnList = new IDictionary<boolean>();
11
- private visibilityState = true;
12
-
13
- protected touched = false;
14
- protected domUtil: DomUtil;
15
-
16
- protected hasValueDependency: any;
17
- protected noValueDependency: any;
18
- protected dependencies: any[];
19
-
20
- public onChange = new CustomElementEvent<CustomElementEventArgs>();
21
- public onValidate = new CustomElementEvent<CustomElementEventArgs>();
22
- public onVisibilityChanged = new CustomElementEvent<CustomElementEventArgs>();
23
-
24
- public name: string;
25
- public options: any[];
26
- public optionsWithDescriptions: OptionWithDescription[];
27
- public required: boolean;
28
- public customValue: string;
29
- public allDependenciesMustBeMet: boolean = false;
30
- public multi: boolean = false;
31
- public max: any;
32
- public min: any;
33
- public step: any;
34
-
35
- constructor() {
36
- super();
37
- }
38
-
39
- abstract get value(): any;
40
- abstract set value(value);
41
- abstract get valid(): boolean;
42
-
43
- abstract initChildInputs(): void;
44
- abstract validate(): void;
45
- abstract change($event): void;
46
-
47
- compareVlaues = [];
48
-
49
- isValueConditionMatched(val: any) {
50
- if (val && Array.isArray(val) && val.length) {
51
- let result = false;
52
- val.forEach(element => {
53
- const elementMatched = this.compareVlaues.findIndex(x => x == element) !== -1;
54
- if (elementMatched) {
55
- result = true;
56
- return;
57
- }
58
- });
59
- return result;
60
- }
61
- return this.compareVlaues.findIndex(x => x == val) !== -1;
62
- }
63
-
64
- connectedCallback(): void {
65
- this.init();
66
- this.setAttributes();
67
- }
68
-
69
- init(): void {
70
- this.style.width = "100%";
71
- this.domUtil = new DomUtil(this);
72
- this.parseData();
73
- this.initChildInputs();
74
- this.bindEvents();
75
- this.setAttributes();
76
-
77
- window.addEventListener("load", () => {
78
- this.bindDependencies();
79
- });
80
- }
81
-
82
- private parseData(): void {
83
- try {
84
- if (!(this.children[0] instanceof HTMLScriptElement)) {
85
- return;
86
- }
87
- let data = JSON.parse(this.children[0].innerHTML);
88
- this.options = data.options;
89
- this.optionsWithDescriptions = data.optionsWithDescriptions;
90
- this.hasValueDependency = data.hasValueDependency;
91
- this.noValueDependency = data.noValueDependency;
92
- this.dependencies = data.dependencies;
93
- this.required = data.required;
94
- this.name = data.name;
95
- this.allDependenciesMustBeMet = data.allDependenciesMustBeMet;
96
- this.multi = data.multi;
97
- this.max = data.max;
98
- this.min = data.min;
99
- this.step = data.step;
100
- this.customValue = data.value;
101
- } catch (ex) {
102
- console.error(ex);
103
- }
104
- }
105
-
106
- private bindEvents(): void {
107
- this.onValidate.on(e => {
108
- if (this.valid) {
109
- if (this.closest('.custom-validation-target')) {
110
- this.closest('.custom-validation-target').classList.remove("invalid");
111
- this.closest('.custom-validation-target').classList.add("valid");
112
- }
113
- } else {
114
- if (this.closest('.custom-validation-target')) {
115
- this.closest('.custom-validation-target').classList.add("invalid");
116
- this.closest('.custom-validation-target').classList.remove("valid");
117
- }
118
- this.domUtil.focus();
119
- }
120
- });
121
- this.onChange.on(e => {
122
- if (this.touched) {
123
- this.validate();
124
- }
125
- });
126
- }
127
-
128
- private setAttributes(): void {
129
- this.setAttribute("custom-input", "");
130
- this.setAttribute("name", this.name);
131
- }
132
-
133
- private bindDependencies(): void {
134
- if (this.hasValueDependency && this.hasValueDependency.items.length) {
135
- for (const fieldName of this.hasValueDependency.items) {
136
- this.bindDependency(fieldName, "has");
137
- }
138
- }
139
-
140
- if (this.noValueDependency && this.noValueDependency.items.length) {
141
- for (const fieldName of this.noValueDependency.items) {
142
- this.bindDependency(fieldName, "no");
143
- }
144
- }
145
-
146
- if (this.dependencies && this.dependencies.length) {
147
- for (const index in this.dependencies) {
148
- if (this.dependencies.hasOwnProperty(index)) {
149
- const dependency = this.dependencies[index];
150
- for (const fieldName of dependency.items) {
151
- this.bindDependency(
152
- fieldName,
153
- "custom",
154
- dependency.value,
155
- dependency.criteria,
156
- );
157
- }
158
- }
159
- }
160
- }
161
- }
162
-
163
- private bindDependency(elementName: string, type: string, value?: string, criteria?: string,): void {
164
- let element = document.querySelector(`[name="${elementName}"]`) as CustomInputElement;
165
- if (element instanceof CustomInputElement) {
166
- element.compareVlaues.push(value);
167
- if (this.dependentOnList.hasOwnProperty(element.name)) {
168
- return;
169
- }
170
- let isVisibleByDefault = type === "no";
171
- element.RegisterDependentOn(this.name, isVisibleByDefault);
172
- this.onChange.on(e => {
173
- let IsConditionMatched = false;
174
- if (type === "has") {
175
- IsConditionMatched = !!e.value;
176
- }
177
- if (type === "no") {
178
- IsConditionMatched = !e.value;
179
- }
180
- if (type === "custom") {
181
- if (criteria === "Exact") {
182
- IsConditionMatched = element.isValueConditionMatched(e.value);
183
- } else if (criteria === "LessThan") {
184
- IsConditionMatched = e.value < value;
185
- } else if (criteria === "MoreThan") {
186
- IsConditionMatched = e.value > value;
187
- }
188
- }
189
- element.DependentOnStateChanged(this.name, IsConditionMatched);
190
- });
191
- this.onVisibilityChanged.on(e => {
192
- if (this.visibilityState) {
193
- this.onChange.emit(
194
- new CustomElementEventArgs(this.value, "change"),
195
- );
196
- } else {
197
- element.DependentOnStateChanged(this.name, false);
198
- }
199
- });
200
- }
201
- }
202
-
203
- private setVisibility() {
204
- if (this.allDependenciesMustBeMet) {
205
- this.visibilityState = Object.values(this.dependentOnList).every(state => state);
206
- } else {
207
- this.visibilityState = Object.values(this.dependentOnList).some(state => state);
208
- }
209
-
210
- if (this.visibilityState) {
211
- this.show();
212
- } else {
213
- this.hide();
214
- }
215
- this.onVisibilityChanged.emit(new CustomElementEventArgs(this.value, "VisibilityChanged"));
216
- }
217
-
218
- private hide() {
219
- this.setAttribute("hidden", "");
220
- if (this.closest('.custom-validation-target')) {
221
- this.closest('.custom-validation-target').setAttribute("hidden", "");
222
- }
223
- }
224
-
225
- private show() {
226
- this.removeAttribute("hidden");
227
- if (this.closest('.custom-validation-target')) {
228
- this.closest('.custom-validation-target').removeAttribute("hidden");
229
- }
230
- }
231
-
232
- protected getChildInput(selector: string): HTMLInputElement {
233
- let element: any = this;
234
- if (this.shadowRoot) {
235
- element = this.shadowRoot;
236
- }
237
- return element.querySelector(selector) as HTMLInputElement;
238
- }
239
-
240
- protected getChildInputs(selector: string): HTMLInputElement[] {
241
- let element: any = this;
242
- if (this.shadowRoot) {
243
- element = this.shadowRoot;
244
- }
245
- return ArrayUtil.FromNodeList(
246
- element.querySelectorAll(selector),
247
- ) as HTMLInputElement[];
248
- }
249
-
250
- protected getChildElement(selector: string): HTMLElement {
251
- let element: any = this;
252
- if (this.shadowRoot) {
253
- element = this.shadowRoot;
254
- }
255
- return element.querySelector(selector) as HTMLElement;
256
- }
257
-
258
- protected getChildElements(selector: string): HTMLElement[] {
259
- let element: any = this;
260
- if (this.shadowRoot) {
261
- element = this.shadowRoot;
262
- }
263
- return element.querySelectorAll(selector) as HTMLElement[];
264
- }
265
-
266
- public RegisterDependentOn(name: string, initialValue: boolean = false) {
267
- this.dependentOnList[name] = initialValue;
268
- this.setVisibility();
269
- }
270
-
271
- public DependentOnStateChanged(name: string, state: boolean) {
272
- if (this.dependentOnList.hasOwnProperty(name)) {
273
- this.dependentOnList[name] = state;
274
- }
275
- this.setVisibility();
276
- }
277
- }
1
+ import { CustomElementEvent, CustomElementEventArgs } from "./CustomEvents";
2
+ import OptionWithDescription from "./Models/OptionWithDescription";
3
+ import ArrayUtil from "./Utilities/ArrayUtil";
4
+ import DomUtil from "./Utilities/DomUtil";
5
+
6
+ class IDictionary<TValue> {
7
+ [index: string]: TValue;
8
+ }
9
+ export abstract class CustomInputElement extends HTMLElement {
10
+ private dependentOnList = new IDictionary<boolean>();
11
+ private visibilityState = true;
12
+
13
+ protected touched = false;
14
+ protected domUtil: DomUtil;
15
+
16
+ protected hasValueDependency: any;
17
+ protected noValueDependency: any;
18
+ protected dependencies: any[];
19
+
20
+ public onChange = new CustomElementEvent<CustomElementEventArgs>();
21
+ public onValidate = new CustomElementEvent<CustomElementEventArgs>();
22
+ public onVisibilityChanged = new CustomElementEvent<CustomElementEventArgs>();
23
+
24
+ public name: string;
25
+ public options: any[];
26
+ public optionsWithDescriptions: OptionWithDescription[];
27
+ public required: boolean;
28
+ public customValue: string;
29
+ public allDependenciesMustBeMet: boolean = false;
30
+ public multi: boolean = false;
31
+ public max: any;
32
+ public min: any;
33
+ public step: any;
34
+
35
+ constructor() {
36
+ super();
37
+ }
38
+
39
+ abstract get value(): any;
40
+ abstract set value(value);
41
+ abstract get valid(): boolean;
42
+
43
+ abstract initChildInputs(): void;
44
+ abstract validate(): void;
45
+ abstract change($event): void;
46
+
47
+ compareVlaues = [];
48
+
49
+ isValueConditionMatched(val: any) {
50
+ if (val && Array.isArray(val) && val.length) {
51
+ let result = false;
52
+ val.forEach(element => {
53
+ const elementMatched = this.compareVlaues.findIndex(x => x == element) !== -1;
54
+ if (elementMatched) {
55
+ result = true;
56
+ return;
57
+ }
58
+ });
59
+ return result;
60
+ }
61
+ return this.compareVlaues.findIndex(x => x == val) !== -1;
62
+ }
63
+
64
+ connectedCallback(): void {
65
+ this.init();
66
+ this.setAttributes();
67
+ }
68
+
69
+ init(): void {
70
+ this.style.width = "100%";
71
+ this.domUtil = new DomUtil(this);
72
+ this.parseData();
73
+ this.initChildInputs();
74
+ this.bindEvents();
75
+ this.setAttributes();
76
+
77
+ window.addEventListener("load", () => {
78
+ this.bindDependencies();
79
+ });
80
+ }
81
+
82
+ private parseData(): void {
83
+ try {
84
+ if (!(this.children[0] instanceof HTMLScriptElement)) {
85
+ return;
86
+ }
87
+ let data = JSON.parse(this.children[0].innerHTML);
88
+ this.options = data.options;
89
+ this.optionsWithDescriptions = data.optionsWithDescriptions;
90
+ this.hasValueDependency = data.hasValueDependency;
91
+ this.noValueDependency = data.noValueDependency;
92
+ this.dependencies = data.dependencies;
93
+ this.required = data.required;
94
+ this.name = data.name;
95
+ this.allDependenciesMustBeMet = data.allDependenciesMustBeMet;
96
+ this.multi = data.multi;
97
+ this.max = data.max;
98
+ this.min = data.min;
99
+ this.step = data.step;
100
+ this.customValue = data.value;
101
+ } catch (ex) {
102
+ console.error(ex);
103
+ }
104
+ }
105
+
106
+ private bindEvents(): void {
107
+ this.onValidate.on(e => {
108
+ if (this.valid) {
109
+ if (this.closest('.custom-validation-target')) {
110
+ this.closest('.custom-validation-target').classList.remove("invalid");
111
+ this.closest('.custom-validation-target').classList.add("valid");
112
+ }
113
+ } else {
114
+ if (this.closest('.custom-validation-target')) {
115
+ this.closest('.custom-validation-target').classList.add("invalid");
116
+ this.closest('.custom-validation-target').classList.remove("valid");
117
+ }
118
+ this.domUtil.focus();
119
+ }
120
+ });
121
+ this.onChange.on(e => {
122
+ if (this.touched) {
123
+ this.validate();
124
+ }
125
+ });
126
+ }
127
+
128
+ private setAttributes(): void {
129
+ this.setAttribute("custom-input", "");
130
+ this.setAttribute("name", this.name);
131
+ }
132
+
133
+ private bindDependencies(): void {
134
+ if (this.hasValueDependency && this.hasValueDependency.items.length) {
135
+ for (const fieldName of this.hasValueDependency.items) {
136
+ this.bindDependency(fieldName, "has");
137
+ }
138
+ }
139
+
140
+ if (this.noValueDependency && this.noValueDependency.items.length) {
141
+ for (const fieldName of this.noValueDependency.items) {
142
+ this.bindDependency(fieldName, "no");
143
+ }
144
+ }
145
+
146
+ if (this.dependencies && this.dependencies.length) {
147
+ for (const index in this.dependencies) {
148
+ if (this.dependencies.hasOwnProperty(index)) {
149
+ const dependency = this.dependencies[index];
150
+ for (const fieldName of dependency.items) {
151
+ this.bindDependency(
152
+ fieldName,
153
+ "custom",
154
+ dependency.value,
155
+ dependency.criteria,
156
+ );
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+
163
+ private bindDependency(elementName: string, type: string, value?: string, criteria?: string,): void {
164
+ let element = document.querySelector(`[name="${elementName}"]`) as CustomInputElement;
165
+ if (element instanceof CustomInputElement) {
166
+ element.compareVlaues.push(value);
167
+ if (this.dependentOnList.hasOwnProperty(element.name)) {
168
+ return;
169
+ }
170
+ let isVisibleByDefault = type === "no";
171
+ element.RegisterDependentOn(this.name, isVisibleByDefault);
172
+ this.onChange.on(e => {
173
+ let IsConditionMatched = false;
174
+ if (type === "has") {
175
+ IsConditionMatched = !!e.value;
176
+ }
177
+ if (type === "no") {
178
+ IsConditionMatched = !e.value;
179
+ }
180
+ if (type === "custom") {
181
+ if (criteria === "Exact") {
182
+ IsConditionMatched = element.isValueConditionMatched(e.value);
183
+ } else if (criteria === "LessThan") {
184
+ IsConditionMatched = e.value < value;
185
+ } else if (criteria === "MoreThan") {
186
+ IsConditionMatched = e.value > value;
187
+ }
188
+ }
189
+ element.DependentOnStateChanged(this.name, IsConditionMatched);
190
+ });
191
+ this.onVisibilityChanged.on(e => {
192
+ if (this.visibilityState) {
193
+ this.onChange.emit(
194
+ new CustomElementEventArgs(this.value, "change"),
195
+ );
196
+ } else {
197
+ element.DependentOnStateChanged(this.name, false);
198
+ }
199
+ });
200
+ }
201
+ }
202
+
203
+ private setVisibility() {
204
+ if (this.allDependenciesMustBeMet) {
205
+ this.visibilityState = Object.values(this.dependentOnList).every(state => state);
206
+ } else {
207
+ this.visibilityState = Object.values(this.dependentOnList).some(state => state);
208
+ }
209
+
210
+ if (this.visibilityState) {
211
+ this.show();
212
+ } else {
213
+ this.hide();
214
+ }
215
+ this.onVisibilityChanged.emit(new CustomElementEventArgs(this.value, "VisibilityChanged"));
216
+ }
217
+
218
+ private hide() {
219
+ this.setAttribute("hidden", "");
220
+ if (this.closest('.custom-validation-target')) {
221
+ this.closest('.custom-validation-target').setAttribute("hidden", "");
222
+ }
223
+ }
224
+
225
+ private show() {
226
+ this.removeAttribute("hidden");
227
+ if (this.closest('.custom-validation-target')) {
228
+ this.closest('.custom-validation-target').removeAttribute("hidden");
229
+ }
230
+ }
231
+
232
+ protected getChildInput(selector: string): HTMLInputElement {
233
+ let element: any = this;
234
+ if (this.shadowRoot) {
235
+ element = this.shadowRoot;
236
+ }
237
+ return element.querySelector(selector) as HTMLInputElement;
238
+ }
239
+
240
+ protected getChildInputs(selector: string): HTMLInputElement[] {
241
+ let element: any = this;
242
+ if (this.shadowRoot) {
243
+ element = this.shadowRoot;
244
+ }
245
+ return ArrayUtil.FromNodeList(
246
+ element.querySelectorAll(selector),
247
+ ) as HTMLInputElement[];
248
+ }
249
+
250
+ protected getChildElement(selector: string): HTMLElement {
251
+ let element: any = this;
252
+ if (this.shadowRoot) {
253
+ element = this.shadowRoot;
254
+ }
255
+ return element.querySelector(selector) as HTMLElement;
256
+ }
257
+
258
+ protected getChildElements(selector: string): HTMLElement[] {
259
+ let element: any = this;
260
+ if (this.shadowRoot) {
261
+ element = this.shadowRoot;
262
+ }
263
+ return element.querySelectorAll(selector) as HTMLElement[];
264
+ }
265
+
266
+ public RegisterDependentOn(name: string, initialValue: boolean = false) {
267
+ this.dependentOnList[name] = initialValue;
268
+ this.setVisibility();
269
+ }
270
+
271
+ public DependentOnStateChanged(name: string, state: boolean) {
272
+ if (this.dependentOnList.hasOwnProperty(name)) {
273
+ this.dependentOnList[name] = state;
274
+ }
275
+ this.setVisibility();
276
+ }
277
+ }
@@ -1,16 +1,16 @@
1
- export default abstract class BaseDictionary {
2
- abstract dictionary: any;
3
-
4
- get(key: string): string {
5
- const keyParts = key.split('.');
6
- var result: string | any = this.dictionary;
7
- keyParts.forEach(keyPart => {
8
- result = result[keyPart];
9
- if (!result) {
10
- result = key;
11
- return;
12
- }
13
- });
14
- return result;
15
- }
1
+ export default abstract class BaseDictionary {
2
+ abstract dictionary: any;
3
+
4
+ get(key: string): string {
5
+ const keyParts = key.split('.');
6
+ var result: string | any = this.dictionary;
7
+ keyParts.forEach(keyPart => {
8
+ result = result[keyPart];
9
+ if (!result) {
10
+ result = key;
11
+ return;
12
+ }
13
+ });
14
+ return result;
15
+ }
16
16
  }
@@ -1,18 +1,18 @@
1
- import BaseDictionary from "./Base/BaseDictionary";
2
-
3
- export default class CzechDictionary extends BaseDictionary {
4
-
5
- dictionary: any = {
6
- AddressElement: {
7
- Address: "adresa",
8
- City: "město",
9
- Country: "země",
10
- Zip: "poštovní směrovací číslo"
11
- },
12
- BankElement: {
13
- Account: "Účet",
14
- RegistrationNumber: "Registrační číslo"
15
- }
16
- };
17
-
18
- }
1
+ import BaseDictionary from "./Base/BaseDictionary";
2
+
3
+ export default class CzechDictionary extends BaseDictionary {
4
+
5
+ dictionary: any = {
6
+ AddressElement: {
7
+ Address: "adresa",
8
+ City: "město",
9
+ Country: "země",
10
+ Zip: "poštovní směrovací číslo"
11
+ },
12
+ BankElement: {
13
+ Account: "Účet",
14
+ RegistrationNumber: "Registrační číslo"
15
+ }
16
+ };
17
+
18
+ }
@@ -1,18 +1,18 @@
1
- import BaseDictionary from "./Base/BaseDictionary";
2
-
3
- export default class DanishDictionary extends BaseDictionary {
4
-
5
- dictionary: any = {
6
- AddressElement: {
7
- Address: "adresse",
8
- City: "by",
9
- Country: "land",
10
- Zip: "postnummer"
11
- },
12
- BankElement: {
13
- Account: "Kontonummer",
14
- RegistrationNumber: "Registreringsnummer"
15
- }
16
- };
17
-
1
+ import BaseDictionary from "./Base/BaseDictionary";
2
+
3
+ export default class DanishDictionary extends BaseDictionary {
4
+
5
+ dictionary: any = {
6
+ AddressElement: {
7
+ Address: "adresse",
8
+ City: "by",
9
+ Country: "land",
10
+ Zip: "postnummer"
11
+ },
12
+ BankElement: {
13
+ Account: "Kontonummer",
14
+ RegistrationNumber: "Registreringsnummer"
15
+ }
16
+ };
17
+
18
18
  }