geico-design-kit 7.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.

Potentially problematic release.


This version of geico-design-kit might be problematic. Click here for more details.

Files changed (107) hide show
  1. package/.babelrc +5 -0
  2. package/LICENSE +0 -0
  3. package/dist/analytics.js +119 -0
  4. package/dist/appState.js +56 -0
  5. package/dist/baseComponent.js +110 -0
  6. package/dist/components/Accordion.js +312 -0
  7. package/dist/components/AddressAutoComplete.js +220 -0
  8. package/dist/components/Alert.js +145 -0
  9. package/dist/components/BackgroundPattern.js +99 -0
  10. package/dist/components/BackgroundPatternPortfolio.js +242 -0
  11. package/dist/components/ButtonSwitch.js +236 -0
  12. package/dist/components/CardSelections.js +230 -0
  13. package/dist/components/CommonQuestionsSquares.js +169 -0
  14. package/dist/components/Confirmation.js +156 -0
  15. package/dist/components/ConsolidatedSummary.js +489 -0
  16. package/dist/components/CoverageGraph.js +201 -0
  17. package/dist/components/CreditCard.js +591 -0
  18. package/dist/components/CurrencyInput.js +302 -0
  19. package/dist/components/DatePicker.js +468 -0
  20. package/dist/components/DockedMessage.js +146 -0
  21. package/dist/components/DotNavigation.js +200 -0
  22. package/dist/components/EditComponent.js +128 -0
  23. package/dist/components/EditableTable.js +113 -0
  24. package/dist/components/InPageNavigation.js +360 -0
  25. package/dist/components/Loader.js +232 -0
  26. package/dist/components/MakePayment.js +361 -0
  27. package/dist/components/Modal.js +254 -0
  28. package/dist/components/MoreInfoButton.js +227 -0
  29. package/dist/components/MultipleSelectBox.js +217 -0
  30. package/dist/components/NavigationalBox.js +161 -0
  31. package/dist/components/Navigator.js +294 -0
  32. package/dist/components/PasswordMeter.js +201 -0
  33. package/dist/components/PayPlans.js +534 -0
  34. package/dist/components/SegmentedControl.js +327 -0
  35. package/dist/components/SortableTable.js +166 -0
  36. package/dist/components/Tabs.js +1 -0
  37. package/dist/components/TextAreaCountdown.js +219 -0
  38. package/dist/components/Timeline.js +498 -0
  39. package/dist/components/TimelineFilter.js +492 -0
  40. package/dist/components/ToTopArrow.js +153 -0
  41. package/dist/components/Tooltip.js +329 -0
  42. package/dist/components/Upsell.js +168 -0
  43. package/dist/components/VIN.js +271 -0
  44. package/dist/components/ValidateForm.js +938 -0
  45. package/dist/components/ViewMoreLess.js +191 -0
  46. package/dist/components/ZipCode.js +191 -0
  47. package/dist/components/portfolio.js +99 -0
  48. package/dist/geico-design-kit.js +141 -0
  49. package/dist/global/components.js +98 -0
  50. package/dist/global/footer.js +26 -0
  51. package/dist/global/nav.js +1257 -0
  52. package/dist/services/CharacterTypeService.js +106 -0
  53. package/dist/services/UserAgentService.js +73 -0
  54. package/dist/utils.js +79 -0
  55. package/package.json +32 -0
  56. package/src/analytics.js +82 -0
  57. package/src/appState.js +56 -0
  58. package/src/baseComponent.js +156 -0
  59. package/src/components/Accordion.js +336 -0
  60. package/src/components/AddressAutoComplete.js +236 -0
  61. package/src/components/Alert.js +135 -0
  62. package/src/components/BackgroundPattern.js +96 -0
  63. package/src/components/BackgroundPatternPortfolio.js +284 -0
  64. package/src/components/ButtonSwitch.js +241 -0
  65. package/src/components/CardSelections.js +240 -0
  66. package/src/components/CommonQuestionsSquares.js +179 -0
  67. package/src/components/Confirmation.js +160 -0
  68. package/src/components/ConsolidatedSummary.js +505 -0
  69. package/src/components/CoverageGraph.js +203 -0
  70. package/src/components/CreditCard.js +595 -0
  71. package/src/components/CurrencyInput.js +321 -0
  72. package/src/components/DatePicker.js +487 -0
  73. package/src/components/DockedMessage.js +142 -0
  74. package/src/components/DotNavigation.js +206 -0
  75. package/src/components/EditComponent.js +130 -0
  76. package/src/components/EditableTable.js +106 -0
  77. package/src/components/InPageNavigation.js +391 -0
  78. package/src/components/Loader.js +272 -0
  79. package/src/components/MakePayment.js +397 -0
  80. package/src/components/Modal.js +279 -0
  81. package/src/components/MoreInfoButton.js +243 -0
  82. package/src/components/MultipleSelectBox.js +211 -0
  83. package/src/components/NavigationalBox.js +163 -0
  84. package/src/components/Navigator.js +338 -0
  85. package/src/components/PasswordMeter.js +209 -0
  86. package/src/components/PayPlans.js +604 -0
  87. package/src/components/SegmentedControl.js +365 -0
  88. package/src/components/SortableTable.js +176 -0
  89. package/src/components/Tabs.js +0 -0
  90. package/src/components/TextAreaCountdown.js +231 -0
  91. package/src/components/Timeline.js +532 -0
  92. package/src/components/TimelineFilter.js +533 -0
  93. package/src/components/ToTopArrow.js +153 -0
  94. package/src/components/Tooltip.js +344 -0
  95. package/src/components/Upsell.js +196 -0
  96. package/src/components/VIN.js +289 -0
  97. package/src/components/ValidateForm.js +1030 -0
  98. package/src/components/ViewMoreLess.js +193 -0
  99. package/src/components/ZipCode.js +193 -0
  100. package/src/components/portfolio.js +106 -0
  101. package/src/geico-design-kit.js +144 -0
  102. package/src/global/components.js +92 -0
  103. package/src/global/footer.js +25 -0
  104. package/src/global/nav.js +1457 -0
  105. package/src/services/CharacterTypeService.js +107 -0
  106. package/src/services/UserAgentService.js +59 -0
  107. package/src/utils.js +82 -0
