@iamproperty/components 7.8.2--beta3 → 7.8.2--beta5

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 (235) hide show
  1. package/assets/css/components/actionbar.component.css +1 -1
  2. package/assets/css/components/actionbar.component.css.map +1 -1
  3. package/assets/css/components/address-lookup.component.css +1 -1
  4. package/assets/css/components/address-lookup.component.css.map +1 -1
  5. package/assets/css/components/advanced-select.component.css +1 -1
  6. package/assets/css/components/advanced-select.component.css.map +1 -1
  7. package/assets/css/components/banner.preload.css +1 -0
  8. package/assets/css/components/banner.preload.css.map +1 -0
  9. package/assets/css/components/calendar.component.css +1 -1
  10. package/assets/css/components/calendar.component.css.map +1 -1
  11. package/assets/css/components/card.component.css +1 -1
  12. package/assets/css/components/card.component.css.map +1 -1
  13. package/assets/css/components/card.module.css +1 -1
  14. package/assets/css/components/card.module.css.map +1 -1
  15. package/assets/css/components/card.preload.css +1 -0
  16. package/assets/css/components/card.preload.css.map +1 -0
  17. package/assets/css/components/carousel.component.css +1 -1
  18. package/assets/css/components/carousel.component.css.map +1 -1
  19. package/assets/css/components/carousel.config.css +1 -1
  20. package/assets/css/components/carousel.config.css.map +1 -1
  21. package/assets/css/components/config.component.css +1 -1
  22. package/assets/css/components/config.component.css.map +1 -1
  23. package/assets/css/components/content.component.css +1 -1
  24. package/assets/css/components/content.component.css.map +1 -1
  25. package/assets/css/components/fileupload.css +1 -1
  26. package/assets/css/components/fileupload.css.map +1 -1
  27. package/assets/css/components/filter-card.component.css +1 -1
  28. package/assets/css/components/filter-card.component.css.map +1 -1
  29. package/assets/css/components/modal.component.css +1 -1
  30. package/assets/css/components/modal.component.css.map +1 -1
  31. package/assets/css/components/multi-step-modal.component.css +1 -1
  32. package/assets/css/components/multi-step-modal.component.css.map +1 -1
  33. package/assets/css/components/multiselect.css +1 -1
  34. package/assets/css/components/multiselect.css.map +1 -1
  35. package/assets/css/components/nav.component.css +1 -1
  36. package/assets/css/components/nav.component.css.map +1 -1
  37. package/assets/css/components/nav.global.css +1 -1
  38. package/assets/css/components/nav.global.css.map +1 -1
  39. package/assets/css/components/notification.global.css +1 -1
  40. package/assets/css/components/notification.global.css.map +1 -1
  41. package/assets/css/components/pagination.css +1 -1
  42. package/assets/css/components/pagination.css.map +1 -1
  43. package/assets/css/components/record-card.component.css +1 -1
  44. package/assets/css/components/record-card.component.css.map +1 -1
  45. package/assets/css/components/search.component.css +1 -1
  46. package/assets/css/components/search.component.css.map +1 -1
  47. package/assets/css/components/skeleton.global.css +1 -1
  48. package/assets/css/components/skeleton.global.css.map +1 -1
  49. package/assets/css/components/slider.css +1 -1
  50. package/assets/css/components/slider.css.map +1 -1
  51. package/assets/css/components/split-button.component.css +1 -1
  52. package/assets/css/components/split-button.component.css.map +1 -1
  53. package/assets/css/components/std-nav-standalone.component.css +1 -1
  54. package/assets/css/components/std-nav-standalone.component.css.map +1 -1
  55. package/assets/css/components/tabs.component.css +1 -1
  56. package/assets/css/components/tabs.component.css.map +1 -1
  57. package/assets/css/components/tag.component.css +1 -1
  58. package/assets/css/components/tag.component.css.map +1 -1
  59. package/assets/css/components/video-card.component.css +1 -1
  60. package/assets/css/components/video-card.component.css.map +1 -1
  61. package/assets/css/components/video-modal.component.css +1 -1
  62. package/assets/css/components/video-modal.component.css.map +1 -1
  63. package/assets/css/core.min.css +1 -1
  64. package/assets/css/core.min.css.map +1 -1
  65. package/assets/css/elements/dialog.css +1 -1
  66. package/assets/css/elements/dialog.css.map +1 -1
  67. package/assets/css/elements/dropdown.css +1 -1
  68. package/assets/css/elements/dropdown.css.map +1 -1
  69. package/assets/css/elements/forms.css +1 -1
  70. package/assets/css/elements/forms.css.map +1 -1
  71. package/assets/css/elements/links--global.css +1 -1
  72. package/assets/css/elements/links--global.css.map +1 -1
  73. package/assets/css/elements/links.css +1 -1
  74. package/assets/css/elements/links.css.map +1 -1
  75. package/assets/css/style.min.css +1 -1
  76. package/assets/css/style.min.css.map +1 -1
  77. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  78. package/assets/js/components/actionbar/actionbar.component.min.js +3 -3
  79. package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
  80. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  81. package/assets/js/components/advanced-select/advanced-select.component.min.js +2 -2
  82. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  83. package/assets/js/components/banner/banner.component.min.js +1 -1
  84. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  85. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  86. package/assets/js/components/bone/bone.component.min.js +1 -1
  87. package/assets/js/components/button/button.component.min.js +1 -1
  88. package/assets/js/components/calendar/calendar.component.min.js +2 -2
  89. package/assets/js/components/card/card.component.js +114 -125
  90. package/assets/js/components/card/card.component.min.js +7 -7
  91. package/assets/js/components/card/card.component.min.js.map +1 -1
  92. package/assets/js/components/carousel/carousel.component.js +83 -29
  93. package/assets/js/components/carousel/carousel.component.min.js +16 -11
  94. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  95. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  96. package/assets/js/components/config/config.component.min.js +7 -7
  97. package/assets/js/components/config/config.component.min.js.map +1 -1
  98. package/assets/js/components/content/content.component.js +28 -69
  99. package/assets/js/components/content/content.component.min.js +4 -4
  100. package/assets/js/components/content/content.component.min.js.map +1 -1
  101. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  102. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  103. package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
  104. package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
  105. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  106. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  107. package/assets/js/components/form/form.component.js +42 -151
  108. package/assets/js/components/form/form.component.min.js +3 -3
  109. package/assets/js/components/form/form.component.min.js.map +1 -1
  110. package/assets/js/components/header/header.component.min.js +1 -1
  111. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  112. package/assets/js/components/input/input.component.min.js +1 -1
  113. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  114. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  115. package/assets/js/components/menu/menu.component.min.js +1 -1
  116. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  117. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  118. package/assets/js/components/modal/modal.component.js +16 -11
  119. package/assets/js/components/modal/modal.component.min.js +7 -7
  120. package/assets/js/components/modal/modal.component.min.js.map +1 -1
  121. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  122. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +4 -4
  123. package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
  124. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  125. package/assets/js/components/nav/nav.component.js +88 -79
  126. package/assets/js/components/nav/nav.component.min.js +8 -8
  127. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  128. package/assets/js/components/notification/notification.component.min.js +2 -2
  129. package/assets/js/components/pagination/pagination.component.min.js +5 -5
  130. package/assets/js/components/password/password.component.min.js +1 -1
  131. package/assets/js/components/popover/popover.component.min.js +1 -1
  132. package/assets/js/components/rank/rank.component.min.js +1 -1
  133. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  134. package/assets/js/components/rating/rating.component.min.js +1 -1
  135. package/assets/js/components/record-card/record-card.component.min.js +6 -6
  136. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  137. package/assets/js/components/search/search.component.js +235 -186
  138. package/assets/js/components/search/search.component.min.js +12 -7
  139. package/assets/js/components/search/search.component.min.js.map +1 -1
  140. package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
  141. package/assets/js/components/slider/slider.component.min.js +2 -2
  142. package/assets/js/components/split-button/split-button.component.min.js +2 -2
  143. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
  144. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  145. package/assets/js/components/std-nav/std-nav.component.js +12 -9
  146. package/assets/js/components/std-nav/std-nav.component.min.js +12 -15
  147. package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
  148. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +5 -5
  149. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +1 -1
  150. package/assets/js/components/table/table.component.min.js +1 -1
  151. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  152. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  153. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  154. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  155. package/assets/js/components/tabs/tabs.component.min.js +4 -4
  156. package/assets/js/components/tag/tag.component.min.js +3 -3
  157. package/assets/js/components/tag/tag.component.min.js.map +1 -1
  158. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  159. package/assets/js/components/video/video.component.min.js +1 -1
  160. package/assets/js/components/video-card/video-card.component.min.js +9 -9
  161. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  162. package/assets/js/components/video-modal/video-modal.component.min.js +5 -5
  163. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  164. package/assets/js/modules/card.module.js +12 -11
  165. package/assets/js/modules/content.js +40 -8
  166. package/assets/js/modules/content.test.js +62 -12
  167. package/assets/js/modules/data-layer.js +7 -6
  168. package/assets/js/modules/dropdown.js +0 -1
  169. package/assets/js/modules/form.js +129 -0
  170. package/assets/js/modules/form.test.js +132 -0
  171. package/assets/js/modules/nav.js +10 -3
  172. package/assets/js/modules/search.js +153 -0
  173. package/assets/js/modules/search.test.js +125 -0
  174. package/assets/js/modules/tabs.test.js +64 -12
  175. package/assets/js/modules/test-dom.js +5 -0
  176. package/assets/js/modules/testimonial.test.js +44 -6
  177. package/assets/js/modules/videos.test.js +61 -13
  178. package/assets/js/scripts.bundle.js +3 -3
  179. package/assets/js/scripts.bundle.js.map +1 -1
  180. package/assets/js/scripts.bundle.min.js +2 -2
  181. package/assets/js/scripts.bundle.min.js.map +1 -1
  182. package/assets/sass/_components.scss +2 -63
  183. package/assets/sass/_utilities.scss +1 -0
  184. package/assets/sass/components/banner.preload.scss +26 -0
  185. package/assets/sass/components/card.component.scss +1 -7
  186. package/assets/sass/components/card.module.scss +6 -6
  187. package/assets/sass/components/card.preload.scss +80 -0
  188. package/assets/sass/components/carousel.component.scss +165 -0
  189. package/assets/sass/components/carousel.config.scss +90 -249
  190. package/assets/sass/components/content.component.scss +0 -7
  191. package/assets/sass/components/modal.component.scss +5 -1
  192. package/assets/sass/components/nav.component.scss +2 -1
  193. package/assets/sass/components/nav.global.scss +0 -10
  194. package/assets/sass/components/notification.global.scss +8 -0
  195. package/assets/sass/components/search.component.scss +89 -7
  196. package/assets/sass/components/skeleton.global.scss +4 -0
  197. package/assets/sass/elements/dialog.scss +43 -0
  198. package/assets/sass/elements/dropdown.css +2 -0
  199. package/assets/sass/elements/forms.scss +0 -27
  200. package/assets/sass/elements/links--global.scss +40 -2
  201. package/assets/sass/foundations/colours.scss +0 -24
  202. package/assets/sass/foundations/reboot.scss +4 -0
  203. package/assets/sass/foundations/root.scss +0 -1
  204. package/assets/sass/utilities/js-display.css +2 -3
  205. package/assets/sass/utilities/wordpress.css +7 -0
  206. package/assets/ts/components/card/card.component.ts +72 -62
  207. package/assets/ts/components/carousel/carousel.component.ts +84 -19
  208. package/assets/ts/components/content/content.component.ts +36 -100
  209. package/assets/ts/components/form/form.component.ts +54 -213
  210. package/assets/ts/components/modal/modal.component.ts +27 -19
  211. package/assets/ts/components/nav/nav.component.ts +107 -95
  212. package/assets/ts/components/search/search.component.ts +260 -184
  213. package/assets/ts/components/std-nav/std-nav.component.ts +20 -17
  214. package/assets/ts/html.d.ts +6 -0
  215. package/assets/ts/modules/card.module.ts +19 -11
  216. package/assets/ts/modules/content.test.ts +84 -12
  217. package/assets/ts/modules/content.ts +56 -9
  218. package/assets/ts/modules/data-layer.ts +7 -11
  219. package/assets/ts/modules/dropdown.ts +0 -2
  220. package/assets/ts/modules/form.test.ts +183 -0
  221. package/assets/ts/modules/form.ts +210 -0
  222. package/assets/ts/modules/nav.ts +12 -3
  223. package/assets/ts/modules/search.test.ts +142 -0
  224. package/assets/ts/modules/search.ts +206 -0
  225. package/assets/ts/modules/tabs.test.ts +79 -12
  226. package/assets/ts/modules/test-dom.ts +5 -0
  227. package/assets/ts/modules/testimonial.test.ts +45 -6
  228. package/assets/ts/modules/videos.test.ts +74 -14
  229. package/dist/components.es.js +25 -25
  230. package/dist/components.umd.js +170 -163
  231. package/package.json +1 -1
  232. package/assets/js/modules/carousel.js +0 -214
  233. package/assets/js/modules/carousel.test.js +0 -18
  234. package/assets/ts/modules/carousel.test.ts +0 -27
  235. package/assets/ts/modules/carousel.ts +0 -301
