@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.
- package/assets/css/components/accordion.css +1 -1
- package/assets/css/components/accordion.css.map +1 -1
- package/assets/css/components/accordion.global.css +1 -0
- package/assets/css/components/accordion.global.css.map +1 -0
- package/assets/css/components/actionbar.css +1 -1
- package/assets/css/components/actionbar.css.map +1 -1
- package/assets/css/components/actionbar.global.css +1 -0
- package/assets/css/components/actionbar.global.css.map +1 -0
- package/assets/css/components/card.css +1 -1
- package/assets/css/components/card.css.map +1 -1
- package/assets/css/components/card.global.css +1 -0
- package/assets/css/components/card.global.css.map +1 -0
- package/assets/css/components/component.native.css +1 -0
- package/assets/css/components/component.native.css.map +1 -0
- package/assets/css/components/component.reset.css +1 -1
- package/assets/css/components/component.reset.css.map +1 -1
- package/assets/css/components/header.css +1 -1
- package/assets/css/components/header.css.map +1 -1
- package/assets/css/components/{nav-global.css → nav.global.css} +1 -1
- package/assets/css/components/{nav-global.css.map → nav.global.css.map} +1 -1
- package/assets/css/components/notification.global.css +1 -0
- package/assets/css/components/notification.global.css.map +1 -0
- package/assets/css/components/slider.css +1 -0
- package/assets/css/components/slider.css.map +1 -0
- package/assets/css/components/table.css +1 -1
- package/assets/css/components/table.css.map +1 -1
- package/assets/css/components/{table.extras.css → table.global.css} +1 -1
- package/assets/css/components/{table.extras.css.map → table.global.css.map} +1 -1
- package/assets/css/components/tabs.css +1 -1
- package/assets/css/components/tabs.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/img/illustrations/add-new-property.png +0 -0
- package/assets/img/illustrations/auctioneer.png +0 -0
- package/assets/img/illustrations/branch.png +0 -0
- package/assets/img/illustrations/company-level.png +0 -0
- package/assets/img/illustrations/contractors.png +0 -0
- package/assets/img/illustrations/find-existing-property.png +0 -0
- package/assets/img/illustrations/green/add-new-property.png +0 -0
- package/assets/img/illustrations/green/auctioneer.png +0 -0
- package/assets/img/illustrations/green/branch.png +0 -0
- package/assets/img/illustrations/green/buyer.png +0 -0
- package/assets/img/illustrations/green/company-level.png +0 -0
- package/assets/img/illustrations/green/contractors.png +0 -0
- package/assets/img/illustrations/green/estate-agents.png +0 -0
- package/assets/img/illustrations/green/find-existing-property.png +0 -0
- package/assets/img/illustrations/green/landlords.png +0 -0
- package/assets/img/illustrations/green/seller.png +0 -0
- package/assets/img/illustrations/green/whats-new-2.png +0 -0
- package/assets/img/illustrations/green/whats-new.png +0 -0
- package/assets/img/illustrations/information-works.png +0 -0
- package/assets/img/illustrations/landlords.png +0 -0
- package/assets/img/illustrations/whats-new-2.png +0 -0
- package/assets/img/illustrations/whats-new.png +0 -0
- package/assets/js/components/accordion/accordion.component.js +4 -0
- package/assets/js/components/accordion/accordion.component.min.js +6 -5
- package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
- package/assets/js/components/actionbar/actionbar.component.js +4 -0
- package/assets/js/components/actionbar/actionbar.component.min.js +5 -4
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.js +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +2 -2
- package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/card/card.component.js +4 -0
- package/assets/js/components/card/card.component.min.js +4 -3
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +2 -2
- package/assets/js/components/nav/nav.component.js +4 -0
- package/assets/js/components/nav/nav.component.min.js +4 -3
- package/assets/js/components/nav/nav.component.min.js.map +1 -1
- package/assets/js/components/notification/notification.component.js +4 -0
- package/assets/js/components/notification/notification.component.min.js +4 -3
- package/assets/js/components/notification/notification.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.js +143 -0
- package/assets/js/components/table/table.component.js +1 -1
- package/assets/js/components/table/table.component.min.js +3 -3
- package/assets/js/components/table/table.component.min.js.map +1 -1
- package/assets/js/components/tabs/tabs.component.js +2 -0
- package/assets/js/components/tabs/tabs.component.min.js +5 -3
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
- package/assets/js/dynamic.min.js +5 -5
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/modules/helpers.js +1 -1
- package/assets/js/modules/inputs.js +44 -3
- package/assets/js/modules/tabs.js +29 -31
- package/assets/js/scripts.bundle.js +24 -23
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/tests/slider.spec.js +20 -0
- package/assets/sass/_components.scss +0 -6
- package/assets/sass/_corefiles.scss +8 -88
- package/assets/sass/_elements.scss +0 -1
- package/assets/sass/components/accordion.global.scss +135 -0
- package/assets/sass/components/accordion.scss +6 -192
- package/assets/sass/components/{actionbar-global.scss → actionbar.global.scss} +3 -1
- package/assets/sass/components/actionbar.scss +2 -2
- package/assets/sass/components/{card-global.scss → card.global.scss} +2 -23
- package/assets/sass/components/card.scss +21 -0
- package/assets/sass/components/component.native.scss +37 -0
- package/assets/sass/components/component.reset.scss +1 -3
- package/assets/sass/components/header.scss +6 -1
- package/assets/sass/components/notification.global.scss +41 -0
- package/assets/sass/components/slider.scss +121 -0
- package/assets/sass/components/{table.extras.scss → table.global.scss} +5 -1
- package/assets/sass/components/table.scss +1 -1
- package/assets/sass/components/tabs.scss +2 -5
- package/assets/sass/core.scss +1 -2
- package/assets/sass/elements/container.scss +17 -0
- package/assets/sass/elements/forms.scss +138 -10
- package/assets/sass/elements/table.element.scss +1 -2
- package/assets/sass/error.scss +1 -1
- package/assets/sass/foundations/reboot.scss +48 -0
- package/assets/sass/main.scss +0 -1
- package/assets/sass/templates/form.scss +1 -0
- package/assets/ts/components/accordion/accordion.component.ts +5 -0
- package/assets/ts/components/actionbar/actionbar.component.ts +5 -0
- package/assets/ts/components/address-lookup/address-lookup.component.ts +1 -1
- package/assets/ts/components/card/card.component.ts +5 -0
- package/assets/ts/components/nav/nav.component.ts +5 -0
- package/assets/ts/components/notification/notification.component.ts +4 -0
- package/assets/ts/components/slider/README.md +26 -0
- package/assets/ts/components/slider/slider.component.ts +189 -0
- package/assets/ts/components/table/table.component.ts +1 -1
- package/assets/ts/components/tabs/tabs.component.ts +2 -0
- package/assets/ts/modules/helpers.ts +1 -1
- package/assets/ts/modules/inputs.ts +61 -4
- package/assets/ts/modules/tabs.ts +38 -41
- package/assets/ts/tests/slider.spec.ts +33 -0
- package/dist/components.es.js +1002 -1446
- package/dist/components.umd.js +292 -131
- package/dist/style.css +1 -1
- package/package.json +5 -4
- package/src/components/Accordion/Accordion.vue +12 -5
- package/src/components/Actionbar/Actionbar.vue +12 -5
- package/src/components/Card/Card.vue +1 -1
- package/src/components/Header/Header.vue +9 -3
- package/src/components/Nav/Nav.vue +1 -1
- package/src/components/Slider/README.md +11 -0
- package/src/components/Slider/Slider.vue +25 -0
- package/src/components/Tabs/Tabs.vue +14 -5
- package/assets/css/components/actionbar-global.css +0 -1
- package/assets/css/components/actionbar-global.css.map +0 -1
- package/assets/css/components/card-global.css +0 -1
- package/assets/css/components/card-global.css.map +0 -1
- /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.
|
|
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
|
-
|
|
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
|
-
|
|
24
|
+
let tabindex = 0;
|
|
25
|
+
detailsORLinks.forEach((element, index) => {
|
|
26
|
+
|
|
27
|
+
let button = document.createElement('button');
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
let isDisabled = summary.classList.contains('disabled')
|
|
29
|
+
if(element.matches('details')){
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
let button = document.createElement('button');
|
|
31
|
+
let summary = element.querySelector(':scope > summary');
|
|
32
|
+
let isDisabled = summary.classList.contains('disabled')
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
summary.classList.add('visually-hidden');
|
|
35
|
+
|
|
36
|
+
if (element.hasAttribute('id'))
|
|
37
|
+
button.setAttribute('data-id',`${element.getAttribute('id')}`);
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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 >
|
|
68
|
+
let buttons = tabsElement.querySelectorAll(':scope .tabs__links > button');
|
|
60
69
|
|
|
61
70
|
if(tabsElement.shadowRoot)
|
|
62
|
-
buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links >
|
|
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('
|
|
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 [
|
|
130
|
-
|
|
131
|
-
tabsElement.querySelector(`[
|
|
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
|
+
});
|