@watermarkinsights/ripple 3.6.0 → 3.7.0-3

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 (182) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/{functions-068b9a56.js → functions-f0693632.js} +708 -442
  3. package/dist/cjs/{global-51e309da.js → global-69ca443d.js} +65 -65
  4. package/dist/cjs/{http-service-9e8c4dd5.js → http-service-494d81de.js} +49 -49
  5. package/dist/cjs/{interfaces-30a74c1f.js → interfaces-a3338581.js} +29 -29
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/priv-chart-popover.cjs.entry.js +78 -78
  8. package/dist/cjs/priv-datepicker.cjs.entry.js +667 -667
  9. package/dist/cjs/priv-navigator-button.cjs.entry.js +18 -18
  10. package/dist/cjs/priv-navigator-item.cjs.entry.js +23 -23
  11. package/dist/cjs/ripple.cjs.js +2 -2
  12. package/dist/cjs/wm-action-menu_2.cjs.entry.js +341 -341
  13. package/dist/cjs/wm-button.cjs.entry.js +237 -219
  14. package/dist/cjs/wm-chart-slice.cjs.entry.js +13 -13
  15. package/dist/cjs/wm-chart.cjs.entry.js +474 -474
  16. package/dist/cjs/wm-datepicker.cjs.entry.js +262 -256
  17. package/dist/cjs/wm-input.cjs.entry.js +134 -134
  18. package/dist/cjs/wm-modal-footer.cjs.entry.js +31 -31
  19. package/dist/cjs/wm-modal-header.cjs.entry.js +34 -34
  20. package/dist/cjs/wm-modal.cjs.entry.js +161 -161
  21. package/dist/cjs/wm-navigator.cjs.entry.js +268 -268
  22. package/dist/cjs/wm-network-uploader.cjs.entry.js +421 -421
  23. package/dist/cjs/wm-option_2.cjs.entry.js +494 -494
  24. package/dist/cjs/wm-pagination.cjs.entry.js +167 -167
  25. package/dist/cjs/wm-search.cjs.entry.js +231 -231
  26. package/dist/cjs/wm-snackbar.cjs.entry.js +170 -170
  27. package/dist/cjs/wm-tab-item_3.cjs.entry.js +296 -300
  28. package/dist/cjs/wm-tag-input.cjs.entry.js +570 -570
  29. package/dist/cjs/wm-timepicker.cjs.entry.js +380 -380
  30. package/dist/cjs/wm-toggletip.cjs.entry.js +124 -124
  31. package/dist/cjs/wm-uploader.cjs.entry.js +347 -347
  32. package/dist/cjs/wm-wrapper.cjs.entry.js +12 -12
  33. package/dist/collection/components/wm-action-menu/wm-action-menu.js +460 -460
  34. package/dist/collection/components/wm-button/wm-button.css +37 -4
  35. package/dist/collection/components/wm-button/wm-button.js +503 -485
  36. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.js +232 -232
  37. package/dist/collection/components/wm-chart/wm-chart-slice.js +64 -64
  38. package/dist/collection/components/wm-chart/wm-chart.js +718 -719
  39. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +1015 -1015
  40. package/dist/collection/components/wm-datepicker/wm-datepicker.js +468 -462
  41. package/dist/collection/components/wm-input/wm-input.js +423 -424
  42. package/dist/collection/components/wm-menuitem/wm-menuitem.js +444 -444
  43. package/dist/collection/components/wm-modal/wm-modal-footer.js +141 -141
  44. package/dist/collection/components/wm-modal/wm-modal-header.js +92 -92
  45. package/dist/collection/components/wm-modal/wm-modal.js +459 -459
  46. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +97 -97
  47. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +114 -114
  48. package/dist/collection/components/wm-navigator/wm-navigator.js +468 -468
  49. package/dist/collection/components/wm-option/wm-option.js +422 -422
  50. package/dist/collection/components/wm-pagination/wm-pagination.js +368 -368
  51. package/dist/collection/components/wm-search/wm-search.js +479 -479
  52. package/dist/collection/components/wm-select/wm-select.js +720 -720
  53. package/dist/collection/components/wm-snackbar/wm-snackbar.js +297 -297
  54. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +216 -219
  55. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +330 -331
  56. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +104 -104
  57. package/dist/collection/components/wm-tag-input/wm-tag-input.js +801 -801
  58. package/dist/collection/components/wm-timepicker/wm-timepicker.js +580 -580
  59. package/dist/collection/components/wm-toggletip/wm-toggletip.js +241 -241
  60. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.css +37 -4
  61. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.js +753 -753
  62. package/dist/collection/components/wm-uploader/wm-uploader.css +37 -4
  63. package/dist/collection/components/wm-uploader/wm-uploader.js +748 -748
  64. package/dist/collection/components/wm-wrapper/wm-wrapper.js +27 -27
  65. package/dist/collection/dev/scripts.js +20 -20
  66. package/dist/collection/global/__mocks__/functions.js +6 -6
  67. package/dist/collection/global/functions.js +445 -445
  68. package/dist/collection/global/global.js +72 -72
  69. package/dist/collection/global/interfaces.js +49 -49
  70. package/dist/collection/global/services/__mocks__/http-service.js +130 -130
  71. package/dist/collection/global/services/http-service.js +50 -50
  72. package/dist/collection/lang/lang.js +5 -5
  73. package/dist/collection/lang/missing.js +39 -39
  74. package/dist/collection/lang/piglatin.js +93 -93
  75. package/dist/esm/{functions-122ab496.js → functions-cbfc81d1.js} +708 -442
  76. package/dist/esm/{global-c36ac692.js → global-a12289f9.js} +65 -65
  77. package/dist/esm/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +49 -49
  78. package/dist/esm/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +29 -29
  79. package/dist/esm/loader.js +2 -2
  80. package/dist/esm/polyfills/core-js.js +0 -0
  81. package/dist/esm/polyfills/dom.js +0 -0
  82. package/dist/esm/polyfills/es5-html-element.js +0 -0
  83. package/dist/esm/polyfills/index.js +0 -0
  84. package/dist/esm/polyfills/system.js +0 -0
  85. package/dist/esm/priv-chart-popover.entry.js +78 -78
  86. package/dist/esm/priv-datepicker.entry.js +667 -667
  87. package/dist/esm/priv-navigator-button.entry.js +18 -18
  88. package/dist/esm/priv-navigator-item.entry.js +23 -23
  89. package/dist/esm/ripple.js +2 -2
  90. package/dist/esm/wm-action-menu_2.entry.js +341 -341
  91. package/dist/esm/wm-button.entry.js +237 -219
  92. package/dist/esm/wm-chart-slice.entry.js +13 -13
  93. package/dist/esm/wm-chart.entry.js +474 -474
  94. package/dist/esm/wm-datepicker.entry.js +262 -256
  95. package/dist/esm/wm-input.entry.js +134 -134
  96. package/dist/esm/wm-modal-footer.entry.js +31 -31
  97. package/dist/esm/wm-modal-header.entry.js +34 -34
  98. package/dist/esm/wm-modal.entry.js +161 -161
  99. package/dist/esm/wm-navigator.entry.js +268 -268
  100. package/dist/esm/wm-network-uploader.entry.js +421 -421
  101. package/dist/esm/wm-option_2.entry.js +494 -494
  102. package/dist/esm/wm-pagination.entry.js +167 -167
  103. package/dist/esm/wm-search.entry.js +231 -231
  104. package/dist/esm/wm-snackbar.entry.js +170 -170
  105. package/dist/esm/wm-tab-item_3.entry.js +296 -300
  106. package/dist/esm/wm-tag-input.entry.js +570 -570
  107. package/dist/esm/wm-timepicker.entry.js +380 -380
  108. package/dist/esm/wm-toggletip.entry.js +124 -124
  109. package/dist/esm/wm-uploader.entry.js +347 -347
  110. package/dist/esm/wm-wrapper.entry.js +12 -12
  111. package/dist/ripple/{p-9a8fbfad.entry.js → p-0c488d9d.entry.js} +1 -1
  112. package/dist/ripple/{p-54c39a0b.entry.js → p-111f705a.entry.js} +1 -1
  113. package/dist/ripple/{p-e36853fd.entry.js → p-266e4bc2.entry.js} +1 -1
  114. package/dist/ripple/p-2caeca6b.entry.js +1 -0
  115. package/dist/ripple/{p-ecbb441f.entry.js → p-30f13477.entry.js} +1 -1
  116. package/dist/ripple/{p-888bec42.js → p-43f1298b.js} +0 -0
  117. package/dist/ripple/p-4414cb64.entry.js +1 -0
  118. package/dist/ripple/p-4870d369.entry.js +1 -0
  119. package/dist/ripple/p-5585f23e.entry.js +1 -0
  120. package/dist/ripple/p-74438aab.entry.js +1 -0
  121. package/dist/ripple/p-7d9c18b9.entry.js +1 -0
  122. package/dist/ripple/{p-a61b07de.entry.js → p-8a4bac13.entry.js} +1 -1
  123. package/dist/ripple/{p-4b72f4eb.entry.js → p-938a5ba4.entry.js} +1 -1
  124. package/dist/ripple/{p-97884327.entry.js → p-ad73d523.entry.js} +1 -1
  125. package/dist/ripple/{p-08e67884.js → p-b5edcf38.js} +2 -2
  126. package/dist/ripple/{p-067909ce.entry.js → p-b9656d44.entry.js} +1 -1
  127. package/dist/ripple/{p-2aa79663.entry.js → p-bd05632b.entry.js} +1 -1
  128. package/dist/ripple/{p-f6bed262.entry.js → p-c0b0510a.entry.js} +1 -1
  129. package/dist/ripple/p-c296ff27.js +1 -0
  130. package/dist/ripple/{p-1c23f228.entry.js → p-cd466a5b.entry.js} +1 -1
  131. package/dist/ripple/p-da1435f1.entry.js +1 -0
  132. package/dist/ripple/p-e3765b8e.entry.js +1 -0
  133. package/dist/ripple/{p-803b19aa.entry.js → p-f3569e91.entry.js} +1 -1
  134. package/dist/ripple/{p-a6d6eae7.js → p-fd8070fb.js} +0 -0
  135. package/dist/ripple/ripple.esm.js +1 -1
  136. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +48 -48
  137. package/dist/types/components/wm-button/wm-button.d.ts +44 -44
  138. package/dist/types/components/wm-chart/priv-chart-popover/priv-chart-popover.d.ts +23 -23
  139. package/dist/types/components/wm-chart/wm-chart-slice.d.ts +8 -8
  140. package/dist/types/components/wm-chart/wm-chart.d.ts +82 -82
  141. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +76 -76
  142. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +41 -41
  143. package/dist/types/components/wm-input/wm-input.d.ts +46 -46
  144. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +34 -34
  145. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +15 -15
  146. package/dist/types/components/wm-modal/wm-modal-header.d.ts +12 -12
  147. package/dist/types/components/wm-modal/wm-modal.d.ts +41 -41
  148. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +10 -10
  149. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +13 -13
  150. package/dist/types/components/wm-navigator/wm-navigator.d.ts +61 -61
  151. package/dist/types/components/wm-option/wm-option.d.ts +32 -32
  152. package/dist/types/components/wm-pagination/wm-pagination.d.ts +32 -32
  153. package/dist/types/components/wm-search/wm-search.d.ts +86 -86
  154. package/dist/types/components/wm-select/wm-select.d.ts +66 -66
  155. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +35 -35
  156. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +38 -38
  157. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +53 -53
  158. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +20 -20
  159. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +92 -92
  160. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +61 -61
  161. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +27 -27
  162. package/dist/types/components/wm-uploader/wm-network-uploader/wm-network-uploader.d.ts +85 -85
  163. package/dist/types/components/wm-uploader/wm-uploader.d.ts +80 -80
  164. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +7 -7
  165. package/dist/types/components.d.ts +24 -24
  166. package/dist/types/global/__mocks__/functions.d.ts +6 -6
  167. package/dist/types/global/functions.d.ts +40 -40
  168. package/dist/types/global/global.d.ts +1 -1
  169. package/dist/types/global/interfaces.d.ts +34 -34
  170. package/dist/types/global/services/__mocks__/http-service.d.ts +6 -6
  171. package/dist/types/global/services/http-service.d.ts +4 -4
  172. package/dist/types/lang/lang.d.ts +5 -5
  173. package/package.json +47 -47
  174. package/dist/ripple/p-2b3f75eb.entry.js +0 -1
  175. package/dist/ripple/p-3ff67fd5.entry.js +0 -1
  176. package/dist/ripple/p-4629470d.entry.js +0 -1
  177. package/dist/ripple/p-4b1f14bb.entry.js +0 -1
  178. package/dist/ripple/p-7da00f33.entry.js +0 -1
  179. package/dist/ripple/p-888c18c3.entry.js +0 -1
  180. package/dist/ripple/p-8c93b893.js +0 -1
  181. package/dist/ripple/p-a2b02aec.entry.js +0 -1
  182. package/dist/ripple/p-f95c2283.entry.js +0 -1
