@iamproperty/components 5.0.0 → 5.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 (153) 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/component.native.css +1 -0
  14. package/assets/css/components/component.native.css.map +1 -0
  15. package/assets/css/components/component.reset.css +1 -1
  16. package/assets/css/components/component.reset.css.map +1 -1
  17. package/assets/css/components/header.css +1 -1
  18. package/assets/css/components/header.css.map +1 -1
  19. package/assets/css/components/{nav-global.css → nav.global.css} +1 -1
  20. package/assets/css/components/{nav-global.css.map → nav.global.css.map} +1 -1
  21. package/assets/css/components/notification.global.css +1 -0
  22. package/assets/css/components/notification.global.css.map +1 -0
  23. package/assets/css/components/slider.css +1 -0
  24. package/assets/css/components/slider.css.map +1 -0
  25. package/assets/css/components/table.css +1 -1
  26. package/assets/css/components/table.css.map +1 -1
  27. package/assets/css/components/{table.extras.css → table.global.css} +1 -1
  28. package/assets/css/components/{table.extras.css.map → table.global.css.map} +1 -1
  29. package/assets/css/components/tabs.css +1 -1
  30. package/assets/css/components/tabs.css.map +1 -1
  31. package/assets/css/core.min.css +1 -1
  32. package/assets/css/core.min.css.map +1 -1
  33. package/assets/css/style.min.css +1 -1
  34. package/assets/css/style.min.css.map +1 -1
  35. package/assets/img/illustrations/add-new-property.png +0 -0
  36. package/assets/img/illustrations/auctioneer.png +0 -0
  37. package/assets/img/illustrations/branch.png +0 -0
  38. package/assets/img/illustrations/company-level.png +0 -0
  39. package/assets/img/illustrations/contractors.png +0 -0
  40. package/assets/img/illustrations/find-existing-property.png +0 -0
  41. package/assets/img/illustrations/green/add-new-property.png +0 -0
  42. package/assets/img/illustrations/green/auctioneer.png +0 -0
  43. package/assets/img/illustrations/green/branch.png +0 -0
  44. package/assets/img/illustrations/green/buyer.png +0 -0
  45. package/assets/img/illustrations/green/company-level.png +0 -0
  46. package/assets/img/illustrations/green/contractors.png +0 -0
  47. package/assets/img/illustrations/green/estate-agents.png +0 -0
  48. package/assets/img/illustrations/green/find-existing-property.png +0 -0
  49. package/assets/img/illustrations/green/landlords.png +0 -0
  50. package/assets/img/illustrations/green/seller.png +0 -0
  51. package/assets/img/illustrations/green/whats-new-2.png +0 -0
  52. package/assets/img/illustrations/green/whats-new.png +0 -0
  53. package/assets/img/illustrations/information-works.png +0 -0
  54. package/assets/img/illustrations/landlords.png +0 -0
  55. package/assets/img/illustrations/whats-new-2.png +0 -0
  56. package/assets/img/illustrations/whats-new.png +0 -0
  57. package/assets/js/components/accordion/accordion.component.js +4 -0
  58. package/assets/js/components/accordion/accordion.component.min.js +6 -5
  59. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  60. package/assets/js/components/actionbar/actionbar.component.js +4 -0
  61. package/assets/js/components/actionbar/actionbar.component.min.js +5 -4
  62. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  63. package/assets/js/components/address-lookup/address-lookup.component.js +1 -1
  64. package/assets/js/components/address-lookup/address-lookup.component.min.js +2 -2
  65. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  66. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  67. package/assets/js/components/card/card.component.js +4 -0
  68. package/assets/js/components/card/card.component.min.js +4 -3
  69. package/assets/js/components/card/card.component.min.js.map +1 -1
  70. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  71. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  72. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  73. package/assets/js/components/header/header.component.min.js +2 -2
  74. package/assets/js/components/nav/nav.component.js +4 -0
  75. package/assets/js/components/nav/nav.component.min.js +4 -3
  76. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  77. package/assets/js/components/notification/notification.component.js +4 -0
  78. package/assets/js/components/notification/notification.component.min.js +4 -3
  79. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  80. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  81. package/assets/js/components/slider/slider.component.js +143 -0
  82. package/assets/js/components/table/table.component.js +1 -1
  83. package/assets/js/components/table/table.component.min.js +3 -3
  84. package/assets/js/components/table/table.component.min.js.map +1 -1
  85. package/assets/js/components/tabs/tabs.component.js +2 -0
  86. package/assets/js/components/tabs/tabs.component.min.js +5 -3
  87. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  88. package/assets/js/dynamic.min.js +5 -5
  89. package/assets/js/dynamic.min.js.map +1 -1
  90. package/assets/js/modules/helpers.js +1 -1
  91. package/assets/js/modules/inputs.js +44 -3
  92. package/assets/js/modules/tabs.js +29 -31
  93. package/assets/js/scripts.bundle.js +24 -23
  94. package/assets/js/scripts.bundle.js.map +1 -1
  95. package/assets/js/scripts.bundle.min.js +2 -2
  96. package/assets/js/scripts.bundle.min.js.map +1 -1
  97. package/assets/js/tests/slider.spec.js +20 -0
  98. package/assets/sass/_components.scss +0 -6
  99. package/assets/sass/_corefiles.scss +8 -88
  100. package/assets/sass/_elements.scss +0 -1
  101. package/assets/sass/components/accordion.global.scss +135 -0
  102. package/assets/sass/components/accordion.scss +6 -192
  103. package/assets/sass/components/{actionbar-global.scss → actionbar.global.scss} +3 -1
  104. package/assets/sass/components/actionbar.scss +2 -2
  105. package/assets/sass/components/{card-global.scss → card.global.scss} +2 -23
  106. package/assets/sass/components/card.scss +21 -0
  107. package/assets/sass/components/component.native.scss +37 -0
  108. package/assets/sass/components/component.reset.scss +1 -3
  109. package/assets/sass/components/header.scss +6 -1
  110. package/assets/sass/components/notification.global.scss +41 -0
  111. package/assets/sass/components/slider.scss +121 -0
  112. package/assets/sass/components/{table.extras.scss → table.global.scss} +5 -1
  113. package/assets/sass/components/table.scss +1 -1
  114. package/assets/sass/components/tabs.scss +2 -5
  115. package/assets/sass/core.scss +1 -2
  116. package/assets/sass/elements/container.scss +17 -0
  117. package/assets/sass/elements/forms.scss +138 -10
  118. package/assets/sass/elements/table.element.scss +1 -2
  119. package/assets/sass/error.scss +1 -1
  120. package/assets/sass/foundations/reboot.scss +48 -0
  121. package/assets/sass/main.scss +0 -1
  122. package/assets/sass/templates/form.scss +1 -0
  123. package/assets/ts/components/accordion/accordion.component.ts +5 -0
  124. package/assets/ts/components/actionbar/actionbar.component.ts +5 -0
  125. package/assets/ts/components/address-lookup/address-lookup.component.ts +1 -1
  126. package/assets/ts/components/card/card.component.ts +5 -0
  127. package/assets/ts/components/nav/nav.component.ts +5 -0
  128. package/assets/ts/components/notification/notification.component.ts +4 -0
  129. package/assets/ts/components/slider/README.md +26 -0
  130. package/assets/ts/components/slider/slider.component.ts +189 -0
  131. package/assets/ts/components/table/table.component.ts +1 -1
  132. package/assets/ts/components/tabs/tabs.component.ts +2 -0
  133. package/assets/ts/modules/helpers.ts +1 -1
  134. package/assets/ts/modules/inputs.ts +61 -4
  135. package/assets/ts/modules/tabs.ts +38 -41
  136. package/assets/ts/tests/slider.spec.ts +33 -0
  137. package/dist/components.es.js +1002 -1446
  138. package/dist/components.umd.js +292 -131
  139. package/dist/style.css +1 -1
  140. package/package.json +5 -4
  141. package/src/components/Accordion/Accordion.vue +12 -5
  142. package/src/components/Actionbar/Actionbar.vue +12 -5
  143. package/src/components/Card/Card.vue +1 -1
  144. package/src/components/Header/Header.vue +9 -3
  145. package/src/components/Nav/Nav.vue +1 -1
  146. package/src/components/Slider/README.md +11 -0
  147. package/src/components/Slider/Slider.vue +25 -0
  148. package/src/components/Tabs/Tabs.vue +14 -5
  149. package/assets/css/components/actionbar-global.css +0 -1
  150. package/assets/css/components/actionbar-global.css.map +0 -1
  151. package/assets/css/components/card-global.css +0 -1
  152. package/assets/css/components/card-global.css.map +0 -1
  153. /package/assets/sass/components/{nav-global.scss → nav.global.scss} +0 -0
@@ -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;
@@ -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
 
@@ -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')){
@@ -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
+ });