@iamproperty/components 5.7.1-beta6 → 6.1.0--beta

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 (213) hide show
  1. package/assets/bootstrap/README.md +8 -7
  2. package/assets/bootstrap/js/index.esm.js +19 -0
  3. package/assets/bootstrap/js/index.umd.js +34 -0
  4. package/assets/bootstrap/js/src/alert.js +1 -1
  5. package/assets/bootstrap/js/src/base-component.js +2 -2
  6. package/assets/bootstrap/js/src/button.js +1 -1
  7. package/assets/bootstrap/js/src/carousel.js +1 -1
  8. package/assets/bootstrap/js/src/collapse.js +1 -1
  9. package/assets/bootstrap/js/src/dom/data.js +1 -1
  10. package/assets/bootstrap/js/src/dom/event-handler.js +1 -1
  11. package/assets/bootstrap/js/src/dom/manipulator.js +1 -1
  12. package/assets/bootstrap/js/src/dom/selector-engine.js +1 -1
  13. package/assets/bootstrap/js/src/dropdown.js +3 -12
  14. package/assets/bootstrap/js/src/modal.js +13 -17
  15. package/assets/bootstrap/js/src/offcanvas.js +1 -1
  16. package/assets/bootstrap/js/src/popover.js +1 -1
  17. package/assets/bootstrap/js/src/scrollspy.js +10 -14
  18. package/assets/bootstrap/js/src/tab.js +4 -2
  19. package/assets/bootstrap/js/src/toast.js +4 -9
  20. package/assets/bootstrap/js/src/tooltip.js +50 -32
  21. package/assets/bootstrap/js/src/util/backdrop.js +1 -1
  22. package/assets/bootstrap/js/src/util/component-functions.js +1 -1
  23. package/assets/bootstrap/js/src/util/config.js +1 -1
  24. package/assets/bootstrap/js/src/util/focustrap.js +1 -1
  25. package/assets/bootstrap/js/src/util/index.js +1 -1
  26. package/assets/bootstrap/js/src/util/sanitizer.js +1 -1
  27. package/assets/bootstrap/js/src/util/scrollbar.js +1 -1
  28. package/assets/bootstrap/js/src/util/swipe.js +1 -1
  29. package/assets/bootstrap/js/src/util/template-factory.js +1 -1
  30. package/assets/bootstrap/package.json +27 -28
  31. package/assets/bootstrap/scss/_accordion.scss +4 -7
  32. package/assets/bootstrap/scss/_button-group.scss +1 -1
  33. package/assets/bootstrap/scss/_buttons.scss +7 -28
  34. package/assets/bootstrap/scss/_carousel.scss +3 -0
  35. package/assets/bootstrap/scss/_dropdown.scss +1 -2
  36. package/assets/bootstrap/scss/_functions.scss +2 -2
  37. package/assets/bootstrap/scss/_list-group.scss +5 -6
  38. package/assets/bootstrap/scss/_modal.scss +1 -1
  39. package/assets/bootstrap/scss/_nav.scss +2 -2
  40. package/assets/bootstrap/scss/_navbar.scss +0 -2
  41. package/assets/bootstrap/scss/_offcanvas.scss +4 -5
  42. package/assets/bootstrap/scss/_pagination.scss +1 -1
  43. package/assets/bootstrap/scss/_popover.scss +5 -5
  44. package/assets/bootstrap/scss/_toasts.scss +2 -5
  45. package/assets/bootstrap/scss/_variables-dark.scss +87 -0
  46. package/assets/bootstrap/scss/_variables.scss +17 -18
  47. package/assets/bootstrap/scss/bootstrap-utilities.scss +0 -3
  48. package/assets/bootstrap/scss/forms/_floating-labels.scss +0 -1
  49. package/assets/bootstrap/scss/forms/_input-group.scss +4 -7
  50. package/assets/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  51. package/assets/bootstrap/scss/helpers/_icon-link.scss +25 -0
  52. package/assets/bootstrap/scss/mixins/_banner.scss +2 -2
  53. package/assets/bootstrap/scss/mixins/_color-mode.scss +21 -0
  54. package/assets/bootstrap/scss/mixins/_forms.scss +10 -10
  55. package/assets/bootstrap/scss/mixins/_table-variants.scss +2 -2
  56. package/assets/bootstrap/scss/mixins/_utilities.scss +1 -1
  57. package/assets/css/components/barchart.component.css +1 -1
  58. package/assets/css/components/barchart.component.css.map +1 -1
  59. package/assets/css/components/card.component.css +1 -0
  60. package/assets/css/components/card.component.css.map +1 -0
  61. package/assets/css/components/card.module.css +1 -0
  62. package/assets/css/components/card.module.css.map +1 -0
  63. package/assets/css/components/charts.config.css +1 -1
  64. package/assets/css/components/charts.config.css.map +1 -1
  65. package/assets/css/components/charts.css +1 -1
  66. package/assets/css/components/charts.css.map +1 -1
  67. package/assets/css/components/charts.module.css +1 -1
  68. package/assets/css/components/charts.module.css.map +1 -1
  69. package/assets/css/components/filter-card.component.css +1 -0
  70. package/assets/css/components/filter-card.component.css.map +1 -0
  71. package/assets/css/components/multiselect.preload.css +1 -1
  72. package/assets/css/components/multiselect.preload.css.map +1 -1
  73. package/assets/css/components/record-card.component.css +1 -0
  74. package/assets/css/components/record-card.component.css.map +1 -0
  75. package/assets/css/components/timeline.css +1 -1
  76. package/assets/css/components/timeline.css.map +1 -1
  77. package/assets/css/components/video-card.component.css +1 -0
  78. package/assets/css/components/video-card.component.css.map +1 -0
  79. package/assets/css/core.min.css +1 -1
  80. package/assets/css/core.min.css.map +1 -1
  81. package/assets/css/style.min.css +1 -1
  82. package/assets/css/style.min.css.map +1 -1
  83. package/assets/js/components/_global.js +32 -0
  84. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  85. package/assets/js/components/actionbar/actionbar.component.min.js +5 -5
  86. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  87. package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
  88. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  89. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  90. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  91. package/assets/js/components/barchart/barchart.component.js +8 -7
  92. package/assets/js/components/barchart/barchart.component.min.js +6 -4
  93. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  94. package/assets/js/components/card/card.component.js +92 -154
  95. package/assets/js/components/card/card.component.min.js +26 -31
  96. package/assets/js/components/card/card.component.min.js.map +1 -1
  97. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  98. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  99. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  100. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  101. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  102. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  103. package/assets/js/components/filter-card/filter-card.component.js +71 -0
  104. package/assets/js/components/filter-card/filter-card.component.min.js +27 -0
  105. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -0
  106. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  107. package/assets/js/components/header/header.component.min.js +1 -1
  108. package/assets/js/components/header/header.component.min.js.map +1 -1
  109. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  110. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  111. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  112. package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
  113. package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
  114. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  115. package/assets/js/components/nav/nav.component.min.js +1 -1
  116. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  117. package/assets/js/components/notification/notification.component.min.js +1 -1
  118. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  119. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  120. package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
  121. package/assets/js/components/record-card/record-card.component.js +69 -0
  122. package/assets/js/components/record-card/record-card.component.min.js +27 -0
  123. package/assets/js/components/record-card/record-card.component.min.js.map +1 -0
  124. package/assets/js/components/search/search.component.min.js +1 -1
  125. package/assets/js/components/slider/slider.component.min.js +1 -1
  126. package/assets/js/components/slider/slider.component.min.js.map +1 -1
  127. package/assets/js/components/table/table.component.min.js +2 -2
  128. package/assets/js/components/table/table.component.min.js.map +1 -1
  129. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  130. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  131. package/assets/js/components/video-card/video-card.component.js +176 -0
  132. package/assets/js/components/video-card/video-card.component.min.js +30 -0
  133. package/assets/js/components/video-card/video-card.component.min.js.map +1 -0
  134. package/assets/js/components.bundle.js +5 -0
  135. package/assets/js/components.bundle.js.map +1 -0
  136. package/assets/js/components.js +30 -0
  137. package/assets/js/modules/card.module.js +33 -0
  138. package/assets/js/modules/chart.js +2 -2
  139. package/assets/js/modules/chart.module.js +25 -60
  140. package/assets/js/modules/dialogs.js +0 -6
  141. package/assets/js/modules/table.js +1 -1
  142. package/assets/js/scripts.bundle.js +3 -194
  143. package/assets/js/scripts.bundle.js.map +1 -1
  144. package/assets/js/scripts.bundle.min.js +2 -2
  145. package/assets/js/scripts.bundle.min.js.map +1 -1
  146. package/assets/js/scripts.js +17 -0
  147. package/assets/js/tests/chart.spec.js +57 -0
  148. package/assets/js/tests/filterlist.spec.js +1 -1
  149. package/assets/sass/_components.scss +81 -1
  150. package/assets/sass/_corefiles.scss +4 -10
  151. package/assets/sass/_elements.scss +2 -0
  152. package/assets/sass/components/card.component.scss +229 -0
  153. package/assets/sass/components/card.module.scss +154 -0
  154. package/assets/sass/components/charts.config.scss +3 -0
  155. package/assets/sass/components/charts.module.scss +18 -7
  156. package/assets/sass/components/filter-card.component.scss +106 -0
  157. package/assets/sass/components/multiselect.preload.scss +7 -0
  158. package/assets/sass/components/record-card.component.scss +204 -0
  159. package/assets/sass/components/video-card.component.scss +80 -0
  160. package/assets/sass/components.reset.scss +5 -43
  161. package/assets/sass/elements/badge-tag.scss +5 -1
  162. package/assets/sass/elements/buttons.scss +3 -0
  163. package/assets/sass/elements/dialog.scss +2 -744
  164. package/assets/sass/elements/forms.scss +5 -0
  165. package/assets/sass/elements/media.scss +0 -38
  166. package/assets/sass/elements/modal.scss +553 -0
  167. package/assets/sass/elements/popover.scss +207 -0
  168. package/assets/sass/foundations/reboot.scss +2 -2
  169. package/assets/sass/foundations/root.scss +0 -1
  170. package/assets/ts/components/_global.ts +40 -0
  171. package/assets/ts/components/barchart/barchart.component.ts +9 -17
  172. package/assets/ts/components/card/card.component.ts +94 -192
  173. package/assets/ts/components/filter-card/filter-card.component.ts +81 -0
  174. package/assets/ts/components/record-card/record-card.component.ts +82 -0
  175. package/assets/ts/components/video-card/video-card.component.ts +227 -0
  176. package/assets/ts/components.ts +38 -0
  177. package/assets/ts/modules/card.module.ts +43 -0
  178. package/assets/ts/modules/chart.module.ts +25 -74
  179. package/assets/ts/modules/dialogs.ts +0 -8
  180. package/assets/ts/modules/table.ts +1 -1
  181. package/assets/ts/scripts.ts +22 -0
  182. package/assets/ts/tests/chart.spec.ts +77 -0
  183. package/assets/ts/tests/filterlist.spec.ts +1 -1
  184. package/dist/components.es.js +201 -201
  185. package/dist/components.umd.js +76 -81
  186. package/package.json +8 -7
  187. package/src/components/BarChart/BarChart.vue +2 -2
  188. package/src/components/FilterCard/FilterCard.vue +25 -0
  189. package/src/components/RecordCard/RecordCard.vue +25 -0
  190. package/src/components/VideoCard/VideoCard.vue +25 -0
  191. package/assets/css/components/card.css +0 -1
  192. package/assets/css/components/card.css.map +0 -1
  193. package/assets/css/components/card.global.css +0 -1
  194. package/assets/css/components/card.global.css.map +0 -1
  195. package/assets/css/components/card.preload.css +0 -1
  196. package/assets/css/components/card.preload.css.map +0 -1
  197. package/assets/js/bundle.js +0 -74
  198. package/assets/js/dynamic.js +0 -80
  199. package/assets/js/dynamic.min.js +0 -18
  200. package/assets/js/dynamic.min.js.map +0 -1
  201. package/assets/js/flat-components.js +0 -84
  202. package/assets/js/modules/youtubevideo.js +0 -106
  203. package/assets/sass/components/card.global.scss +0 -102
  204. package/assets/sass/components/card.preload.scss +0 -8
  205. package/assets/sass/components/card.scss +0 -606
  206. package/assets/ts/bundle.ts +0 -94
  207. package/assets/ts/components/barchart/README.md +0 -37
  208. package/assets/ts/components/card/README.md +0 -39
  209. package/assets/ts/dynamic.ts +0 -107
  210. package/assets/ts/flat-components.ts +0 -106
  211. package/assets/ts/modules/youtubevideo.ts +0 -141
  212. package/src/foundations/YoutubeVideo/README.md +0 -11
  213. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +0 -24