@@ -0,0 +1,397 @@
1
+ import baseComponent from '../../src/baseComponent';
2
+
3
+ const validateSettings = [
4
+ {
5
+ setting : "content",
6
+ isRequired : true,
7
+ validate : "type",
8
+ possibleValues : ["string","object"],
9
+ errorMessage : ["GDK Make a Payment : Content must be defined and set to a DOM selector or Node"]
10
+ }
11
+ ];
12
+
13
+ /**
14
+ * MakePayment Class
15
+ */
16
+ class MakePayment{
17
+ /**
18
+ * These are settings for the instantiation. Refer to the design kit section of this component for JS setting examples.
19
+ * @param {string|Object} content
20
+ * A reference to the div form field containing the make payment input node
21
+ *
22
+ */
23
+
24
+ constructor(options) {
25
+
26
+ this._internalVars = {};
27
+
28
+ //options with defaults set
29
+ this._defaults = {};
30
+
31
+ // Create options by extending defaults with the passed in arugments
32
+ if (options && typeof options === "object") {
33
+ this._options = baseComponent.extendDefaults(this._defaults, options);
34
+ }
35
+
36
+ //if the required options are valid set up the environment
37
+ if( baseComponent.validateSettings(this._options, validateSettings) ){
38
+ this._internalVars.contentType = baseComponent.getContentType(this);
39
+ setLocalVars.call(this);
40
+ setEvents.call(this);
41
+ }
42
+ }
43
+
44
+ //Public Methods
45
+
46
+ /**
47
+ * destroy()
48
+ * removes the node from the dom and any events attached
49
+ */
50
+ destroy(){
51
+ removeEvents.call(this);
52
+ this._internalVars.node.parentNode.removeChild(this._internalVars.node);
53
+
54
+ //a little garbage collection
55
+ for (var variableKey in this){
56
+ if (this.hasOwnProperty(variableKey)){
57
+ delete this[variableKey];
58
+ }
59
+ }
60
+ }
61
+
62
+ }
63
+
64
+ // Private Methods
65
+ /**
66
+ * setEvents()
67
+ * Sets all the events needed for the component
68
+ */
69
+ function setEvents() {
70
+ Array.prototype.forEach.call(this._internalVars.radios, (radio)=> {
71
+ radio.addEventListener('change', paymentTypeFieldsDisplay.bind(this));
72
+ });
73
+
74
+ Array.prototype.forEach.call(this._internalVars.paymentAmountRadios, (radio)=> {
75
+ radio.addEventListener('change', enableDisableOtherAmount.bind(this));
76
+ });
77
+
78
+ this._internalVars.creditCardcarddholderSelect.addEventListener('change', mailingAddressDisplay.bind(this));
79
+ this._internalVars.checkAccountholderSelect.addEventListener('change', mailingAddressDisplay.bind(this));
80
+
81
+ this._internalVars.creditCardcarddholderSelect.addEventListener('change', prefillName.bind(this));
82
+ this._internalVars.checkAccountholderSelect.addEventListener('change', prefillName.bind(this));
83
+
84
+ Array.prototype.forEach.call(this._internalVars.newAddressRadios, (radio)=> {
85
+ radio.addEventListener('change', newAddressFieldsDisplay.bind(this));
86
+ });
87
+
88
+ if(this._internalVars.nameOnCheckInput) {
89
+ this._internalVars.nameOnCheckInput.addEventListener('blur', parseFirstName.bind(this));
90
+ }
91
+ if(this._internalVars.nameOnCardInput) {
92
+ this._internalVars.nameOnCardInput.addEventListener('blur', parseFirstName.bind(this));
93
+ }
94
+
95
+ this._internalVars.saveMethodRadio.addEventListener('change', saveMethodFieldDisplay.bind(this));
96
+ }
97
+
98
+
99
+ /**
100
+ * removeEvents()
101
+ * removes all events from the component
102
+ */
103
+ function removeEvents() {
104
+ Array.prototype.forEach.call(this._internalVars.radios, (radio)=> {
105
+ radio.removeEventListener('change', paymentTypeFieldsDisplay.bind(this));
106
+ });
107
+
108
+ Array.prototype.forEach.call(this._internalVars.paymentAmountRadios, (radio)=> {
109
+ radio.removeEventListener('change', enableDisableOtherAmount.bind(this));
110
+ });
111
+
112
+ this._internalVars.creditCardcarddholderSelect.removeEventListener('change', mailingAddressDisplay.bind(this));
113
+ this._internalVars.checkAccountholderSelect.removeEventListener('change', mailingAddressDisplay.bind(this));
114
+
115
+ Array.prototype.forEach.call(this._internalVars.newAddressRadios, (radio)=> {
116
+ radio.removeEventListener('change', newAddressFieldsDisplay.bind(this));
117
+ });
118
+
119
+ if(this._internalVars.nameOnCheckInput) {
120
+ this._internalVars.nameOnCheckInput.removeEventListener('blur', parseFirstName.bind(this));
121
+ }
122
+ if(this._internalVars.nameOnCardInput) {
123
+ this._internalVars.nameOnCardInput.removeEventListener('blur', parseFirstName.bind(this));
124
+ }
125
+
126
+ this._internalVars.saveMethodRadio.removeEventListener('change', saveMethodFieldDisplay.bind(this));
127
+ }
128
+
129
+ function enableDisableOtherAmount(event) {
130
+ if (event.target.value === 'other') {
131
+ this._internalVars.currencyInput.removeAttribute('disabled');
132
+ } else if (event.target.value !== 'other') {
133
+ this._internalVars.currencyInput.setAttribute('disabled', 'disabled');
134
+ }
135
+ }
136
+
137
+ function paymentTypeFieldsDisplay(event) {
138
+ //Set variable values for which fields should be displayed
139
+ let creditCardFieldsDisplay = false,
140
+ checkFieldsDisplay = false,
141
+ generalFieldsDisplay = false,
142
+ saveMethodFieldsDisplay = false;
143
+
144
+ this._internalVars.creditCardSelected = false;
145
+ this._internalVars.checkSelected = false;
146
+
147
+ if(event.target.value === 'card') {
148
+ generalFieldsDisplay = true;
149
+ creditCardFieldsDisplay = true;
150
+ checkFieldsDisplay = false;
151
+ this._internalVars.creditCardSelected = true;
152
+ this._internalVars.addressFieldLabel.innerHTML = "Cardholder's";
153
+ }
154
+
155
+ if(event.target.value === 'check') {
156
+ generalFieldsDisplay = true;
157
+ checkFieldsDisplay = true;
158
+ creditCardFieldsDisplay = false;
159
+ this._internalVars.checkSelected = true;
160
+ this._internalVars.addressFieldLabel.innerHTML = "Account holder's";
161
+ }
162
+
163
+ //Reset values if payment method is changed
164
+ this._internalVars.creditCardcarddholderSelect.options[0].selected = true;
165
+ this._internalVars.checkAccountholderSelect.options[0].selected = true;
166
+
167
+ Array.prototype.forEach.call(this._internalVars.newAddressRadios, (radio)=> {
168
+ radio.checked = false;
169
+ });
170
+
171
+ this._internalVars.saveMethodRadio.checked = false;
172
+
173
+ toggleFieldDisplay.call(this, creditCardFieldsDisplay, checkFieldsDisplay, generalFieldsDisplay, saveMethodFieldsDisplay);
174
+ }
175
+
176
+ function toggleFieldDisplay(creditCardFieldsDisplay, checkFieldsDisplay, generalFieldsDisplay, saveMethodFieldsDisplay) {
177
+ if($(this._internalVars.dynamicAddressField).is(':visible')) {
178
+ $(this._internalVars.dynamicAddressField).slideUp();
179
+ }
180
+ if($(this._internalVars.dynamicNewAddressFields).is(':visible')) {
181
+ $(this._internalVars.dynamicNewAddressFields).slideUp();
182
+ }
183
+ if(generalFieldsDisplay === true) {
184
+ if($(this._internalVars.dynamicFieldGeneral).is(':hidden')) {
185
+ $(this._internalVars.dynamicFieldGeneral).slideDown();
186
+ }
187
+ } else {
188
+ if($(this._internalVars.dynamicFieldGeneral).is(':visible')) {
189
+ $(this._internalVars.dynamicFieldGeneral).slideUp();
190
+ }
191
+ }
192
+ if(creditCardFieldsDisplay === true) {
193
+ if($(this._internalVars.dynamicCardFields).is(':hidden')) {
194
+ $(this._internalVars.dynamicCardFields).slideDown();
195
+ }
196
+ } else {
197
+ if($(this._internalVars.dynamicCardFields).is(':visible')) {
198
+ $(this._internalVars.dynamicCardFields).slideUp();
199
+ }
200
+ }
201
+ if(checkFieldsDisplay === true) {
202
+ if($(this._internalVars.dynamicCheckFields).is(':hidden')) {
203
+ $(this._internalVars.dynamicCheckFields).slideDown();
204
+ }
205
+ } else {
206
+ if($(this._internalVars.dynamicCheckFields).is(':visible')) {
207
+ $(this._internalVars.dynamicCheckFields).slideUp();
208
+ }
209
+ }
210
+ if(saveMethodFieldsDisplay === true) {
211
+ if($(this._internalVars.dynamicFieldSaveFields).is(':hidden')) {
212
+ $(this._internalVars.dynamicFieldSaveFields).slideDown();
213
+ }
214
+ } else {
215
+ if($(this._internalVars.dynamicFieldSaveFields).is(':visible')) {
216
+ $(this._internalVars.dynamicFieldSaveFields).slideUp();
217
+ }
218
+ }
219
+ }
220
+
221
+ function mailingAddressDisplay(event) {
222
+ let mailingAddressFields = false;
223
+ if(event.target.value === 'Other Payee') {
224
+ mailingAddressFields = true;
225
+ }
226
+ toggleMailingAddressFieldDisplay.call(this, mailingAddressFields);
227
+ }
228
+
229
+ function prefillName(event) {
230
+ let addressLabel;
231
+ if (this._internalVars.checkSelected === true) {
232
+ addressLabel = "Account holder's";
233
+ } else if (this._internalVars.creditCardSelected === true) {
234
+ addressLabel = "Cardholder's";
235
+ }
236
+ if(event.target.value !== 'Other Payee' && event.target.value !== 'Please Select') {
237
+ let value;
238
+ for (var i = 0; i < event.target.length; i++) {
239
+ if(event.target.options[i].value === event.target.value) {
240
+ value = event.target.options[i].text;
241
+ }
242
+ }
243
+ if (this._internalVars.creditCardSelected === true) {
244
+ this._internalVars.nameOnCardInput.value = value;
245
+ } else if (this._internalVars.checkSelected === true) {
246
+ this._internalVars.nameOnCheckInput.value = value;
247
+ }
248
+ } else {
249
+ this._internalVars.nameOnCardInput.value = '';
250
+ this._internalVars.nameOnCheckInput.value = '';
251
+ this._internalVars.addressFieldLabel.innerHTML = addressLabel;
252
+ }
253
+ }
254
+
255
+ function toggleMailingAddressFieldDisplay(mailingAddressFields) {
256
+ if(mailingAddressFields === true) {
257
+ if($(this._internalVars.dynamicAddressField).is(':hidden')) {
258
+ $(this._internalVars.dynamicAddressField).slideDown();
259
+ }
260
+ } else {
261
+ if($(this._internalVars.dynamicAddressField).is(':visible')) {
262
+ $(this._internalVars.dynamicAddressField).slideUp();
263
+ }
264
+ }
265
+ }
266
+
267
+ function newAddressFieldsDisplay(event) {
268
+ let newAddressFields = false;
269
+ if(event.target.value === 'new') {
270
+ newAddressFields = true;
271
+ }
272
+ toggleNewAddressFieldsDisplay.call(this, newAddressFields);
273
+ }
274
+
275
+ function toggleNewAddressFieldsDisplay(newAddressFields) {
276
+ if(newAddressFields === true) {
277
+ if($(this._internalVars.dynamicNewAddressFields).is(':hidden')) {
278
+ $(this._internalVars.dynamicNewAddressFields).slideDown();
279
+ }
280
+ } else {
281
+ if($(this._internalVars.dynamicNewAddressFields).is(':visible')) {
282
+ $(this._internalVars.dynamicNewAddressFields).slideUp();
283
+ }
284
+ }
285
+ }
286
+
287
+ function parseFirstName(event) {
288
+ let nameField,
289
+ addressLabel;
290
+ if (this._internalVars.checkSelected === true) {
291
+ nameField = this._internalVars.nameOnCheckInput;
292
+ addressLabel = "Account holder's";
293
+ } else if (this._internalVars.creditCardSelected === true) {
294
+ nameField = this._internalVars.nameOnCardInput;
295
+ addressLabel = "Cardholder's";
296
+ }
297
+ if (nameField.value.length > 0) {
298
+ let firstName = event.target.value.split(" ")[0];
299
+ if (firstName.slice(-1) === 's' || firstName.slice(-1) === 'S') {
300
+ this._internalVars.addressFieldLabel.innerHTML = firstName + "'";
301
+ } else {
302
+ this._internalVars.addressFieldLabel.innerHTML = firstName + "'s";
303
+ }
304
+
305
+ } else {
306
+ this._internalVars.addressFieldLabel.innerHTML = addressLabel;
307
+ }
308
+ }
309
+
310
+ function saveMethodFieldDisplay(event) {
311
+ if(event.target.checked === true) {
312
+ if($(this._internalVars.dynamicFieldSaveFields).is(':hidden')) {
313
+ $(this._internalVars.dynamicFieldSaveFields).slideDown();
314
+ }
315
+ } else {
316
+ if($(this._internalVars.dynamicFieldSaveFields).is(':visible')) {
317
+ $(this._internalVars.dynamicFieldSaveFields).slideUp();
318
+ }
319
+ }
320
+ }
321
+
322
+ /**
323
+ * setLocalVars()
324
+ * set all the local vars to passed in options
325
+ */
326
+ function setLocalVars() {
327
+ //determine the type of content passed in
328
+ if(this._internalVars.contentType === 'string'){
329
+ this._internalVars.node = document.querySelector(this._options.content);
330
+ }else if(this._internalVars.contentType === 'domNode'){
331
+ this._internalVars.node = this._options.content;
332
+ }
333
+
334
+ this._internalVars.makePaymentFields = this._internalVars.node;
335
+
336
+ this._internalVars.paymentAmountID = 'payment-amount';
337
+ this._internalVars.paymentAmountFields = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.paymentAmountID);
338
+ this._internalVars.paymentAmountRadios = this._internalVars.paymentAmountFields.querySelectorAll("input[type='radio']");
339
+
340
+ this._internalVars.currencyInputClass = 'currency-input';
341
+ this._internalVars.currencyInput = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.currencyInputClass);
342
+
343
+ this._internalVars.paymentMethodID = 'payment-method-selection';
344
+ this._internalVars.paymentMethodFields = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.paymentMethodID);
345
+ this._internalVars.radios = this._internalVars.paymentMethodFields.querySelectorAll('input');
346
+
347
+ this._internalVars.dynamicFieldCheckClass = 'dynamic-fields-check';
348
+ this._internalVars.dynamicCheckFields = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldCheckClass);
349
+
350
+ this._internalVars.dynamicFieldCardClass = 'dynamic-fields-card';
351
+ this._internalVars.dynamicCardFields = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldCardClass);
352
+
353
+ this._internalVars.dynamicFieldGeneralClass = 'dynamic-fields-general';
354
+ this._internalVars.dynamicFieldGeneral = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldGeneralClass);
355
+
356
+ this._internalVars.creditCardCardholderID = 'cardholder-credit-card';
357
+ this._internalVars.creditCardCardholderField = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.creditCardCardholderID);
358
+ this._internalVars.creditCardcarddholderSelect = this._internalVars.creditCardCardholderField.querySelector('select');
359
+
360
+ this._internalVars.checkAccountholderID = 'accountholder-check';
361
+ this._internalVars.checkAccountholderField = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.checkAccountholderID);
362
+ this._internalVars.checkAccountholderSelect = this._internalVars.checkAccountholderField.querySelector('select');
363
+
364
+ this._internalVars.nameOnCheckID = 'name-on-check';
365
+ if(this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.nameOnCheckID)) {
366
+ this._internalVars.nameOnCheckFields = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.nameOnCheckID);
367
+ this._internalVars.nameOnCheckInput = this._internalVars.nameOnCheckFields.querySelector('input');
368
+ }
369
+
370
+ this._internalVars.nameOnCardID = 'name-credit-card';
371
+ if(this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.nameOnCardID)) {
372
+ this._internalVars.nameOnCardFields = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.nameOnCardID);
373
+ this._internalVars.nameOnCardInput = this._internalVars.nameOnCardFields.querySelector('input');
374
+ }
375
+
376
+ this._internalVars.dynamicFieldAddressClass = 'dynamic-fields-address';
377
+ this._internalVars.dynamicAddressField = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldAddressClass);
378
+
379
+ this._internalVars.addressFieldNameLabelID = 'address-name';
380
+ this._internalVars.addressFieldLabel = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.addressFieldNameLabelID);
381
+
382
+ this._internalVars.newAddressID = 'address';
383
+ this._internalVars.newAddressFields = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.newAddressID);
384
+ this._internalVars.newAddressRadios = this._internalVars.newAddressFields.querySelectorAll('input');
385
+
386
+ this._internalVars.dynamicFieldNewAddressClass = 'dynamic-fields-new-address';
387
+ this._internalVars.dynamicNewAddressFields = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldNewAddressClass);
388
+
389
+ this._internalVars.saveMethodId = 'save-method';
390
+ this._internalVars.saveMethodField = this._internalVars.makePaymentFields.querySelector('#' + this._internalVars.saveMethodId);
391
+ this._internalVars.saveMethodRadio = this._internalVars.saveMethodField.querySelector('input');
392
+
393
+ this._internalVars.dynamicFieldSaveClass = 'dynamic-fields-save-method';
394
+ this._internalVars.dynamicFieldSaveFields = this._internalVars.makePaymentFields.querySelector('.' + this._internalVars.dynamicFieldSaveClass);
395
+ }
396
+
397
+ export default MakePayment;
@@ -0,0 +1,279 @@
1
+ import * as utils from '../../src/utils';
2
+ import baseComponent from '../../src/baseComponent';
3
+ import UserAgentService from '../../src/services/UserAgentService';
4
+
5
+ let PromiseIE = require('es6-promise-polyfill').Promise;
6
+
7
+ const validateSettings = [
8
+ {
9
+ setting : "content",
10
+ isRequired : true,
11
+ validate : "type",
12
+ possibleValues : ["string","object"],
13
+ errorMessage : ["GDK Modal : Content must be defined and set to a DOM selector or Node"]
14
+ },
15
+ {
16
+ setting : "autoShow",
17
+ isRequired : false,
18
+ validate : "type",
19
+ possibleValues : ["boolean"],
20
+ errorMessage : ["GDK Modal : autoShow must be a boolean"]
21
+ },
22
+ {
23
+ setting : "overlayShouldCloseModal",
24
+ isRequired : false,
25
+ validate : "type",
26
+ possibleValues : ["boolean"],
27
+ errorMessage : ["GDK Modal : overlayShouldCloseModal must be a boolean"]
28
+ },
29
+ {
30
+ setting : "hideCloseButton",
31
+ isRequired : false,
32
+ validate : "type",
33
+ possibleValues : ["boolean"],
34
+ errorMessage : ["GDK Modal : hideCloseButton must be a boolean"]
35
+ },
36
+ {
37
+ setting : "onOpened",
38
+ isRequired : false,
39
+ validate : "type",
40
+ possibleValues : ["function"],
41
+ errorMessage : ["GDK Modal : onOpened must be a function"]
42
+ },
43
+ {
44
+ setting : "onClosed",
45
+ isRequired : false,
46
+ validate : "type",
47
+ possibleValues : ["function"],
48
+ errorMessage : ["GDK Modal : onClosed must be a function"]
49
+ }
50
+
51
+ ];
52
+
53
+
54
+ const modalCloseBtn = '<button class="btn-close icon-close" type="button" aria-label="Close modal"></button>';
55
+
56
+
57
+ class Modal{
58
+ /**
59
+ * These are settings for the instantiation. Refer to the design kit section of this component for JS setting examples.
60
+ * @param {string|Object} content
61
+ * A reference to the modal node
62
+ *
63
+ * @param {boolean} [autoShow=false]
64
+ * Use if you want to model to auto show when instantiated
65
+ *
66
+ * @param {boolean} [overlayShouldCloseModal=true]
67
+ * Set to false if you do not want the overlay to have click to close functionality
68
+ *
69
+ * @param {boolean} [hideCloseButton=false]
70
+ * Set to true if you want to hide the close button in the upper right corner of the modal
71
+ *
72
+ * @param {function} [onOpened]
73
+ * A callback function that gets fired when the modal has been opened
74
+ *
75
+ * @param {function} [onClosed]
76
+ * A callback function that gets fired when the modal has been closed
77
+ *
78
+ */
79
+ constructor(options) {
80
+
81
+ this._internalVars = {
82
+ node: null,//used for current node
83
+ closeBtn : null
84
+ };
85
+
86
+ //options with defaults set
87
+ this._defaults = {
88
+ autoShow : false,
89
+ overlayShouldCloseModal : true,
90
+ hideCloseButton : false
91
+ };
92
+
93
+ // Create options by extending defaults with the passed in arugments
94
+ if (options && typeof options === "object") {
95
+ this._options = baseComponent.extendDefaults(this._defaults, options);
96
+ }
97
+
98
+ //if the required options are valid set up the environment
99
+ if( baseComponent.validateSettings(this._options, validateSettings) ){
100
+ this._internalVars.contentType = baseComponent.getContentType(this);
101
+ setLocalVars.call(this);
102
+ buildModal.call(this);
103
+ setEvents.call(this);
104
+
105
+ if(this._options.autoShow){
106
+ this.show();
107
+ }
108
+ }
109
+
110
+ }
111
+
112
+ //Public Methods
113
+
114
+ /**
115
+ * show()
116
+ * shows the modal
117
+ */
118
+ show(){
119
+
120
+ this._internalVars.node.style.display = "block";
121
+
122
+ setTimeout( ()=> {
123
+ this._internalVars.node.classList.add("modal--show");
124
+ if(this._options.onOpened)
125
+ this._options.onOpened();
126
+ }, 10);
127
+ this._internalVars.inModalArray = [];
128
+ document.addEventListener('keyup', this._internalVars.modalTabHandler);
129
+
130
+ }
131
+
132
+ /**
133
+ * hide()
134
+ * hides the modal
135
+ */
136
+ hide(duration = 500){
137
+ this._internalVars.inModalArray = [];
138
+ document.removeEventListener('keyup', this._internalVars.modalTabHandler);
139
+
140
+ return new PromiseIE((resolve, reject) => {
141
+ setTimeout( ()=> {
142
+ this._internalVars.node.classList.remove("modal--show");
143
+ this._internalVars.node.style.display = "none";
144
+ if(this._options.onClosed)
145
+ this._options.onClosed();
146
+ resolve();
147
+ }, duration);
148
+ });
149
+ }
150
+
151
+ /**
152
+ * destroy()
153
+ * removes the node from the dom and any events attached
154
+ */
155
+ destroy(){
156
+ removeEvents.call(this);
157
+ this._internalVars.node.parentNode.removeChild(this._internalVars.node);
158
+
159
+ //a little garbage collection
160
+ for (var variableKey in this){
161
+ if (this.hasOwnProperty(variableKey)){
162
+ delete this[variableKey];
163
+ }
164
+ }
165
+ }
166
+
167
+ }
168
+
169
+
170
+ /**
171
+ * setLocalVars()
172
+ * set all the local vars to passed in options
173
+ */
174
+ function setLocalVars() {
175
+ //determine the type of content passed in
176
+ if(this._internalVars.contentType === 'string'){
177
+ this._internalVars.node = document.querySelector(this._options.content);
178
+ }else if(this._internalVars.contentType === 'domNode'){
179
+ this._internalVars.node = this._options.content;
180
+ }
181
+
182
+ this._internalVars.modalTabHandler = isolateTab.bind(this);
183
+ }
184
+
185
+
186
+ /**
187
+ * modalClicked()
188
+ * Gets fired when you click anywhere on a model
189
+ */
190
+ function modalClicked(e) {
191
+
192
+ //NodeList of items that the mouse is currently over in document order.
193
+ //The last element in the NodeList is the most specific, each preceding
194
+ //one should be a parent, grandparent, and so on.
195
+ let nodes = document.querySelectorAll( ":hover" );
196
+
197
+ if(this._internalVars.node == nodes[nodes.length- 1]){
198
+ this.hide();
199
+ }
200
+
201
+
202
+ }
203
+
204
+ /**
205
+ * setEvents()
206
+ * Sets all the events needed for this component
207
+ */
208
+ function setEvents() {
209
+
210
+ const eventName = UserAgentService._clickEventName();
211
+
212
+ if(this._options.overlayShouldCloseModal){
213
+ this._internalVars.node.addEventListener(eventName, modalClicked.bind(this) );
214
+ }
215
+
216
+ if(this._options.hideCloseButton){
217
+ this._internalVars.closeBtn.classList.add("hidden");
218
+ }
219
+ else {
220
+ this._internalVars.closeBtn.addEventListener(eventName, this.hide.bind(this) );
221
+ }
222
+
223
+
224
+
225
+
226
+
227
+ }
228
+
229
+ /**
230
+ * removeEvents()
231
+ * removes all events from this component
232
+ */
233
+ function removeEvents() {
234
+
235
+ const eventName = UserAgentService._clickEventName();
236
+
237
+ if(this._options.overlayShouldCloseModal){
238
+ this._internalVars.node.removeEventListener(eventName, modalClicked.bind(this) );
239
+ }
240
+ this._internalVars.closeBtn.removeEventListener(eventName, this.hide.bind(this) );
241
+ }
242
+
243
+
244
+
245
+
246
+ /**
247
+ * buildModal()
248
+ * Adds needed markup this component
249
+ */
250
+ function buildModal() {
251
+ let modalContentDom = this._internalVars.node.querySelector(".modal-container");
252
+ modalContentDom.insertAdjacentHTML('afterBegin', modalCloseBtn);
253
+
254
+ this._internalVars.closeBtn = this._internalVars.node.querySelector(".btn-close");
255
+
256
+ let spanTab = document.createElement('span');
257
+ spanTab.setAttribute('tabindex', '0');
258
+ spanTab.setAttribute('class', 'tab-filler');
259
+ let cloneSpanTab = spanTab.cloneNode(true);
260
+ modalContentDom.appendChild(spanTab);
261
+ modalContentDom.insertBefore(cloneSpanTab, modalContentDom.children[0]);
262
+ }
263
+
264
+ function isolateTab(e){
265
+ if(e.keyCode == 9 || (e.keyCode == 9 && e.shiftKey)){
266
+ if (utils.isChild("modal", document.activeElement) && !document.activeElement.classList.contains('tab-filler') && !this._internalVars.inModalArray.includes(document.activeElement)) {
267
+ this._internalVars.inModalArray.push(document.activeElement);
268
+ }
269
+
270
+ if (document.activeElement.classList.contains('tab-filler')) {
271
+ if (this._internalVars.inModalArray.length > 0) {
272
+ this._internalVars.inModalArray[0].focus();
273
+ }
274
+ }
275
+ }
276
+ }
277
+
278
+
279
+ export default Modal;