@iamproperty/components 5.0.0 → 5.1.0-beta10

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 (208) hide show
  1. package/assets/css/components/accordion.css +1 -1
  2. package/assets/css/components/accordion.css.map +1 -1
  3. package/assets/css/components/accordion.global.css +1 -0
  4. package/assets/css/components/accordion.global.css.map +1 -0
  5. package/assets/css/components/actionbar.css +1 -1
  6. package/assets/css/components/actionbar.css.map +1 -1
  7. package/assets/css/components/actionbar.global.css +1 -0
  8. package/assets/css/components/actionbar.global.css.map +1 -0
  9. package/assets/css/components/card.css +1 -1
  10. package/assets/css/components/card.css.map +1 -1
  11. package/assets/css/components/card.global.css +1 -0
  12. package/assets/css/components/card.global.css.map +1 -0
  13. package/assets/css/components/carousel.css +1 -1
  14. package/assets/css/components/carousel.css.map +1 -1
  15. package/assets/css/components/component.native.css +1 -0
  16. package/assets/css/components/component.native.css.map +1 -0
  17. package/assets/css/components/component.reset.css +1 -1
  18. package/assets/css/components/component.reset.css.map +1 -1
  19. package/assets/css/components/fileupload.css +1 -1
  20. package/assets/css/components/fileupload.css.map +1 -1
  21. package/assets/css/components/header.css +1 -1
  22. package/assets/css/components/header.css.map +1 -1
  23. package/assets/css/components/marketing.css +1 -0
  24. package/assets/css/components/marketing.css.map +1 -0
  25. package/assets/css/components/nav.css +1 -1
  26. package/assets/css/components/nav.css.map +1 -1
  27. package/assets/css/components/nav.global.css +1 -0
  28. package/assets/css/components/nav.global.css.map +1 -0
  29. package/assets/css/components/notification.global.css +1 -0
  30. package/assets/css/components/notification.global.css.map +1 -0
  31. package/assets/css/components/pagination.css +1 -1
  32. package/assets/css/components/pagination.css.map +1 -1
  33. package/assets/css/components/slider.css +1 -0
  34. package/assets/css/components/slider.css.map +1 -0
  35. package/assets/css/components/table.css +1 -1
  36. package/assets/css/components/table.css.map +1 -1
  37. package/assets/css/components/{table.extras.css → table.global.css} +1 -1
  38. package/assets/css/components/{table.extras.css.map → table.global.css.map} +1 -1
  39. package/assets/css/components/tabs.css +1 -1
  40. package/assets/css/components/tabs.css.map +1 -1
  41. package/assets/css/core.min.css +1 -1
  42. package/assets/css/core.min.css.map +1 -1
  43. package/assets/css/style.min.css +1 -1
  44. package/assets/css/style.min.css.map +1 -1
  45. package/assets/img/illustrations/add-new-property.png +0 -0
  46. package/assets/img/illustrations/auctioneer.png +0 -0
  47. package/assets/img/illustrations/branch.png +0 -0
  48. package/assets/img/illustrations/company-level.png +0 -0
  49. package/assets/img/illustrations/contractors.png +0 -0
  50. package/assets/img/illustrations/find-existing-property.png +0 -0
  51. package/assets/img/illustrations/green/add-new-property.png +0 -0
  52. package/assets/img/illustrations/green/auctioneer.png +0 -0
  53. package/assets/img/illustrations/green/branch.png +0 -0
  54. package/assets/img/illustrations/green/buyer.png +0 -0
  55. package/assets/img/illustrations/green/company-level.png +0 -0
  56. package/assets/img/illustrations/green/contractors.png +0 -0
  57. package/assets/img/illustrations/green/estate-agents.png +0 -0
  58. package/assets/img/illustrations/green/find-existing-property.png +0 -0
  59. package/assets/img/illustrations/green/landlords.png +0 -0
  60. package/assets/img/illustrations/green/seller.png +0 -0
  61. package/assets/img/illustrations/green/whats-new-2.png +0 -0
  62. package/assets/img/illustrations/green/whats-new.png +0 -0
  63. package/assets/img/illustrations/information-works.png +0 -0
  64. package/assets/img/illustrations/landlords.png +0 -0
  65. package/assets/img/illustrations/whats-new-2.png +0 -0
  66. package/assets/img/illustrations/whats-new.png +0 -0
  67. package/assets/img/signin-bg.png +0 -0
  68. package/assets/js/components/accordion/accordion.component.js +4 -0
  69. package/assets/js/components/accordion/accordion.component.min.js +6 -5
  70. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  71. package/assets/js/components/actionbar/actionbar.component.js +4 -0
  72. package/assets/js/components/actionbar/actionbar.component.min.js +5 -4
  73. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  74. package/assets/js/components/address-lookup/address-lookup.component.js +18 -4
  75. package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
  76. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  77. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  78. package/assets/js/components/card/card.component.js +6 -1
  79. package/assets/js/components/card/card.component.min.js +6 -4
  80. package/assets/js/components/card/card.component.min.js.map +1 -1
  81. package/assets/js/components/carousel/carousel.component.js +61 -0
  82. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  83. package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
  84. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  85. package/assets/js/components/header/header.component.js +6 -12
  86. package/assets/js/components/header/header.component.min.js +8 -14
  87. package/assets/js/components/header/header.component.min.js.map +1 -1
  88. package/assets/js/components/marketing/marketing.component.js +37 -0
  89. package/assets/js/components/nav/nav.component.js +8 -36
  90. package/assets/js/components/nav/nav.component.min.js +10 -12
  91. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  92. package/assets/js/components/notification/notification.component.js +4 -0
  93. package/assets/js/components/notification/notification.component.min.js +4 -3
  94. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  95. package/assets/js/components/pagination/pagination.component.min.js +2 -2
  96. package/assets/js/components/search/search.component.js +148 -0
  97. package/assets/js/components/search/search.component.min.js +14 -0
  98. package/assets/js/components/search/search.component.min.js.map +1 -0
  99. package/assets/js/components/slider/slider.component.js +143 -0
  100. package/assets/js/components/table/table.component.js +1 -1
  101. package/assets/js/components/table/table.component.min.js +6 -6
  102. package/assets/js/components/table/table.component.min.js.map +1 -1
  103. package/assets/js/components/tabs/tabs.component.js +2 -0
  104. package/assets/js/components/tabs/tabs.component.min.js +5 -3
  105. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  106. package/assets/js/dynamic.js +1 -1
  107. package/assets/js/dynamic.min.js +5 -5
  108. package/assets/js/dynamic.min.js.map +1 -1
  109. package/assets/js/modules/carousel.js +15 -23
  110. package/assets/js/modules/dynamicEvents.js +28 -13
  111. package/assets/js/modules/helpers.js +4 -1
  112. package/assets/js/modules/inputs.js +44 -3
  113. package/assets/js/modules/table.js +8 -6
  114. package/assets/js/modules/tabs.js +29 -31
  115. package/assets/js/scripts.bundle.js +31 -35
  116. package/assets/js/scripts.bundle.js.map +1 -1
  117. package/assets/js/scripts.bundle.min.js +2 -2
  118. package/assets/js/scripts.bundle.min.js.map +1 -1
  119. package/assets/js/tests/slider.spec.js +20 -0
  120. package/assets/sass/_components.scss +0 -6
  121. package/assets/sass/_corefiles.scss +9 -88
  122. package/assets/sass/_elements.scss +1 -2
  123. package/assets/sass/_functions/mixins.scss +16 -0
  124. package/assets/sass/_functions/utilities.scss +0 -17
  125. package/assets/sass/_functions/variables.scss +1 -0
  126. package/assets/sass/components/accordion.global.scss +135 -0
  127. package/assets/sass/components/accordion.scss +6 -192
  128. package/assets/sass/components/{actionbar-global.scss → actionbar.global.scss} +3 -1
  129. package/assets/sass/components/actionbar.scss +2 -2
  130. package/assets/sass/components/{card-global.scss → card.global.scss} +2 -23
  131. package/assets/sass/components/card.scss +44 -3
  132. package/assets/sass/components/carousel.scss +86 -159
  133. package/assets/sass/components/component.native.scss +120 -0
  134. package/assets/sass/components/component.reset.scss +1 -3
  135. package/assets/sass/components/fileupload.scss +1 -1
  136. package/assets/sass/components/header.scss +55 -52
  137. package/assets/sass/components/marketing.scss +64 -0
  138. package/assets/sass/components/{nav-global.scss → nav.global.scss} +2 -1
  139. package/assets/sass/components/nav.scss +7 -1
  140. package/assets/sass/components/notification.global.scss +41 -0
  141. package/assets/sass/components/pagination.scss +4 -0
  142. package/assets/sass/components/slider.scss +121 -0
  143. package/assets/sass/components/{table.extras.scss → table.global.scss} +5 -1
  144. package/assets/sass/components/table.scss +1 -1
  145. package/assets/sass/components/tabs.scss +2 -5
  146. package/assets/sass/core.scss +1 -2
  147. package/assets/sass/elements/admin-panel.scss +9 -7
  148. package/assets/sass/elements/badge.scss +29 -0
  149. package/assets/sass/elements/container.scss +17 -0
  150. package/assets/sass/elements/dialog.scss +4 -4
  151. package/assets/sass/elements/forms.scss +142 -14
  152. package/assets/sass/elements/links.scss +2 -1
  153. package/assets/sass/elements/table.element.scss +1 -2
  154. package/assets/sass/error.scss +1 -1
  155. package/assets/sass/foundations/reboot.scss +59 -12
  156. package/assets/sass/foundations/root.scss +11 -3
  157. package/assets/sass/helpers/max-height.scss +78 -4
  158. package/assets/sass/main.scss +0 -1
  159. package/assets/sass/templates/auth.scss +112 -0
  160. package/assets/sass/templates/form.scss +1 -0
  161. package/assets/ts/components/accordion/accordion.component.ts +5 -0
  162. package/assets/ts/components/actionbar/actionbar.component.ts +5 -0
  163. package/assets/ts/components/address-lookup/address-lookup.component.ts +24 -5
  164. package/assets/ts/components/card/card.component.ts +7 -1
  165. package/assets/ts/components/carousel/README.md +39 -0
  166. package/assets/ts/components/carousel/carousel.component.ts +75 -0
  167. package/assets/ts/components/header/header.component.ts +6 -12
  168. package/assets/ts/components/marketing/marketing.component.ts +49 -0
  169. package/assets/ts/components/nav/README.md +2 -13
  170. package/assets/ts/components/nav/nav.component.ts +9 -47
  171. package/assets/ts/components/notification/notification.component.ts +4 -0
  172. package/assets/ts/components/search/search.component.ts +177 -0
  173. package/assets/ts/components/slider/README.md +26 -0
  174. package/assets/ts/components/slider/slider.component.ts +189 -0
  175. package/assets/ts/components/table/table.component.ts +1 -1
  176. package/assets/ts/components/tabs/tabs.component.ts +2 -0
  177. package/assets/ts/dynamic.ts +1 -1
  178. package/assets/ts/modules/carousel.ts +21 -33
  179. package/assets/ts/modules/dynamicEvents.ts +44 -24
  180. package/assets/ts/modules/helpers.ts +8 -2
  181. package/assets/ts/modules/inputs.ts +61 -4
  182. package/assets/ts/modules/table.ts +11 -14
  183. package/assets/ts/modules/tabs.ts +38 -41
  184. package/assets/ts/tests/slider.spec.ts +33 -0
  185. package/dist/components.es.js +893 -1542
  186. package/dist/components.umd.js +328 -161
  187. package/dist/style.css +1 -1
  188. package/package.json +5 -4
  189. package/src/components/Accordion/Accordion.vue +12 -5
  190. package/src/components/Actionbar/Actionbar.vue +12 -5
  191. package/src/components/Card/Card.vue +1 -1
  192. package/src/components/Carousel/Carousel.vue +18 -103
  193. package/src/components/Header/Header.vue +10 -6
  194. package/src/components/Marketing/Marketing.vue +39 -0
  195. package/src/components/Marketing/README.md +20 -0
  196. package/src/components/Nav/Nav.vue +1 -1
  197. package/src/components/Nav/README.md +1 -12
  198. package/src/components/Search/Search.vue +25 -0
  199. package/src/components/Slider/README.md +11 -0
  200. package/src/components/Slider/Slider.vue +25 -0
  201. package/src/components/Tabs/Tabs.vue +14 -5
  202. package/assets/css/components/actionbar-global.css +0 -1
  203. package/assets/css/components/actionbar-global.css.map +0 -1
  204. package/assets/css/components/card-global.css +0 -1
  205. package/assets/css/components/card-global.css.map +0 -1
  206. package/assets/css/components/nav-global.css +0 -1
  207. package/assets/css/components/nav-global.css.map +0 -1
  208. package/src/components/Carousel/Carousel.spec.js +0 -45