@@ -5,6 +5,35 @@ trackComponentRegistered('iam-carousel');
5
5
  class iamCarousel extends HTMLElement {
6
6
  constructor() {
7
7
  super();
8
+ this.attachShadow({ mode: 'open' });
9
+
10
+ const assetLocation = document.body.hasAttribute('data-assets-location')
11
+ ? document.body.getAttribute('data-assets-location')
12
+ : '/assets';
13
+
14
+ const loadCSS = `@import "${assetLocation}/css/components/carousel.component.css";`;
15
+
16
+ const template = document.createElement('template');
17
+
18
+ template.innerHTML = /* HTML */ `
19
+ <style>
20
+ ${loadCSS}
21
+ </style>
22
+ <slot></slot>
23
+ <div class="carousel__controls" part="carousel__controls">
24
+ <div class="carousel__pips" part="carousel__pips"></div>
25
+ <div class="carousel__progress carousel__progress-xs" part="carousel__progress-xs">
26
+ <input type="range" min="1" max="100" value="1" step="1" />
27
+ </div>
28
+ <div class="carousel__progress carousel__progress-sm" part="carousel__progress-sm">
29
+ <input type="range" min="1" max="100" value="1" step="1" />
30
+ </div>
31
+ <div class="carousel__progress carousel__progress-md" part="carousel__progress-md">
32
+ <input type="range" min="1" max="100" value="1" step="1" />
33
+ </div>
34
+ </div>
35
+ `;
36
+ this.shadowRoot?.appendChild(template.content.cloneNode(true));
8
37
  }
9
38
 
10
39
  generateThumbnailList = (carouselComponent): any => {
@@ -46,7 +75,7 @@ class iamCarousel extends HTMLElement {
46
75
  }
47
76
 
48
77
  connectedCallback(): void {
49
-
78
+ /*
50
79
  this.insertAdjacentHTML('beforeend',`
51
80
  <div class="carousel__controls">
52
81
  <div class="carousel__pips"></div>
@@ -61,15 +90,48 @@ class iamCarousel extends HTMLElement {
61
90
  </div>
62
91
  </div>
63
92
  `)
93
+ */
64
94
 
65
95
  // eslint-disable-next-line @typescript-eslint/no-this-alias
66
96
  const carouselElement = this;
67
- const carouselProgress = this.querySelector('.carousel__progress-xs [type="range"]');
68
- const carouselProgressSM = this.querySelector('.carousel__progress-sm [type="range"]');
69
- const carouselProgressMD = this.querySelector('.carousel__progress-md [type="range"]');
97
+ const carouselProgress = this.shadowRoot.querySelector('.carousel__progress-xs [type="range"]');
98
+ const carouselProgressSM = this.shadowRoot.querySelector('.carousel__progress-sm [type="range"]');
99
+ const carouselProgressMD = this.shadowRoot.querySelector('.carousel__progress-md [type="range"]');
70
100
  const itemCount = this.querySelectorAll(':scope > *:not(.carousel__controls)').length;
71
101
  const progressPercent = this.progressPercent;
72
102
 
103
+ this.querySelectorAll(':scope > *').forEach((item,index) => {
104
+ item.setAttribute('data-child',index+1);
105
+ })
106
+ this.setAttribute('data-current',1);
107
+
108
+ this.addEventListener("scrollsnapchange", (event) => {
109
+
110
+ const snapTargetInlineElement = event.snapTargetInline;
111
+ const child = Array.from(snapTargetInlineElement.parentElement.children).indexOf(snapTargetInlineElement)+1;
112
+
113
+ if(child != this.getAttribute('data-current')){
114
+ const customEvent = new CustomEvent(`snap-to`, {
115
+ detail: {
116
+ item: child,
117
+ },
118
+ });
119
+
120
+ this.dispatchEvent(customEvent);
121
+ this.setAttribute('data-current',child);
122
+ }
123
+
124
+ console.log(child);
125
+ carouselProgress.value = child;
126
+ carouselProgress.style.setProperty('--percent', progressPercent(child, itemCount));
127
+ carouselProgressSM.value = child;
128
+ carouselProgressSM.style.setProperty('--percent', progressPercent(child, carouselProgressSM?.getAttribute('max')));
129
+ carouselProgressMD.value = child;
130
+ carouselProgressMD.style.setProperty('--percent', progressPercent(child, carouselProgressMD?.getAttribute('max')));
131
+
132
+ });
133
+
134
+
73
135
  let stepperInterval,
74
136
  stepperEvent = 'mouseup',
75
137
  stepperStart = 'mousedown';
@@ -111,17 +173,18 @@ class iamCarousel extends HTMLElement {
111
173
 
112
174
  // SM Progress bar
113
175
  const smStep = this.getAttribute('data-smcols') ? this.getAttribute('data-smcols') : 1;
114
- const smItemCount = Math.floor(itemCount / smStep) * smStep;
176
+ //const smItemCount = Math.floor(itemCount / smStep) * smStep;
177
+ const SMMax = ((Math.floor(itemCount / smStep)-1) * smStep)+1;
115
178
 
116
- carouselProgressSM.setAttribute('max', smItemCount);
179
+ carouselProgressSM.setAttribute('max', SMMax);
117
180
  carouselProgressSM.setAttribute('step', smStep);
118
181
 
119
- carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, smItemCount));
182
+ carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, carouselProgressSM?.getAttribute('max')));
120
183
 
