@iamproperty/components 3.4.5 → 3.4.7

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 (203) hide show
  1. package/assets/css/components/accordion.css +1 -0
  2. package/assets/css/components/accordion.css.map +1 -0
  3. package/assets/css/components/alert.css +1 -0
  4. package/assets/css/components/alert.css.map +1 -0
  5. package/assets/css/components/applied-filters.css +1 -0
  6. package/assets/css/components/applied-filters.css.map +1 -0
  7. package/assets/css/components/buttons.css +1 -0
  8. package/assets/css/components/buttons.css.map +1 -0
  9. package/assets/css/components/card.css +1 -0
  10. package/assets/css/components/card.css.map +1 -0
  11. package/assets/css/components/carousel.css +1 -0
  12. package/assets/css/components/carousel.css.map +1 -0
  13. package/assets/css/components/charts.css +1 -0
  14. package/assets/css/components/charts.css.map +1 -0
  15. package/assets/css/components/container.css +1 -0
  16. package/assets/css/components/container.css.map +1 -0
  17. package/assets/css/components/dialog.css +1 -0
  18. package/assets/css/components/dialog.css.map +1 -0
  19. package/assets/css/components/forms.css +1 -0
  20. package/assets/css/components/forms.css.map +1 -0
  21. package/assets/css/components/header.css +1 -0
  22. package/assets/css/components/header.css.map +1 -0
  23. package/assets/css/components/lists.css +1 -0
  24. package/assets/css/components/lists.css.map +1 -0
  25. package/assets/css/components/nav.css +1 -0
  26. package/assets/css/components/nav.css.map +1 -0
  27. package/assets/css/components/pagination.css +1 -0
  28. package/assets/css/components/pagination.css.map +1 -0
  29. package/assets/css/components/panel.css +1 -0
  30. package/assets/css/components/panel.css.map +1 -0
  31. package/assets/css/components/property-searchbar.css +1 -0
  32. package/assets/css/components/property-searchbar.css.map +1 -0
  33. package/assets/css/components/snapshot.css +1 -0
  34. package/assets/css/components/snapshot.css.map +1 -0
  35. package/assets/css/components/stepper.css +1 -0
  36. package/assets/css/components/stepper.css.map +1 -0
  37. package/assets/css/components/table.css +1 -0
  38. package/assets/css/components/table.css.map +1 -0
  39. package/assets/css/components/tabs.css +1 -0
  40. package/assets/css/components/tabs.css.map +1 -0
  41. package/assets/css/components/testimonial.css +1 -0
  42. package/assets/css/components/testimonial.css.map +1 -0
  43. package/assets/css/components/timeline.css +1 -0
  44. package/assets/css/components/timeline.css.map +1 -0
  45. package/assets/css/components/tooltips.css +1 -0
  46. package/assets/css/components/tooltips.css.map +1 -0
  47. package/assets/css/core.min.css +1 -1
  48. package/assets/css/core.min.css.map +1 -1
  49. package/assets/css/style.min.css +1 -1
  50. package/assets/css/style.min.css.map +1 -1
  51. package/assets/fonts/qanelas-bold-webfont.woff +0 -0
  52. package/assets/fonts/qanelas-bold-webfont.woff2 +0 -0
  53. package/assets/js/bundle.js +68 -0
  54. package/assets/js/components/accordion/accordion.component.js +33 -0
  55. package/assets/js/components/accordion/accordion.component.min.js +14 -0
  56. package/assets/js/components/accordion/accordion.component.min.js.map +1 -0
  57. package/assets/js/components/applied-filters/applied-filters.component.js +26 -0
  58. package/assets/js/components/card/card.component.js +91 -0
  59. package/assets/js/components/card/card.component.min.js +21 -0
  60. package/assets/js/components/card/card.component.min.js.map +1 -0
  61. package/assets/js/components/filterlist/filterlist.component.js +49 -0
  62. package/assets/js/components/filterlist/filterlist.component.min.js +23 -0
  63. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -0
  64. package/assets/js/components/header/header.component.js +51 -0
  65. package/assets/js/components/header/header.component.min.js +30 -0
  66. package/assets/js/components/header/header.component.min.js.map +1 -0
  67. package/assets/js/components/pagination/pagination.component.js +34 -0
  68. package/assets/js/components/table/table.component.js +104 -0
  69. package/assets/js/components/table/table.component.min.js +24 -0
  70. package/assets/js/components/table/table.component.min.js.map +1 -0
  71. package/assets/js/components/tabs/tabs.component.js +34 -0
  72. package/assets/js/components/tabs/tabs.component.min.js +17 -0
  73. package/assets/js/components/tabs/tabs.component.min.js.map +1 -0
  74. package/assets/js/dynamic.js +74 -0
  75. package/assets/js/dynamic.min.js +5 -0
  76. package/assets/js/dynamic.min.js.map +1 -0
  77. package/assets/js/flat-components.js +79 -0
  78. package/assets/js/modules/accordion.js +11 -14
  79. package/assets/js/modules/applied-filters.js +100 -0
  80. package/assets/js/modules/data-layer.js +45 -0
  81. package/assets/js/modules/filterlist.js +32 -0
  82. package/assets/js/modules/helpers.js +80 -47
  83. package/assets/js/modules/pagination.js +33 -0
  84. package/assets/js/modules/table.js +507 -420
  85. package/assets/js/modules/tabs.js +97 -0
  86. package/assets/js/modules/youtubevideo.js +53 -61
  87. package/assets/js/scripts.bundle.js +111 -984
  88. package/assets/js/scripts.bundle.js.map +1 -1
  89. package/assets/js/scripts.bundle.min.js +3 -4
  90. package/assets/js/scripts.bundle.min.js.map +1 -1
  91. package/assets/js/tests/filterlist.spec.js +22 -0
  92. package/assets/js/tests/pagination.spec.js +15 -0
  93. package/assets/js/tests/table.spec.js +147 -0
  94. package/assets/sass/_components.scss +1 -2
  95. package/assets/sass/_corefiles.scss +5 -4
  96. package/assets/sass/_fonts.scss +4 -4
  97. package/assets/sass/_func.scss +1 -0
  98. package/assets/sass/_functions/functions.scss +6 -0
  99. package/assets/sass/_functions/mixins.scss +9 -9
  100. package/assets/sass/_functions/utilities.scss +16 -0
  101. package/assets/sass/_functions/variables.scss +128 -86
  102. package/assets/sass/_tests/colours.spec.scss +1 -1
  103. package/assets/sass/_tests/mixins.spec.scss +1 -1
  104. package/assets/sass/_tests/typography.spec.scss +2 -2
  105. package/assets/sass/components/accordion.scss +9 -6
  106. package/assets/sass/components/applied-filters.scss +65 -0
  107. package/assets/sass/components/card.scss +178 -227
  108. package/assets/sass/components/charts.scss +4 -0
  109. package/assets/sass/components/container.scss +13 -8
  110. package/assets/sass/components/dialog.scss +202 -0
  111. package/assets/sass/components/forms.scss +39 -5
  112. package/assets/sass/components/header.scss +34 -11
  113. package/assets/sass/components/lists.scss +15 -0
  114. package/assets/sass/components/nav.scss +5 -1
  115. package/assets/sass/components/pagination.scss +140 -0
  116. package/assets/sass/components/panel.scss +3 -4
  117. package/assets/sass/components/snapshot.scss +1 -1
  118. package/assets/sass/components/table.scss +419 -0
  119. package/assets/sass/components/tabs.scss +52 -36
  120. package/assets/sass/components/timeline.scss +2 -2
  121. package/assets/sass/foundations/icons.scss +1 -1
  122. package/assets/sass/{components → foundations}/links.scss +29 -2
  123. package/assets/sass/foundations/reboot.scss +21 -15
  124. package/assets/sass/foundations/root.scss +12 -5
  125. package/assets/sass/foundations/type.scss +90 -66
  126. package/assets/svg/illustrations/table.svg +165 -0
  127. package/assets/ts/README.md +12 -0
  128. package/assets/ts/bundle.ts +87 -0
  129. package/assets/ts/components/accordion/README.md +17 -0
  130. package/assets/ts/components/accordion/accordion.component.ts +43 -0
  131. package/assets/ts/components/applied-filters/README.md +5 -0
  132. package/assets/ts/components/applied-filters/applied-filters.component.ts +33 -0
  133. package/assets/ts/components/card/README.md +22 -0
  134. package/assets/ts/components/card/card.component.ts +117 -0
  135. package/assets/ts/components/filterlist/README.md +17 -0
  136. package/assets/ts/components/filterlist/filterlist.component.ts +60 -0
  137. package/assets/ts/components/header/README.md +26 -0
  138. package/assets/ts/components/header/header.component.ts +61 -0
  139. package/assets/ts/components/pagination/README.md +11 -0
  140. package/assets/ts/components/pagination/pagination.component.ts +45 -0
  141. package/assets/ts/components/table/README.md +23 -0
  142. package/assets/ts/components/table/table.component.ts +128 -0
  143. package/assets/ts/components/tabs/README.md +18 -0
  144. package/assets/ts/components/tabs/tabs.component.ts +41 -0
  145. package/assets/ts/dynamic.ts +98 -0
  146. package/assets/ts/flat-components.ts +100 -0
  147. package/assets/ts/html.d.ts +4 -0
  148. package/assets/ts/modules/accordion.ts +15 -21
  149. package/assets/ts/modules/applied-filters.ts +146 -0
  150. package/assets/ts/modules/data-layer.ts +58 -0
  151. package/assets/ts/modules/filterlist.ts +46 -0
  152. package/assets/ts/modules/helpers.ts +93 -55
  153. package/assets/ts/modules/pagination.ts +44 -0
  154. package/assets/ts/modules/table.ts +598 -433
  155. package/assets/ts/modules/tabs.ts +136 -0
  156. package/assets/ts/modules/youtubevideo.ts +58 -63
  157. package/assets/ts/tests/filterlist.spec.ts +29 -0
  158. package/assets/ts/tests/pagination.spec.ts +21 -0
  159. package/assets/ts/tests/table.spec.ts +191 -0
  160. package/dist/components.es.js +1359 -1356
  161. package/dist/components.umd.js +103 -54
  162. package/dist/style.css +1 -1
  163. package/package.json +20 -12
  164. package/src/components/Accordion/Accordion.spec.js +1 -1
  165. package/src/components/Accordion/Accordion.vue +7 -5
  166. package/src/components/Accordion/AccordionItem.vue +3 -6
  167. package/src/components/Accordion/README.md +0 -2
  168. package/src/components/AppliedFilters/AppliedFilters.vue +20 -0
  169. package/src/components/AppliedFilters/README.md +5 -0
  170. package/src/components/Card/Card.vue +11 -112
  171. package/src/components/Card/README.md +16 -18
  172. package/src/components/Carousel/Carousel.vue +49 -10
  173. package/src/components/Chart/Chart.vue +46 -4
  174. package/src/components/Filterlist/Filterlist.vue +20 -0
  175. package/src/components/Filterlist/README.md +17 -0
  176. package/src/components/Header/Header.spec.js +5 -4
  177. package/src/components/Header/Header.vue +14 -20
  178. package/src/components/Pagination/Pagination.vue +30 -0
  179. package/src/components/Pagination/README.md +11 -0
  180. package/src/components/Snapshot/Snapshot.vue +1 -1
  181. package/src/components/Table/README.md +29 -44
  182. package/src/components/Table/Table.spec.js +5 -37
  183. package/src/components/Table/Table.vue +16 -91
  184. package/src/components/Tabs/README.md +0 -2
  185. package/src/components/Tabs/Tab.vue +3 -2
  186. package/src/components/Tabs/Tabs.vue +8 -64
  187. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +1 -1
  188. package/src/index.js +3 -2
  189. package/assets/fonts/qanelassoft-extrabold-webfont.woff +0 -0
  190. package/assets/fonts/qanelassoft-extrabold-webfont.woff2 +0 -0
  191. package/assets/js/main.js +0 -57
  192. package/assets/js/modules/modal.js +0 -69
  193. package/assets/sass/components/cardDeck.scss +0 -108
  194. package/assets/sass/components/modal.scss +0 -136
  195. package/assets/sass/components/tables.scss +0 -291
  196. package/assets/ts/main.ts +0 -68
  197. package/assets/ts/modules/modal.ts +0 -91
  198. package/src/components/CardDeck/CardDeck.spec.js +0 -99
  199. package/src/components/CardDeck/CardDeck.vue +0 -77
  200. package/src/components/CardDeck/README.md +0 -25
  201. package/src/components/Modal/Modal.spec.js +0 -22
  202. package/src/components/Modal/Modal.vue +0 -43
  203. package/src/components/Modal/README.md +0 -20