@@ -0,0 +1,227 @@
1
+ // @ts-nocheck
2
+ import {trackComponent, trackComponentRegistered} from "../_global";
3
+ import {cardHTML,setupCard} from "../../modules/card.module";
4
+
5
+ trackComponentRegistered("iam-video-card");
6
+
7
+ class iamVideoCard extends HTMLElement {
8
+
9
+ constructor(){
10
+ super();
11
+ this.attachShadow({ mode: 'open'});
12
+
13
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
14
+ const loadCSS = `@import "${assetLocation}/css/components/video-card.component.css";`;
15
+
16
+ const template = document.createElement('template');
17
+ template.innerHTML = `
18
+ <style>
19
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
20
+
21
+ ${loadCSS}
22
+ </style>
23
+ ${cardHTML}
24
+ <dialog>
25
+ <div class="embed"></div>
26
+ </dialog>
27
+ `;
28
+
29
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
30
+ }
31
+
32
+ async connectedCallback() {
33
+
34
+ const cardComponent = this;
35
+ const cardHead = cardComponent.shadowRoot.querySelector('.card__head');
36
+
37
+ const randLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
38
+ const link_id = randLetter + Date.now();
39
+
40
+ let dialog;
41
+ let embed;
42
+
43
+ setupCard(cardComponent);
44
+
45
+ // Check if youtube or vimeo video link is present
46
+ if(cardComponent.querySelector('[data-youtube]'))
47
+ cardComponent.setAttribute('data-youtube',cardComponent.querySelector('[data-youtube]').getAttribute('data-youtube'));
48
+
49
+ if(cardComponent.querySelector('[data-vimeo]'))
50
+ cardComponent.setAttribute('data-vimeo',cardComponent.querySelector('[data-vimeo]').getAttribute('data-vimeo'));
51
+
52
+ // General dialog stuff
53
+ if(cardComponent.hasAttribute('data-youtube') || cardComponent.hasAttribute('data-vimeo')){
54
+
55
+ cardHead.setAttribute('tabindex','0');
56
+
57
+ // Add dialog to page
58
+ if(!document.getElementById(`${link_id}-dialog`)){
59
+ document.body.insertAdjacentHTML('beforeend', `<dialog id="${link_id}-dialog"><div class="embed" id="${link_id}"></div></dialog>`);
60
+ }
61
+
62
+ dialog = document.getElementById(`${link_id}-dialog`);
63
+ embed = document.getElementById(link_id);
64
+ }
65
+
66
+ // Youtube
67
+ if(cardComponent.hasAttribute('data-youtube')){
68
+
69
+ // Load the scripts only once
70
+ if(!document.body.classList.contains('youtubeLoaded')){
71
+ let loaded = await this.loadYouTubeScripts();
72
+ }
73
+ cardHead.addEventListener('click',function(){
74
+
75
+ const customEvent = new CustomEvent("play-video", { detail: { 'Video Type': 'YoutTube', 'ID': cardComponent.getAttribute('data-youtube') } });
76
+ cardComponent.dispatchEvent(customEvent);
77
+
78
+ cardComponent.createYoutTubeVideo(embed);
79
+ dialog.showModal();
80
+ });
81
+
82
+ dialog.addEventListener("close", (event) => {
83
+
84
+ if(window.player[embed.getAttribute('id')] && typeof window.player[embed.getAttribute('id')].pauseVideo == "function"){
85
+
86
+ window.player[embed.getAttribute('id')].pauseVideo();
87
+ }
88
+
89
+
90
+ const customEvent = new CustomEvent("close-video", { detail: { 'Video Type': 'YoutTube', 'ID': cardComponent.getAttribute('data-youtube') } });
91
+ cardComponent.dispatchEvent(customEvent);
92
+ });
93
+
94
+ }
95
+ else if(cardComponent.hasAttribute('data-vimeo')){ // Vimeo
96
+
97
+ cardHead.addEventListener('click',function(){
98
+
99
+ const videoId = cardComponent.getAttribute('data-vimeo');
100
+
101
+ const customEvent = new CustomEvent("play-video", { detail: { 'Video Type': 'Vimeo', 'ID': videoId } });
102
+ cardComponent.dispatchEvent(customEvent);
103
+
104
+ if(!embed.querySelector('iframe'))
105
+ embed.innerHTML = `<iframe src="https://player.vimeo.com/video/${videoId}?autoplay=1" width="100%" height="100%" frameborder="0" allow="autoplay; encrypted-media" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`
106
+
107
+ dialog.showModal();
108
+ });
109
+
110
+ dialog.addEventListener("close", (event) => {
111
+
112
+ embed.innerHTML = ``; // Remove the video since we cant pause it
113
+
114
+ const customEvent = new CustomEvent("close-video", { detail: { 'Video Type': 'Vimeo', 'ID': cardComponent.getAttribute('data-vimeo') } });
115
+ cardComponent.dispatchEvent(customEvent);
116
+ });
117
+ }
118
+
119
+ trackComponent(cardComponent,"iam-video-card",['play-video','close-video']);
120
+ }
121
+
122
+ loadYouTubeScripts(){
123
+
124
+ return new Promise((resolve, reject) => {
125
+
126
+ const image = new Image();
127
+ image.onload = function(){
128
+
129
+ // This code loads the IFrame Player API code asynchronously.
130
+ var tag = document.createElement('script');
131
+ tag.src = "https://www.youtube.com/iframe_api";
132
+ var firstScriptTag = document.getElementsByTagName('script')[0];
133
+ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
134
+ document.body.classList.add('youtubeLoaded');
135
+ resolve(true);
136
+ };
137
+ image.onerror = function(){
138
+ reject(false);
139
+ };
140
+ image.src = "https://youtube.com/favicon.ico";
141
+ });
142
+
143
+ }
144
+
145
+ createYoutTubeVideo(target){
146
+
147
+ if(typeof window.player == "undefined"){
148
+ window.player = [];
149
+ }
150
+
151
+ var link_id = target.getAttribute('id');
152
+ var video_id = this.getAttribute('data-youtube');
153
+
154
+ console.log(window.player)
155
+
156
+ if(typeof window.player[link_id] != 'undefined' && typeof window.player[link_id].pauseVideo == "function"){
157
+
158
+ window.player[link_id].playVideo();
159
+
160
+ return false;
161
+ }
162
+
163
+ // This function creates an <iframe> (and YouTube player) after the API code downloads.
164
+ //function onYouTubeIframeAPIReady() {
165
+
166
+ window.player[link_id] = new YT.Player(link_id, {
167
+ height: '100%',
168
+ width: '100%',
169
+ videoId: video_id,
170
+ playerVars: {
171
+ 'modestbranding': 1,
172
+ 'playsinline': 1,
173
+ 'rel': 0,
174
+ 'showinfo': 0
175
+ },
176
+ events: {
177
+ 'onReady': onPlayerReady,
178
+ 'onStateChange': onPlayerStateChange
179
+ }
180
+ });
181
+ //}
182
+ //onYouTubeIframeAPIReady();
183
+
184
+ // The API will call this function when the video player is ready.
185
+ function onPlayerReady(event) {
186
+ // Play the video straight away
187
+ event.target.playVideo();
188
+ }
189
+
190
+ // The API calls this function when the player's state changes.
191
+ // The function indicates that when playing a video (state=1)
192
+ var done = false;
193
+ function onPlayerStateChange(event) {
194
+
195
+ if (event.data == YT.PlayerState.PLAYING && !done) {
196
+
197
+ var link = document.getElementById(link_id);
198
+ link.classList.add('player-ready');
199
+
200
+ done = true;
201
+ }
202
+ }
203
+ }
204
+
205
+ static get observedAttributes() {
206
+ return ["data-image"];
207
+ }
208
+
209
+ attributeChangedCallback(attrName, oldVal, newVal) {
210
+ switch (attrName) {
211
+ case "data-image": {
212
+
213
+ if(oldVal != newVal){
214
+
215
+ const cardHeadImg = this.shadowRoot.querySelector('.card__head img');
216
+
217
+ if(cardHeadImg)
218
+ cardHeadImg.setAttribute('src',newVal);
219
+ }
220
+ break;
221
+ }
222
+ }
223
+
224
+ }
225
+ }
226
+
227
+ export default iamVideoCard;
@@ -0,0 +1,38 @@
1
+ // @ts-nocheck
2
+ const components = ["accordion","header","table","tabs",'card','filter-card','video-card','record-card',"filterlist",'applied-filters','pagination','notification','actionbar','nav','collapsible-side','address-lookup','fileupload','search','inline-edit','multiselect','slider','carousel','marketing','barchart'];
3
+
4
+ const prefix = "iam"
5
+ const options = {
6
+ rootMargin: '50px',
7
+ threshold: 0.1
8
+ }
9
+ const componentExt = ".component.min.js";
10
+
11
+ // Load components - Each component will load once the first of its type has been loaded
12
+ components.forEach((component) => {
13
+
14
+ if(document.getElementsByTagName(`${prefix}-${component}`).length === 0)
15
+ return;
16
+
17
+ let callback = (entries:any) => {
18
+ entries.forEach((entry:any) => {
19
+
20
+ if(entry.intersectionRatio > 0){
21
+
22
+ console.log(component)
23
+
24
+ import(`./components/${component}/${component}${componentExt}`).then(module => {
25
+ if (!window.customElements.get(`${prefix}-${component}`))
26
+ window.customElements.define(`${prefix}-${component}`, module.default);
27
+ }).catch((err) => {
28
+ console.log(err.message);
29
+ });
30
+
31
+ intObserver.unobserve(entry.target);
32
+ }
33
+ });
34
+ };
35
+
36
+ const intObserver = new IntersectionObserver(callback, options);
37
+ intObserver.observe(document.getElementsByTagName(`${prefix}-${component}`)[0]);
38
+ });
@@ -0,0 +1,43 @@
1
+ export const cardHTML = `<div class="card__head" part="head">
2
+ <slot name="head"></slot>
3
+ </div>
4
+ <div class="card__badges"><slot name="badges"></slot></div>
5
+ <slot name="checkbox" class="activate-prevent-hover"></slot>
6
+ <div class="card__body" part="body">
7
+ <slot></slot>
8
+ <slot name="secondary" part="secondary"></slot>
9
+ </div>
10
+ <div class="card__details" part="details">
11
+ <slot name="details"></slot>
12
+ </div>
13
+ <div class="card__footer" part="footer">
14
+ <slot name="footer"></slot>
15
+ </div>`;
16
+
17
+
18
+ export const setupCard = (cardComponent:any) => {
19
+
20
+ cardComponent.classList.add('card');
21
+ const cardHead = cardComponent.shadowRoot.querySelector('.card__head');
22
+ const cardBody = cardComponent.shadowRoot.querySelector('.card__body');
23
+
24
+ if(cardComponent.hasAttribute('data-image')){
25
+
26
+ cardHead.innerHTML += `<img src="${cardComponent.getAttribute('data-image')}" alt="" loading="lazy" part="image" />`;
27
+ }
28
+
29
+
30
+ // Inset the HTML for the data total or icon fallback
31
+ if(cardComponent.hasAttribute('data-total')){
32
+
33
+ cardBody.insertAdjacentHTML('beforeend', `<div class="card__total">${cardComponent.getAttribute('data-total')}</div>`);
34
+ }
35
+ else if(cardComponent.querySelector('[slot="total-icon"]')){
36
+
37
+ cardBody.insertAdjacentHTML('beforeend', `<div class="card__total"><slot name="total-icon"></slot></div>`);
38
+ }
39
+
40
+ if(!cardComponent.querySelector('[slot="badges"]')){
41
+ cardComponent.shadowRoot.querySelector('.card__badges').remove();
42
+ }
43
+ }
@@ -1,4 +1,3 @@
1
- import { numberOfDays } from './helpers'
2
1
 