121
184
  carouselProgressSM.addEventListener(stepperStart, () => {
122
185
  clearInterval(stepperInterval);
123
186
  stepperInterval = setInterval(function () {
124
- carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, smItemCount));
187
+ carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, carouselProgressSM?.getAttribute('max')));
125
188
  });
126
189
  });
127
190
 
@@ -133,8 +196,8 @@ class iamCarousel extends HTMLElement {
133
196
 
134
197
  clearInterval(stepperInterval);
135
198
 
136
- carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, smItemCount));
137
- const scrollTo = Math.floor((carouselElement.scrollWidth / smItemCount) * carouselProgressSM.value);
199
+ carouselProgressSM.style.setProperty('--percent', progressPercent(carouselProgressSM.value, carouselProgressSM?.getAttribute('max')));
200
+ const scrollTo = Math.floor((carouselElement.scrollWidth / itemCount) * carouselProgressSM.value);
138
201
 
139
202
  carouselElement.scrollTo({
140
203
  top: 0,
@@ -145,18 +208,18 @@ class iamCarousel extends HTMLElement {
145
208
 
146
209
  // MD Progress bar
147
210
 
148
- const mdStep = this.getAttribute('data-smcols') ? this.getAttribute('data-smcols') : 1;
149
- const mdItemCount = Math.floor(itemCount / mdStep) * mdStep;
211
+ const mdStep = this.getAttribute('data-mdcols') ? this.getAttribute('data-mdcols') : 1;
212
+ const mdMax = ((Math.floor(itemCount / mdStep)-1) * mdStep)+1;
150
213
 
151
- carouselProgressMD.setAttribute('max', mdItemCount);
214
+ carouselProgressMD.setAttribute('max', mdMax);
152
215
  carouselProgressMD.setAttribute('step', mdStep);
153
216
 
154
- carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, mdItemCount));
155
-
217
+ carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, carouselProgressMD?.getAttribute('max')));
218
+
156
219
  carouselProgressMD.addEventListener(stepperStart, () => {
157
220
  clearInterval(stepperInterval);
158
221
  stepperInterval = setInterval(function () {
159
- carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, mdItemCount));
222
+ carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, carouselProgressMD?.getAttribute('max')));
160
223
  });