@@ -1,424 +1,423 @@
1
- import { h, Component, Element, Event, Host, Prop, State, Watch } from "@stencil/core";
2
- import { intl, generateId, isRelatedTarget } from "../../global/functions";
3
- export class Input {
4
- constructor() {
5
- this.labelPosition = "top";
6
- this.value = "";
7
- this.disabled = false;
8
- this.placeholder = "";
9
- this.requiredField = false;
10
- this.type = "text";
11
- this.step = 1;
12
- this.announcement = "";
13
- this.previousBlurredValue = "";
14
- this.displayedErrorMessage = "";
15
- this.uid = "";
16
- this.requiredErrorMessage = intl.formatMessage({
17
- id: "global.requiredError",
18
- defaultMessage: "This field is required.",
19
- });
20
- this.numberErrorMessage = intl.formatMessage({
21
- id: "input.numberError",
22
- defaultMessage: "Please enter a valid number.",
23
- });
24
- }
25
- get charCount() {
26
- return this.value.length;
27
- }
28
- componentWillLoad() {
29
- this.uid = this.el.id ? this.el.id : generateId();
30
- this.el.focus = function () {
31
- if (!this.disabled) {
32
- this.shadowRoot.querySelector("input").focus();
33
- }
34
- };
35
- if (!this.label) {
36
- console.error("wm-input requires the label property");
37
- }
38
- }
39
- componentDidLoad() {
40
- if (this.value) {
41
- this.inputEl.value = this.value;
42
- this.previousBlurredValue = this.inputEl.value;
43
- }
44
- }
45
- handleErrorMessage() {
46
- this.displayedErrorMessage = this.validate();
47
- }
48
- handleKeyDown(ev) {
49
- // in most browsers, onInput doesn't fire if the input's maxLength is reached
50
- // to handle the case where a user continues to type after reaching the character limit, the keyDown event must be used
51
- const isModifierKey = ev.ctrlKey || ev.metaKey || ev.altKey;
52
- const isCharacter = /^.$/.test(ev.key) && !isModifierKey;
53
- const hasReachedCharacterLimit = isCharacter && this.characterLimit && this.inputEl.value.length >= this.characterLimit;
54
- if (hasReachedCharacterLimit) {
55
- this.announce(this.generateCharacterLimitWarning(this.charCount, this.characterLimit));
56
- }
57
- }
58
- handleBlur(ev) {
59
- if (this.value !== this.previousBlurredValue) {
60
- this.wmInputValueChanged.emit({ value: this.value });
61
- }
62
- this.previousBlurredValue = this.value;
63
- // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)
64
- const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);
65
- if (!shouldPreventValidation) {
66
- this.displayedErrorMessage = this.validate();
67
- }
68
- this.inputWrapperEl.classList.remove("focus");
69
- }
70
- handleInput(ev) {
71
- this.value = ev.target.value;
72
- if (this.characterLimit && this.charCount >= this.characterLimit - 5) {
73
- this.announce(this.generateCharacterLimitWarning(this.charCount, this.characterLimit));
74
- }
75
- }
76
- handleFocus() {
77
- this.inputWrapperEl.classList.add("focus");
78
- }
79
- validate() {
80
- // These rules are in priority order
81
- // i.e. an input that is triggering both required and number errors will only show the number one but it's first
82
- const validationRules = [this.validateNumber.bind(this), this.validateRequired.bind(this)];
83
- if (this.errorMessage) {
84
- return this.errorMessage;
85
- }
86
- else {
87
- // sets newError to first rule that returns an error
88
- return validationRules.reduce((prev, current) => (prev ? prev : current()), "");
89
- }
90
- }
91
- validateRequired() {
92
- return this.requiredField && this.value === "" ? this.requiredErrorMessage : "";
93
- }
94
- validateNumber() {
95
- return this.type === "number" && this.inputEl.validity.badInput ? this.numberErrorMessage : "";
96
- }
97
- announce(message) {
98
- if (this.liveRegionEl.textContent === message) {
99
- message += "\u00A0";
100
- }
101
- this.announcement = message;
102
- }
103
- generateCharacterLimitWarning(charCount, charLimit) {
104
- const charactersEnteredMessage = intl.formatMessage({
105
- id: "global.charactersEntered",
106
- defaultMessage: "{x, number} of {y, number} characters entered.",
107
- description: "for screen readers",
108
- }, { x: charCount, y: charLimit });
109
- const characterLimitReachedMessage = intl.formatMessage({
110
- id: "global.characterLimitReached",
111
- defaultMessage: "No additional characters will be entered.",
112
- description: "for screen readers",
113
- });
114
- return `${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`;
115
- }
116
- generateCharacterLimitLabel(characterLimit) {
117
- return intl.formatMessage({
118
- id: "global.characterLimit",
119
- defaultMessage: "{limit, number} characters allowed.",
120
- description: "for screen readers",
121
- }, { limit: characterLimit });
122
- }
123
- renderErrorMessage() {
124
- return this.errorMessage || this.displayedErrorMessage;
125
- }
126
- render() {
127
- return (h(Host, { id: this.uid },
128
- h("div", { class: `wrapper label-${this.labelPosition} ${this.errorMessage || this.displayedErrorMessage ? "invalid" : ""}`, ref: (el) => (this.inputWrapperEl = el) },
129
- h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { htmlFor: `inputfield-${this.uid}`, class: "label" },
130
- this.label,
131
- this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
132
- h("div", { class: "inner-wrapper" },
133
- h("div", { class: "inputfield-wrapper" },
134
- h("input", { ref: (el) => (this.inputEl = el), id: `inputfield-${this.uid}`, disabled: this.disabled, "aria-label": `${this.label}${this.characterLimit ? " " + this.generateCharacterLimitLabel(this.characterLimit) : ""}`, "aria-describedby": `info-${this.uid} error-${this.uid}`, onInput: (ev) => this.handleInput(ev), onKeyDown: (ev) => this.handleKeyDown(ev), onBlur: (ev) => this.handleBlur(ev), onFocus: this.handleFocus.bind(this), placeholder: this.placeholder, autocomplete: "off", required: this.requiredField, maxLength: this.characterLimit || undefined, type: this.type, step: this.step, max: this.max, min: this.min }),
135
- this.characterLimit && typeof this.characterLimit === "number" ? (h("div", { class: "character-count" },
136
- this.charCount,
137
- "/",
138
- this.characterLimit)) : ("")),
139
- this.info && (h("div", { id: `info-${this.uid}`, class: "info" }, this.info)),
140
- h("div", { id: `error-${this.uid}`, "aria-live": "assertive", class: "error-message", "aria-atomic": "true" }, this.renderErrorMessage()),
141
- h("div", { class: "sr-only", "aria-live": "polite", "aria-atomic": "true", ref: (el) => (this.liveRegionEl = el) }, this.announcement)))));
142
- }
143
- static get is() { return "wm-input"; }
144
- static get encapsulation() { return "shadow"; }
145
- static get originalStyleUrls() { return {
146
- "$": ["wm-input.scss"]
147
- }; }
148
- static get styleUrls() { return {
149
- "$": ["wm-input.css"]
150
- }; }
151
- static get properties() { return {
152
- "label": {
153
- "type": "string",
154
- "mutable": false,
155
- "complexType": {
156
- "original": "string",
157
- "resolved": "string",
158
- "references": {}
159
- },
160
- "required": true,
161
- "optional": false,
162
- "docs": {
163
- "tags": [],
164
- "text": ""
165
- },
166
- "attribute": "label",
167
- "reflect": false
168
- },
169
- "labelPosition": {
170
- "type": "string",
171
- "mutable": false,
172
- "complexType": {
173
- "original": "\"top\" | \"left\" | \"none\"",
174
- "resolved": "\"left\" | \"none\" | \"top\"",
175
- "references": {}
176
- },
177
- "required": false,
178
- "optional": false,
179
- "docs": {
180
- "tags": [],
181
- "text": ""
182
- },
183
- "attribute": "label-position",
184
- "reflect": false,
185
- "defaultValue": "\"top\""
186
- },
187
- "value": {
188
- "type": "string",
189
- "mutable": true,
190
- "complexType": {
191
- "original": "string",
192
- "resolved": "string",
193
- "references": {}
194
- },
195
- "required": false,
196
- "optional": false,
197
- "docs": {
198
- "tags": [],
199
- "text": ""
200
- },
201
- "attribute": "value",
202
- "reflect": true,
203
- "defaultValue": "\"\""
204
- },
205
- "disabled": {
206
- "type": "boolean",
207
- "mutable": false,
208
- "complexType": {
209
- "original": "boolean",
210
- "resolved": "boolean",
211
- "references": {}
212
- },
213
- "required": false,
214
- "optional": false,
215
- "docs": {
216
- "tags": [],
217
- "text": ""
218
- },
219
- "attribute": "disabled",
220
- "reflect": true,
221
- "defaultValue": "false"
222
- },
223
- "info": {
224
- "type": "string",
225
- "mutable": false,
226
- "complexType": {
227
- "original": "string",
228
- "resolved": "string | undefined",
229
- "references": {}
230
- },
231
- "required": false,
232
- "optional": true,
233
- "docs": {
234
- "tags": [],
235
- "text": ""
236
- },
237
- "attribute": "info",
238
- "reflect": false
239
- },
240
- "placeholder": {
241
- "type": "string",
242
- "mutable": false,
243
- "complexType": {
244
- "original": "string",
245
- "resolved": "string",
246
- "references": {}
247
- },
248
- "required": false,
249
- "optional": false,
250
- "docs": {
251
- "tags": [],
252
- "text": ""
253
- },
254
- "attribute": "placeholder",
255
- "reflect": false,
256
- "defaultValue": "\"\""
257
- },
258
- "requiredField": {
259
- "type": "boolean",
260
- "mutable": false,
261
- "complexType": {
262
- "original": "boolean",
263
- "resolved": "boolean",
264
- "references": {}
265
- },
266
- "required": false,
267
- "optional": false,
268
- "docs": {
269
- "tags": [],
270
- "text": ""
271
- },
272
- "attribute": "required-field",
273
- "reflect": false,
274
- "defaultValue": "false"
275
- },
276
- "errorMessage": {
277
- "type": "string",
278
- "mutable": false,
279
- "complexType": {
280
- "original": "string",
281
- "resolved": "string | undefined",
282
- "references": {}
283
- },
284
- "required": false,
285
- "optional": true,
286
- "docs": {
287
- "tags": [],
288
- "text": ""
289
- },
290
- "attribute": "error-message",
291
- "reflect": false
292
- },
293
- "characterLimit": {
294
- "type": "number",
295
- "mutable": false,
296
- "complexType": {
297
- "original": "number",
298
- "resolved": "number | undefined",
299
- "references": {}
300
- },
301
- "required": false,
302
- "optional": true,
303
- "docs": {
304
- "tags": [],
305
- "text": ""
306
- },
307
- "attribute": "character-limit",
308
- "reflect": false
309
- },
310
- "preventValidation": {
311
- "type": "string",
312
- "mutable": false,
313
- "complexType": {
314
- "original": "string",
315
- "resolved": "string | undefined",
316
- "references": {}
317
- },
318
- "required": false,
319
- "optional": true,
320
- "docs": {
321
- "tags": [],
322
- "text": ""
323
- },
324
- "attribute": "prevent-validation",
325
- "reflect": false
326
- },
327
- "type": {
328
- "type": "string",
329
- "mutable": false,
330
- "complexType": {
331
- "original": "\"number\" | \"text\"",
332
- "resolved": "\"number\" | \"text\"",
333
- "references": {}
334
- },
335
- "required": false,
336
- "optional": false,
337
- "docs": {
338
- "tags": [],
339
- "text": ""
340
- },
341
- "attribute": "type",
342
- "reflect": false,
343
- "defaultValue": "\"text\""
344
- },
345
- "step": {
346
- "type": "number",
347
- "mutable": false,
348
- "complexType": {
349
- "original": "number",
350
- "resolved": "number | undefined",
351
- "references": {}
352
- },
353
- "required": false,
354
- "optional": true,
355
- "docs": {
356
- "tags": [],
357
- "text": ""
358
- },
359
- "attribute": "step",
360
- "reflect": false,
361
- "defaultValue": "1"
362
- },
363
- "min": {
364
- "type": "number",
365
- "mutable": false,
366
- "complexType": {
367
- "original": "number",
368
- "resolved": "number | undefined",
369
- "references": {}
370
- },
371
- "required": false,
372
- "optional": true,
373
- "docs": {
374
- "tags": [],
375
- "text": ""
376
- },
377
- "attribute": "min",
378
- "reflect": false
379
- },
380
- "max": {
381
- "type": "number",
382
- "mutable": false,
383
- "complexType": {
384
- "original": "number",
385
- "resolved": "number | undefined",
386
- "references": {}
387
- },
388
- "required": false,
389
- "optional": true,
390
- "docs": {
391
- "tags": [],
392
- "text": ""
393
- },
394
- "attribute": "max",
395
- "reflect": false
396
- }
397
- }; }
398
- static get states() { return {
399
- "announcement": {},
400
- "previousBlurredValue": {},
401
- "displayedErrorMessage": {}
402
- }; }
403
- static get events() { return [{
404
- "method": "wmInputValueChanged",
405
- "name": "wmInputValueChanged",
406
- "bubbles": true,
407
- "cancelable": true,
408
- "composed": true,
409
- "docs": {
410
- "tags": [],
411
- "text": ""
412
- },
413
- "complexType": {
414
- "original": "{ value: string }",
415
- "resolved": "{ value: string; }",
416
- "references": {}
417
- }
418
- }]; }
419
- static get elementRef() { return "el"; }
420
- static get watchers() { return [{
421
- "propName": "errorMessage",
422
- "methodName": "handleErrorMessage"
423
- }]; }
424
- }
1
+ import { h, Component, Element, Event, Host, Prop, State, Watch } from "@stencil/core";
2
+ import { intl, generateId, isRelatedTarget } from "../../global/functions";
3
+ export class Input {
4
+ constructor() {
5
+ this.labelPosition = "top";
6
+ this.value = "";
7
+ this.disabled = false;
8
+ this.placeholder = "";
9
+ this.requiredField = false;
10
+ this.type = "text";
11
+ this.step = 1;
12
+ this.announcement = "";
13
+ this.displayedErrorMessage = "";
14
+ this.uid = "";
15
+ this.previousBlurredValue = "";
16
+ this.requiredErrorMessage = intl.formatMessage({
17
+ id: "global.requiredError",
18
+ defaultMessage: "This field is required.",
19
+ });
20
+ this.numberErrorMessage = intl.formatMessage({
21
+ id: "input.numberError",
22
+ defaultMessage: "Please enter a valid number.",
23
+ });
24
+ }
25
+ get charCount() {
26
+ return this.value.length;
27
+ }
28
+ componentWillLoad() {
29
+ this.uid = this.el.id ? this.el.id : generateId();
30
+ this.el.focus = function () {
31
+ if (!this.disabled) {
32
+ this.shadowRoot.querySelector("input").focus();
33
+ }
34
+ };
35
+ if (!this.label) {
36
+ console.error("wm-input requires the label property");
37
+ }
38
+ }
39
+ componentDidLoad() {
40
+ if (this.value) {
41
+ this.inputEl.value = this.value;
42
+ this.previousBlurredValue = this.inputEl.value;
43
+ }
44
+ }
45
+ handleErrorMessage(newValue) {
46
+ this.displayedErrorMessage = newValue;
47
+ }
48
+ handleKeyDown(ev) {
49
+ // in most browsers, onInput doesn't fire if the input's maxLength is reached
50
+ // to handle the case where a user continues to type after reaching the character limit, the keyDown event must be used
51
+ const isModifierKey = ev.ctrlKey || ev.metaKey || ev.altKey;
52
+ const isCharacter = /^.$/.test(ev.key) && !isModifierKey;
53
+ const hasReachedCharacterLimit = isCharacter && this.characterLimit && this.inputEl.value.length >= this.characterLimit;
54
+ if (hasReachedCharacterLimit) {
55
+ this.announce(this.generateCharacterLimitWarning(this.charCount, this.characterLimit));
56
+ }
57
+ }
58
+ handleBlur(ev) {
59
+ if (this.value !== this.previousBlurredValue) {
60
+ this.wmInputValueChanged.emit({ value: this.value });
61
+ }
62
+ this.previousBlurredValue = this.value;
63
+ // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)
64
+ const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);
65
+ if (!shouldPreventValidation) {
66
+ this.displayedErrorMessage = this.validate();
67
+ }
68
+ this.inputWrapperEl.classList.remove("focus");
69
+ }
70
+ handleInput(ev) {
71
+ this.value = ev.target.value;
72
+ if (this.characterLimit && this.charCount >= this.characterLimit - 5) {
73
+ this.announce(this.generateCharacterLimitWarning(this.charCount, this.characterLimit));
74
+ }
75
+ }
76
+ handleFocus() {
77
+ this.inputWrapperEl.classList.add("focus");
78
+ }
79
+ validate() {
80
+ // These rules are in priority order
81
+ // i.e. an input that is triggering both required and number errors will only show the number one but it's first
82
+ const validationRules = [this.validateNumber.bind(this), this.validateRequired.bind(this)];
83
+ if (this.errorMessage) {
84
+ return this.errorMessage;
85
+ }
86
+ else {
87
+ // sets newError to first rule that returns an error
88
+ return validationRules.reduce((prev, current) => (prev ? prev : current()), "");
89
+ }
90
+ }
91
+ validateRequired() {
92
+ return this.requiredField && this.value === "" ? this.requiredErrorMessage : "";
93
+ }
94
+ validateNumber() {
95
+ return this.type === "number" && this.inputEl.validity.badInput ? this.numberErrorMessage : "";
96
+ }
97
+ announce(message) {
98
+ if (this.liveRegionEl.textContent === message) {
99
+ message += "\u00A0";
100
+ }
101
+ this.announcement = message;
102
+ }
103
+ generateCharacterLimitWarning(charCount, charLimit) {
104
+ const charactersEnteredMessage = intl.formatMessage({
105
+ id: "global.charactersEntered",
106
+ defaultMessage: "{x, number} of {y, number} characters entered.",
107
+ description: "for screen readers",
108
+ }, { x: charCount, y: charLimit });
109
+ const characterLimitReachedMessage = intl.formatMessage({
110
+ id: "global.characterLimitReached",
111
+ defaultMessage: "No additional characters will be entered.",
112
+ description: "for screen readers",
113
+ });
114
+ return `${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`;
115
+ }
116
+ generateCharacterLimitLabel(characterLimit) {
117
+ return intl.formatMessage({
118
+ id: "global.characterLimit",
119
+ defaultMessage: "{limit, number} characters allowed.",
120
+ description: "for screen readers",
121
+ }, { limit: characterLimit });
122
+ }
123
+ renderErrorMessage() {
124
+ return this.errorMessage || this.displayedErrorMessage;
125
+ }
126
+ render() {
127
+ return (h(Host, { id: this.uid },
128
+ h("div", { class: `wrapper label-${this.labelPosition} ${this.errorMessage || this.displayedErrorMessage ? "invalid" : ""}`, ref: (el) => (this.inputWrapperEl = el) },
129
+ h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { htmlFor: `inputfield-${this.uid}`, class: "label" },
130
+ this.label,
131
+ this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
132
+ h("div", { class: "inner-wrapper" },
133
+ h("div", { class: "inputfield-wrapper" },
134
+ h("input", { ref: (el) => (this.inputEl = el), id: `inputfield-${this.uid}`, disabled: this.disabled, "aria-label": `${this.label}${this.characterLimit ? " " + this.generateCharacterLimitLabel(this.characterLimit) : ""}`, "aria-describedby": `info-${this.uid} error-${this.uid}`, onInput: (ev) => this.handleInput(ev), onKeyDown: (ev) => this.handleKeyDown(ev), onBlur: (ev) => this.handleBlur(ev), onFocus: this.handleFocus.bind(this), placeholder: this.placeholder, autocomplete: "off", required: this.requiredField, maxLength: this.characterLimit || undefined, type: this.type, step: this.step, max: this.max, min: this.min }),
135
+ this.characterLimit && typeof this.characterLimit === "number" ? (h("div", { class: "character-count" },
136
+ this.charCount,
137
+ "/",
138
+ this.characterLimit)) : ("")),
139
+ this.info && (h("div", { id: `info-${this.uid}`, class: "info" }, this.info)),
140
+ h("div", { id: `error-${this.uid}`, "aria-live": "assertive", class: "error-message", "aria-atomic": "true" }, this.renderErrorMessage()),
141
+ h("div", { class: "sr-only", "aria-live": "polite", "aria-atomic": "true", ref: (el) => (this.liveRegionEl = el) }, this.announcement)))));
142
+ }
143
+ static get is() { return "wm-input"; }
144
+ static get encapsulation() { return "shadow"; }
145
+ static get originalStyleUrls() { return {
146
+ "$": ["wm-input.scss"]
147
+ }; }
148
+ static get styleUrls() { return {
149
+ "$": ["wm-input.css"]
150
+ }; }
151
+ static get properties() { return {
152
+ "label": {
153
+ "type": "string",
154
+ "mutable": false,
155
+ "complexType": {
156
+ "original": "string",
157
+ "resolved": "string",
158
+ "references": {}
159
+ },
160
+ "required": true,
161
+ "optional": false,
162
+ "docs": {
163
+ "tags": [],
164
+ "text": ""
165
+ },
166
+ "attribute": "label",
167
+ "reflect": false
168
+ },
169
+ "labelPosition": {
170
+ "type": "string",
171
+ "mutable": false,
172
+ "complexType": {
173
+ "original": "\"top\" | \"left\" | \"none\"",
174
+ "resolved": "\"left\" | \"none\" | \"top\"",
175
+ "references": {}
176
+ },
177
+ "required": false,
178
+ "optional": false,
179
+ "docs": {
180
+ "tags": [],
181
+ "text": ""
182
+ },
183
+ "attribute": "label-position",
184
+ "reflect": false,
185
+ "defaultValue": "\"top\""
186
+ },
187
+ "value": {
188
+ "type": "string",
189
+ "mutable": true,
190
+ "complexType": {
191
+ "original": "string",
192
+ "resolved": "string",
193
+ "references": {}
194
+ },
195
+ "required": false,
196
+ "optional": false,
197
+ "docs": {
198
+ "tags": [],
199
+ "text": ""
200
+ },
201
+ "attribute": "value",
202
+ "reflect": true,
203
+ "defaultValue": "\"\""
204
+ },
205
+ "disabled": {
206
+ "type": "boolean",
207
+ "mutable": false,
208
+ "complexType": {
209
+ "original": "boolean",
210
+ "resolved": "boolean",
211
+ "references": {}
212
+ },
213
+ "required": false,
214
+ "optional": false,
215
+ "docs": {
216
+ "tags": [],
217
+ "text": ""
218
+ },
219
+ "attribute": "disabled",
220
+ "reflect": true,
221
+ "defaultValue": "false"
222
+ },
223
+ "info": {
224
+ "type": "string",
225
+ "mutable": false,
226
+ "complexType": {
227
+ "original": "string",
228
+ "resolved": "string | undefined",
229
+ "references": {}
230
+ },
231
+ "required": false,
232
+ "optional": true,
233
+ "docs": {
234
+ "tags": [],
235
+ "text": ""
236
+ },
237
+ "attribute": "info",
238
+ "reflect": false
239
+ },
240
+ "placeholder": {
241
+ "type": "string",
242
+ "mutable": false,
243
+ "complexType": {
244
+ "original": "string",
245
+ "resolved": "string",
246
+ "references": {}
247
+ },
248
+ "required": false,
249
+ "optional": false,
250
+ "docs": {
251
+ "tags": [],
252
+ "text": ""
253
+ },
254
+ "attribute": "placeholder",
255
+ "reflect": false,
256
+ "defaultValue": "\"\""
257
+ },
258
+ "requiredField": {
259
+ "type": "boolean",
260
+ "mutable": false,
261
+ "complexType": {
262
+ "original": "boolean",
263
+ "resolved": "boolean",
264
+ "references": {}
265
+ },
266
+ "required": false,
267
+ "optional": false,
268
+ "docs": {
269
+ "tags": [],
270
+ "text": ""
271
+ },
272
+ "attribute": "required-field",
273
+ "reflect": false,
274
+ "defaultValue": "false"
275
+ },
276
+ "errorMessage": {
277
+ "type": "string",
278
+ "mutable": false,
279
+ "complexType": {
280
+ "original": "string",
281
+ "resolved": "string | undefined",
282
+ "references": {}
283
+ },
284
+ "required": false,
285
+ "optional": true,
286
+ "docs": {
287
+ "tags": [],
288
+ "text": ""
289
+ },
290
+ "attribute": "error-message",
291
+ "reflect": false
292
+ },
293
+ "characterLimit": {
294
+ "type": "number",
295
+ "mutable": false,
296
+ "complexType": {
297
+ "original": "number",
298
+ "resolved": "number | undefined",
299
+ "references": {}
300
+ },
301
+ "required": false,
302
+ "optional": true,
303
+ "docs": {
304
+ "tags": [],
305
+ "text": ""
306
+ },
307
+ "attribute": "character-limit",
308
+ "reflect": false
309
+ },
310
+ "preventValidation": {
311
+ "type": "string",
312
+ "mutable": false,
313
+ "complexType": {
314
+ "original": "string",
315
+ "resolved": "string | undefined",
316
+ "references": {}
317
+ },
318
+ "required": false,
319
+ "optional": true,
320
+ "docs": {
321
+ "tags": [],
322
+ "text": ""
323
+ },
324
+ "attribute": "prevent-validation",
325
+ "reflect": false
326
+ },
327
+ "type": {
328
+ "type": "string",
329
+ "mutable": false,
330
+ "complexType": {
331
+ "original": "\"number\" | \"text\"",
332
+ "resolved": "\"number\" | \"text\"",
333
+ "references": {}
334
+ },
335
+ "required": false,
336
+ "optional": false,
337
+ "docs": {
338
+ "tags": [],
339
+ "text": ""
340
+ },
341
+ "attribute": "type",
342
+ "reflect": false,
343
+ "defaultValue": "\"text\""
344
+ },
345
+ "step": {
346
+ "type": "number",
347
+ "mutable": false,
348
+ "complexType": {
349
+ "original": "number",
350
+ "resolved": "number | undefined",
351
+ "references": {}
352
+ },
353
+ "required": false,
354
+ "optional": true,
355
+ "docs": {
356
+ "tags": [],
357
+ "text": ""
358
+ },
359
+ "attribute": "step",
360
+ "reflect": false,
361
+ "defaultValue": "1"
362
+ },
363
+ "min": {
364
+ "type": "number",
365
+ "mutable": false,
366
+ "complexType": {
367
+ "original": "number",
368
+ "resolved": "number | undefined",
369
+ "references": {}
370
+ },
371
+ "required": false,
372
+ "optional": true,
373
+ "docs": {
374
+ "tags": [],
375
+ "text": ""
376
+ },
377
+ "attribute": "min",
378
+ "reflect": false
379
+ },
380
+ "max": {
381
+ "type": "number",
382
+ "mutable": false,
383
+ "complexType": {
384
+ "original": "number",
385
+ "resolved": "number | undefined",
386
+ "references": {}
387
+ },
388
+ "required": false,
389
+ "optional": true,
390
+ "docs": {
391
+ "tags": [],
392
+ "text": ""
393
+ },
394
+ "attribute": "max",
395
+ "reflect": false
396
+ }
397
+ }; }
398
+ static get states() { return {
399
+ "announcement": {},
400
+ "displayedErrorMessage": {}
401
+ }; }
402
+ static get events() { return [{
403
+ "method": "wmInputValueChanged",
404
+ "name": "wmInputValueChanged",
405
+ "bubbles": true,
406
+ "cancelable": true,
407
+ "composed": true,
408
+ "docs": {
409
+ "tags": [],
410
+ "text": ""
411
+ },
412
+ "complexType": {
413
+ "original": "{ value: string }",
414
+ "resolved": "{ value: string; }",
415
+ "references": {}
416
+ }
417
+ }]; }
418
+ static get elementRef() { return "el"; }
419
+ static get watchers() { return [{
420
+ "propName": "errorMessage",
421
+ "methodName": "handleErrorMessage"
422
+ }]; }
423
+ }