geico-design-kit 7.0.0

Sign up to get free protection for your applications and to get access to all the features.

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,533 @@
1
+ import appState from '../../src/appState';
2
+ import * as utils from '../../src/utils';
3
+ import baseComponent from '../../src/baseComponent';
4
+ import UserAgentService from '../../src/services/UserAgentService';
5
+
6
+ const validateSettings = [
7
+ {
8
+ setting : "content",
9
+ isRequired : true,
10
+ validate : "type",
11
+ possibleValues : ["string","object"],
12
+ errorMessage : ["GDK TimelineFilter : Content must be defined and set to a DOM selector or Node"]
13
+ },
14
+ {
15
+ setting : "onFilterSubmit",
16
+ isRequired : false,
17
+ validate : "type",
18
+ possibleValues : ["function"],
19
+ errorMessage : ["GDK TimelineFilter : onFilterSubmit must be a function"]
20
+ },
21
+ {
22
+ setting : "onClearFilter",
23
+ isRequired : false,
24
+ validate : "type",
25
+ possibleValues : ["function"],
26
+ errorMessage : ["GDK TimelineFilter : onClearFilter must be a function"]
27
+ },
28
+ {
29
+ setting : "setInitialFilters",
30
+ isRequired : false,
31
+ validate : "type",
32
+ possibleValues : ["object"],
33
+ errorMessage : ["GDK TimelineFilter : setInitialFilters must be an object"]
34
+ }
35
+ ];
36
+
37
+ class TimelineFilter{
38
+ /**
39
+ * Refer to the design kit section of this component for JS examples and setting details.
40
+ * @param {string, Object} content
41
+ * A reference to the html timeline filter node
42
+ *
43
+ * @param {function} [onFilterSubmit]
44
+ * Callback function fired once a 'filter-submit' is clicked
45
+ *
46
+ * @param {function} [onClearFilter]
47
+ * Callback function fired once 'Clear Filters' is clicked
48
+ *
49
+ * @param {object} [setDefaultFilters]
50
+ * Accepts an array of objects containing checkbox IDs and an indicator to select or deselect them, selects or deselects them, and updates the count bubble
51
+ *
52
+ */
53
+ constructor(options) {
54
+
55
+ this._internalVars = {
56
+ node: null,//used for content item
57
+ dropdownTrigger: null,
58
+ checkbox: null,
59
+ dropdown: null,
60
+ mobileOpen: null,
61
+ //mobileClose: null,
62
+ mobileBar: null,
63
+ mobileText: null,
64
+ clear: null,
65
+ search: null,
66
+ submit: null,
67
+ dropdownContainer: null
68
+ };
69
+
70
+ //options with defaults set
71
+ this._defaults = {};
72
+
73
+ // Create options by extending defaults with the passed in arugments
74
+ if (options && typeof options === "object") {
75
+ this._options = baseComponent.extendDefaults(this._defaults, options);
76
+ }
77
+
78
+ //if the required options are valid set up the environment
79
+ if( baseComponent.validateSettings(this._options, validateSettings) ){
80
+ this._internalVars.contentType = baseComponent.getContentType(this);
81
+ setLocalVars.call(this);
82
+ setEvents.call(this);
83
+
84
+ if(appState.mode == "desktop")
85
+ Array.prototype.forEach.call(this._internalVars.dropdownTrigger, (el, i)=>{
86
+ el.setAttribute('aria-expanded', 'false');
87
+ });
88
+
89
+ if(this._options.setInitialFilters) {
90
+ this.setDefaultFilters.call(this, this._options.setInitialFilters);
91
+ }
92
+ }
93
+ }
94
+
95
+ //Public Methods
96
+
97
+ /**
98
+ * setDefaultFilters(obj)
99
+ * @param {object} [obj]
100
+ * Accepts an array of objects containing checkbox IDs and an indicator to select or deselect them, selects or deselects them, and updates the count bubble
101
+ */
102
+ setDefaultFilters(obj) {
103
+ Array.prototype.forEach.call(obj, (el)=> {
104
+ if(el.id && el.action) {
105
+ let checkbox = document.querySelector('#' + el.id);
106
+ if(checkbox) {
107
+ if(el.action === 'select') {
108
+ checkbox.checked = true;
109
+ updateAllNotificationBubbles.call(this, checkbox);
110
+ } else if (el.action === 'deselect') {
111
+ checkbox.checked = false;
112
+ updateAllNotificationBubbles.call(this, checkbox);
113
+ }
114
+ }
115
+ }
116
+ });
117
+ }
118
+
119
+ /**
120
+ * destroy()
121
+ * removes the node from the dom and any events attached
122
+ */
123
+ destroy(){
124
+ removeEvents.call(this);
125
+ this._internalVars.node.parentNode.removeChild(this._internalVars.node);
126
+
127
+ //a little garbage collection
128
+ for (var variableKey in this){
129
+ if (this.hasOwnProperty(variableKey)){
130
+ delete this[variableKey];
131
+ }
132
+ }
133
+ }
134
+
135
+ }
136
+
137
+ // Private Methods
138
+
139
+ /**
140
+ * setLocalVars()
141
+ * set all the local vars to passed in options
142
+ */
143
+ function setLocalVars() {
144
+ //determine the type of content passed in
145
+ if(this._internalVars.contentType === 'string'){
146
+ this._internalVars.node = document.querySelector(this._options.content);
147
+ }else if(this._internalVars.contentType === 'domNode'){
148
+ this._internalVars.node = this._options.content;
149
+ }
150
+
151
+ this._internalVars.dropdownTrigger = this._internalVars.node.querySelectorAll(".filter-dropdown-trigger");
152
+ this._internalVars.checkbox = this._internalVars.node.querySelectorAll(".filter-checkbox");
153
+ this._internalVars.dropdown = this._internalVars.node.querySelectorAll(".filter-dropdown");
154
+ this._internalVars.clear = this._internalVars.node.querySelector(".filter-clear");
155
+ this._internalVars.search = this._internalVars.node.querySelector(".filter-search");
156
+ this._internalVars.submit = this._internalVars.node.querySelector(".filter-submit");
157
+ this._internalVars.dropdownContainer = this._internalVars.node.querySelectorAll(".filter-container");
158
+
159
+ this._internalVars.mobileOpen = this._internalVars.node.querySelector(".filter-mobile-open");
160
+ //this._internalVars.mobileClose = this._internalVars.node.querySelector(".filter-mobile-close");
161
+ this._internalVars.mobileBar = this._internalVars.node.querySelector(".filter-mobile-bar");
162
+ this._internalVars.mobileText = this._internalVars.node.querySelector(".filter-mobile-bar-text");
163
+
164
+ this._internalVars.outsideHandler = outsideFieldClickHandler.bind(this);
165
+ this._internalVars.dropdownHandler = dropdownClickHandler.bind(this);
166
+ this._internalVars.checkTouchHandler = checkForTouch.bind(this);
167
+ this._internalVars.checkboxHandler = checkboxChangeHandler.bind(this);
168
+ this._internalVars.clearFilterHandler = clearFilter.bind(this);
169
+ this._internalVars.submitFilterHandler = submitFilter.bind(this);
170
+ this._internalVars.openDrawerHandler = openDrawer.bind(this);
171
+ this._internalVars.searchFocusHandler = searchFocus.bind(this);
172
+ }
173
+
174
+
175
+ /**
176
+ * setEvents()
177
+ * Sets all the events needed for the component
178
+ */
179
+ function setEvents() {
180
+
181
+ const eventName = UserAgentService._clickEventName();
182
+
183
+ //set click events
184
+ Array.prototype.forEach.call(this._internalVars.dropdownTrigger, (el, i)=>{
185
+ el.addEventListener(eventName,this._internalVars.dropdownHandler);
186
+ el.addEventListener("pointerdown", this._internalVars.checkTouchHandler );
187
+ });
188
+ Array.prototype.forEach.call(this._internalVars.dropdownContainer, (el, i)=>{
189
+ el.addEventListener("mouseleave",this._internalVars.outsideHandler);
190
+ });
191
+ Array.prototype.forEach.call(this._internalVars.checkbox, (el, i)=>{
192
+ el.addEventListener('change', this._internalVars.checkboxHandler);
193
+ });
194
+
195
+ this._internalVars.clear.addEventListener(eventName, this._internalVars.clearFilterHandler);
196
+ if(this._internalVars.search){
197
+ this._internalVars.search.addEventListener('focus', this._internalVars.searchFocusHandler );
198
+ }
199
+ this._internalVars.submit.addEventListener(eventName, this._internalVars.submitFilterHandler );
200
+
201
+ // mobile
202
+ this._internalVars.mobileOpen.addEventListener(eventName, this._internalVars.openDrawerHandler);
203
+ //this._internalVars.mobileClose.addEventListener(eventName, closeDrawer.bind(this) );
204
+
205
+ }
206
+
207
+
208
+ /**
209
+ * removeEvents()
210
+ * removes all events from the component
211
+ */
212
+ function removeEvents() {
213
+
214
+ const eventName = UserAgentService._clickEventName();
215
+
216
+ //remove click events
217
+ Array.prototype.forEach.call(this._internalVars.dropdownTrigger, (el, i)=>{
218
+ el.removeEventListener(eventName,this._internalVars.dropdownHandler);
219
+ el.removeEventListener("pointerdown", this._internalVars.checkTouchHandler);
220
+ });
221
+ Array.prototype.forEach.call(this._internalVars.dropdownContainer, (el, i)=>{
222
+ el.removeEventListener("mouseleave",this._internalVars.outsideHandler);
223
+ });
224
+ Array.prototype.forEach.call(this._internalVars.checkbox, (el, i)=>{
225
+ el.removeEventListener('change',this._internalVars.checkboxHandler);
226
+ });
227
+
228
+ this._internalVars.clear.removeEventListener(eventName, this._internalVars.clearFilterHandler );
229
+ if(this._internalVars.search){
230
+ this._internalVars.search.removeEventListener('focus', this._internalVars.searchFocusHandler );
231
+ }
232
+ this._internalVars.submit.removeEventListener(eventName, this._internalVars.submitFilterHandler );
233
+
234
+ // mobile
235
+ this._internalVars.mobileOpen.removeEventListener(eventName, this._internalVars.openDrawerHandler);
236
+ //this._internalVars.mobileClose.removeEventListener(eventName, closeDrawer.bind(this) );
237
+ }
238
+
239
+
240
+ function checkForTouch(el){
241
+ if(el.pointerType=='touch'){
242
+ Array.prototype.forEach.call(this._internalVars.dropdownContainer, (el, i)=>{
243
+ el.removeEventListener("mouseleave",this._internalVars.outsideHandler);
244
+ });
245
+ }else{
246
+ Array.prototype.forEach.call(this._internalVars.dropdownContainer, (el, i)=>{
247
+ el.addEventListener("mouseleave",this._internalVars.outsideHandler);
248
+ });
249
+ }
250
+ }
251
+
252
+ /**
253
+ * openDrawer()
254
+ * opens the mobile filter drawer
255
+ */
256
+ function openDrawer(el){
257
+ if(utils.hasClass(this._internalVars.node, "-drawer-open")){
258
+ closeDrawer.call(this);
259
+ }else{
260
+ this._internalVars.node.classList.add("-drawer-open");
261
+ }
262
+
263
+
264
+ }
265
+
266
+ /**
267
+ * closeDrawer()
268
+ * closes the mobile filter drawer
269
+ */
270
+ function closeDrawer(el){
271
+ this._internalVars.node.classList.remove("-drawer-open");
272
+ }
273
+
274
+ /**
275
+ * submitFilter()
276
+ * submits Filter form
277
+ */
278
+ function submitFilter(el){
279
+
280
+ let data = serializeForm(this._internalVars.node);
281
+
282
+ // if mobile, close the drawer and update the filter text
283
+ if(appState.mode === "mobile"){
284
+ let fields = Object.keys(data).length;
285
+
286
+ if ((data.keywords !== '') || (fields > 1)) {
287
+ this._internalVars.mobileText.innerHTML = 'Showing filtered activities & policies';
288
+ } else {
289
+ this._internalVars.mobileText.innerHTML = 'Showing all activities & policies';
290
+ }
291
+ this._internalVars.node.classList.remove("-drawer-open");
292
+ }
293
+
294
+ // fire onFilterSubmit Callback if there is one
295
+ setTimeout( ()=> {
296
+ if(this._options.onFilterSubmit)
297
+ this._options.onFilterSubmit(data);
298
+ }, 10);
299
+
300
+ return false;
301
+ }
302
+
303
+ /**
304
+ * serializeForm()
305
+ * serialize form into object
306
+ */
307
+ function serializeForm(form){
308
+ if (!form || form.nodeName !== "FORM") {
309
+ return;
310
+ }
311
+ var i, j,
312
+ obj = {};
313
+ for (i = form.elements.length - 1; i >= 0; i = i - 1) {
314
+ if (form.elements[i].name === "") {
315
+ continue;
316
+ }
317
+ switch (form.elements[i].nodeName) {
318
+ case 'INPUT':
319
+ switch (form.elements[i].type) {
320
+ case 'text':
321
+ case 'hidden':
322
+ case 'password':
323
+ case 'button':
324
+ case 'reset':
325
+ case 'submit':
326
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].value);
327
+ break;
328
+ case 'checkbox':
329
+ case 'radio':
330
+ if (form.elements[i].checked) {
331
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].value);
332
+ }
333
+ break;
334
+ case 'file':
335
+ break;
336
+ }
337
+ break;
338
+ case 'TEXTAREA':
339
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].value);
340
+ break;
341
+ case 'SELECT':
342
+ switch (form.elements[i].type) {
343
+ case 'select-one':
344
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].value);
345
+ break;
346
+ case 'select-multiple':
347
+ for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
348
+ if (form.elements[i].options[j].selected) {
349
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].options[j].value);
350
+ }
351
+ }
352
+ break;
353
+ }
354
+ break;
355
+ case 'BUTTON':
356
+ switch (form.elements[i].type) {
357
+ case 'reset':
358
+ case 'submit':
359
+ case 'button':
360
+ obj[form.elements[i].name] = encodeURIComponent(form.elements[i].value);
361
+ break;
362
+ }
363
+ break;
364
+ }
365
+ }
366
+ return obj;
367
+
368
+ }
369
+
370
+ /**
371
+ * clearFilter()
372
+ * clears the timeline filters and unchecks all checkboxes
373
+ */
374
+ function clearFilter(e){
375
+ e.preventDefault();
376
+ // unchecks all checkboxes
377
+ Array.prototype.forEach.call(this._internalVars.checkbox, (el, i)=>{
378
+
379
+ el.checked = false;
380
+
381
+ });
382
+
383
+ // update notification bubble to 0
384
+ Array.prototype.forEach.call(this._internalVars.dropdownTrigger, (el, i)=>{
385
+
386
+ updateNotificationBubble(el, 0);
387
+
388
+ });
389
+
390
+ // clears search field
391
+ if(this._internalVars.search){
392
+ this._internalVars.search.value = '';
393
+ }
394
+
395
+
396
+ // fire onClearFilter Callback if there is one
397
+ setTimeout( ()=> {
398
+ if(this._options.onClearFilter)
399
+ this._options.onClearFilter();
400
+ }, 10);
401
+
402
+ }
403
+
404
+ /**
405
+ * checkboxChangeHandler()
406
+ * updates the notification of how many checkboxes are selected per dropdown
407
+ */
408
+ function checkboxChangeHandler(el){
409
+
410
+ let currentNode = el.currentTarget;
411
+
412
+ let dropdownParent = findAncestor(currentNode, 'filter-dropdown');
413
+ let dropdownTrigger = dropdownParent.parentElement;
414
+
415
+ let total = dropdownParent.querySelectorAll('input[type="checkbox"]:checked').length;
416
+
417
+ updateNotificationBubble(dropdownTrigger, total);
418
+
419
+ }
420
+
421
+ /**
422
+ * findAncestor()
423
+ * Finds nearest ancestor with specified class
424
+ */
425
+ function findAncestor (el, cls) {
426
+ while ((el = el.parentElement) && !el.classList.contains(cls));
427
+ return el;
428
+ }
429
+
430
+ /**
431
+ * updateNotificationBubble()
432
+ * updates the notification of how many checkboxes are selected per dropdown
433
+ */
434
+ function updateNotificationBubble(el, value){
435
+
436
+ let bubble = el.getElementsByClassName('dropdown-notify')[0];
437
+ bubble.innerHTML = value;
438
+
439
+ if (value > 0) {
440
+ bubble.classList.add("-visible");
441
+ } else {
442
+ bubble.classList.remove("-visible");
443
+ }
444
+ }
445
+
446
+ function updateAllNotificationBubbles(el) {
447
+
448
+ let dropdownParent = findAncestor(el, 'filter-dropdown');
449
+ let dropdownTrigger = dropdownParent.parentElement;
450
+
451
+ let total = dropdownParent.querySelectorAll('input[type="checkbox"]:checked').length;
452
+
453
+ updateNotificationBubble(dropdownTrigger, total);
454
+ }
455
+
456
+ /**
457
+ * dropdownClickHandler()
458
+ * Opens tab content for clicked tab and hides the rest
459
+ */
460
+ function dropdownClickHandler(el){
461
+
462
+ let currentNode = el.currentTarget;
463
+ currentNode.focus();
464
+ // add -active class
465
+ Array.prototype.map.call(this._internalVars.dropdownTrigger, (e, rank)=> {
466
+ if(e===currentNode&&e===document.activeElement){
467
+ // if already has active class, remove it
468
+ if (utils.hasClass(e,'filter-dropdown-trigger--active')) {
469
+ e.classList.remove("filter-dropdown-trigger--active");
470
+ if(appState.mode == 'desktop')
471
+ e.setAttribute('aria-expanded', 'false');
472
+
473
+ } else {
474
+ e.classList.add("filter-dropdown-trigger--active");
475
+ if(appState.mode == 'desktop'){
476
+ e.setAttribute('aria-expanded', 'true');
477
+ }
478
+
479
+ }
480
+
481
+ } else {
482
+ e.classList.remove("filter-dropdown-trigger--active");
483
+ if(appState.mode == 'desktop')
484
+ e.setAttribute('aria-expanded', 'false');
485
+ }
486
+ });
487
+
488
+ }
489
+
490
+ /**
491
+ * dropdownClickHandler()
492
+ * Opens tab content for clicked tab and hides the rest
493
+ */
494
+ function outsideFieldClickHandler(el){
495
+
496
+ let currentNode = el.currentTarget;
497
+ // add -active class
498
+ Array.prototype.map.call(this._internalVars.dropdownTrigger, (e, rank)=> {
499
+ if(e===currentNode){
500
+ // if already has active class, remove it
501
+ if (utils.hasClass(e,'filter-dropdown-trigger--active')) {
502
+ e.classList.remove("filter-dropdown-trigger--active");
503
+ if(appState.mode == 'desktop')
504
+ e.setAttribute('aria-expanded', 'false');
505
+ }
506
+
507
+ } else {
508
+ e.classList.remove("filter-dropdown-trigger--active");
509
+ if(appState.mode == 'desktop')
510
+ e.setAttribute('aria-expanded', 'false');
511
+ }
512
+ });
513
+
514
+ }
515
+
516
+ /**
517
+ * searchFocus()
518
+ * Closes all dropdowns on search focus
519
+ */
520
+ function searchFocus(el){
521
+ // add -active class
522
+ Array.prototype.map.call(this._internalVars.dropdownTrigger, (e, rank)=> {
523
+ e.classList.remove("filter-dropdown-trigger--active");
524
+ if(appState.mode == 'desktop')
525
+ e.setAttribute('aria-expanded', 'false');
526
+ });
527
+
528
+ }
529
+
530
+
531
+
532
+
533
+ export default TimelineFilter;
@@ -0,0 +1,153 @@
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 ToTopArrow : Content must be defined and set to a DOM selector or Node"]
10
+ },
11
+ {
12
+ setting: "toTopArrowClicked",
13
+ isRequired: false,
14
+ validate: "type",
15
+ possibleValues: ["function"],
16
+ errorMessage: ["GDK ToTopArrow : toTopArrowClicked must be defined and set function"]
17
+ }
18
+ ];
19
+
20
+ class ToTopArrow {
21
+ /**
22
+ * Refer to the design kit section of this component for JS examples and setting details.
23
+ * @param {string, Object} content
24
+ * A reference to the component node to toggle
25
+ *
26
+ * @param {function} [toTopArrowClicked]
27
+ * A callback function that gets fired when the To Top arrow is clicked
28
+ *
29
+ */
30
+ constructor(options) {
31
+
32
+ console.log('ToTopArrow has been initialized');
33
+
34
+ this._internalVars = {
35
+ node: null //used for current node
36
+ };
37
+
38
+ //options with defaults set
39
+ this._defaults = {
40
+ "getDuration": function () {
41
+ return (pageYOffset <= 2000) ? 300 : 1200;
42
+ }
43
+ };
44
+
45
+ // Create options by extending defaults with the passed in arguments
46
+ if (options && typeof options === "object") {
47
+ this._options = baseComponent.extendDefaults(this._defaults, options);
48
+ }
49
+
50
+
51
+ //if the required options are valid set up the environment
52
+ if (baseComponent.validateSettings(this._options, validateSettings)) {
53
+ this._internalVars.contentType = baseComponent.getContentType(this);
54
+ setLocalVars.call(this);
55
+ setEvents.call(this);
56
+ }
57
+ }
58
+
59
+ //Public Methods
60
+
61
+ /**
62
+ * removes the node from the dom and any events attached
63
+ */
64
+ destroy() {
65
+ removeEvents.call(this);
66
+ this._internalVars.node.parentNode.removeChild(this._internalVars.node);
67
+
68
+ //a little garbage collection
69
+ for (let variableKey in this) {
70
+ if (this.hasOwnProperty(variableKey)) {
71
+ delete this[variableKey];
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ // Private Methods
78
+ /**
79
+ * setEvents()
80
+ * Sets all the events needed for the component
81
+ */
82
+ function setEvents() {
83
+ this._internalVars.button.addEventListener("click", this._internalVars.handler);
84
+ window.addEventListener("scroll", toggleScrollBtnView.bind(this));
85
+ }
86
+
87
+
88
+ /**
89
+ * removeEvents()
90
+ * removes all events from the component
91
+ */
92
+ function removeEvents() {
93
+ this._internalVars.button.removeEventListener("click", this._internalVars.handler);
94
+ }
95
+
96
+ /**
97
+ * toggleScrollBtnView()
98
+ * @param e
99
+ */
100
+ function toggleScrollBtnView(e) {
101
+ if (((window.scrollY || screen.scrollY) > 200 && !this._internalVars.isDisplayed) || ((window.pageYOffset || screen.pageYOffset) > 200 && !this._internalVars.isDisplayed)) {
102
+ this._internalVars.button.classList.add('displayed');
103
+ this._internalVars.isDisplayed = true;
104
+ } else if ((window.scrollY <= 100 && this._internalVars.isDisplayed) || (window.pageYOffset <= 100 && this._internalVars.isDisplayed)) {
105
+ this._internalVars.button.classList.remove('displayed');
106
+ this._internalVars.isDisplayed = false;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * toggleView()
112
+ * instantiate To Top Arrow
113
+ */
114
+
115
+ function toggleScroll(e) {
116
+ //TODO: set correct Duration speed!
117
+ let duration = this._defaults.getDuration();
118
+ e.preventDefault();
119
+ let scrollStep = -window.scrollY / (duration / 15) || -window.pageYOffset / (duration / 15),
120
+ scrollInterval = setInterval(function () {
121
+ if ((window.scrollY !== 0 && window.scrollY !== undefined) || (window.pageYOffset !== 0 && window.pageYOffset !== undefined)) {
122
+ window.scrollBy(0, scrollStep);
123
+ }
124
+ else clearInterval(scrollInterval);
125
+ }, 15);
126
+
127
+ if (this._options.toTopArrowClicked) {
128
+ this._options.toTopArrowClicked();
129
+ }
130
+ }
131
+
132
+ /**
133
+ * setLocalVars()
134
+ * set local vars to the ones passed in options
135
+ */
136
+ function setLocalVars() {
137
+ if (this._internalVars.contentType === 'string') {
138
+ this._internalVars.node = document.querySelector(this._options.content);
139
+ } else if (this._internalVars.contentType === 'domNode') {
140
+ this._internalVars.node = this._options.content;
141
+ }
142
+
143
+ //add icon dom
144
+ this._internalVars.node.insertAdjacentHTML('beforeend', `<div class="icon-to-top-arrow"></div>`);
145
+
146
+
147
+ this._internalVars.button = this._internalVars.node;
148
+ this._internalVars.isDisplayed = false;
149
+
150
+ this._internalVars.handler = toggleScroll.bind(this);
151
+ }
152
+
153
+ export default ToTopArrow;