161
224
  });
162
225
 
@@ -168,8 +231,10 @@ class iamCarousel extends HTMLElement {
168
231
 
169
232
  clearInterval(stepperInterval);
170
233
 
171
- carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, mdItemCount));
172
- const scrollTo = Math.floor((carouselElement.scrollWidth / mdItemCount) * carouselProgressMD.value);
234
+ carouselProgressMD.style.setProperty('--percent', progressPercent(carouselProgressMD.value, carouselProgressMD?.getAttribute('max')));
235
+ const scrollTo = Math.floor((carouselElement.scrollWidth / itemCount) * carouselProgressMD.value);
236
+
237
+ console.log(carouselProgressMD.value);
173
238
 
174
239
  carouselElement.scrollTo({
175
240
  top: 0,
@@ -180,7 +245,7 @@ class iamCarousel extends HTMLElement {
180
245
 
181
246
 
182
247
  // Thumbnails
183
- const carouselPips = this.querySelector('.carousel__pips');
248
+ const carouselPips = this.shadowRoot.querySelector('.carousel__pips');
184
249
 
185
250
  if (carouselElement.querySelector('[data-thumbnail]')) {
186
251
  const thumbnailImages = this.generateThumbnailList(carouselElement);
@@ -1,5 +1,4 @@
1
-
2
- import { transformButtons } from '../../modules/content';
1
+ import {createTitle,replaceShortcode,transformElement,transformButtons, loadComponents} from '../../modules/content';
3
2
 
4
3
  class iamContent extends HTMLElement {
5
4
  constructor() {
@@ -23,95 +22,11 @@ class iamContent extends HTMLElement {
23
22
  this.shadowRoot.appendChild(template.content.cloneNode(true));
24
23
  }
25
24
 
26
- addTitle = (title):void => {
27
-
28
- if(this.hasAttribute('data-title-tag')){
29
-
30
- return `<${this.getAttribute('data-title-tag')} class="${this.getAttribute('data-title-class')} iam-content--title">${title}</${this.getAttribute('data-title-tag')}>`;
31
- }
32
-
33
- return '';
34
- }
35
-
36
- fixContent = (component):void => {
37
-
38
- const transform = component.getAttribute('data-transform');
39
- let wrapper = component;
40
-
41
- if(transform){
42
-
43
- component.querySelectorAll(`${transform} > *:empty`).forEach((element) => {
44
- element.remove();
45
- });
46
-
47
- wrapper = component.querySelector(`${transform}`);
48
- }
49
- else {
50
-
51
- component.querySelectorAll(`:scope > *:empty`).forEach((element) => {
52
- element.remove();
53
- });
54
- }
55
-
56
- const itemClass = component.getAttribute('data-items-class');
57
-
58
- if(itemClass){
59
-
60
- wrapper.querySelectorAll(`:scope > *`).forEach((element) => {
61
- element.classList.add(itemClass);
62
- });
63
- }
64
-
65
- }
66
-
67
25
  connectedCallback(): void {
68
26
  // eslint-disable-next-line @typescript-eslint/no-this-alias
69
27
  const component = this;
70
28
  const url = this.getAttribute('data-url');
71
29
 
72
- const transform = this.getAttribute('data-transform');
73
-
74
- const fixContent = this.fixContent;
75
-
76
- let elementAttributes = '';
77
-
78
-
79
- for (const attr of this.attributes) {
80
- elementAttributes += `${attr.name}="${attr.value}" `;
81
- }
82
-
83
- const addTitle = this.addTitle;
84
-
85
- const registerComponents = (contentComponent): void => {
86
- const components = ['skeleton','bone','carousel', 'card', 'banner', 'notification'];
87
-
88
- const assetLocation = document.body.hasAttribute('data-assets-location')
89
- ? document.body.getAttribute('data-assets-location')
90
- : '/assets';
91
-
92
- // Load components - Each component will load once the first of its type has been loaded
93
- components.forEach((component) => {
94
- if (component == 'notification') {
95
- document.querySelectorAll('[data-notification]').forEach((element) => {
96
- element.outerHTML = element.outerHTML
97
- .replace(/<div/g, '<iam-notification')
98
- .replace(/<\/div>/g, '</iam-notification>');
99
- });
100
- }
101
-
102
- if (contentComponent.getElementsByTagName(`iam-${component}`).length === 0) return;
103
-
104
- import(/* @vite-ignore */ `${assetLocation}/js/components/${component}/${component}.component.js`)
105
- .then((module) => {
106
- if (!window.customElements.get(`iam-${component}`))
107
- window.customElements.define(`iam-${component}`, module.default);
108
- })
109
- .catch((err) => {
110
- console.log(err.message);
111
- });
112
- });
113
- };
114
-
115
30
  if (url) {
116
31
  const newXHRRequest = new XMLHttpRequest();
117
32
  newXHRRequest.open('GET', url, true);
@@ -123,37 +38,58 @@ class iamContent extends HTMLElement {
123
38
  if(Array.isArray(response))
124
39
  response = response[0];
125
40
 
126
- const renderedContent = response.content.rendered.replaceAll(/<p>\[(.*)\]<\/p>/g, "<span data-shortcode=\"$1\"><iam-skeleton><iam-bone class=\"search\"></iam-bone></iam-skeleton></span>");
41
+ // Create the rendered content block and maintain any shortcodes
42
+ const renderedContent = replaceShortcode(response.content.rendered);
127
43
 
128
-
129
-
44
+ // Update the content title
130
45
  component.parentElement?.querySelector('.iam-content--title')?.remove();
131
- component.insertAdjacentHTML('beforebegin',addTitle(response.title.rendered));
132
-
46
+ const renderedTitle = createTitle(component, response.title.rendered);
133
47
 
48
+ // Transform the component if required
49
+ if(component.hasAttribute('data-transform')){
134
50
 
135
- if(transform){
136
-
137
- component.innerHTML = `<${transform} ${elementAttributes}>${renderedContent}</${transform}>`;
51
+ component.innerHTML = transformElement(component,renderedTitle,renderedContent);
138
52
  component.removeAttribute('class');
53
+
54
+ component.querySelectorAll(`${component.getAttribute('data-transform')} > *:empty`).forEach((element) => {
55
+ element.remove();
56
+ });
139
57
  }
140
58
  else {
141
-
59
+
60
+ component.insertAdjacentHTML('beforebegin',renderedTitle);
61
+
142
62
  component.innerHTML = `${renderedContent}`;
63
+ component.querySelectorAll(`:scope > *:empty`).forEach((element) => {
64
+ element.remove();
65
+ });
143
66
  }
144
-
145
- fixContent(component);
146
- registerComponents(component);
147
- transformButtons(component);
148
67
 
68
+ // Load components - Each component will load once the first of its type has been loaded
69
+ loadComponents(component);
70
+
71
+ // Transform the buttons
72
+ Array.from(document.querySelectorAll('.wp-block-buttons')).forEach((buttons) => {
73
+
74
+ const fragment = transformButtons(buttons);
75
+ buttons.parentNode.replaceChild(fragment, buttons);
76
+ });
77
+
78
+ // This allows for content added dynamically via the standardised nav to be added after the content is loaded
149
79
  Array.from(document.querySelectorAll('[data-variable]')).forEach((element) => {
150
80
 
151
81
  if(document.querySelector(`[data-save-variable="${element.getAttribute('data-variable')}"][data-variable-value]`))
152
82
  element.innerHTML = document.querySelector(`[data-save-variable="${element.getAttribute('data-variable')}"][data-variable-value]`)?.getAttribute('data-variable-value');
153
83
  });
154
84
 
155
- const changeEvent = new CustomEvent('loaded', { detail: {triggered: true} });
85
+ // Dispatch the loaded event for external JS and save to the data layer
86
+ const eventDetails = {url: url};
87
+ const changeEvent = new CustomEvent('content-loaded', { detail: eventDetails });
88
+
156
89
  component?.dispatchEvent(changeEvent);
90
+
91
+ window.dataLayer = window.dataLayer || [];
92
+ window.dataLayer.push({'event': 'content-loaded', ...eventDetails});
157
93
  }
158
94
  };
159
95
 
@@ -1,12 +1,23 @@
1
- import { trackComponent, trackComponentRegistered } from '../_global';
2
- import { searchAjax, filterList, setTag } from '../../modules/dropdown';
3
-
4
- trackComponentRegistered('iam-tag');
1
+ import { trackComponentRegistered } from '../_global';
2
+ import {
3
+ isFormValid,
4
+ showIf,
5
+ hideIf,
6
+ disabledIf,
7
+ enabledIf,
8
+ requiredIf,
9
+ readonlyIf,
10
+ writeIf,
11
+ emptyIf,
12
+ limitCheckboxes
13
+ } from '../../modules/form';
14
+
15
+ trackComponentRegistered('iam-form');
5
16
 
6
17
  class iamForm extends HTMLElement {
7
18
  constructor() {
8
19
  super();
9
- this.attachShadow({ mode: 'open' });
20
+ const shadowRoot = this.attachShadow({ mode: 'open' });
10
21
 
11
22
  const template = document.createElement('template');
12
23
  template.innerHTML = `
@@ -15,260 +26,90 @@ class iamForm extends HTMLElement {
15
26
  </div>
16
27
  `;
17
28
 
18
- this.shadowRoot.appendChild(template.content.cloneNode(true));
19
- }
20
-
21
- isFormValid(form):boolean {
22
-
23
- if (form.querySelector(':invalid'))
24
- return false;
25
-
26
- if (form.querySelector('.pwd-checker[data-strength="1"]') || form.querySelector('.pwd-checker[data-strength="2"]'))
27
- return false;
28
-
29
- if (form.querySelector('iam-multiselect[data-is-required][data-error]'))
30
- return false;
31
-
32
- return true;
33
- };
34
-
35
- checkConditions = (conditions):boolean => {
36
-
37
- let meetsCondition = true;
38
-
39
- JSON.parse(conditions).forEach((condition) => {
40
- if(this.querySelector(`#${condition['if']}`).value != condition['equals'])
41
- meetsCondition = false;
42
- });
43
-
44
- return meetsCondition;
45
- }
46
-
47
- showIf = ():void => {
48
-
49
- Array.from(this.querySelectorAll('[data-show-if]')).forEach((element) => {
50
-
51
- if(!this.checkConditions(element.getAttribute('data-show-if')))
52
- element.classList.add('d-none');
53
- else
54
- element.classList.remove('d-none');
55
-
56
- });
57
- }
58
-
59
- hideIf = ():void => {
60
-
61
- Array.from(this.querySelectorAll('[data-hide-if]')).forEach((element) => {
62
-
63
- if(this.checkConditions(element.getAttribute('data-hide-if')))
64
- element.classList.add('d-none');
65
- else
66
- element.classList.remove('d-none');
67
-
68
- });
69
- }
70
-
71
- disabledIf = ():void => {
72
-
73
- Array.from(this.querySelectorAll('[data-disabled-if]')).forEach((element) => {
74
-
75
- if(this.checkConditions(element.getAttribute('data-disabled-if')))
76
- element.setAttribute('disabled','disabled');
77
- else
78
- element.removeAttribute('disabled');
79
-
80
- });
81
- }
82
-
83
- enabledIf = ():void => {
84
-
85
- Array.from(this.querySelectorAll('[data-enabled-if]')).forEach((element) => {
86
-
87
- if(!this.checkConditions(element.getAttribute('data-enabled-if')))
88
- element.setAttribute('disabled','disabled');
89
- else
90
- element.removeAttribute('disabled');
91
-
92
- });
93
- }
94
-
95
- requiredIf = ():void => {
96
-
97
- Array.from(this.querySelectorAll('[data-required-if]')).forEach((element) => {
98
-
99
- if(this.checkConditions(element.getAttribute('data-required-if')))
100
- element.setAttribute('required','required');
101
- else
102
- element.removeAttribute('required');
103
-
104
- });
105
- }
106
-
107
- readonlyIf = ():void => {
108
-
109
- Array.from(this.querySelectorAll('[data-readonly-if]')).forEach((element) => {
110
-
111
- if(this.checkConditions(element.getAttribute('data-readonly-if')))
112
- element.setAttribute('readonly','readonly');
113
- else
114
- element.removeAttribute('readonly');
115
-
116
- });
117
- }
118
-
119
- writeIf = ():void => {
120
-
121
- Array.from(this.querySelectorAll('[data-write-if]')).forEach((element) => {
122
-
123
- if(!this.checkConditions(element.getAttribute('data-write-if')))
124
- element.setAttribute('readonly','readonly');
125
- else
126
- element.removeAttribute('readonly');
127
-
128
- });
129
- }
130
-
131
- emptyIf = ():void => {
132
-
133
- Array.from(this.querySelectorAll('[data-empty-if]')).forEach((element) => {
134
-
135
- if(this.checkConditions(element.getAttribute('data-empty-if')))
136
- element.value = "";
137
-
138
- });
139
- }
140
-
141
- getCheckboxLimit = (element):number => {
142
-
143
- const limit = parseInt(element.getAttribute('data-checkbox-limit') || '10', 10);
144
-
145
- return !isNaN(limit) && limit > 0 ? limit : 10;
146
- }
147
-
148
- limitCheckboxes = (event?:Event):void => {
149
-
150
-
151
-
152
- const target = event?.target instanceof HTMLInputElement ? event.target : null;
153
- const changedCheckbox = target?.matches('input[type="checkbox"]') ? target : null;
154
- const checkboxLimitGroup = changedCheckbox?.closest('[data-checkbox-limit]');
155
- const checkboxLimitGroups = checkboxLimitGroup
156
- ? [checkboxLimitGroup]
157
- : [
158
- ...(this.hasAttribute('data-checkbox-limit') ? [this] : []),
159
- ...Array.from(this.querySelectorAll('[data-checkbox-limit]')),
160
- ];
161
-
162
- checkboxLimitGroups.forEach((group) => {
163
-
164
- const limit = this.getCheckboxLimit(group);
165
- const checked = Array.from(group.querySelectorAll('input[type="checkbox"]:checked'));
166
- const notChecked = Array.from(group.querySelectorAll('input[type="checkbox"]:not(:checked)'));
167
-
168
- notChecked.forEach((checkbox) => {
169
-
170
- checkbox.setAttribute('disabled','disabled');
171
- });
172
-
173
- if(checked.length < limit){
174
- notChecked.forEach((checkbox) => {
175
-
176
- checkbox.removeAttribute('disabled');
177
- });
178
- }
179
-
180
- if(checked.length <= limit)
181
- return;
182
-
183
-
184
- if(changedCheckbox?.checked && group.contains(changedCheckbox)) {
185
- changedCheckbox.checked = false;
186
- return;
187
- }
188
-
189
- checked.slice(limit).forEach((checkbox) => {
190
-
191
- checkbox.checked = false;
192
- });
193
- });
29
+ shadowRoot.appendChild(template.content.cloneNode(true));
194
30
  }
195
31
 
196
32
  connectedCallback(): void {
197
33
 
198
- const form = this.querySelector('form');
34
+ const form = this.querySelector<HTMLFormElement>('form') ?? this;
199
35
 
200
36
  if(!form)
201
- return false;
37
+ return;
202
38
 
203
39
  form.setAttribute('novalidate','true');
204
40
 
205
41
  // Form validation
206
- form.addEventListener('submit', (e) => {
42
+ form.addEventListener('submit', (event) => {
207
43
 
208
44
  form.classList.add('was-validated');
209
45
 
210
- if (!this.isFormValid(form)) {
46
+ if (!isFormValid(form)) {
211
47
 
212
- e.preventDefault();
213
- form?.querySelector('input:invalid')?.scrollIntoView();
48
+ event.preventDefault();
49
+ form.querySelector<HTMLInputElement>('input:invalid')?.scrollIntoView();
214
50
  }
215
51
  });
216
52
 
217
53
  // conditional reveal required fields
218
- Array.from(form.querySelectorAll('.conditional [required]')).forEach((input) => {
54
+ form.querySelectorAll<HTMLElement>('.conditional [required]').forEach((input) => {
219
55
 
220
56
  input.setAttribute('data-conditional-required','true');
221
57
  input.removeAttribute('required');
222
58
  });
223
59
 
224
60
  // conditional reveal required fields (for fields inside of components like the address lookup)
225
- Array.from(form.querySelectorAll('.conditional [data-required]')).forEach((input) => {
61
+ form.querySelectorAll<HTMLElement>('.conditional [data-required]').forEach((input) => {
226
62
 
227
63
  input.setAttribute('data-conditional-data-required','true');
228
64
  input.removeAttribute('data-required');
229
65
  });
230
66
 
231
- this.showIf();
232
- this.hideIf();
233
- this.disabledIf();
234
- this.enabledIf();
235
- this.requiredIf();
236
- this.readonlyIf();
237
- this.writeIf();
238
- this.emptyIf();
239
- this.limitCheckboxes();
240
-
67
+ showIf(this);
68
+ hideIf(this);
69
+ disabledIf(this);
70
+ enabledIf(this);
71
+ requiredIf(this);
72
+ readonlyIf(this);
73
+ writeIf(this);
74
+ emptyIf(this);
75
+ limitCheckboxes(null, this);
241
76
 
242
77
  form.addEventListener('change', (event) => {
243
78
 
244
- this.showIf();
245
- this.hideIf();
246
- this.disabledIf();
247
- this.enabledIf();
248
- this.requiredIf();
249
- this.readonlyIf();
250
- this.writeIf();
251
- this.emptyIf();
252
- this.limitCheckboxes(event);
79
+ showIf(this);
80
+ hideIf(this);
81
+ disabledIf(this);
82
+ enabledIf(this);
83
+ requiredIf(this);
84
+ readonlyIf(this);
85
+ writeIf(this);
86
+ emptyIf(this);
87
+ limitCheckboxes(event, form);
253
88
 
254
- Array.from(form.querySelectorAll('.conditional [data-conditional-required], .conditional [data-conditional-data-required]')).forEach((input) => {
89
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-required], .conditional [data-conditional-data-required]').forEach((input) => {
255
90
 
256
91
  input.removeAttribute('required');
257
92
  input.removeAttribute('data-required');
258
93
  });
259
94
 
260
95
 
261
- Array.from(form.querySelectorAll('.conditional [data-conditional-required]')).forEach((input) => {
96
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-required]').forEach((input) => {
262
97
 
263
- const conditionalStyles = window.getComputedStyle(input.closest('.conditional'));
98
+ const conditionalElement = input.closest<HTMLElement>('.conditional');
99
+ if(!conditionalElement) return;
100
+
101
+ const conditionalStyles = window.getComputedStyle(conditionalElement);
264
102
 
265
103
  if(conditionalStyles.getPropertyValue("display") == 'block')
266
104
  input.setAttribute('required', 'required');
267
105
  });
268
106
 
269
- Array.from(form.querySelectorAll('.conditional [data-conditional-data-required]')).forEach((input) => {
107
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-data-required]').forEach((input) => {
108
+
109
+ const conditionalElement = input.closest<HTMLElement>('.conditional');
110
+ if(!conditionalElement) return;
270
111
 
271
- const conditionalStyles = window.getComputedStyle(input.closest('.conditional'));
112
+ const conditionalStyles = window.getComputedStyle(conditionalElement);
272
113
 
273
114
  if(conditionalStyles.getPropertyValue("display") == 'block')
274
115
  input.setAttribute('data-required', 'true');