@@ -37,9 +37,6 @@ import('../node_modules/@iamproperty/components/assets/js/components/nav/nav.com
37
37
 
38
38
  | Option | Type | Default Value | Description |
39
39
  | ------ | ---- | ------------- | ----------- |
40
- | data-search | String | - | Optional, displays a search button and form. The value passed through is used for the forms action attribute. |
41
- | data-list | String | - | Optional string with an ID of a datalist, note this list needs to be added as an element in the component |
42
- | data-prevent-search | String | - | Flag that prevents the search form submitting allowing it to used purely with JavaScript |
43
40
  | data-searcd-open | String | - | Flag that opens the search bar on desktop on page load. |
44
41
 
45
42
  **Slots**
@@ -51,18 +48,10 @@ import('../node_modules/@iamproperty/components/assets/js/components/nav/nav.com
51
48
  | secondary | - | Moves the link upto the top of the navbar on desktop |
52
49
  | actions | - | A place to add buttons |
53
50
  | dual | - | Plave the link or list to the right of the nav, forcing the default slot to the left. |
51
+ | search | - | A place to include a form with search functionality |
54
52
 
55
53
  **Class modifiers**
56
54
 
57
55
  - Adding a class of **.bg-primary** will change the background of the navbar without chaning the menu background.
58
56
  - Adding a class of **.nav--sticky** will add etxra styling to make the navbar stick to the top of the page
59
- - Adding a class of **.nav--xs-sticky** will add etxra styling to make the navbar stick to the top of the page BUT only on the mobile view.
60
-
61
- **Dispatched events**
62
-
63
- | Event | Dispatched when | Details passed|
64
- | ------ | ------------- | ----------- |
65
- | search-keydown | When a user uses the search input field and triggers the keydown event. | { search: $inputValue } |
66
- | search-keyup | When a user uses the search input field and triggers the keyup event. | { search: $inputValue } |
67
- | search-change | When a user uses the search input field and triggers the change event. | { search: $inputValue } |
68
- | search-submit | When a user uses the search form and triggers the submit event. | { search: $inputValue } |
57
+ - Adding a class of **.nav--xs-sticky** will add etxra styling to make the navbar stick to the top of the page BUT only on the mobile view.
@@ -16,6 +16,7 @@ class iamNav extends HTMLElement {
16
16
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
17
17
  const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
18
18
  const loadCSS = `@import "${assetLocation}/css/components/nav.css";`;
19
+ const loadExtraCSS = `@import "${assetLocation}/css/components/nav.global.css";`;
19
20
 
20
21
  const template = document.createElement('template');
21
22
  template.innerHTML = `
@@ -47,11 +48,14 @@ class iamNav extends HTMLElement {
47
48
  <slot name="menus"></slot>
48
49
  </div>
49
50
  </div>
50
- <div class="lists"></div>
51
51
  <div class="backdrop" part="backdrop"></div>
52
52
  `;
53
53
 
54
54
  shadowRoot.appendChild(template.content.cloneNode(true));
55
+
56
+ // insert extra CSS
57
+ if(!document.getElementById('navGlobal'))
58
+ document.head.insertAdjacentHTML('beforeend',`<style id="navGlobal">${loadExtraCSS}</style>`);
55
59
  }
56
60
 
57
61
  connectedCallback() {
@@ -280,7 +284,7 @@ class iamNav extends HTMLElement {
280
284
  });
281
285
 
282
286
  // Search
283
- if(this.hasAttribute('data-search')){
287
+ if(this.querySelector('[slot="search"]')){
284
288
  menu.classList.add('has-search');
285
289
  let searchWrapper = this.shadowRoot.querySelector('#search-wrapper');
286
290
 
@@ -288,24 +292,20 @@ class iamNav extends HTMLElement {
288
292
  searchWrapper.insertAdjacentHTML('afterbegin',`<button class="btn btn-secondary btn-compact fa-search me-0 mb-0" id="search-button" aria-controls="search-dialog">Open Search field</button>
289
293
  <dialog id="search-dialog">
290
294
  <div class="container">
291
- <form action="${this.hasAttribute('data-search') ? this.getAttribute('data-search') : ''}" class="row" id="search-form">
295
+ <div class="row">
292
296
  <div class="col mb-0 ms-auto col-md-7">
293
- <label for="search" class="visually-hidden">Search</label>
294
- <button class="suffix me-0 mb-0"><i class="fa-regular fa-search"></i></button>
295
- <input type="search" class="" id="search" name="search" required="" autocomplete="off" data-list="${this.hasAttribute('data-list') ? this.getAttribute('data-list') : ''}" />
297
+ <slot name="search"></slot>
296
298
  </div>
297
299
  <div class="col d-none d-md-block mw-fit-content ms-3">
298
300
  <button class="btn btn-compact btn-secondary fa-xmark-large m-0 mb-0" type="button" id="search-close">Close search field</button>
299
301
  </div>
300
- </form>
302
+ </div>
301
303
  </div>
302
304
  </dialog>`);
303
305
 
304
306
  let searchButton = this.shadowRoot.querySelector('#search-button');
305
307
  let searchClose = this.shadowRoot.querySelector('#search-close');
306
308
  let searchDialog = this.shadowRoot.querySelector('#search-dialog');
307
- let searchInput = this.shadowRoot.querySelector('#search');
308
- let searchForm = this.shadowRoot.querySelector('#search-form');
309
309
 
310
310
  if(this.hasAttribute('data-search-open')){
311
311
 
@@ -331,44 +331,6 @@ class iamNav extends HTMLElement {
331
331
  searchButton.removeAttribute('aria-expanded');
332
332
  });
333
333
 
334
- // Search events
335
- searchInput.addEventListener('keydown', (event) => {
336
-
337
- const keyupEvent = new CustomEvent("search-keydown", { detail: { search: searchInput.value } });
338
- this.dispatchEvent(keyupEvent);
339
- });
340
-
341
- searchInput.addEventListener('keyup', (event) => {
342
-
343
- if (searchInput.value.length >= 3 && searchInput.hasAttribute('data-list'))
344
- searchInput.setAttribute("list", searchInput.getAttribute('data-list'));
345
- else
346
- searchInput.removeAttribute("list");
347
-
348
- const keyupEvent = new CustomEvent("search-keyup", { detail: { search: searchInput.value } });
349
- this.dispatchEvent(keyupEvent);
350
- });
351
-
352
- searchInput.addEventListener('change', (event) => {
353
-
354
- const changeEvent = new CustomEvent("search-change", { detail: { search: searchInput.value } });
355
- this.dispatchEvent(changeEvent);
356
- });
357
-
358
- searchForm.addEventListener('submit', (event) => {
359
-
360
- if(this.hasAttribute('data-prevent-search'))
361
- event.preventDefault();
362
-
363
- const submitEvent = new CustomEvent("search-submit", { detail: { search: searchInput.value } });
364
- this.dispatchEvent(submitEvent);
365
- });
366
-
367
- // Make sure any child lists are available to the search input
368
- this.querySelectorAll('datalist').forEach((list) => {
369
-
370
- iamNav.shadowRoot.querySelector('.lists').insertAdjacentElement('beforeend',list);
371
- });
372
334
  }
373
335
  }
374
336
  }
@@ -17,6 +17,7 @@ class iamNotification extends HTMLElement {
17
17
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
18
18
  const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
19
19
  const loadCSS = `@import "${assetLocation}/css/components/notification.css";`;
20
+ const loadExtraCSS = `@import "${assetLocation}/css/components/notification.global.css";`;
20
21
 
21
22
  const buttons = this.querySelectorAll('a,button');
22
23
 
@@ -45,6 +46,9 @@ class iamNotification extends HTMLElement {
45
46
  `;
46
47
  this.shadowRoot.appendChild(template.content.cloneNode(true));
47
48
 
49
+ // insert extra CSS
50
+ if(!document.getElementById('notificationHolder'))
51
+ document.head.insertAdjacentHTML('beforeend',`<style id="notificationHolder">${loadExtraCSS}</style>`);
48
52
  }
49
53
 
50
54
  connectedCallback() {
@@ -0,0 +1,177 @@
1
+ // @ts-nocheck
2
+ import Cookies from 'js-cookie';
3
+ import { safeID, resolvePath, isTraversable } from '../../modules/helpers'
4
+
5
+ // Data layer Web component created
6
+ window.dataLayer = window.dataLayer || [];
7
+ window.dataLayer.push({
8
+ "event": "customElementRegistered",
9
+ "element": "Search"
10
+ });
11
+
12
+ class iamSearch extends HTMLElement {
13
+
14
+ constructor(){
15
+ super();
16
+ this.attachShadow({ mode: 'open'});
17
+
18
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets'
19
+ const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
20
+
21
+ const template = document.createElement('template');
22
+ template.innerHTML = `
23
+ <style>
24
+ @import "${coreCSS}";
25
+
26
+ </style>
27
+ <link rel="stylesheet" href="https://kit.fontawesome.com/26fdbf0179.css" crossorigin="anonymous" />
28
+ <slot></slot>
29
+ `;
30
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
31
+ }
32
+
33
+ async connectedCallback() {
34
+
35
+ const searchWrapper = this;
36
+ const inputField = this.querySelector('input');
37
+ const valueSchema = this.hasAttribute('data-value-schema') ? this.getAttribute('data-value-schema') : 'value';
38
+ const displaySchema = this.hasAttribute('data-display-schema') ? this.getAttribute('data-display-schema') : 'label';
39
+ const loopSchema = this.hasAttribute('data-schema') ? this.getAttribute('data-schema') : '';
40
+ let datalist = this.querySelector('datalist');
41
+ let searched = [];
42
+
43
+ // Clone original input field, re-name and use for display purposes
44
+ const displayInputField = inputField.cloneNode();
45
+ displayInputField.setAttribute('name',`${inputField.getAttribute('name')}Alt`);
46
+ inputField.removeAttribute('data-change-events');
47
+ displayInputField.removeAttribute('id');
48
+
49
+ inputField.after(displayInputField);
50
+
51
+ // Hide original input field
52
+ inputField.setAttribute('type','hidden');
53
+
54
+ // if data list does not exist then create one and append
55
+ if(!datalist){
56
+
57
+ datalist = document.createElement("datalist");
58
+ let listID = safeID('list');
59
+ datalist.setAttribute('id',listID);
60
+ searchWrapper.appendChild(datalist);
61
+
62
+ displayInputField.setAttribute('list',listID);
63
+ }
64
+
65
+ // on change update oringinal field with the actual value and use displayed input for the nice display text
66
+ displayInputField.addEventListener('change', (event) => {
67
+
68
+ let match = datalist.querySelector(`option[value="${displayInputField.value}"]`);
69
+
70
+ if(match){
71
+ inputField.value = match.getAttribute('data-value');
72
+ }
73
+ });
74
+
75
+ // Search the endpoint when 3 characters has been added
76
+ if(searchWrapper.hasAttribute('data-url')){
77
+
78
+ displayInputField.addEventListener('keyup', (event) => {
79
+
80
+ if(displayInputField.value.length == 3 && !searched.includes(displayInputField.value)){
81
+ search(displayInputField.value);
82
+ searched.push(displayInputField.value);
83
+ }
84
+ });
85
+
86
+ displayInputField.addEventListener('change', (event) => {
87
+
88
+ if(displayInputField.value.length >= 3 && !searched.includes(displayInputField.value.substring(0,3))){
89
+ search(displayInputField.value.substring(0,3));
90
+ searched.push(displayInputField.value.substring(0,3));
91
+ }
92
+ });
93
+ }
94
+
95
+ const search = async (searchterm) => {
96
+
97
+ let ajaxURL = searchWrapper.getAttribute('data-url');
98
+ ajaxURL += `${encodeURI(searchterm)}`;
99
+
100
+ // Setup controller vars if not already set
101
+ if(!window.controller)
102
+ window.controller = [];
103
+
104
+ // Abort if controller already present for this url
105
+ if(window.controller[ajaxURL])
106
+ window.controller[ajaxURL].abort();
107
+
108
+ // Create a new controller so it can be aborted if new fetch made
109
+ window.controller[ajaxURL] = new AbortController();
110
+ const { signal } = controller[ajaxURL];
111
+
112
+ try {
113
+ await fetch(ajaxURL, {
114
+ signal: signal,
115
+ method: 'get',
116
+ credentials: 'same-origin',
117
+ headers: new Headers({
118
+ 'Content-Type': 'application/json',
119
+ Accept: 'application/json',
120
+ 'X-Requested-With': 'XMLHttpRequest',
121
+ 'X-XSRF-TOKEN': Cookies.get('XSRF-TOKEN')
122
+ })
123
+ })
124
+ .then((response) => response.json()).then((response) => {
125
+
126
+ // populate datalist
127
+ let listString = '';
128
+ let loopValues = resolvePath(response, loopSchema, '');
129
+
130
+ if(isTraversable(loopValues) && typeof loopValues.forEach == 'function') {
131
+ loopValues.forEach((item, index) => {
132
+ let actualValue = resolvePath(item, valueSchema, '');
133
+ let displayValue = resolvePath(item, displaySchema, '').replace('\n',', ');
134
+
135
+ if(!datalist.querySelector(`option[data-value="${actualValue}"]`))
136
+ listString += `<option value="${displayValue}" data-value='${actualValue}'></option>`;
137
+ });
138
+ }
139
+ else if (typeof loopValues == 'object'){
140
+
141
+ for (const [key, value] of Object.entries(loopValues)) {
142
+
143
+ if(isTraversable(value) && typeof value.forEach == 'function') {
144
+ value.forEach((item, index) => {
145
+ let actualValue = resolvePath(item, valueSchema, '');
146
+ let displayValue = resolvePath(item, displaySchema, '').replace('\n',', ');
147
+
148
+ if(!datalist.querySelector(`option[data-value="${actualValue}"]`))
149
+ listString += `<option value="${key}: ${displayValue}" data-value='${actualValue}'></option>`;
150
+ });
151
+ }
152
+ }
153
+ }
154
+
155
+ datalist.innerHTML += listString;
156
+
157
+ return response;
158
+ });
159
+
160
+ } catch (error) {
161
+ console.log(error);
162
+ }
163
+ }
164
+
165
+ if(searchWrapper.hasAttribute('data-prevent-submit')){
166
+
167
+ const form = searchWrapper.closest('form');
168
+
169
+ form.addEventListener('submit', (e) => {
170
+
171
+ e.preventDefault();
172
+ });
173
+ }
174
+ }
175
+ }
176
+
177
+ export default iamSearch;
@@ -0,0 +1,26 @@
1
+ **Add the below to your initialise script**
2
+
3
+ ```
4
+ import('../node_modules/@iamproperty/components/assets/js/components/slider/slider.component.min').then(module => { // Might need to update the path
5
+
6
+ if (!window.customElements.get(`iam-slider`))
7
+ window.customElements.define(`iam-slider`, module.default);
8
+
9
+ }).catch((err) => {
10
+ console.log(err.message);
11
+ });
12
+ ```
13
+
14
+ **Add the below HTML code to where you want the component to live.**
15
+
16
+ ```
17
+ <label>Input field label <iam-slider><input type="number" name="percent" min="0" max="100" value="15" step="1" /></iam-slider></label>
18
+ ```
19
+
20
+ **Note**
21
+
22
+ The slider component is best put inside of a label and wrapped around an input field. The component is there to enhance the input field.
23
+
24
+ **Properties**
25
+
26
+ The properties of the slider are reflected by the attributes of the input field. So the min and max used to create the range are taken from the first input inside of the component.
@@ -0,0 +1,189 @@
1
+ // @ts-nocheck
2
+
3
+ // Data layer Web component created
4
+ window.dataLayer = window.dataLayer || [];
5
+ window.dataLayer.push({
6
+ "event": "customElementRegistered",
7
+ "element": "Slider"
8
+ });
9
+
10
+
11
+ class iamSlider extends HTMLElement {
12
+
13
+ constructor(){
14
+ super();
15
+ this.attachShadow({ mode: 'open'});
16
+
17
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets'
18
+ const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
19
+ const loadCSS = `@import "${assetLocation}/css/components/slider.css";`;
20
+
21
+ const template = document.createElement('template');
22
+ template.innerHTML = `
23
+ <style>
24
+ @import "${coreCSS}";
25
+ ${loadCSS}
26
+ </style>
27
+ <div class="row">
28
+ <div class="col min pe-2"></div>
29
+ <div class="col sliders">
30
+
31
+ </div>
32
+ <div class="col max ps-2"></div>
33
+ </div>
34
+ <div class="input__wrapper"><slot></slot><span>Minimum</span><span>Maximum</span></div>
35
+ `;
36
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
37
+ }
38
+
39
+ connectedCallback() {
40
+
41
+ const slider = this;
42
+ const minElement = this.shadowRoot.querySelector('.min');
43
+ const maxElement = this.shadowRoot.querySelector('.max');
44
+ const slidersHolder = this.shadowRoot.querySelector('.sliders')
45
+ let inputs = this.querySelectorAll('input');
46
+ const inputWrapper = this.shadowRoot.querySelector('.input__wrapper');
47
+ const label = this.closest('label');
48
+
49
+
50
+ let stepperInterval, stepperEvent = "mouseup", stepperStart = "mousedown";
51
+
52
+ if("ontouchstart" in document.documentElement) {
53
+ stepperEvent = "touchend";
54
+ stepperStart = "touchstart";
55
+ }
56
+
57
+ let stepperFunction = function(input, eventType) {
58
+
59
+ let value = input.value;
60
+
61
+ let min = slider.shadowRoot.querySelector('.is-first').getAttribute('min');
62
+ let max = slider.shadowRoot.querySelector('.is-last').getAttribute('max');
63
+
64
+ if (input.classList.contains('is-last') && !input.classList.contains('is-first')){
65
+
66
+ let percent = ((value/(max-min)) * 100);
67
+ slider.style.setProperty('--percent', percent + "%");
68
+
69
+ if(parseFloat(input.value) <= parseFloat(slider.shadowRoot.querySelector('.is-first').value)){
70
+
71
+ slider.shadowRoot.querySelector('.is-first').value = input.value;
72
+ slider.querySelector('.is-first').value = input.value;
73
+ slider.style.setProperty('--start-percent', percent + "%");
74
+ }
75
+ }
76
+ else if(input.classList.contains('is-first') && !input.classList.contains('is-last')){
77
+
78
+ let percent = ((value/(max-min)) * 100);
79
+ slider.style.setProperty('--start-percent', percent + "%");
80
+
81
+ if(parseFloat(input.value) >= parseFloat(slider.shadowRoot.querySelector('.is-last').value)){
82
+
83
+ slider.shadowRoot.querySelector('.is-last').value = input.value;
84
+ slider.querySelector('.is-last').value = input.value;
85
+ slider.style.setProperty('--percent', percent + "%");
86
+ }
87
+ }
88
+ else {
89
+
90
+ let percent = ((value/(max-min)) * 100).toFixed(2);
91
+ slider.style.setProperty('--percent', percent + "%");
92
+ }
93
+ };
94
+
95
+ // Create sliders
96
+ Array.from(inputs).forEach((input,index) => {
97
+
98
+ let rangeInput = input.cloneNode(true);
99
+ input.setAttribute('type','number');
100
+ rangeInput.setAttribute('type','range');
101
+
102
+ if(index == 0){
103
+ input.classList.add('is-first');
104
+ rangeInput.classList.add('is-first');
105
+
106
+ minElement.innerHTML = input.getAttribute('min');
107
+ maxElement.innerHTML = input.getAttribute('max');
108
+
109
+ slidersHolder.appendChild(rangeInput);
110
+ }
111
+
112
+ if(index == inputs.length-1){
113
+ input.classList.add('is-last');
114
+ rangeInput.classList.add('is-last');
115
+ slidersHolder.appendChild(rangeInput);
116
+ }
117
+
118
+ if(index > 1) {
119
+ input.remove();
120
+ }
121
+
122
+ });
123
+ inputs = this.querySelectorAll('input');
124
+ inputWrapper.setAttribute('data-elements',inputs.length);
125
+
126
+
127
+ const sliders = this.shadowRoot.querySelectorAll('input');
128
+
129
+ Array.from(inputs).forEach((input,index) => {
130
+
131
+ input.addEventListener('keyup',function(event){
132
+ sliders[index].value = input.value;
133
+ stepperFunction(sliders[index]);
134
+ });
135
+ input.addEventListener('keydown',function(event){
136
+ sliders[index].value = input.value;
137
+ stepperFunction(sliders[index]);
138
+ });
139
+
140
+ input.addEventListener('change',function(event){
141
+ sliders[index].value = input.value;
142
+ stepperFunction(sliders[index]);
143
+ });
144
+ });
145
+
146
+ Array.from(sliders).forEach((input,index) => {
147
+
148
+ stepperFunction(input,'start');
149
+
150
+ input.addEventListener(stepperStart,function(event){
151
+
152
+ clearInterval(stepperInterval);
153
+ stepperInterval = setInterval(function() {
154
+ stepperFunction(input,'drag');
155
+ inputs[index].value = input.value;
156
+ }, 10);
157
+ });
158
+
159
+ input.addEventListener(stepperEvent,function(event){
160
+ clearInterval(stepperInterval);
161
+ });
162
+
163
+ input.addEventListener('change',function(event){
164
+ clearInterval(stepperInterval);
165
+ stepperFunction(input,'click');
166
+ inputs[index].value = input.value;
167
+ });
168
+ });
169
+
170
+ // Move focus to slider when clicking on label
171
+ label.addEventListener('click',function(event) {
172
+
173
+ event.preventDefault();
174
+
175
+ if (this === event.target) {
176
+ /* click was on label */
177
+ slider.shadowRoot.querySelector('input').focus();
178
+
179
+ } else {
180
+ /* click was on input */
181
+ event.stopPropagation();
182
+ return false;
183
+ }
184
+ });
185
+
186
+ } // Connected callback
187
+ }
188
+
189
+ export default iamSlider;
@@ -8,7 +8,7 @@ class iamTable extends HTMLElement {
8
8
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
9
9
  const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
10
10
  const loadCSS = `@import "${assetLocation}/css/components/table.css";`;
11
- const loadExtraCSS = `@import "${assetLocation}/css/components/table.extras.css";`;
11
+ const loadExtraCSS = `@import "${assetLocation}/css/components/table.global.css";`;
12
12
 
13
13
  const template = document.createElement('template');
14
14
  template.innerHTML = `
@@ -16,11 +16,13 @@ class iamTabs extends HTMLElement {
16
16
 
17
17
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
18
18
  const coreCSS = document.body.hasAttribute('data-core-css') ? document.body.getAttribute('data-core-css') : `${assetLocation}/css/core.min.css`;
19
+ const loadCSS = `@import "${assetLocation}/css/components/tabs.css";`;
19
20
 
20
21
  const template = document.createElement('template');
21
22
  template.innerHTML = `
22
23
  <style>
23
24
  @import "${coreCSS}";
25
+ ${loadCSS}
24
26
 
25
27
  :host(.admin-panel){
26
28
  display: contents!important;
@@ -14,7 +14,7 @@ import youtubeVideo from '../js/modules/youtubevideo'
14
14
 
15
15
  import iamNotification from './components/notification/notification.component'
16
16
 
17
- const components = ['accordion','header','tabs', 'table','card','pagination','filterlist', 'applied-filters'];
17
+ const components = ['accordion','header','tabs', 'table','card','pagination','filterlist', 'applied-filters', 'nav', 'marketing'];
18
18
  const prefix = "iam"
19
19
  const options = {
20
20
  rootMargin: '50px',