@@ -0,0 +1,128 @@
1
+ // @ts-nocheck
2
+ import * as tableModule from "../../modules/table";
3
+ import createPaginationButttons from "../../modules/pagination";
4
+
5
+ class iamTable extends HTMLElement {
6
+
7
+ constructor(){
8
+ super();
9
+ this.attachShadow({ mode: 'open'});
10
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
11
+
12
+ const isCTA = this.classList.contains('table--cta');
13
+ const isExportable = this.classList.contains('table--export');
14
+
15
+ let classList = this.classList.toString();
16
+
17
+ classList = classList.replace('table--cta','');
18
+
19
+ const template = document.createElement('template');
20
+ template.innerHTML = `
21
+ <style>
22
+ @import "${assetLocation}/css/core.min.css";
23
+ </style>
24
+ ${isCTA ? '<div class="table--cta">' : ''}
25
+ <div class="table__wrapper ${classList}">
26
+ <slot></slot>
27
+ </div>
28
+ ${isCTA ? '</div>' : ''}
29
+ ${isExportable ? '<button class="link" type="button" data-export>Export table as CSV</button>' : ''}
30
+ <div class="table__pagination"></div>
31
+ `;
32
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
33
+
34
+ const params = new URLSearchParams(window.location.search)
35
+ // Set default attributes
36
+ if(!this.hasAttribute('data-total'))
37
+ this.setAttribute('data-total', this.querySelectorAll('table tbody tr').length);
38
+
39
+ if(!this.hasAttribute('data-page'))
40
+ this.setAttribute('data-page', (params.has('page') ? params.get('page') : 1));
41
+
42
+ if(!this.hasAttribute('data-show'))
43
+ this.setAttribute('data-show', 15);
44
+
45
+ this.setAttribute('data-pages', Math.ceil(this.getAttribute('data-total') / this.getAttribute('data-show')));
46
+ }
47
+
48
+ connectedCallback() {
49
+
50
+ this.table = this.querySelector('table');
51
+ this.savedTableBody = this.querySelector('tbody').cloneNode(true);
52
+ this.pagination = this.shadowRoot.querySelector('.table__pagination');
53
+
54
+ // Set events on the filter table
55
+ this.form = document.createElement('form');
56
+ if(this.hasAttribute('data-filterby')){
57
+
58
+ this.form = document.querySelector(`#${this.getAttribute('data-filterby')}`);
59
+
60
+ // Create a data list if a search input is present
61
+ tableModule.createSearchDataList(this.table, this.form);
62
+
63
+ if(!this.form.querySelector('[data-page]')){
64
+ this.form.innerHTML += `<input name="page" type="hidden" value="${this.getAttribute('data-page')}" data-pagination="true" />`
65
+ }
66
+ if(!this.form.querySelector('[data-show]')){
67
+ this.form.innerHTML += `<input name="show" type="hidden" value="${this.getAttribute('data-show')}" data-show="true" />`
68
+ }
69
+ }
70
+
71
+
72
+ // Event listeners
73
+ tableModule.addTableEventListeners(this.table);
74
+ tableModule.addFilterEventListeners(this.table, this.form, this.pagination, this, this.savedTableBody);
75
+ tableModule.addPaginationEventListeners(this.table, this.form, this.pagination, this);
76
+ tableModule.addExportEventListeners(this.shadowRoot.querySelector('[data-export]'), this.table);
77
+
78
+ if(this.form.getAttribute('data-ajax')){
79
+ tableModule.loadAjaxTable(this.table, this.form, this.pagination, this);
80
+ }
81
+ else {
82
+ tableModule.makeTableFunctional(this.table, this.form, this.pagination, this);
83
+ tableModule.filterTable(this.table, this.form,this);
84
+ createPaginationButttons(this,this.pagination);
85
+ }
86
+
87
+ }
88
+
89
+
90
+ static get observedAttributes() {
91
+ return ["data-total","data-pages","data-page","data-show"];
92
+ }
93
+
94
+ attributeChangedCallback(attrName, oldVal, newVal) {
95
+ /*
96
+ switch (attrName) {
97
+ case "data-total": {
98
+ this.setAttribute('data-pages', Math.ceil(newVal / this.getAttribute('data-show')));
99
+ break;
100
+ }
101
+ case "data-show": {
102
+ this.setAttribute('data-pages', Math.ceil(this.getAttribute('data-total') / newVal));
103
+ break;
104
+ }
105
+ case "data-pages": {
106
+ console.log('create pagination');
107
+
108
+ tableModule.filterTable(this.table, this.form);
109
+ createPaginationButttons(this,this.pagination);
110
+
111
+ break;
112
+ }
113
+ case "data-page": {
114
+
115
+ let paginationInput = this.form.querySelector('[data-pagination]');
116
+
117
+ paginationInput.value = newVal;
118
+
119
+ //tableModule.filterTable(this.table, this.form);
120
+
121
+ break;
122
+ }
123
+ }
124
+ */
125
+ }
126
+ }
127
+
128
+ export default iamTable;
@@ -0,0 +1,18 @@
1
+ ```
2
+ <iam-tabs class="container">
3
+ <details>
4
+ <summary>Question 1</summary>
5
+ <p>Answer </p>
6
+ </details>
7
+ <details>
8
+ <summary>Question 2</summary>
9
+ <p>Answer</p>
10
+ </details>
11
+ </iam-tabs>
12
+ ```
13
+
14
+ ### Tab Properties
15
+
16
+ | Option | Type | Default Value | Description |
17
+ | ------ | ---- | ------------- | ----------- |
18
+ | title | String | - | Used for the heading of the component |
@@ -0,0 +1,41 @@
1
+ // @ts-nocheck
2
+ import tabs from "../../modules/tabs";
3
+
4
+ // Data layer Web component created
5
+ window.dataLayer = window.dataLayer || [];
6
+ window.dataLayer.push({
7
+ "event": "customElementRegistered",
8
+ "element": "tabs"
9
+ });
10
+
11
+ class iamTabs extends HTMLElement {
12
+
13
+ constructor(){
14
+ super();
15
+ this.attachShadow({ mode: 'open'});
16
+
17
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
18
+ const loadCSS = `@import "${assetLocation}/css/components/tabs.css";`;
19
+ const template = document.createElement('template');
20
+ template.innerHTML = `
21
+ <style>
22
+ @import "${assetLocation}/css/core.min.css";
23
+ ${loadCSS}
24
+
25
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
26
+ </style>
27
+ <div class="tabs">
28
+ <div class="tabs__links"></div>
29
+ <slot></slot>
30
+ </div>
31
+ `;
32
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
33
+ }
34
+
35
+ connectedCallback() {
36
+
37
+ tabs(this);
38
+ }
39
+ }
40
+
41
+ export default iamTabs;
@@ -0,0 +1,98 @@
1
+ // @ts-nocheck
2
+ // Modules
3
+ import * as helpers from '../js/modules/helpers'
4
+ import createDataLayer from '../js/modules/data-layer'
5
+ import nav from '../js/modules/nav'
6
+ import table from '../js/modules/table'
7
+ //import accordion from './modules/accordion'
8
+ import testimonial from '../js/modules/testimonial'
9
+ import carousel from '../js/modules/carousel'
10
+ import form from '../js/modules/form'
11
+ import youtubeVideo from '../js/modules/youtubevideo'
12
+
13
+ const components = ['accordion','header','tabs', 'table','card','pagination','filterlist', 'applied-filters'];
14
+ const prefix = "iam"
15
+ const options = {
16
+ rootMargin: '50px',
17
+ threshold: 0.1
18
+ }
19
+ const componentExt = ".component.js";
20
+
21
+ // Load components - Each component will load once the first of its type has been loaded
22
+ components.forEach((component) => {
23
+
24
+ console.log(component)
25
+
26
+ if(document.getElementsByTagName(`${prefix}-${component}`).length === 0)
27
+ return;
28
+
29
+ let callback = (entries:any) => {
30
+ entries.forEach((entry:any) => {
31
+
32
+ if(entry.intersectionRatio > 0){
33
+
34
+ console.log(component)
35
+
36
+ import(`./components/${component}/${component}${componentExt}`).then(module => {
37
+ if (!window.customElements.get(`${prefix}-${component}`))
38
+ window.customElements.define(`${prefix}-${component}`, module.default);
39
+ }).catch((err) => {
40
+ console.log(err.message);
41
+ });
42
+
43
+ intObserver.unobserve(entry.target);
44
+ }
45
+ });
46
+ };
47
+
48
+ const intObserver = new IntersectionObserver(callback, options);
49
+ intObserver.observe(document.getElementsByTagName(`${prefix}-${component}`)[0]);
50
+ });
51
+
52
+
53
+ // Attach classes to dom elements
54
+ document.addEventListener("DOMContentLoaded", function() {
55
+
56
+ createDataLayer();
57
+
58
+ // Global stuff
59
+ helpers.addBodyClasses(document.body);
60
+ helpers.addGlobalEvents(document.body);
61
+ //helpers.checkElements(document.body);
62
+
63
+ // ANav
64
+ Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
65
+ nav(arrayElement);
66
+ });
67
+
68
+ // Testimonial
69
+ Array.from(document.querySelectorAll('.testimonial')).forEach((arrayElement) => {
70
+ testimonial(arrayElement);
71
+ });
72
+ // Carousel
73
+ Array.from(document.querySelectorAll('.carousel')).forEach((arrayElement) => {
74
+ carousel(arrayElement);
75
+ });
76
+ // Form
77
+ Array.from(document.querySelectorAll('form')).forEach((arrayElement) => {
78
+ form(arrayElement);
79
+ });
80
+ // YouTube videos
81
+ Array.from(document.querySelectorAll('.youtube-embed')).forEach((arrayElement) => {
82
+
83
+ console.log(arrayElement)
84
+
85
+ new youtubeVideo(arrayElement);
86
+ });
87
+
88
+
89
+ window.addEventListener('hashchange', function() {
90
+
91
+ const hash = location.hash.replace('#','');
92
+ const label = document.querySelector(`label[for="${hash}"]`);
93
+
94
+ if (label instanceof HTMLElement)
95
+ label.click();
96
+
97
+ }, false);
98
+ });
@@ -0,0 +1,100 @@
1
+ // @ts-nocheck
2
+ // Modules
3
+ import * as helpers from '../js/modules/helpers'
4
+ import createDataLayer from '../js/modules/data-layer'
5
+ import nav from '../js/modules/nav'
6
+ import * as tableModule from './modules/table'
7
+ import accordion from './modules/accordion'
8
+ import testimonial from '../js/modules/testimonial'
9
+ import carousel from '../js/modules/carousel'
10
+ import form from '../js/modules/form'
11
+ import youtubeVideo from '../js/modules/youtubevideo'
12
+ import tabs from '../js/modules/tabs'
13
+ import filterlist from '../js/modules/filterlist'
14
+ import createPaginationButttons from '../js/modules/pagination'
15
+
16
+ // Attach classes to dom elements
17
+ document.addEventListener("DOMContentLoaded", function() {
18
+
19
+ createDataLayer();
20
+
21
+ // Global stuff
22
+ helpers.addBodyClasses(document.body);
23
+ helpers.addGlobalEvents(document.body);
24
+ //helpers.checkElements(document.body);
25
+
26
+ // ANav
27
+ Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
28
+ nav(arrayElement);
29
+ });
30
+
31
+ // Advanced tables
32
+ Array.from(document.querySelectorAll('table')).forEach((arrayElement) => {
33
+
34
+ tableModule.addTableEventListeners(arrayElement);
35
+ tableModule.createMobileButton(arrayElement);
36
+ tableModule.addDataAttributes(arrayElement);
37
+
38
+
39
+ if(arrayElement.closest('.table--cta')){
40
+
41
+ const largestWidth = tableModule.getLargestLastColWidth(arrayElement);
42
+ arrayElement.closest('.table--cta').style.setProperty("--cta-width", `${largestWidth}rem`);
43
+ }
44
+ });
45
+
46
+ // Accordions
47
+ Array.from(document.querySelectorAll('.accordion')).forEach((arrayElement) => {
48
+ accordion(arrayElement);
49
+ });
50
+
51
+ // Testimonial
52
+ Array.from(document.querySelectorAll('.testimonial')).forEach((arrayElement) => {
53
+ testimonial(arrayElement);
54
+ });
55
+ // Carousel
56
+ Array.from(document.querySelectorAll('.carousel')).forEach((arrayElement) => {
57
+ carousel(arrayElement);
58
+ });
59
+ // Form
60
+ Array.from(document.querySelectorAll('form')).forEach((arrayElement) => {
61
+ form(arrayElement);
62
+ });
63
+ // YouTube videos
64
+ Array.from(document.querySelectorAll('.youtube-embed')).forEach((arrayElement) => {
65
+ new youtubeVideo(arrayElement);
66
+ });
67
+ // Tabs
68
+ Array.from(document.querySelectorAll('.tabs')).forEach((arrayElement) => {
69
+ tabs(arrayElement);
70
+ });
71
+
72
+ // filterlist
73
+ Array.from(document.querySelectorAll('.iam-filterlist')).forEach((arrayElement) => {
74
+ if(arrayElement.hasAttribute('data-input') && document.querySelector(arrayElement.getAttribute('data-input')))
75
+ filterlist(arrayElement.querySelector('ul'),document.querySelector(arrayElement.getAttribute('data-input')));
76
+ });
77
+
78
+ Array.from(document.querySelectorAll('.pagination__wrapper')).forEach((arrayElement) => {
79
+
80
+
81
+ const params = new URLSearchParams(window.location.search);
82
+ arrayElement.setAttribute('data-page', (params.has('page') ? params.get('page') : 1));
83
+ arrayElement.setAttribute('data-show', (params.has('show') ? params.get('show') : 15));
84
+ arrayElement.setAttribute('data-increment', 15);
85
+ arrayElement.setAttribute('data-pages', Math.ceil(arrayElement.getAttribute('data-total') / arrayElement.getAttribute('data-show')));
86
+
87
+ createPaginationButttons(arrayElement,arrayElement);
88
+ });
89
+
90
+
91
+ window.addEventListener('hashchange', function() {
92
+
93
+ const hash = location.hash.replace('#','');
94
+ const label = document.querySelector(`label[for="${hash}"]`);
95
+
96
+ if (label instanceof HTMLElement)
97
+ label.click();
98
+
99
+ }, false);
100
+ });
@@ -0,0 +1,4 @@
1
+ declare module '*.html' {
2
+ const value: string;
3
+ export default value
4
+ }
@@ -1,6 +1,21 @@
1
1
  // @ts-nocheck
