@watermarkinsights/ripple 3.3.2-0 → 3.4.0-2

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 +3 -3
  2. package/dist/cjs/{functions-8fb310fe.js → functions-653e695c.js} +442 -442
  3. package/dist/cjs/{global-c3cf628f.js → global-ea9e87be.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 -661
  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 +218 -218
  14. package/dist/cjs/wm-chart-slice.cjs.entry.js +13 -13
  15. package/dist/cjs/wm-chart.cjs.entry.js +516 -514
  16. package/dist/cjs/wm-datepicker.cjs.entry.js +256 -256
  17. package/dist/cjs/wm-input.cjs.entry.js +133 -125
  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 +420 -420
  23. package/dist/cjs/wm-option_2.cjs.entry.js +492 -492
  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 +300 -300
  28. package/dist/cjs/wm-tag-input.cjs.entry.js +556 -556
  29. package/dist/cjs/wm-timepicker.cjs.entry.js +383 -383
  30. package/dist/cjs/wm-toggletip.cjs.entry.js +124 -124
  31. package/dist/cjs/wm-uploader.cjs.entry.js +346 -346
  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.js +485 -485
  35. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.js +232 -232
  36. package/dist/collection/components/wm-chart/wm-chart-slice.js +64 -64
  37. package/dist/collection/components/wm-chart/wm-chart.css +7 -5
  38. package/dist/collection/components/wm-chart/wm-chart.js +765 -761
  39. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +1015 -1003
  40. package/dist/collection/components/wm-datepicker/wm-datepicker.js +462 -462
  41. package/dist/collection/components/wm-input/wm-input.js +423 -415
  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.css +1 -0
  53. package/dist/collection/components/wm-select/wm-select.js +717 -717
  54. package/dist/collection/components/wm-snackbar/wm-snackbar.js +297 -297
  55. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +219 -219
  56. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +331 -331
  57. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +104 -104
  58. package/dist/collection/components/wm-tag-input/wm-tag-input.js +787 -787
  59. package/dist/collection/components/wm-timepicker/wm-timepicker.js +589 -589
  60. package/dist/collection/components/wm-toggletip/wm-toggletip.js +241 -241
  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.js +748 -748
  63. package/dist/collection/components/wm-wrapper/wm-wrapper.js +27 -27
  64. package/dist/collection/dev/scripts.js +20 -20
  65. package/dist/collection/global/__mocks__/functions.js +6 -6
  66. package/dist/collection/global/functions.js +445 -445
  67. package/dist/collection/global/global.js +72 -72
  68. package/dist/collection/global/interfaces.js +49 -49
  69. package/dist/collection/global/services/__mocks__/http-service.js +130 -130
  70. package/dist/collection/global/services/http-service.js +50 -50
  71. package/dist/collection/lang/lang.js +5 -5
  72. package/dist/collection/lang/piglatin.js +93 -93
  73. package/dist/esm/{functions-c315390d.js → functions-e528c934.js} +442 -442
  74. package/dist/esm/{global-1c69b942.js → global-c7a1f76c.js} +65 -65
  75. package/dist/esm/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +49 -49
  76. package/dist/esm/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +29 -29
  77. package/dist/esm/loader.js +2 -2
  78. package/dist/esm/polyfills/core-js.js +0 -0
  79. package/dist/esm/polyfills/dom.js +0 -0
  80. package/dist/esm/polyfills/es5-html-element.js +0 -0
  81. package/dist/esm/polyfills/index.js +0 -0
  82. package/dist/esm/polyfills/system.js +0 -0
  83. package/dist/esm/priv-chart-popover.entry.js +78 -78
  84. package/dist/esm/priv-datepicker.entry.js +667 -661
  85. package/dist/esm/priv-navigator-button.entry.js +18 -18
  86. package/dist/esm/priv-navigator-item.entry.js +23 -23
  87. package/dist/esm/ripple.js +2 -2
  88. package/dist/esm/wm-action-menu_2.entry.js +341 -341
  89. package/dist/esm/wm-button.entry.js +218 -218
  90. package/dist/esm/wm-chart-slice.entry.js +13 -13
  91. package/dist/esm/wm-chart.entry.js +516 -514
  92. package/dist/esm/wm-datepicker.entry.js +256 -256
  93. package/dist/esm/wm-input.entry.js +133 -125
  94. package/dist/esm/wm-modal-footer.entry.js +31 -31
  95. package/dist/esm/wm-modal-header.entry.js +34 -34
  96. package/dist/esm/wm-modal.entry.js +161 -161
  97. package/dist/esm/wm-navigator.entry.js +268 -268
  98. package/dist/esm/wm-network-uploader.entry.js +420 -420
  99. package/dist/esm/wm-option_2.entry.js +492 -492
  100. package/dist/esm/wm-pagination.entry.js +167 -167
  101. package/dist/esm/wm-search.entry.js +231 -231
  102. package/dist/esm/wm-snackbar.entry.js +170 -170
  103. package/dist/esm/wm-tab-item_3.entry.js +300 -300
  104. package/dist/esm/wm-tag-input.entry.js +556 -556
  105. package/dist/esm/wm-timepicker.entry.js +383 -383
  106. package/dist/esm/wm-toggletip.entry.js +124 -124
  107. package/dist/esm/wm-uploader.entry.js +346 -346
  108. package/dist/esm/wm-wrapper.entry.js +12 -12
  109. package/dist/ripple/{p-c5e44367.entry.js → p-092b01f3.entry.js} +1 -1
  110. package/dist/ripple/{p-5ffa983b.entry.js → p-1e0c41a9.entry.js} +1 -1
  111. package/dist/ripple/{p-d5fafa9c.entry.js → p-3003d26d.entry.js} +1 -1
  112. package/dist/ripple/{p-374b4fa6.entry.js → p-33524565.entry.js} +1 -1
  113. package/dist/ripple/{p-888bec42.js → p-43f1298b.js} +0 -0
  114. package/dist/ripple/{p-dea72d46.entry.js → p-4cc71463.entry.js} +1 -1
  115. package/dist/ripple/{p-e60fe2f5.js → p-588b4475.js} +0 -0
  116. package/dist/ripple/{p-b03382ea.entry.js → p-65e3a656.entry.js} +1 -1
  117. package/dist/ripple/{p-7bbd123c.entry.js → p-8923b7d0.entry.js} +1 -1
  118. package/dist/ripple/{p-ba9d3069.entry.js → p-8cd1396e.entry.js} +1 -1
  119. package/dist/ripple/{p-e574fb73.entry.js → p-aa973691.entry.js} +1 -1
  120. package/dist/ripple/{p-b4a8c8d3.entry.js → p-b3d5ea85.entry.js} +1 -1
  121. package/dist/ripple/{p-1a934627.entry.js → p-b5189f72.entry.js} +1 -1
  122. package/dist/ripple/p-bc27b604.entry.js +1 -0
  123. package/dist/ripple/p-bcb41945.entry.js +1 -0
  124. package/dist/ripple/{p-a50439f1.entry.js → p-cd58a15c.entry.js} +1 -1
  125. package/dist/ripple/{p-7f6c08c4.js → p-d298bf82.js} +1 -1
  126. package/dist/ripple/{p-41f39509.entry.js → p-dc9c9fda.entry.js} +1 -1
  127. package/dist/ripple/p-e7616311.entry.js +1 -0
  128. package/dist/ripple/{p-36da5d4a.entry.js → p-e9e8334e.entry.js} +1 -1
  129. package/dist/ripple/{p-ec5db255.entry.js → p-ec9697db.entry.js} +1 -1
  130. package/dist/ripple/p-efdaf3b6.entry.js +1 -0
  131. package/dist/ripple/{p-042d6449.entry.js → p-fcdc6395.entry.js} +1 -1
  132. package/dist/ripple/{p-a6d6eae7.js → p-fd8070fb.js} +0 -0
  133. package/dist/ripple/ripple.esm.js +1 -1
  134. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +48 -48
  135. package/dist/types/components/wm-button/wm-button.d.ts +44 -44
  136. package/dist/types/components/wm-chart/priv-chart-popover/priv-chart-popover.d.ts +23 -23
  137. package/dist/types/components/wm-chart/wm-chart-slice.d.ts +8 -8
  138. package/dist/types/components/wm-chart/wm-chart.d.ts +80 -80
  139. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +76 -75
  140. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +41 -41
  141. package/dist/types/components/wm-input/wm-input.d.ts +46 -45
  142. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +34 -34
  143. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +15 -15
  144. package/dist/types/components/wm-modal/wm-modal-header.d.ts +12 -12
  145. package/dist/types/components/wm-modal/wm-modal.d.ts +41 -41
  146. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +10 -10
  147. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +13 -13
  148. package/dist/types/components/wm-navigator/wm-navigator.d.ts +61 -61
  149. package/dist/types/components/wm-option/wm-option.d.ts +32 -32
  150. package/dist/types/components/wm-pagination/wm-pagination.d.ts +32 -32
  151. package/dist/types/components/wm-search/wm-search.d.ts +86 -86
  152. package/dist/types/components/wm-select/wm-select.d.ts +66 -66
  153. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +35 -35
  154. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +38 -38
  155. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +53 -53
  156. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +20 -20
  157. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +91 -91
  158. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +62 -62
  159. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +27 -27
  160. package/dist/types/components/wm-uploader/wm-network-uploader/wm-network-uploader.d.ts +85 -85
  161. package/dist/types/components/wm-uploader/wm-uploader.d.ts +80 -80
  162. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +7 -7
  163. package/dist/types/components.d.ts +24 -24
  164. package/dist/types/global/__mocks__/functions.d.ts +6 -6
  165. package/dist/types/global/functions.d.ts +40 -40
  166. package/dist/types/global/global.d.ts +1 -1
  167. package/dist/types/global/interfaces.d.ts +34 -34
  168. package/dist/types/global/services/__mocks__/http-service.d.ts +6 -6
  169. package/dist/types/global/services/http-service.d.ts +4 -4
  170. package/dist/types/lang/lang.d.ts +5 -5
  171. package/package.json +46 -46
  172. package/dist/ripple/p-053e8324.entry.js +0 -1
  173. package/dist/ripple/p-2689c3ff.entry.js +0 -1
  174. package/dist/ripple/p-589f8195.entry.js +0 -1
  175. package/dist/ripple/p-af4b2ea9.entry.js +0 -1
@@ -1,415 +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: "input.charactersEntered",
106
- defaultMessage: "{x, number} of {y, number} characters entered.",
107
- }, { x: charCount, y: charLimit });
108
- const characterLimitReachedMessage = intl.formatMessage({
109
- id: "input.characterLimitReached",
110
- defaultMessage: "No additional characters will be entered.",
111
- });
112
- return `${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`;
113
- }
114
- renderErrorMessage() {
115
- return this.errorMessage || this.displayedErrorMessage;
116
- }
117
- render() {
118
- return (h(Host, { id: this.uid },
119
- h("div", { class: `wrapper label-${this.labelPosition} ${this.errorMessage || this.displayedErrorMessage ? "invalid" : ""}`, ref: (el) => (this.inputWrapperEl = el) },
120
- h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { htmlFor: `inputfield-${this.uid}`, class: "label" },
121
- this.label,
122
- this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
123
- h("div", { class: "inner-wrapper" },
124
- h("div", { class: "inputfield-wrapper" },
125
- h("input", { ref: (el) => (this.inputEl = el), id: `inputfield-${this.uid}`, disabled: this.disabled, "aria-label": this.label, "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 }),
126
- this.characterLimit && typeof this.characterLimit === "number" ? (h("div", { class: "character-count" },
127
- this.charCount,
128
- "/",
129
- this.characterLimit)) : ("")),
130
- this.info && (h("div", { id: `info-${this.uid}`, class: "info" }, this.info)),
131
- h("div", { id: `error-${this.uid}`, "aria-live": "assertive", class: "error-message", "aria-atomic": "true" }, this.renderErrorMessage()),
132
- h("div", { class: "sr-only", "aria-live": "polite", "aria-atomic": "true", ref: (el) => (this.liveRegionEl = el) }, this.announcement)))));
133
- }
134
- static get is() { return "wm-input"; }
135
- static get encapsulation() { return "shadow"; }
136
- static get originalStyleUrls() { return {
137
- "$": ["wm-input.scss"]
138
- }; }
139
- static get styleUrls() { return {
140
- "$": ["wm-input.css"]
141
- }; }
142
- static get properties() { return {
143
- "label": {
144
- "type": "string",
145
- "mutable": false,
146
- "complexType": {
147
- "original": "string",
148
- "resolved": "string",
149
- "references": {}
150
- },
151
- "required": true,
152
- "optional": false,
153
- "docs": {
154
- "tags": [],
155
- "text": ""
156
- },
157
- "attribute": "label",
158
- "reflect": false
159
- },
160
- "labelPosition": {
161
- "type": "string",
162
- "mutable": false,
163
- "complexType": {
164
- "original": "\"top\" | \"left\" | \"none\"",
165
- "resolved": "\"left\" | \"none\" | \"top\"",
166
- "references": {}
167
- },
168
- "required": false,
169
- "optional": false,
170
- "docs": {
171
- "tags": [],
172
- "text": ""
173
- },
174
- "attribute": "label-position",
175
- "reflect": false,
176
- "defaultValue": "\"top\""
177
- },
178
- "value": {
179
- "type": "string",
180
- "mutable": true,
181
- "complexType": {
182
- "original": "string",
183
- "resolved": "string",
184
- "references": {}
185
- },
186
- "required": false,
187
- "optional": false,
188
- "docs": {
189
- "tags": [],
190
- "text": ""
191
- },
192
- "attribute": "value",
193
- "reflect": true,
194
- "defaultValue": "\"\""
195
- },
196
- "disabled": {
197
- "type": "boolean",
198
- "mutable": false,
199
- "complexType": {
200
- "original": "boolean",
201
- "resolved": "boolean",
202
- "references": {}
203
- },
204
- "required": false,
205
- "optional": false,
206
- "docs": {
207
- "tags": [],
208
- "text": ""
209
- },
210
- "attribute": "disabled",
211
- "reflect": true,
212
- "defaultValue": "false"
213
- },
214
- "info": {
215
- "type": "string",
216
- "mutable": false,
217
- "complexType": {
218
- "original": "string",
219
- "resolved": "string | undefined",
220
- "references": {}
221
- },
222
- "required": false,
223
- "optional": true,
224
- "docs": {
225
- "tags": [],
226
- "text": ""
227
- },
228
- "attribute": "info",
229
- "reflect": false
230
- },
231
- "placeholder": {
232
- "type": "string",
233
- "mutable": false,
234
- "complexType": {
235
- "original": "string",
236
- "resolved": "string",
237
- "references": {}
238
- },
239
- "required": false,
240
- "optional": false,
241
- "docs": {
242
- "tags": [],
243
- "text": ""
244
- },
245
- "attribute": "placeholder",
246
- "reflect": false,
247
- "defaultValue": "\"\""
248
- },
249
- "requiredField": {
250
- "type": "boolean",
251
- "mutable": false,
252
- "complexType": {
253
- "original": "boolean",
254
- "resolved": "boolean",
255
- "references": {}
256
- },
257
- "required": false,
258
- "optional": false,
259
- "docs": {
260
- "tags": [],
261
- "text": ""
262
- },
263
- "attribute": "required-field",
264
- "reflect": false,
265
- "defaultValue": "false"
266
- },
267
- "errorMessage": {
268
- "type": "string",
269
- "mutable": false,
270
- "complexType": {
271
- "original": "string",
272
- "resolved": "string | undefined",
273
- "references": {}
274
- },
275
- "required": false,
276
- "optional": true,
277
- "docs": {
278
- "tags": [],
279
- "text": ""
280
- },
281
- "attribute": "error-message",
282
- "reflect": false
283
- },
284
- "characterLimit": {
285
- "type": "number",
286
- "mutable": false,
287
- "complexType": {
288
- "original": "number",
289
- "resolved": "number | undefined",
290
- "references": {}
291
- },
292
- "required": false,
293
- "optional": true,
294
- "docs": {
295
- "tags": [],
296
- "text": ""
297
- },
298
- "attribute": "character-limit",
299
- "reflect": false
300
- },
301
- "preventValidation": {
302
- "type": "string",
303
- "mutable": false,
304
- "complexType": {
305
- "original": "string",
306
- "resolved": "string | undefined",
307
- "references": {}
308
- },
309
- "required": false,
310
- "optional": true,
311
- "docs": {
312
- "tags": [],
313
- "text": ""
314
- },
315
- "attribute": "prevent-validation",
316
- "reflect": false
317
- },
318
- "type": {
319
- "type": "string",
320
- "mutable": false,
321
- "complexType": {
322
- "original": "\"number\" | \"text\"",
323
- "resolved": "\"number\" | \"text\"",
324
- "references": {}
325
- },
326
- "required": false,
327
- "optional": false,
328
- "docs": {
329
- "tags": [],
330
- "text": ""
331
- },
332
- "attribute": "type",
333
- "reflect": false,
334
- "defaultValue": "\"text\""
335
- },
336
- "step": {
337
- "type": "number",
338
- "mutable": false,
339
- "complexType": {
340
- "original": "number",
341
- "resolved": "number | undefined",
342
- "references": {}
343
- },
344
- "required": false,
345
- "optional": true,
346
- "docs": {
347
- "tags": [],
348
- "text": ""
349
- },
350
- "attribute": "step",
351
- "reflect": false,
352
- "defaultValue": "1"
353
- },
354
- "min": {
355
- "type": "number",
356
- "mutable": false,
357
- "complexType": {
358
- "original": "number",
359
- "resolved": "number | undefined",
360
- "references": {}
361
- },
362
- "required": false,
363
- "optional": true,
364
- "docs": {
365
- "tags": [],
366
- "text": ""
367
- },
368
- "attribute": "min",
369
- "reflect": false
370
- },
371
- "max": {
372
- "type": "number",
373
- "mutable": false,
374
- "complexType": {
375
- "original": "number",
376
- "resolved": "number | undefined",
377
- "references": {}
378
- },
379
- "required": false,
380
- "optional": true,
381
- "docs": {
382
- "tags": [],
383
- "text": ""
384
- },
385
- "attribute": "max",
386
- "reflect": false
387
- }
388
- }; }
389
- static get states() { return {
390
- "announcement": {},
391
- "previousBlurredValue": {},
392
- "displayedErrorMessage": {}
393
- }; }
394
- static get events() { return [{
395
- "method": "wmInputValueChanged",
396
- "name": "wmInputValueChanged",
397
- "bubbles": true,
398
- "cancelable": true,
399
- "composed": true,
400
- "docs": {
401
- "tags": [],
402
- "text": ""
403
- },
404
- "complexType": {
405
- "original": "{ value: string }",
406
- "resolved": "{ value: string; }",
407
- "references": {}
408
- }
409
- }]; }
410
- static get elementRef() { return "el"; }
411
- static get watchers() { return [{
412
- "propName": "errorMessage",
413
- "methodName": "handleErrorMessage"
414
- }]; }
415
- }
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: "input.charactersEntered",
106
+ defaultMessage: "{x, number} of {y, number} characters entered.",
107
+ }, { x: charCount, y: charLimit });
108
+ const characterLimitReachedMessage = intl.formatMessage({
109
+ id: "input.characterLimitReached",
110
+ defaultMessage: "No additional characters will be entered.",
111
+ });
112
+ return `${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`;
113
+ }
114
+ generateCharacterLimitLabel(characterLimit) {
115
+ return intl.formatMessage({
116
+ id: "input.characterLimit",
117
+ defaultMessage: "{limit, number} characters allowed.",
118
+ }, {
119
+ limit: characterLimit,
120
+ });
121
+ }
122
+ renderErrorMessage() {
123
+ return this.errorMessage || this.displayedErrorMessage;
124
+ }
125
+ render() {
126
+ return (h(Host, { id: this.uid },
127
+ h("div", { class: `wrapper label-${this.labelPosition} ${this.errorMessage || this.displayedErrorMessage ? "invalid" : ""}`, ref: (el) => (this.inputWrapperEl = el) },
128
+ h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { htmlFor: `inputfield-${this.uid}`, class: "label" },
129
+ this.label,
130
+ this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
131
+ h("div", { class: "inner-wrapper" },
132
+ h("div", { class: "inputfield-wrapper" },
133
+ 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 }),
134
+ this.characterLimit && typeof this.characterLimit === "number" ? (h("div", { class: "character-count" },
135
+ this.charCount,
136
+ "/",
137
+ this.characterLimit)) : ("")),
138
+ this.info && (h("div", { id: `info-${this.uid}`, class: "info" }, this.info)),
139
+ h("div", { id: `error-${this.uid}`, "aria-live": "assertive", class: "error-message", "aria-atomic": "true" }, this.renderErrorMessage()),
140
+ h("div", { class: "sr-only", "aria-live": "polite", "aria-atomic": "true", ref: (el) => (this.liveRegionEl = el) }, this.announcement)))));
141
+ }
142
+ static get is() { return "wm-input"; }
143
+ static get encapsulation() { return "shadow"; }
144
+ static get originalStyleUrls() { return {
145
+ "$": ["wm-input.scss"]
146
+ }; }
147
+ static get styleUrls() { return {
148
+ "$": ["wm-input.css"]
149
+ }; }
150
+ static get properties() { return {
151
+ "label": {
152
+ "type": "string",
153
+ "mutable": false,
154
+ "complexType": {
155
+ "original": "string",
156
+ "resolved": "string",
157
+ "references": {}
158
+ },
159
+ "required": true,
160
+ "optional": false,
161
+ "docs": {
162
+ "tags": [],
163
+ "text": ""
164
+ },
165
+ "attribute": "label",
166
+ "reflect": false
167
+ },
168
+ "labelPosition": {
169
+ "type": "string",
170
+ "mutable": false,
171
+ "complexType": {
172
+ "original": "\"top\" | \"left\" | \"none\"",
173
+ "resolved": "\"left\" | \"none\" | \"top\"",
174
+ "references": {}
175
+ },
176
+ "required": false,
177
+ "optional": false,
178
+ "docs": {
179
+ "tags": [],
180
+ "text": ""
181
+ },
182
+ "attribute": "label-position",
183
+ "reflect": false,
184
+ "defaultValue": "\"top\""
185
+ },
186
+ "value": {
187
+ "type": "string",
188
+ "mutable": true,
189
+ "complexType": {
190
+ "original": "string",
191
+ "resolved": "string",
192
+ "references": {}
193
+ },
194
+ "required": false,
195
+ "optional": false,
196
+ "docs": {
197
+ "tags": [],
198
+ "text": ""
199
+ },
200
+ "attribute": "value",
201
+ "reflect": true,
202
+ "defaultValue": "\"\""
203
+ },
204
+ "disabled": {
205
+ "type": "boolean",
206
+ "mutable": false,
207
+ "complexType": {
208
+ "original": "boolean",
209
+ "resolved": "boolean",
210
+ "references": {}
211
+ },
212
+ "required": false,
213
+ "optional": false,
214
+ "docs": {
215
+ "tags": [],
216
+ "text": ""
217
+ },
218
+ "attribute": "disabled",
219
+ "reflect": true,
220
+ "defaultValue": "false"
221
+ },
222
+ "info": {
223
+ "type": "string",
224
+ "mutable": false,
225
+ "complexType": {
226
+ "original": "string",
227
+ "resolved": "string | undefined",
228
+ "references": {}
229
+ },
230
+ "required": false,
231
+ "optional": true,
232
+ "docs": {
233
+ "tags": [],
234
+ "text": ""
235
+ },
236
+ "attribute": "info",
237
+ "reflect": false
238
+ },
239
+ "placeholder": {
240
+ "type": "string",
241
+ "mutable": false,
242
+ "complexType": {
243
+ "original": "string",
244
+ "resolved": "string",
245
+ "references": {}
246
+ },
247
+ "required": false,
248
+ "optional": false,
249
+ "docs": {
250
+ "tags": [],
251
+ "text": ""
252
+ },
253
+ "attribute": "placeholder",
254
+ "reflect": false,
255
+ "defaultValue": "\"\""
256
+ },
257
+ "requiredField": {
258
+ "type": "boolean",
259
+ "mutable": false,
260
+ "complexType": {
261
+ "original": "boolean",
262
+ "resolved": "boolean",
263
+ "references": {}
264
+ },
265
+ "required": false,
266
+ "optional": false,
267
+ "docs": {
268
+ "tags": [],
269
+ "text": ""
270
+ },
271
+ "attribute": "required-field",
272
+ "reflect": false,
273
+ "defaultValue": "false"
274
+ },
275
+ "errorMessage": {
276
+ "type": "string",
277
+ "mutable": false,
278
+ "complexType": {
279
+ "original": "string",
280
+ "resolved": "string | undefined",
281
+ "references": {}
282
+ },
283
+ "required": false,
284
+ "optional": true,
285
+ "docs": {
286
+ "tags": [],
287
+ "text": ""
288
+ },
289
+ "attribute": "error-message",
290
+ "reflect": false
291
+ },
292
+ "characterLimit": {
293
+ "type": "number",
294
+ "mutable": false,
295
+ "complexType": {
296
+ "original": "number",
297
+ "resolved": "number | undefined",
298
+ "references": {}
299
+ },
300
+ "required": false,
301
+ "optional": true,
302
+ "docs": {
303
+ "tags": [],
304
+ "text": ""
305
+ },
306
+ "attribute": "character-limit",
307
+ "reflect": false
308
+ },
309
+ "preventValidation": {
310
+ "type": "string",
311
+ "mutable": false,
312
+ "complexType": {
313
+ "original": "string",
314
+ "resolved": "string | undefined",
315
+ "references": {}
316
+ },
317
+ "required": false,
318
+ "optional": true,
319
+ "docs": {
320
+ "tags": [],
321
+ "text": ""
322
+ },
323
+ "attribute": "prevent-validation",
324
+ "reflect": false
325
+ },
326
+ "type": {
327
+ "type": "string",
328
+ "mutable": false,
329
+ "complexType": {
330
+ "original": "\"number\" | \"text\"",
331
+ "resolved": "\"number\" | \"text\"",
332
+ "references": {}
333
+ },
334
+ "required": false,
335
+ "optional": false,
336
+ "docs": {
337
+ "tags": [],
338
+ "text": ""
339
+ },
340
+ "attribute": "type",
341
+ "reflect": false,
342
+ "defaultValue": "\"text\""
343
+ },
344
+ "step": {
345
+ "type": "number",
346
+ "mutable": false,
347
+ "complexType": {
348
+ "original": "number",
349
+ "resolved": "number | undefined",
350
+ "references": {}
351
+ },
352
+ "required": false,
353
+ "optional": true,
354
+ "docs": {
355
+ "tags": [],
356
+ "text": ""
357
+ },
358
+ "attribute": "step",
359
+ "reflect": false,
360
+ "defaultValue": "1"
361
+ },
362
+ "min": {
363
+ "type": "number",
364
+ "mutable": false,
365
+ "complexType": {
366
+ "original": "number",
367
+ "resolved": "number | undefined",
368
+ "references": {}
369
+ },
370
+ "required": false,
371
+ "optional": true,
372
+ "docs": {
373
+ "tags": [],
374
+ "text": ""
375
+ },
376
+ "attribute": "min",
377
+ "reflect": false
378
+ },
379
+ "max": {
380
+ "type": "number",
381
+ "mutable": false,
382
+ "complexType": {
383
+ "original": "number",
384
+ "resolved": "number | undefined",
385
+ "references": {}
386
+ },
387
+ "required": false,
388
+ "optional": true,
389
+ "docs": {
390
+ "tags": [],
391
+ "text": ""
392
+ },
393
+ "attribute": "max",
394
+ "reflect": false
395
+ }
396
+ }; }
397
+ static get states() { return {
398
+ "announcement": {},
399
+ "previousBlurredValue": {},
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
+ }