3
2
  // #region Functions that setup and trigger other functions
4
3
 
@@ -41,20 +40,18 @@ export const setupChart = (chartElement:any,chartOuter:any,tableElement:any) =>
41
40
  Array.from(chartOuter.querySelectorAll(':scope > input[type="checkbox"],:scope > input[type="radio"]')).map((element: any) => { element.remove(); })
42
41
  // #endregion
43
42
 
44
- let {xaxis} = getChartData(chartElement,chartOuter);
43
+ let {xaxis} = getChartData(chartElement);
45
44
 
46
- setCellData(chartElement,chartOuter,tableElement);
45
+ setCellData(chartElement,tableElement);
47
46
 
48
47
  createChartKey(chartOuter,tableElement,chartKey);
49
- createChartGuidelines(chartElement,chartOuter,chartGuidelines);
50
- createChartYaxis(chartElement,chartOuter,chartYaxis);
48
+ createChartGuidelines(chartElement,chartGuidelines);
49
+ createChartYaxis(chartElement,chartYaxis);
51
50
 
52
51
  if(xaxis){
53
- createXaxis(chartElement,chartOuter,xaxis);
52
+ createXaxis(chartOuter);
54
53
  }
55
54
 
56
-
57
-
58
55
  return true;
59
56
  };
60
57
  // #endregion