2
2
  function accordion(accordionElement: Element) {
3
3
 
4
+ // Add classes to help with CSS
5
+ let details = accordionElement.querySelectorAll('details');
6
+ let summaries = accordionElement.querySelectorAll('summary');
7
+
8
+ details.forEach((detail) => {
9
+ detail.classList.add('accordion-item');
10
+ });
11
+
12
+ summaries.forEach((summary) => {
13
+ summary.classList.add('accordion-header');
14
+ summary.classList.add('accordion-button');
15
+ summary.classList.add('h4');
16
+ });
17
+
18
+
4
19
  // Fetch all the details element.
5
20
  if(!accordionElement.classList.contains('accordion--keep-open')){
6
21
 
@@ -18,27 +33,6 @@ function accordion(accordionElement: Element) {
18
33
  });
19
34
  });
20
35
  }
21
-
22
-
23
- if(window.location.hash && document.querySelector(window.location.hash+':not([open]) summary')) {
24
-
25
- const detail = document.querySelector(window.location.hash+' summary');
26
-
27
- if (detail instanceof HTMLElement) {
28
- detail.click();
29
- }
30
- }
31
-
32
- window.addEventListener('hashchange', function(){
33
- if(window.location.hash && document.querySelector(window.location.hash+' summary')) {
34
-
35
- const detail = document.querySelector(window.location.hash+' summary');
36
-
37
- if (detail instanceof HTMLElement) {
38
- detail.click();
39
- }
40
- }
41
- });
42
36
  }
