@iamproperty/components 3.4.6 → 3.5.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.
Files changed (304) hide show
  1. package/assets/bootstrap/LICENSE +22 -0
  2. package/assets/bootstrap/README.md +246 -0
  3. package/assets/bootstrap/js/src/alert.js +87 -0
  4. package/assets/bootstrap/js/src/base-component.js +85 -0
  5. package/assets/bootstrap/js/src/button.js +72 -0
  6. package/assets/bootstrap/js/src/carousel.js +475 -0
  7. package/assets/bootstrap/js/src/collapse.js +302 -0
  8. package/assets/bootstrap/js/src/dom/data.js +55 -0
  9. package/assets/bootstrap/js/src/dom/event-handler.js +320 -0
  10. package/assets/bootstrap/js/src/dom/manipulator.js +71 -0
  11. package/assets/bootstrap/js/src/dom/selector-engine.js +83 -0
  12. package/assets/bootstrap/js/src/dropdown.js +454 -0
  13. package/assets/bootstrap/js/src/modal.js +377 -0
  14. package/assets/bootstrap/js/src/offcanvas.js +283 -0
  15. package/assets/bootstrap/js/src/popover.js +97 -0
  16. package/assets/bootstrap/js/src/scrollspy.js +294 -0
  17. package/assets/bootstrap/js/src/tab.js +305 -0
  18. package/assets/bootstrap/js/src/toast.js +225 -0
  19. package/assets/bootstrap/js/src/tooltip.js +633 -0
  20. package/assets/bootstrap/js/src/util/backdrop.js +149 -0
  21. package/assets/bootstrap/js/src/util/component-functions.js +34 -0
  22. package/assets/bootstrap/js/src/util/config.js +66 -0
  23. package/assets/bootstrap/js/src/util/focustrap.js +115 -0
  24. package/assets/bootstrap/js/src/util/index.js +336 -0
  25. package/assets/bootstrap/js/src/util/sanitizer.js +118 -0
  26. package/assets/bootstrap/js/src/util/scrollbar.js +114 -0
  27. package/assets/bootstrap/js/src/util/swipe.js +146 -0
  28. package/assets/bootstrap/js/src/util/template-factory.js +160 -0
  29. package/assets/bootstrap/package.json +181 -0
  30. package/assets/bootstrap/scss/_accordion.scss +149 -0
  31. package/assets/bootstrap/scss/_alert.scss +71 -0
  32. package/assets/bootstrap/scss/_badge.scss +38 -0
  33. package/assets/bootstrap/scss/_breadcrumb.scss +40 -0
  34. package/assets/bootstrap/scss/_button-group.scss +142 -0
  35. package/assets/bootstrap/scss/_buttons.scss +207 -0
  36. package/assets/bootstrap/scss/_card.scss +234 -0
  37. package/assets/bootstrap/scss/_carousel.scss +226 -0
  38. package/assets/bootstrap/scss/_close.scss +40 -0
  39. package/assets/bootstrap/scss/_containers.scss +41 -0
  40. package/assets/bootstrap/scss/_dropdown.scss +249 -0
  41. package/assets/bootstrap/scss/_forms.scss +9 -0
  42. package/assets/bootstrap/scss/_functions.scss +302 -0
  43. package/assets/bootstrap/scss/_grid.scss +33 -0
  44. package/assets/bootstrap/scss/_helpers.scss +10 -0
  45. package/assets/bootstrap/scss/_images.scss +42 -0
  46. package/assets/bootstrap/scss/_list-group.scss +192 -0
  47. package/assets/bootstrap/scss/_maps.scss +54 -0
  48. package/assets/bootstrap/scss/_mixins.scss +43 -0
  49. package/assets/bootstrap/scss/_modal.scss +237 -0
  50. package/assets/bootstrap/scss/_nav.scss +172 -0
  51. package/assets/bootstrap/scss/_navbar.scss +278 -0
  52. package/assets/bootstrap/scss/_offcanvas.scss +144 -0
  53. package/assets/bootstrap/scss/_pagination.scss +109 -0
  54. package/assets/bootstrap/scss/_placeholders.scss +51 -0
  55. package/assets/bootstrap/scss/_popover.scss +196 -0
  56. package/assets/bootstrap/scss/_progress.scss +59 -0
  57. package/assets/bootstrap/scss/_reboot.scss +610 -0
  58. package/assets/bootstrap/scss/_root.scss +73 -0
  59. package/assets/bootstrap/scss/_spinners.scss +85 -0
  60. package/assets/bootstrap/scss/_tables.scss +164 -0
  61. package/assets/bootstrap/scss/_toasts.scss +73 -0
  62. package/assets/bootstrap/scss/_tooltip.scss +120 -0
  63. package/assets/bootstrap/scss/_transitions.scss +27 -0
  64. package/assets/bootstrap/scss/_type.scss +106 -0
  65. package/assets/bootstrap/scss/_utilities.scss +647 -0
  66. package/assets/bootstrap/scss/_variables.scss +1634 -0
  67. package/assets/bootstrap/scss/bootstrap-grid.scss +64 -0
  68. package/assets/bootstrap/scss/bootstrap-reboot.scss +9 -0
  69. package/assets/bootstrap/scss/bootstrap-utilities.scss +18 -0
  70. package/assets/bootstrap/scss/bootstrap.scss +51 -0
  71. package/assets/bootstrap/scss/forms/_floating-labels.scss +75 -0
  72. package/assets/bootstrap/scss/forms/_form-check.scss +175 -0
  73. package/assets/bootstrap/scss/forms/_form-control.scss +194 -0
  74. package/assets/bootstrap/scss/forms/_form-range.scss +91 -0
  75. package/assets/bootstrap/scss/forms/_form-select.scss +71 -0
  76. package/assets/bootstrap/scss/forms/_form-text.scss +11 -0
  77. package/assets/bootstrap/scss/forms/_input-group.scss +132 -0
  78. package/assets/bootstrap/scss/forms/_labels.scss +36 -0
  79. package/assets/bootstrap/scss/forms/_validation.scss +12 -0
  80. package/assets/bootstrap/scss/helpers/_clearfix.scss +3 -0
  81. package/assets/bootstrap/scss/helpers/_color-bg.scss +10 -0
  82. package/assets/bootstrap/scss/helpers/_colored-links.scss +12 -0
  83. package/assets/bootstrap/scss/helpers/_position.scss +36 -0
  84. package/assets/bootstrap/scss/helpers/_ratio.scss +26 -0
  85. package/assets/bootstrap/scss/helpers/_stacks.scss +15 -0
  86. package/assets/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  87. package/assets/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  88. package/assets/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  89. package/assets/bootstrap/scss/helpers/_vr.scss +8 -0
  90. package/assets/bootstrap/scss/mixins/_alert.scss +15 -0
  91. package/assets/bootstrap/scss/mixins/_backdrop.scss +14 -0
  92. package/assets/bootstrap/scss/mixins/_banner.scss +9 -0
  93. package/assets/bootstrap/scss/mixins/_border-radius.scss +78 -0
  94. package/assets/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  95. package/assets/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  96. package/assets/bootstrap/scss/mixins/_buttons.scss +70 -0
  97. package/assets/bootstrap/scss/mixins/_caret.scss +64 -0
  98. package/assets/bootstrap/scss/mixins/_clearfix.scss +9 -0
  99. package/assets/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  100. package/assets/bootstrap/scss/mixins/_container.scss +11 -0
  101. package/assets/bootstrap/scss/mixins/_deprecate.scss +10 -0
  102. package/assets/bootstrap/scss/mixins/_forms.scss +152 -0
  103. package/assets/bootstrap/scss/mixins/_gradients.scss +47 -0
  104. package/assets/bootstrap/scss/mixins/_grid.scss +151 -0
  105. package/assets/bootstrap/scss/mixins/_image.scss +16 -0
  106. package/assets/bootstrap/scss/mixins/_list-group.scss +24 -0
  107. package/assets/bootstrap/scss/mixins/_lists.scss +7 -0
  108. package/assets/bootstrap/scss/mixins/_pagination.scss +10 -0
  109. package/assets/bootstrap/scss/mixins/_reset-text.scss +17 -0
  110. package/assets/bootstrap/scss/mixins/_resize.scss +6 -0
  111. package/assets/bootstrap/scss/mixins/_table-variants.scss +24 -0
  112. package/assets/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  113. package/assets/bootstrap/scss/mixins/_transition.scss +26 -0
  114. package/assets/bootstrap/scss/mixins/_utilities.scss +97 -0
  115. package/assets/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  116. package/assets/bootstrap/scss/utilities/_api.scss +47 -0
  117. package/assets/bootstrap/scss/vendor/_rfs.scss +354 -0
  118. package/assets/css/components/accordion.css +1 -1
  119. package/assets/css/components/accordion.css.map +1 -1
  120. package/assets/css/components/admin-panel.css +1 -0
  121. package/assets/css/components/admin-panel.css.map +1 -0
  122. package/assets/css/components/alert.css +1 -1
  123. package/assets/css/components/alert.css.map +1 -1
  124. package/assets/css/components/applied-filters.css +1 -0
  125. package/assets/css/components/applied-filters.css.map +1 -0
  126. package/assets/css/components/card.css +1 -1
  127. package/assets/css/components/card.css.map +1 -1
  128. package/assets/css/components/carousel.css +1 -1
  129. package/assets/css/components/carousel.css.map +1 -1
  130. package/assets/css/components/charts.css +1 -1
  131. package/assets/css/components/charts.css.map +1 -1
  132. package/assets/css/components/container.css +1 -1
  133. package/assets/css/components/container.css.map +1 -1
  134. package/assets/css/components/dialog.css +1 -0
  135. package/assets/css/components/dialog.css.map +1 -0
  136. package/assets/css/components/forms.css +1 -1
  137. package/assets/css/components/forms.css.map +1 -1
  138. package/assets/css/components/header.css +1 -1
  139. package/assets/css/components/header.css.map +1 -1
  140. package/assets/css/components/lists.css +1 -1
  141. package/assets/css/components/lists.css.map +1 -1
  142. package/assets/css/components/nav.css +1 -1
  143. package/assets/css/components/nav.css.map +1 -1
  144. package/assets/css/components/pagination.css +1 -0
  145. package/assets/css/components/pagination.css.map +1 -0
  146. package/assets/css/components/property-searchbar.css +1 -1
  147. package/assets/css/components/property-searchbar.css.map +1 -1
  148. package/assets/css/components/stepper.css +1 -1
  149. package/assets/css/components/stepper.css.map +1 -1
  150. package/assets/css/components/table.css +1 -0
  151. package/assets/css/components/table.css.map +1 -0
  152. package/assets/css/components/tabs.css +1 -1
  153. package/assets/css/components/tabs.css.map +1 -1
  154. package/assets/css/components/tooltips.css +1 -1
  155. package/assets/css/components/tooltips.css.map +1 -1
  156. package/assets/css/core.min.css +1 -1
  157. package/assets/css/core.min.css.map +1 -1
  158. package/assets/css/style.min.css +1 -1
  159. package/assets/css/style.min.css.map +1 -1
  160. package/assets/js/bundle.js +18 -11
  161. package/assets/js/components/accordion/accordion.component.js +6 -0
  162. package/assets/js/components/accordion/accordion.component.min.js +3 -3
  163. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  164. package/assets/js/components/applied-filters/applied-filters.component.js +26 -0
  165. package/assets/js/components/card/card.component.js +91 -0
  166. package/assets/js/components/card/card.component.min.js +21 -0
  167. package/assets/js/components/card/card.component.min.js.map +1 -0
  168. package/assets/js/components/filterlist/filterlist.component.js +49 -0
  169. package/assets/js/components/filterlist/filterlist.component.min.js +23 -0
  170. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -0
  171. package/assets/js/components/header/header.component.js +6 -0
  172. package/assets/js/components/header/header.component.min.js +5 -5
  173. package/assets/js/components/header/header.component.min.js.map +1 -1
  174. package/assets/js/components/pagination/pagination.component.js +34 -0
  175. package/assets/js/components/table/table.component.js +108 -0
  176. package/assets/js/components/table/table.component.min.js +24 -0
  177. package/assets/js/components/table/table.component.min.js.map +1 -0
  178. package/assets/js/components/tabs/tabs.component.js +6 -0
  179. package/assets/js/components/tabs/tabs.component.min.js +17 -0
  180. package/assets/js/components/tabs/tabs.component.min.js.map +1 -0
  181. package/assets/js/dynamic.js +7 -18
  182. package/assets/js/dynamic.min.js +2 -53
  183. package/assets/js/dynamic.min.js.map +1 -1
  184. package/assets/js/flat-components.js +27 -9
  185. package/assets/js/modules/applied-filters.js +100 -0
  186. package/assets/js/modules/data-layer.js +45 -0
  187. package/assets/js/modules/filterlist.js +32 -0
  188. package/assets/js/modules/helpers.js +102 -49
  189. package/assets/js/modules/pagination.js +33 -0
  190. package/assets/js/modules/table.js +506 -420
  191. package/assets/js/modules/tabs.js +6 -0
  192. package/assets/js/modules/youtubevideo.js +53 -61
  193. package/assets/js/scripts.bundle.js +77 -62
  194. package/assets/js/scripts.bundle.js.map +1 -1
  195. package/assets/js/scripts.bundle.min.js +2 -2
  196. package/assets/js/scripts.bundle.min.js.map +1 -1
  197. package/assets/js/tests/filterlist.spec.js +22 -0
  198. package/assets/js/tests/pagination.spec.js +15 -0
  199. package/assets/js/tests/table.spec.js +149 -0
  200. package/assets/sass/_components.scss +1 -2
  201. package/assets/sass/_corefiles.scss +20 -19
  202. package/assets/sass/_forms.scss +7 -7
  203. package/assets/sass/_functions/functions.scss +1 -1
  204. package/assets/sass/_functions/mixins.scss +19 -21
  205. package/assets/sass/_functions/utilities.scss +67 -9
  206. package/assets/sass/_functions/variables.scss +109 -55
  207. package/assets/sass/_tests/colours.spec.scss +8 -22
  208. package/assets/sass/components/accordion.scss +13 -0
  209. package/assets/sass/components/admin-panel.scss +106 -0
  210. package/assets/sass/components/alert.scss +22 -0
  211. package/assets/sass/components/applied-filters.scss +65 -0
  212. package/assets/sass/components/card.scss +177 -233
  213. package/assets/sass/components/carousel.scss +72 -0
  214. package/assets/sass/components/charts.scss +41 -1
  215. package/assets/sass/components/container.scss +8 -3
  216. package/assets/sass/components/dialog.scss +208 -0
  217. package/assets/sass/components/forms.scss +37 -5
  218. package/assets/sass/components/lists.scss +29 -0
  219. package/assets/sass/components/nav.scss +6 -2
  220. package/assets/sass/components/pagination.scss +140 -0
  221. package/assets/sass/components/stepper.scss +3 -3
  222. package/assets/sass/components/table.scss +423 -0
  223. package/assets/sass/components/tabs.scss +20 -7
  224. package/assets/sass/components/tooltips.scss +1 -1
  225. package/assets/sass/foundations/buttons.scss +366 -0
  226. package/assets/sass/foundations/icons.scss +1 -1
  227. package/assets/sass/foundations/links.scss +125 -0
  228. package/assets/sass/foundations/media.scss +1 -1
  229. package/assets/sass/foundations/reboot.scss +21 -17
  230. package/assets/sass/foundations/root.scss +9 -29
  231. package/assets/sass/foundations/type.scss +1 -1
  232. package/assets/svg/illustrations/table.svg +165 -0
  233. package/assets/ts/bundle.ts +23 -12
  234. package/assets/ts/components/accordion/accordion.component.ts +7 -0
  235. package/assets/ts/components/applied-filters/README.md +5 -0
  236. package/assets/ts/components/applied-filters/applied-filters.component.ts +33 -0
  237. package/assets/ts/components/card/README.md +22 -0
  238. package/assets/ts/components/card/card.component.ts +117 -0
  239. package/assets/ts/components/filterlist/README.md +17 -0
  240. package/assets/ts/components/filterlist/filterlist.component.ts +60 -0
  241. package/assets/ts/components/header/header.component.ts +8 -0
  242. package/assets/ts/components/pagination/README.md +11 -0
  243. package/assets/ts/components/pagination/pagination.component.ts +45 -0
  244. package/assets/ts/components/table/README.md +23 -0
  245. package/assets/ts/components/table/table.component.ts +133 -0
  246. package/assets/ts/components/tabs/tabs.component.ts +7 -0
  247. package/assets/ts/dynamic.ts +12 -19
  248. package/assets/ts/flat-components.ts +37 -9
  249. package/assets/ts/modules/applied-filters.ts +146 -0
  250. package/assets/ts/modules/data-layer.ts +58 -0
  251. package/assets/ts/modules/filterlist.ts +46 -0
  252. package/assets/ts/modules/helpers.ts +129 -58
  253. package/assets/ts/modules/pagination.ts +44 -0
  254. package/assets/ts/modules/table.ts +598 -433
  255. package/assets/ts/modules/tabs.ts +8 -1
  256. package/assets/ts/modules/youtubevideo.ts +58 -63
  257. package/assets/ts/tests/filterlist.spec.ts +29 -0
  258. package/assets/ts/tests/pagination.spec.ts +21 -0
  259. package/assets/ts/tests/table.spec.ts +194 -0
  260. package/dist/components.es.js +1267 -1295
  261. package/dist/components.umd.js +70 -65
  262. package/dist/style.css +1 -1
  263. package/package.json +8 -5
  264. package/src/components/AppliedFilters/AppliedFilters.vue +20 -0
  265. package/src/components/AppliedFilters/README.md +5 -0
  266. package/src/components/Card/Card.vue +11 -112
  267. package/src/components/Card/README.md +16 -18
  268. package/src/components/Carousel/Carousel.vue +49 -10
  269. package/src/components/Chart/Chart.vue +46 -4
  270. package/src/components/Filterlist/Filterlist.vue +20 -0
  271. package/src/components/Filterlist/README.md +17 -0
  272. package/src/components/Pagination/Pagination.vue +30 -0
  273. package/src/components/Pagination/README.md +11 -0
  274. package/src/components/Table/README.md +29 -44
  275. package/src/components/Table/Table.spec.js +5 -37
  276. package/src/components/Table/Table.vue +16 -91
  277. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +1 -1
  278. package/src/index.js +3 -2
  279. package/assets/css/components/buttons.css +0 -1
  280. package/assets/css/components/buttons.css.map +0 -1
  281. package/assets/css/components/cardDeck.css +0 -1
  282. package/assets/css/components/cardDeck.css.map +0 -1
  283. package/assets/css/components/links.css +0 -1
  284. package/assets/css/components/links.css.map +0 -1
  285. package/assets/css/components/modal.css +0 -1
  286. package/assets/css/components/modal.css.map +0 -1
  287. package/assets/css/components/panel.css +0 -1
  288. package/assets/css/components/panel.css.map +0 -1
  289. package/assets/css/components/tables.css +0 -1
  290. package/assets/css/components/tables.css.map +0 -1
  291. package/assets/js/modules/modal.js +0 -69
  292. package/assets/sass/components/buttons.scss +0 -252
  293. package/assets/sass/components/cardDeck.scss +0 -108
  294. package/assets/sass/components/links.scss +0 -99
  295. package/assets/sass/components/modal.scss +0 -136
  296. package/assets/sass/components/panel.scss +0 -161
  297. package/assets/sass/components/tables.scss +0 -291
  298. package/assets/ts/modules/modal.ts +0 -91
  299. package/src/components/CardDeck/CardDeck.spec.js +0 -99
  300. package/src/components/CardDeck/CardDeck.vue +0 -77
  301. package/src/components/CardDeck/README.md +0 -25
  302. package/src/components/Modal/Modal.spec.js +0 -22
  303. package/src/components/Modal/Modal.vue +0 -43
  304. package/src/components/Modal/README.md +0 -20