@@ -115,7 +112,7 @@ export const setEventListener = function(chartElement:any, chartOuter:any) {
115
112
 
116
113
 
117
114
  shadowTable.innerHTML = table.innerHTML;
118
- setCellData(chartElement,chartOuter,shadowTable);
115
+ setCellData(chartElement,shadowTable);
119
116
 
120
117
  });
121
118
  }
@@ -132,7 +129,7 @@ export const setEventObservers = function(chartElement:any,chartOuter:any) {
132
129
 
133
130
  for (const mutation of mutationList) {
134
131
 
135
- if(mutation.attributeName == 'class' || (mutation.type === 'attributes' && mutation.attributeName === 'data-total') || mutation.type === 'attributes') {
132
+ if(mutation.attributeName == 'class' || (mutation.type === 'attributes') || mutation.type === 'attributes') {
136
133
 
137
134
  shadowTable.innerHTML = table.innerHTML;
138
135
  setupChart(chartElement,chartOuter,shadowTable);
@@ -173,29 +170,29 @@ export const setEventObservers = function(chartElement:any,chartOuter:any) {
173
170
  // #endregion
174
171
 
175
172
  // #region GET functions
176
- export const getChartData = function(chartElement:any,chartOuter:any){
173
+ export const getChartData = function(chartElement:any){
177
174
 
178
175
 
179
- let table = chartOuter.querySelector('.chart__wrapper table');
176
+ let table = chartElement.shadowRoot.querySelector('.chart__wrapper table');
180
177
 
181
178
  let min:any = chartElement.hasAttribute('data-min') ? chartElement.getAttribute('data-min') : 0;
182
179
  let max:any = chartElement.hasAttribute('data-max') ? chartElement.getAttribute('data-max') : getLargestValue(chartElement,table);
183
- let type:string = chartElement.hasAttribute('data-type') ? chartElement.getAttribute('data-type') : 'column';
180
+ //let type:string = chartElement.hasAttribute('data-type') ? chartElement.getAttribute('data-type') : 'column';
184
181
  let yaxis:any = chartElement.hasAttribute('data-yaxis') ? chartElement.getAttribute('data-yaxis').split(',') : [];
185
182
  let guidelines:any = chartElement.hasAttribute('data-guidelines') ? chartElement.getAttribute('data-guidelines').split(',') : [];
186
- let targets:any = chartElement.hasAttribute('data-targets') ? JSON.parse(chartElement.getAttribute('data-targets')) : null;
187
- let events:any = chartElement.hasAttribute('data-events') ? JSON.parse(chartElement.getAttribute('data-events')) : null;
183
+ //let targets:any = chartElement.hasAttribute('data-targets') ? JSON.parse(chartElement.getAttribute('data-targets')) : null;
184
+ //let events:any = chartElement.hasAttribute('data-events') ? JSON.parse(chartElement.getAttribute('data-events')) : null;
188
185
  let xaxis:any = chartElement.hasAttribute('data-xaxis') ? chartElement.getAttribute('data-xaxis').split(',') : null;
189
- let increment = chartElement.hasAttribute('data-increment') ? chartElement.getAttribute('data-increment'): null;
186
+ //let increment = chartElement.hasAttribute('data-increment') ? chartElement.getAttribute('data-increment'): null;
190
187
 
191
- let start:any = chartElement.hasAttribute('data-start') ? chartElement.getAttribute('data-start') : 0;
192
- let end:any = chartElement.hasAttribute('data-end') ? chartElement.getAttribute('data-end') : getLargestValue(chartElement,table); // TODO - get largest value from the data-xaxis
188
+ //let start:any = chartElement.hasAttribute('data-start') ? chartElement.getAttribute('data-start') : 0;
189
+ //let end:any = chartElement.hasAttribute('data-end') ? chartElement.getAttribute('data-end') : getLargestValue(chartElement,table); // TODO - get largest value from the data-xaxis
193
190
 
194
191
 
195
- let slope:any = chartElement.hasAttribute('data-slope') ? chartElement.getAttribute('data-slope') : null;
196
- let yInt:any = chartElement.hasAttribute('data-yint') ? chartElement.getAttribute('data-yint') : null;
192
+ //let slope:any = chartElement.hasAttribute('data-slope') ? chartElement.getAttribute('data-slope') : null;
193
+ //let yInt:any = chartElement.hasAttribute('data-yint') ? chartElement.getAttribute('data-yint') : null;
197
194
 
198
- return {min,max,type,yaxis,targets,events,xaxis,increment,start,end,slope,yInt,guidelines};
195
+ return {min,max,yaxis,xaxis,guidelines};
199
196
  }
200
197
 
201
198
  function getLargestValue(chartElement:any,table:any){
@@ -252,7 +249,7 @@ const getValues = function(value:number,min:any,max:any,start?:number){
252
249
  // #endregion
253
250
 
254
251
  // #region SET functions - set data attributes and classes
255
- export const setCellData = function(chartElement:any,chartOuter:any,table:any){
252
+ export const setCellData = function(chartElement:any,table:any){
256
253
 
257
254
  Array.from(table.querySelectorAll('tbody tr')).forEach((tr:any) => {
258
255
 
@@ -274,7 +271,7 @@ export const setCellData = function(chartElement:any,chartOuter:any,table:any){
274
271
  tr.setAttribute('data-numeric',rowValue);
275
272
  });
276
273
 
277
- let {min, max} = getChartData(chartElement,chartOuter);
274
+ let {min, max} = getChartData(chartElement);
278
275
 
279
276
  Array.from(table.querySelectorAll('tbody tr')).forEach((tr:any, index) => {
280
277
 
@@ -299,19 +296,6 @@ export const setCellData = function(chartElement:any,chartOuter:any,table:any){
299
296
  td.setAttribute('data-label',table.querySelectorAll('thead th')[index].textContent);
300
297
  });
301
298
 
302
- /*
303
- if(tr.querySelector('[data-label="Total"]')){
304
- tr.setAttribute('data-total',tr.querySelector('[data-label="Total"][data-numeric]').getAttribute('data-numeric'));
305
- }
306
-
307
- if(tr.querySelector('[data-label="Min"]')){
308
- tr.setAttribute('data-min',tr.querySelector('[data-label="Min"][data-numeric]').getAttribute('data-numeric'));
309
- }
310
- if(tr.querySelector('[data-label="Max"]')){
311
- tr.setAttribute('data-max',tr.querySelector('[data-label="Max"][data-numeric]').getAttribute('data-numeric'));
312
- }
313
-
314
- */
315
299
 
316
300
  let rowMin = tr.hasAttribute('data-min') ? tr.getAttribute('data-min') : min;
317
301
  let rowMax = tr.hasAttribute('data-max') ? tr.getAttribute('data-max') : max;
@@ -437,20 +421,13 @@ function createChartKeyItem(chartID:string,index:number,text:Array<string>,chart
437
421
  return previousInput;
438
422
  }
439
423
 
440
- export const createChartGuidelines = function(chartElement:any,chartOuter:any,chartGuidelines:any){
424
+ export const createChartGuidelines = function(chartElement:any,chartGuidelines:any){
441
425
 
442
- let {min, max, yaxis, increment, guidelines} = getChartData(chartElement,chartOuter);
426
+ let {min, max, yaxis, guidelines} = getChartData(chartElement);
443
427
 
444
428
  if(!guidelines.length)
445
429
  guidelines = yaxis;
446
430
 
447
-
448
- if(increment == "days"){
449
-
450
- max = numberOfDays(min,max);
451
- min = 0;
452
- }
453
-
454
431
  chartGuidelines.innerHTML = '';
455
432
  for (var i = 0; i < guidelines.length; i++) {
456
433
 
@@ -463,56 +440,30 @@ export const createChartGuidelines = function(chartElement:any,chartOuter:any,ch
463
440
  }
464
441
  }
465
442
 
466
- export const createChartYaxis = function(chartElement:any,chartOuter:any,chartYaxis:any){
467
-
468
- let {min, max, yaxis, increment} = getChartData(chartElement,chartOuter);
469
-
470
- let startDay = min;
471
-
472
- if(increment == "days"){
473
-
474
- max = numberOfDays(min,max);
475
- min = 0;
476
- }
443
+ export const createChartYaxis = function(chartElement:any,chartYaxis:any){
477
444
 
445
+ let {min, max, yaxis} = getChartData(chartElement);
478
446
 
479
447
  chartYaxis.innerHTML = '';
480
448
  for (var i = 0; i < yaxis.length; i++) {
481
449
 
482
450
  let value = parseFloat(yaxis[i].replace('£','').replace('%',''));
483
451
 
484
- if(increment == "days"){
485
-
486
- value = numberOfDays(startDay,yaxis[i]);
487
-
488
- }
489
-
490
452
  let { axis } = getValues(value,min,max);
491
453
  chartYaxis.innerHTML += `<div class="axis__point" style="--percent:${axis}%;"><span>${yaxis[i]}</span></div>`;
492
454
  }
493
455
  }
494
456
 
495
- export const createXaxis = function(chartElement:any,chartOuter:any,xaxis:any){
457
+ export const createXaxis = function(chartOuter:any){
496
458
 
497
459
  const chart = chartOuter.querySelector('.chart');
498
460
  let chartXaxis = chartOuter.querySelector('.chart__xaxis');
499
461
 
500
- let {increment,start,end} = getChartData(chartElement,chartOuter);
501
-
502
462
  if(!chartXaxis){
503
463
  chartXaxis = document.createElement('div');
504
464
  chartXaxis.setAttribute('class','chart__xaxis');
505
465
  }
506
- if(increment && start && end){
507
- chartXaxis.innerHTML = '';
508
- for (var i = 0; i < xaxis.length; i++) {
509
466
 
510
- let value = parseFloat(xaxis[i].replace('£','').replace('%',''));
511
- let position = ((value - start)/(end - start)) * 100;
512
-
513
- chartXaxis.innerHTML += `<div class="axis__point" style="--percent:${position}%;"><span>${xaxis[i]}</span></div>`;
514
- }
515
- }
516
467
  chart.prepend(chartXaxis);
517
468
  }
518
469
 
@@ -1,6 +1,4 @@
1
1
  // @ts-nocheck
2
- import { createEmbed } from "./youtubevideo";
3
-
4
2
  const extendDialogs = (body) => {
5
3
 
6
4
  Array.from(body.querySelectorAll('dialog[open]')).forEach((dialog, index) => {
@@ -231,12 +229,6 @@ const extendDialogs = (body) => {
231
229
 
232
230
  export const createDialog = (dialog) => {
233
231
 
234
- // Create the video embed
235
- let videoButton = dialog.querySelector('.youtube-embed a');
236
- if (videoButton){
237
- createEmbed(videoButton)
238
- }
239
-
240
232
  // Multi dialog
241
233
  if(dialog.classList.contains('dialog--multi') && !dialog.querySelector(':scope > .steps')) {
242
234
  createMultiFormDialog(dialog);
@@ -758,7 +758,7 @@ export const filterTable = (table, form, wrapper) => {
758
758
  });
759
759
 
760
760
  // Work out what to display after pagination
761
- Array.from(table.querySelectorAll('tbody tr:not(.filtered')).forEach((row, index) => {
761
+ Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
762
762
 
763
763
  matched++;
764
764
 
@@ -0,0 +1,22 @@
1
+ // @ts-nocheck
2
+ // Modules
3
+ import * as helpers from '../js/modules/helpers'
4
+ import extendDialogs from '../js/modules/dialogs'
5
+ import createDataLayer from '../js/modules/data-layer'
6
+ import extendInputs from '../js/modules/inputs';
7
+ import createDynamicEvents from '../js/modules/dynamicEvents'
8
+
9
+ // Attach classes to dom elements
10
+ document.addEventListener("DOMContentLoaded", function() {
11
+
12
+ createDataLayer();
13
+ createDynamicEvents();
14
+
15
+ // Global stuff
16
+ helpers.addBodyClasses(document.body);
17
+ helpers.addGlobalEvents(document.body);
18
+
19
+ extendDialogs(document.body);
20
+ extendInputs(document.body);
21
+
22
+ });
@@ -0,0 +1,77 @@
1
+ // @ts-nocheck
2
+ import '@testing-library/jest-dom'
3
+ import {getChartData} from "../modules/chart.module";
4
+ import puppeteer from 'puppeteer';
5
+ import "expect-puppeteer";
6
+
7
+
8
+ import iamBarChart from "../components/barchart/barchart.component";
9
+
10
+ describe('The bar chart component', () => {
11
+
12
+ if (!window.customElements.get(`iam-barchart`))
13
+ window.customElements.define(`iam-barchart`, iamBarChart);
14
+
15
+ document.body.innerHTML = `
16
+ <iam-barchart>
17
+ <table>
18
+ <thead>
19
+ <tr>
20
+ <th>Items</th>
21
+ <th>Value</th>
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ <tr>
26
+ <td>Item 1</td>
27
+ <td>300</td>
28
+ </tr>
29
+ <tr>
30
+ <td>Item 2</td>
31
+ <td>150</td>
32
+ </tr>
33
+ <tr>
34
+ <td>Item 3</td>
35
+ <td>100</td>
36
+ </tr>
37
+ </tbody>
38
+ </table>
39
+ </iam-barchart>`;
40
+
41
+ test('should create the min attribute as 0', () => {
42
+
43
+ let component = document.querySelector('iam-barchart');
44
+ let {min} = getChartData(component);
45
+
46
+ expect(min).toEqual(0);
47
+ });
48
+
49
+ test('should equal the largest single value', () => {
50
+
51
+ let component = document.querySelector('iam-barchart');
52
+ let {max} = getChartData(component);
53
+
54
+ expect(max).toEqual(300);
55
+ });
56
+
57
+ test('should equal the largest single value', () => {
58
+
59
+ let component = document.querySelector('iam-barchart');
60
+ let {max} = getChartData(component);
61
+
62
+ expect(max).toEqual(300);
63
+ });
64
+
65
+ test('should have the class of .chart--fit-content added as there is less than 10 bars', () => {
66
+
67
+ let component = document.querySelector('iam-barchart');
68
+ expect(component.classList).toContain("chart--fit-content");
69
+ });
70
+
71
+ test('should have the class of .chart--no-scale added as there is less than 5 bars', () => {
72
+
73
+ let component = document.querySelector('iam-barchart');
74
+ expect(component.classList).toContain("chart--no-scale");
75
+ });
76
+
77
+ });
@@ -24,6 +24,6 @@ describe('addDataAttributes', () => {
24
24
  test('should add a class of d-none to each item except the one containing Lucas Myers', () => {
25
25
 
26
26
  expect(list.querySelectorAll('li:not(.d-none)').length).toEqual(1);
27
- expect(list.querySelector('li:not(.d-none').textContent).toEqual('Lucas Myers');
27
+ expect(list.querySelector('li:not(.d-none)').textContent).toEqual('Lucas Myers');
28
28
  });
29
29
  });