43
37
 
44
38
  export default accordion
@@ -0,0 +1,146 @@
1
+ // @ts-nocheck
2
+ function createAppliedFilters(container,filters) {
3
+
4
+
5
+ function addFilterButton (filters, input){
6
+ let shouldRemoveFilter = false;
7
+ let inputName = input.getAttribute('name');
8
+
9
+ if(inputName.includes('[]'))
10
+ inputName = inputName.replace('[]',`[${input.value}]`);
11
+
12
+ let filter = filters.querySelector(`[data-name="${inputName}"]`);
13
+
14
+ if(filter && input.getAttribute('type') == 'checkbox')
15
+ shouldRemoveFilter = true;
16
+
17
+ let filterText = input.getAttribute('data-filter-text');
18
+
19
+ if(!filter) {
20
+ filter = document.createElement('button');
21
+ filters.appendChild(filter);
22
+ }
23
+
24
+ filter.setAttribute('type','button')
25
+ filter.classList.add('filter');
26
+ filter.setAttribute('data-name',inputName);
27
+
28
+ filter.innerHTML = filterText.replace('$value', input.value);
29
+
30
+ // If the value
31
+ if(!input.value || shouldRemoveFilter)
32
+ filter.remove();
33
+
34
+
35
+
36
+ // If input has an ancestor with data-filter and all of inputs in that parent have been filled in then we need to transform the filter
37
+ if(input.parentNode.closest('[data-filter-text]')){
38
+ let parent = input.parentNode.closest('[data-filter-text]');
39
+ let allValuesSet = true;
40
+ inputName = "";
41
+
42
+ parent.querySelectorAll('input').forEach((element,index) => {
43
+
44
+ let name = element.getAttribute('name');
45
+
46
+ // create a joined inputname for the parent filter
47
+ inputName += `${index!=0?',':''}${name}`;
48
+
49
+ if(filters.querySelector(`[data-name="${name}"]`))
50
+ filters.querySelector(`[data-name="${name}"]`).remove();
51
+
52
+ if(element.value){
53
+
54
+ let childFilter = document.createElement('button');
55
+ childFilter.setAttribute('type','button')
56
+ childFilter.classList.add('filter');
57
+ childFilter.setAttribute('data-name',name);
58
+ childFilter.innerHTML = filterText.replace('$value', element.value);
59
+ filters.appendChild(childFilter);
60
+ }
61
+ else
62
+ allValuesSet = false;
63
+ });
64
+
65
+ if(filters.querySelector(`[data-name="${inputName}"]`))
66
+ filters.querySelector(`[data-name="${inputName}"]`).remove();
67
+
68
+ if(allValuesSet){
69
+
70
+ let newFilterText = parent.getAttribute('data-filter-text');
71
+ parent.querySelectorAll('input').forEach((element,index) => {
72
+
73
+ let name = element.getAttribute('name');
74
+
75
+ // Remove all the child filter tags
76
+ if(filters.querySelector(`[data-name="${name}"]`))
77
+ filters.querySelector(`[data-name="${name}"]`).remove();
78
+
79
+ newFilterText = newFilterText.replace(`$${index+1}`,element.value);
80
+ });
81
+
82
+ let parentFilter = document.createElement('button');
83
+ parentFilter.setAttribute('type','button')
84
+ parentFilter.classList.add('filter');
85
+ parentFilter.setAttribute('data-name',inputName);
86
+ parentFilter.innerHTML = newFilterText;
87
+ filters.appendChild(parentFilter);
88
+ }
89
+
90
+
91
+ }
92
+
93
+ }
94
+
95
+ // check for inputs on load
96
+ Array.from(container.querySelectorAll('input[type="checkbox"]:checked')).forEach((input, index) => {
97
+ addFilterButton(filters, input)
98
+ });
99
+
100
+ container.addEventListener('change', function(event){
101
+
102
+ if (event && event.target instanceof HTMLElement && event.target.closest('input[data-filter-text]')){
103
+
104
+ let input = event.target.closest('input[data-filter-text]');
105
+
106
+ addFilterButton (filters, input)
107
+ };
108
+
109
+ }, false);
110
+
111
+ filters.addEventListener('click', function(event){
112
+
113
+ if (event && event.target instanceof HTMLElement && event.target.closest('.filter')){
114
+ let filter = event.target.closest('.filter');
115
+ let names = filter.getAttribute('data-name').split(',')
116
+
117
+ for(var t=0;t<names.length;t++){
118
+ let name = names[t];
119
+ let selector = `[name="${name}"]`;
120
+
121
+ if(name.match(/\[(.*)\]/)){
122
+ let newName = name.replace(/\[(.*)\]/,`[]`);
123
+ let value = name.replace(/.*\[(.*)\]/,`$1`);
124
+ selector = `[name="${newName}"][value="${value}"]`;
125
+ }
126
+
127
+ let inputs = container.querySelectorAll(selector);
128
+ for(var i=0;i<inputs.length;i++){
129
+ let input = inputs[i];
130
+
131
+ if(input.getAttribute('type') != 'radio' && input.getAttribute('type') != 'checkbox')
132
+ inputs[i].value = "";
133
+
134
+ inputs[i].checked = false;
135
+ }
136
+ }
137
+
138
+ filter.remove();
139
+ }
140
+
141
+ }, false);
142
+
143
+
144
+ }
145
+
146
+ export default createAppliedFilters;
@@ -0,0 +1,58 @@
1
+ type WindowWithDataLayer = Window & {
2
+ dataLayer: Record<string, any>[];
3
+ };
4
+
5
+ declare const window: WindowWithDataLayer;
6
+
7
+ function createDataLayer () {
8
+
9
+ window.dataLayer = window.dataLayer || [];
10
+ window.dataLayer.push({
11
+ "event": "Pageview",
12
+ "pageTitle": document.title
13
+ });
14
+
15
+ // Global events to track
16
+ document.addEventListener('click', (event) => {
17
+
18
+ if (event && event.target instanceof HTMLElement && event.target.closest('[open] summary')){
19
+ window.dataLayer.push({
20
+ "event": "closeDetails",
21
+ // @ts-ignore: Object is possibly 'null'.
22
+ "detailsTitle": event.target.closest('summary').textContent
23
+ });
24
+ }
25
+ else if (event && event.target instanceof HTMLElement && event.target.closest('summary')){
26
+
27
+ window.dataLayer.push({
28
+ "event": "openDetails",
29
+ // @ts-ignore: Object is possibly 'null'.
30
+ "detailsTitle": event.target.closest('summary').textContent
31
+ });
32
+ }
33
+
34
+ if (event && event.target instanceof HTMLElement && event.target.closest('a')){
35
+ window.dataLayer.push({
36
+ "event": "linkClicked",
37
+ // @ts-ignore: Object is possibly 'null'.
38
+ "linkText": event.target.closest('a').hasAttribute('title') ? event.target.closest('a').getAttribute('title') : event.target.closest('a').textContent,
39
+ // @ts-ignore: Object is possibly 'null'.
40
+ "class": (event.target.closest('a').hasAttribute('class') ? event.target.closest('a').getAttribute('class') : ''),
41
+ // @ts-ignore: Object is possibly 'null'.
42
+ "href": event.target.closest('a').getAttribute('href')
43
+ });
44
+ }
45
+ if (event && event.target instanceof HTMLElement && event.target.closest('button')){
46
+ window.dataLayer.push({
47
+ "event": "buttonClicked",
48
+ // @ts-ignore: Object is possibly 'null'.
49
+ "buttonText": event.target.closest('button').textContent,
50
+ // @ts-ignore: Object is possibly 'null'.
51
+ "class": (event.target.closest('button').hasAttribute('class') ? event.target.closest('button').getAttribute('class') : '')
52
+ });
53
+ }
54
+
55
+ });
56
+ }
57
+
58
+ export default createDataLayer;
@@ -0,0 +1,46 @@
1
+ // @ts-nocheck
2
+ function filterlist(list: Element, input:Element) {
3
+
4
+ addFilterlistEventListeners(list,input);
5
+ }
6
+
7
+ function addFilterlistEventListeners(list: Element, input:Element) {
8
+
9
+ var timer;
10
+
11
+ input.addEventListener('keyup', (event) => {
12
+
13
+ clearTimeout(timer);
14
+ timer = setTimeout(function(){
15
+ filterTheList(list,input.value);
16
+ }, 500);
17
+ });
18
+
19
+ input.addEventListener('change', (event) => {
20
+
21
+ clearTimeout(timer);
22
+
23
+ filterTheList(list, input.value);
24
+ });
25
+ }
26
+
27
+ export const filterTheList = function (list: Element, searchTerm){
28
+
29
+ Array.from(list.querySelectorAll(':scope > li')).forEach((item, index) => {
30
+ let content = item.textContent.toLowerCase();
31
+
32
+ item.classList.add('d-none');
33
+
34
+ if(content.includes(searchTerm.toLowerCase()))
35
+ item.classList.remove('d-none');
36
+ });
37
+
38
+ // Data layer Web component created
39
+ window.dataLayer = window.dataLayer || [];
40
+ window.dataLayer.push({
41
+ "event": "Filtered list",
42
+ "value": searchTerm
43
+ });
44
+ }
45
+
46
+ export default filterlist;