@@ -1,4 +1,12 @@
1
1
  // @ts-nocheck
2
+
3
+ // Data layer Web component created
4
+ window.dataLayer = window.dataLayer || [];
5
+ window.dataLayer.push({
6
+ "event": "customElementRegistered",
7
+ "element": "header"
8
+ });
9
+
2
10
  class iamHeader extends HTMLElement {
3
11
 
4
12
  constructor(){
@@ -0,0 +1,11 @@
1
+ ```
2
+ <iam-pagination data-total="12"></iam-pagination>
3
+ ```
4
+
5
+ **Properties**
6
+
7
+ | Option | Type | Default Value | Description |
8
+ | ------ | ---- | ------------- | ----------- |
9
+ | data-total | int | 0 | The total amount is needed to work out how many pagination buttons are needed |
10
+ | data-page | int | 1 | Override the current page value |
11
+ | data-show | int | 15 | Update how many items can be shown per page |
@@ -0,0 +1,45 @@
1
+ // @ts-nocheck
2
+ import createPaginationButttons from "../../modules/pagination";
3
+
4
+ class iamPagination extends HTMLElement {
5
+
6
+ constructor(){
7
+ super();
8
+ this.attachShadow({ mode: 'open'});
9
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
10
+
11
+ const template = document.createElement('template');
12
+ template.innerHTML = `
13
+ <style>
14
+ @import "${assetLocation}/css/core.min.css";
15
+ </style>
16
+ <div class="pagination__wrapper d-none">
17
+ </div>
18
+ `;
19
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
20
+
21
+ // Set default attributes
22
+ const params = new URLSearchParams(window.location.search);
23
+
24
+ if(!this.hasAttribute('data-total'))
25
+ this.setAttribute('data-total', this.querySelectorAll('table tbody tr').length);
26
+
27
+ if(!this.hasAttribute('data-page'))
28
+ this.setAttribute('data-page', (params.has('page') ? params.get('page') : 1));
29
+
30
+ if(!this.hasAttribute('data-show'))
31
+ this.setAttribute('data-show', (params.has('show') ? params.get('show') : 15));
32
+
33
+ if(!this.hasAttribute('data-increment'))
34
+ this.setAttribute('data-increment', 15);
35
+
36
+ this.setAttribute('data-pages', Math.ceil(this.getAttribute('data-total') / this.getAttribute('data-show')));
37
+ createPaginationButttons(this,this.shadowRoot.querySelector('.pagination__wrapper'));
38
+ }
39
+
40
+ connectedCallback() {
41
+ this.shadowRoot.querySelector('.pagination__wrapper').classList.remove('d-none');
42
+ }
43
+ }
44
+
45
+ export default iamPagination;
@@ -0,0 +1,23 @@
1
+ ```
2
+ <iam-table class="container">
3
+ <table>
4
+ <thead>....</thead>
5
+ <tbody>...</tbody>
6
+ </table>
7
+ </iam-tabs>
8
+ ```
9
+
10
+ **Properties**
11
+
12
+ | Option | Type | Default Value | Description |
13
+ | ------ | ---- | ------------- | ----------- |
14
+ | data-show | int | 15 | Update how many rows can be shown per page |
15
+ | data-filterby | string (form ID) | | Give an optional form ID to connect a form to the table and make it act like a filtering system |
16
+
17
+
18
+ **Class modifiers**
19
+
20
+ - Adding a class of **.table--cta** to the table component will fix the last column of the table in place (While on tablet or desktop).
21
+ - Adding a class of **.table--export** to the table component will create a button at the bottom of the table to export its contents out as a CSV file.
22
+ - Adding a class of **.table--fullwidth** to the table component will prevent it from becoming a stacked view on mobile.
23
+ - Adding a class of **.table--mh-small**,**.table--mh-medium** or **.table--mh-large** to the table component will give the table container a max height and the ability to scroll.
@@ -0,0 +1,133 @@
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
+ this.shadowRoot.querySelector('.table__wrapper').addEventListener("scroll", (event) => {
88
+
89
+ if(this.table.querySelector('dialog[open]'))
90
+ this.table.querySelector('dialog[open]').close();
91
+ });
92
+ }
93
+
94
+
95
+ static get observedAttributes() {
96
+ return ["data-total","data-pages","data-page","data-show"];
97
+ }
98
+
99
+ attributeChangedCallback(attrName, oldVal, newVal) {
100
+ /*
101
+ switch (attrName) {
102
+ case "data-total": {
103
+ this.setAttribute('data-pages', Math.ceil(newVal / this.getAttribute('data-show')));
104
+ break;
105
+ }
106
+ case "data-show": {
107
+ this.setAttribute('data-pages', Math.ceil(this.getAttribute('data-total') / newVal));
108
+ break;
109
+ }
110
+ case "data-pages": {
111
+ console.log('create pagination');
112
+
113
+ tableModule.filterTable(this.table, this.form);
114
+ createPaginationButttons(this,this.pagination);
115
+
116
+ break;
117
+ }
118
+ case "data-page": {
119
+
120
+ let paginationInput = this.form.querySelector('[data-pagination]');
121
+
122
+ paginationInput.value = newVal;
123
+
124
+ //tableModule.filterTable(this.table, this.form);
125
+
126
+ break;
127
+ }
128
+ }
129
+ */
130
+ }
131
+ }
132
+
133
+ export default iamTable;
@@ -1,6 +1,13 @@
1
1
  // @ts-nocheck
