@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
@@ -1,33 +1,32 @@
1
1
  // @ts-nocheck
2
- function carousel(carouselElement) {
2
+ function carousel(carouselElement, row) {
3
3
 
4
4
  var scrollTimeout;
5
5
 
6
6
  let carouselInner = carouselElement.querySelector('.carousel__inner');
7
- let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
8
- let cols = carouselElement.getAttribute('data-cols');
9
- let smCols = carouselElement.getAttribute('data-sm-cols');
10
- let mdCols = carouselElement.getAttribute('data-md-cols');
11
-
12
- carouselElement.querySelector('.carousel__controls a').setAttribute('aria-current', true);
7
+ let carouselControls = carouselElement.querySelector('.carousel__controls');
8
+ let itemCount = row.querySelectorAll('.col').length;
13
9
 
14
10
  // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
15
11
  carouselInner.addEventListener('scroll', function(e){
16
12
  clearTimeout(scrollTimeout);
17
- scrollTimeout = setTimeout(function(){
13
+ scrollTimeout = setTimeout(function(){
18
14
 
19
15
  let scrollArea = carouselInner.clientWidth;
20
16
  let scrollWidth = carouselInner.scrollWidth;
21
17
  let scrollLeft = carouselInner.scrollLeft;
22
18
  let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
23
- let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
19
+ let lastItemOffset = row.querySelector('.col:last-child').offsetLeft + 50;
20
+
21
+ if(carouselInner.scrollLeft + scrollArea >= lastItemOffset)
22
+ targetSlide = itemCount;
24
23
 
25
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
26
- link.removeAttribute('aria-current');
24
+ Array.from(carouselElement.querySelectorAll('.carousel__controls button')).forEach((button, index) => {
25
+ button.removeAttribute('aria-current');
27
26
  });
28
27
 
29
28
  carouselElement.querySelector('.control-'+targetSlide).setAttribute('aria-current', true);
30
-
29
+
31
30
  // Disable the previous button
32
31
  if(targetSlide == 1)
33
32
  carouselElement.querySelector('.btn-prev').setAttribute('disabled','disabled');
@@ -35,29 +34,29 @@ function carousel(carouselElement) {
35
34
  carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
36
35
 
37
36
  // Disable the next button if the last item is in view
38
- if(carouselInner.scrollLeft + scrollArea > lastItemOffset)
37
+ if(targetSlide == itemCount)
39
38
  carouselElement.querySelector('.btn-next').setAttribute('disabled','disabled');
40
39
  else
41
40
  carouselElement.querySelector('.btn-next').removeAttribute('disabled');
42
-
41
+
43
42
  }, 100);
44
43
 
45
44
  }, false);
46
45
 
47
46
  // when the buttons are used we need to make sure the carousel scrolls to the correct place
48
- carouselElement.addEventListener('click', function(e){
47
+ carouselControls.addEventListener('click', function(e){
49
48
 
50
49
  for (var target = e.target; target && target != this; target = target.parentNode) {
51
- if (target.matches('.carousel__controls a')) {
50
+ if (typeof target.matches == "function" && target.matches('button')) {
52
51
 
53
52
  e.preventDefault();
54
53
 
55
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
56
- link.removeAttribute('aria-current');
54
+ Array.from(carouselControls.querySelectorAll('button')).forEach((button, index) => {
55
+ button.removeAttribute('aria-current');
57
56
  });
58
57
  target.setAttribute('aria-current', true);
59
-
60
- const el = document.querySelector(target.getAttribute('href'));
58
+
59
+ const el = row.querySelector(`*:nth-child(${target.getAttribute('data-slide')})`);
61
60
 
62
61
  carouselInner.scroll({
63
62
  top: 0,
@@ -69,11 +68,11 @@ function carousel(carouselElement) {
69
68
  }
70
69
  }
71
70
  }, false);
72
-
71
+
73
72
  carouselElement.addEventListener('click', function(e){
74
73
 
75
74
  for (var target = e.target; target && target != this; target = target.parentNode) {
76
- if (target.matches('.btn-next, .btn-prev')) {
75
+ if (typeof target.matches == "function" && target.matches('.btn-next, .btn-prev')) {
77
76
 
78
77
  e.preventDefault();
79
78
  let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
@@ -87,17 +86,6 @@ function carousel(carouselElement) {
87
86
  }
88
87
  }
89
88
  }, false);
90
-
91
-
92
- // Add responsive hide button classes
93
- if(itemCount == 1)
94
- carouselElement.classList.add('hide-btns');
95
-
96
- if(smCols >= itemCount)
97
- carouselElement.classList.add('hide-sm-btns');
98
-
99
- if(mdCols >= itemCount)
100
- carouselElement.classList.add('hide-md-btns');
101
89
  }
102
90
 
103
91
  export default carousel
@@ -77,43 +77,63 @@ const runEvent = (element,event,eventType) => {
77
77
  switch (event[eventType]){
78
78
  case "hide":
79
79
 
80
- let hideElement = document.querySelector(event['target'])
81
- hideElement.classList.add('js-hide');
82
-
83
- Array.from(hideElement.querySelectorAll('[data-required]')).forEach((input, index) => {
84
-
85
- input.removeAttribute('required');
86
- });
80
+ if(document.querySelector(event['target'])){
81
+
82
+ let hideElement = document.querySelector(event['target']);
83
+ hideElement.classList.add('js-hide');
84
+
85
+ Array.from(hideElement.querySelectorAll('[data-required]')).forEach((input, index) => {
86
+
87
+ input.removeAttribute('required');
88
+ });
89
+ }
87
90
  break;
88
91
  case "show":
89
92
 
90
- let showElement = document.querySelector(event['target'])
91
- showElement.classList.remove('js-hide');
92
-
93
- Array.from(showElement.querySelectorAll('[data-required]')).forEach((input, index) => {
94
-
95
- if(!input.closest('.js-hide'))
96
- input.setAttribute('required','true');
97
- });
93
+ if(document.querySelector(event['target'])){
94
+
95
+ let showElement = document.querySelector(event['target']);
96
+ showElement.classList.remove('js-hide');
97
+
98
+ Array.from(showElement.querySelectorAll('[data-required]')).forEach((input, index) => {
99
+
100
+ if(!input.closest('.js-hide'))
101
+ input.setAttribute('required','true');
102
+ });
103
+ }
104
+ break;
105
+ case "populate-form":
106
+ populateForm(element,event);
107
+ break;
108
+ case "dispatchEvent":
109
+ let theEvent = new Event(event['value']);
110
+ document.querySelector(`${event['target']}`).dispatchEvent(theEvent);
98
111
  break;
99
- case "populate-form":
100
- populateForm(element,event);
101
- break;
102
- case "dispatchEvent":
103
- let theEvent = new Event(event['value']);
104
- document.querySelector(`${event['target']}`).dispatchEvent(theEvent);
105
- break;
106
112
  case "setAttribute":
107
- document.querySelector(`${event['target']}`).setAttribute(event['attribute'],event['value']);
113
+
114
+ Array.from(document.querySelectorAll(`${event['target']}`)).forEach(function(element,index){
115
+ element.setAttribute(event['attribute'],event['value']);
116
+ });
108
117
  break;
109
118
  case "removeAttribute":
110
- document.querySelector(`${event['target']}`).removeAttribute(event['attribute']);
119
+ Array.from(document.querySelectorAll(`${event['target']}`)).forEach(function(element,index){
120
+ element.removeAttribute(event['attribute']);
121
+ });
111
122
  break;
112
123
  case "updateValue":
113
124
  document.querySelector(`${event['target']}`).value = event['value'] ? event['value'] : "";
114
125
 
115
126
  let changeEvent = new Event('change');
116
127
  document.querySelector(`${event['target']}`).dispatchEvent(changeEvent);
128
+ break;
129
+ case "submitForm":
130
+ document.querySelector(`${event['target']}`).submit();
131
+ break;
132
+ case "openLink":
133
+
134
+ if(document.querySelector(`${event['target']}`).value)
135
+ window.location.href = document.querySelector(`${event['target']}`).value;
136
+
117
137
  break;
118
138
  default:
119
139
  break;
@@ -47,7 +47,7 @@ export const addGlobalEvents = (body) => {
47
47
 
48
48
  addEventListener("popstate", (event) => {
49
49
 
50
- if(event && event.state.type && event.state.type == "pagination"){
50
+ if(event && event.state && event.state.type && event.state.type == "pagination"){
51
51
  let form = document.querySelector(`#${event.state.form}`);
52
52
  let pageInput = document.querySelector(`#${event.state.form} [data-pagination]`);
53
53
 
@@ -97,4 +97,10 @@ export const safeID = function(str){
97
97
  str = str.replace(/\W/g,'');
98
98
 
99
99
  return str;
100
- }
100
+ }
101
+
102
+ // Used to get values from nested json objects
103
+ export const resolvePath = (object, path, defaultValue) => path.split(/[\.\[\]\'\"]/).filter(p => p).reduce((o, p) => o ? o[p] : defaultValue, object);
104
+
105
+
106
+ export const isTraversable = o => Array.isArray(o) || o !== null && ['function', 'object'].includes(typeof o);
@@ -1,14 +1,71 @@
1
1
  // @ts-nocheck
2
2
  const extendInputs = (body) => {
3
3
 
4
- document.addEventListener("load", function() {
5
-
4
+ function loadInput(){
6
5
  // maxlength counter init
7
- Array.from(document.querySelectorAll('input')).forEach((input,index) => {
6
+ Array.from(document.querySelectorAll('input[maxlength]')).forEach((input,index) => {
8
7
  let wrapper = input.parentElement;
9
8
  setMaxlengthVars(input,wrapper);
10
9
  });
11
- });
10
+
11
+ // Date restrictions
12
+ if(document.querySelector('input[type="date"]')){
13
+
14
+ const today = new Date();
15
+
16
+ function formatDate(date) {
17
+ const year = date.getFullYear();
18
+ const month = String(date.getMonth() + 1).padStart(2, '0');
19
+ const day = String(date.getDate()).padStart(2, '0');
20
+ return `${year}-${month}-${day}`;
21
+ }
22
+
23
+ Array.from(document.querySelectorAll('input[type="date"]')).forEach((input,index) => {
24
+
25
+ let startDate = today;
26
+
27
+ if(input.hasAttribute('data-start')){
28
+
29
+ startDate.setDate(startDate.getDate() + parseInt(input.getAttribute('data-start')));
30
+ input.setAttribute('min', formatDate(startDate));
31
+ }
32
+
33
+ if(input.hasAttribute('data-period')){
34
+
35
+ let timePeriod = parseInt(input.getAttribute('data-period'));
36
+
37
+ let endDate = new Date();
38
+ endDate.setDate(startDate.getDate() + timePeriod);
39
+
40
+ input.setAttribute('max', formatDate(endDate));
41
+ }
42
+
43
+ if(input.hasAttribute('data-allowed-days')){
44
+
45
+ let allowedDays = JSON.parse(`[${input.getAttribute('data-allowed-days')}]`);
46
+
47
+ input.addEventListener('input', function(e){
48
+ var day = new Date(this.value).getUTCDay();
49
+
50
+ if(allowedDays.includes(day))
51
+ input.setCustomValidity("");
52
+ else
53
+ input.setCustomValidity("That day of the week is not allowed");
54
+ });
55
+ }
56
+ });
57
+ }
58
+ }
59
+
60
+ if(document.readyState === 'complete') {
61
+ loadInput();
62
+ }
63
+
64
+ document.onreadystatechange = () => {
65
+ if (document.readyState === "complete") {
66
+ loadInput();
67
+ }
68
+ };
12
69
 
13
70
  body.addEventListener('input', (event) => {
14
71
  if (event && event.target instanceof HTMLElement && event.target.closest('input,textarea,select')){
@@ -1,5 +1,5 @@
1
1
  // @ts-nocheck
2
- import { zeroPad, isNumeric, ucfirst } from "./helpers";
2
+ import { zeroPad, isNumeric, ucfirst, resolvePath } from "./helpers";
3
3
 
4
4
  // Basic functionality needed
5
5
  export const addDataAttributes = (table) => {
@@ -61,20 +61,20 @@ export const getLargestLastColWidth = (table) => {
61
61
 
62
62
  export const createMobileButton = (table, wrapper) => {
63
63
 
64
-
65
- if(wrapper.classList.contains('.table--fullwidth') && !wrapper.hasAttribute('data-expandable'))
64
+ if(wrapper.classList.contains('table--fullwidth') && !wrapper.hasAttribute('data-expandable'))
66
65
  return false;
67
66
 
68
67
  if(table.querySelectorAll('thead tr th').length < 4 && !wrapper.hasAttribute('data-expandable'))
69
68
  return false;
70
69
 
71
-
70
+ //If the expand column already exists we don't need to add a new one.
72
71
  Array.from(table.querySelectorAll('thead tr')).forEach((row,index) => {
73
-
74
- row.insertAdjacentHTML(
75
- 'afterbegin',
76
- `<th class="th--fixed expand-button-heading"></th>`
77
- );
72
+ if(!table.querySelectorAll('thead tr th.expand-button-heading').length){
73
+ row.insertAdjacentHTML(
74
+ 'afterbegin',
75
+ `<th class="th--fixed expand-button-heading"></th>`
76
+ );
77
+ }
78
78
  });
79
79
 
80
80
  Array.from(table.querySelectorAll('tbody tr')).forEach((row,index) => {
@@ -690,7 +690,7 @@ export const populateDataQueries = (table,form,wrapper) => {
690
690
  dataQueries.forEach((queryElement, index) => {
691
691
 
692
692
  let query = queryElement.getAttribute('data-query');
693
- let numberOfMatchedRows: 0;
693
+ let numberOfMatchedRows = 0;
694
694
 
695
695
  if(query == 'total'){
696
696
  if(wrapper.hasAttribute('data-total'))
@@ -903,11 +903,9 @@ const filterFilters = function(form){
903
903
 
904
904
  export const loadAjaxTable = async function (table, form, pagination, wrapper){
905
905
 
906
- const resolvePath = (object, path, defaultValue) => path.split(/[\.\[\]\'\"]/).filter(p => p).reduce((o, p) => o ? o[p] : defaultValue, object);
907
-
908
906
  let formData = new FormData(form);
909
907
  let queryString = new URLSearchParams(formData).toString();
910
- let columns = table.querySelectorAll('thead tr th');
908
+ let columns = table.querySelectorAll('thead tr th:not(.expand-button-heading)');
911
909
  let tbody = table.querySelector('tbody');
912
910
  let ajaxURL = form.getAttribute('data-ajax');
913
911
 
@@ -985,7 +983,6 @@ export const loadAjaxTable = async function (table, form, pagination, wrapper){
985
983
  var table_row = document.createElement('tr');
986
984
 
987
985
  columns.forEach((col, index) => {
988
-
989
986
  let cellOutput = '';
990
987
  var table_cell = document.createElement('td');
991
988
  // Add some data to help with the mobile layout design
@@ -2,6 +2,7 @@
2
2
  export const createTabsLinks = function(tabsElement: Element) {
3
3
 
4
4
  const details = tabsElement.querySelectorAll(':scope > details');
5
+ const detailsORLinks = tabsElement.querySelectorAll(':scope > details, :scope > a');
5
6
  let summaries = tabsElement.querySelectorAll(':scope > details > summary');
6
7
  let tabLinks = tabsElement.querySelector(':scope > .tabs__links');
7
8
 
@@ -20,33 +21,41 @@ export const createTabsLinks = function(tabsElement: Element) {
20
21
  }
21
22
 
22
23
  // Create the tab buttons from the summary titles
23
- details.forEach((detail, index) => {
24
+ let tabindex = 0;
25
+ detailsORLinks.forEach((element, index) => {
26
+
27
+ let button = document.createElement('button');
24
28
 
25
- let summary = detail.querySelector(':scope > summary');
26
- let isDisabled = summary.classList.contains('disabled')
29
+ if(element.matches('details')){
27
30
 
28
- summary.classList.add('visually-hidden');
29
-
30
- let button = document.createElement('button');
31
+ let summary = element.querySelector(':scope > summary');
32
+ let isDisabled = summary.classList.contains('disabled')
31
33
 
32
- if (detail.hasAttribute('id')) {
33
- button = document.createElement('a');
34
- button.setAttribute('href',`#${detail.getAttribute('id')}`);
35
- }
34
+ summary.classList.add('visually-hidden');
35
+
36
+ if (element.hasAttribute('id'))
37
+ button.setAttribute('data-id',`${element.getAttribute('id')}`);
36
38
 
37
- if (detail.hasAttribute('open')) {
38
- button.setAttribute('aria-pressed',true);
39
+ if (element.hasAttribute('open')) {
40
+ button.setAttribute('aria-pressed',true);
41
+ }
42
+ button.innerHTML = `${summary.innerText}`;
43
+ button.classList.add('link');
44
+ button.setAttribute('data-index',tabindex);
45
+ element.setAttribute('tabindex','-1');
46
+
47
+ if (isDisabled) {
48
+ button.classList.add('disabled')
49
+ }
50
+
51
+ tabindex++;
39
52
  }
40
-
41
- button.innerHTML = `${summary.innerText}`;
42
- button.classList.add('link');
43
- button.setAttribute('data-index',index);
44
- button.setAttribute('tabindex','-1');
53
+ else if(element.matches('a')){
45
54
 
46
- if (isDisabled) {
47
- button.classList.add('disabled')
55
+ button = element;
48
56
  }
49
57
 
58
+ button.classList.add('link');
50
59
  tabLinks.appendChild(button);
51
60
  });
52
61
 
@@ -56,10 +65,10 @@ export const setTabsEventHandlers = function(tabsElement: Element){
56
65
 
57
66
  let details = tabsElement.querySelectorAll(':scope > details');
58
67
  let summaries = tabsElement.querySelectorAll(':scope > details > summary');
59
- let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
68
+ let buttons = tabsElement.querySelectorAll(':scope .tabs__links > button');
60
69
 
61
70
  if(tabsElement.shadowRoot)
62
- buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > .link');
71
+ buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button');
63
72
 
64
73
  // Set the on click for the tab buttons, these will open the details box it matches too
65
74
  buttons.forEach((button) => {
@@ -83,9 +92,6 @@ export const setTabsEventHandlers = function(tabsElement: Element){
83
92
  else
84
93
  detail.removeAttribute('open')
85
94
  });
86
-
87
- if(button.hasAttribute('href'))
88
- history.pushState(undefined, undefined, button.getAttribute('href'));
89
95
 
90
96
  // Data layer Open Event
91
97
  window.dataLayer = window.dataLayer || [];
@@ -99,18 +105,8 @@ export const setTabsEventHandlers = function(tabsElement: Element){
99
105
 
100
106
  // Make sure we dont loose existing summary functionality
101
107
  summaries.forEach((summary, index) => {
102
-
103
- // Maintain the focus on the summary element but visually highlight the tab button
104
- summary.addEventListener("focus", (e) => {
105
- buttons.forEach((button) => {
106
-
107
- button.classList.remove('focus');
108
- });
109
-
110
- buttons[index].classList.add('focus');
111
- });
112
-
113
108
  summary.addEventListener("click", (e) => {
109
+
114
110
  e.preventDefault();
115
111
  buttons[index].click();
116
112
  });
@@ -120,15 +116,16 @@ export const setTabsEventHandlers = function(tabsElement: Element){
120
116
 
121
117
  export const openFirstTab = function(tabsElement: Element){
122
118
 
119
+ if(!tabsElement.querySelector(':scope > details'))
120
+ return false;
121
+
123
122
  let details = tabsElement.querySelectorAll(':scope > details');
124
- let buttons = tabsElement.querySelectorAll(':scope > .tabs__links > button, .tabs__links > a');
123
+ let buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button');
125
124
 
126
- if(tabsElement.shadowRoot)
127
- buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button, .tabs__links > a');
128
125
 
129
- if(location.hash && tabsElement.querySelector(`.tabs__links [href="${location.hash}"]`)){
130
-
131
- tabsElement.querySelector(`[href="${location.hash}"]`).setAttribute('open',true);
126
+ if(location.hash && tabsElement.shadowRoot.querySelector(`.tabs__links [data-id="${location.hash.replace('#','')}"]`)){
127
+
128
+ tabsElement.shadowRoot.querySelector(`[data-id="${location.hash.replace('#','')}"]`).setAttribute('aria-pressed',true);
132
129
  tabsElement.querySelector(`details[id="${location.hash.replace('#','')}"]`).setAttribute('open',true);
133
130
  }
134
131
  else if(!tabsElement.querySelector(`details[open]`)) {
@@ -0,0 +1,33 @@
1
+ // @ts-nocheck
2
+ import '@testing-library/jest-dom'
3
+ import * as tableModule from "../modules/table";
4
+ import puppeteer from 'puppeteer';
5
+ import "expect-puppeteer";
6
+
7
+
8
+ import iamSlider from "../components/slider/slider.component";
9
+
10
+ describe('The slider component', () => {
11
+
12
+ if (!window.customElements.get(`iam-slider`))
13
+ window.customElements.define(`iam-slider`, iamSlider);
14
+
15
+ test('should always show the minimum and maximum values that it can be set', () => {
16
+
17
+ document.body.innerHTML = `<label>Input field label <iam-slider><input type="number" name="percent" min="0" max="100" value="15" step="1" /></iam-slider></label>`;
18
+ let component = document.querySelector('iam-slider');
19
+
20
+ expect(component.shadowRoot.innerHTML).toContain('<div class="col min pe-2">0</div>')
21
+ expect(component.shadowRoot.innerHTML).toContain('<div class="col max ps-2">100</div>')
22
+ });
23
+
24
+ test('should always have a secondary way of inputing the value i.e. a number input field', () => {
25
+
26
+ document.body.innerHTML = `<label>Input field label <iam-slider><input type="number" name="percent" min="0" max="100" value="15" step="1" /></iam-slider></label>`;
27
+ let component = document.querySelector('iam-slider');
28
+
29
+ expect(component.querySelectorAll('input[type="number"]').length).toEqual(1)
30
+ expect(component.shadowRoot.querySelectorAll('input[type="range"]').length).toEqual(1)
31
+ });
32
+
33
+ });