2
2
  import tabs from "../../modules/tabs";
3
3
 
4
+ // Data layer Web component created
5
+ window.dataLayer = window.dataLayer || [];
6
+ window.dataLayer.push({
7
+ "event": "customElementRegistered",
8
+ "element": "tabs"
9
+ });
10
+
4
11
  class iamTabs extends HTMLElement {
5
12
 
6
13
  constructor(){
@@ -1,6 +1,7 @@
1
1
  // @ts-nocheck
2
2
  // Modules
3
3
  import * as helpers from '../js/modules/helpers'
4
+ import createDataLayer from '../js/modules/data-layer'
4
5
  import nav from '../js/modules/nav'
5
6
  import table from '../js/modules/table'
6
7
  //import accordion from './modules/accordion'
@@ -8,9 +9,8 @@ import testimonial from '../js/modules/testimonial'
8
9
  import carousel from '../js/modules/carousel'
9
10
  import form from '../js/modules/form'
10
11
  import youtubeVideo from '../js/modules/youtubevideo'
11
- import modal from '../js/modules/modal'
12
12
 
13
- const components = ['accordion','header','tabs'];
13
+ const components = ['accordion','header','tabs', 'table','card','pagination','filterlist', 'applied-filters'];
14
14
  const prefix = "iam"
15
15
  const options = {
16
16
  rootMargin: '50px',
@@ -21,6 +21,8 @@ const componentExt = ".component.js";
21
21
  // Load components - Each component will load once the first of its type has been loaded
22
22
  components.forEach((component) => {
23
23
 
24
+ console.log(component)
25
+
24
26
  if(document.getElementsByTagName(`${prefix}-${component}`).length === 0)
25
27
  return;
26
28
 
@@ -28,6 +30,8 @@ components.forEach((component) => {
28
30
  entries.forEach((entry:any) => {
29
31
 
30
32
  if(entry.intersectionRatio > 0){
33
+
34
+ console.log(component)
31
35
 
32
36
  import(`./components/${component}/${component}${componentExt}`).then(module => {
33
37
  if (!window.customElements.get(`${prefix}-${component}`))
@@ -49,28 +53,18 @@ components.forEach((component) => {
49
53
  // Attach classes to dom elements
50
54
  document.addEventListener("DOMContentLoaded", function() {
51
55
 
56
+ createDataLayer();
57
+
52
58
  // Global stuff
53
59
  helpers.addBodyClasses(document.body);
54
60
  helpers.addGlobalEvents(document.body);
55
- helpers.checkElements(document.body);
61
+ //helpers.checkElements(document.body);
56
62
 
57
63
  // ANav
58
64
  Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
59
65
  nav(arrayElement);
60
66
  });
61
67
 
62
- // Advanced tables
63
- Array.from(document.querySelectorAll('.table__wrapper')).forEach((arrayElement) => {
64
- table(arrayElement);
65
- });
66
-
67
- // Accordions
68
- /*
69
- Array.from(document.querySelectorAll('.accordion')).forEach((arrayElement) => {
70
- accordion(arrayElement);
71
- });
72
- */
73
-
74
68
  // Testimonial
75
69
  Array.from(document.querySelectorAll('.testimonial')).forEach((arrayElement) => {
76
70
  testimonial(arrayElement);
@@ -83,12 +77,11 @@ document.addEventListener("DOMContentLoaded", function() {
83
77
  Array.from(document.querySelectorAll('form')).forEach((arrayElement) => {
84
78
  form(arrayElement);
85
79
  });
86
- // Modal
87
- Array.from(document.querySelectorAll('.modal')).forEach((arrayElement) => {
88
- modal(arrayElement);
89
- });
90
80
  // YouTube videos
91
81
  Array.from(document.querySelectorAll('.youtube-embed')).forEach((arrayElement) => {
82
+
83
+ console.log(arrayElement)
84
+
92
85
  new youtubeVideo(arrayElement);
93
86
  });
94
87
 
@@ -1,23 +1,27 @@
1
1
  // @ts-nocheck
2
2
  // Modules
3
3
  import * as helpers from '../js/modules/helpers'
4
+ import createDataLayer from '../js/modules/data-layer'
4
5
  import nav from '../js/modules/nav'
5
- import table from '../js/modules/table'
6
+ import * as tableModule from './modules/table'
6
7
  import accordion from './modules/accordion'
7
8
  import testimonial from '../js/modules/testimonial'
8
9
  import carousel from '../js/modules/carousel'
9
10
  import form from '../js/modules/form'
10
11
  import youtubeVideo from '../js/modules/youtubevideo'
11
- import modal from '../js/modules/modal'
12
12
  import tabs from '../js/modules/tabs'
13
+ import filterlist from '../js/modules/filterlist'
14
+ import createPaginationButttons from '../js/modules/pagination'
13
15
 
14
16
  // Attach classes to dom elements
15
17
  document.addEventListener("DOMContentLoaded", function() {
16
18
 
19
+ createDataLayer();
20
+
17
21
  // Global stuff
18
22
  helpers.addBodyClasses(document.body);
19
23
  helpers.addGlobalEvents(document.body);
20
- helpers.checkElements(document.body);
24
+ //helpers.checkElements(document.body);
21
25
 
22
26
  // ANav
23
27
  Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
@@ -25,8 +29,18 @@ document.addEventListener("DOMContentLoaded", function() {
25
29
  });
26
30
 
27
31
  // Advanced tables
28
- Array.from(document.querySelectorAll('.table__wrapper')).forEach((arrayElement) => {
29
- table(arrayElement);
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
+ }
30
44
  });
31
45
 
32
46
  // Accordions
@@ -46,10 +60,6 @@ document.addEventListener("DOMContentLoaded", function() {
46
60
  Array.from(document.querySelectorAll('form')).forEach((arrayElement) => {
47
61
  form(arrayElement);
48
62
  });
49
- // Modal
50
- Array.from(document.querySelectorAll('.modal')).forEach((arrayElement) => {
51
- modal(arrayElement);
52
- });
53
63
  // YouTube videos
54
64
  Array.from(document.querySelectorAll('.youtube-embed')).forEach((arrayElement) => {
55
65
  new youtubeVideo(arrayElement);
@@ -59,6 +69,24 @@ document.addEventListener("DOMContentLoaded", function() {
59
69
  tabs(arrayElement);
60
70
  });
61
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
+
62
90
 
63
91
  window.addEventListener('hashchange', function() {
64
92
 
@@ -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;