@iamproperty/components 6.1.0--beta → 6.1.0--beta3
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/actionbar.css.map +1 -1
- package/assets/css/components/actionbar.global.css.map +1 -1
- package/assets/css/components/card.component.css +1 -1
- package/assets/css/components/card.component.css.map +1 -1
- package/assets/css/components/card.module.css +1 -1
- package/assets/css/components/card.module.css.map +1 -1
- package/assets/css/components/carousel.component.css +1 -0
- package/assets/css/components/carousel.component.css.map +1 -0
- package/assets/css/components/carousel.config.css +1 -0
- package/assets/css/components/carousel.config.css.map +1 -0
- package/assets/css/components/collapsible-side.css.map +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/filter-card.component.css +1 -1
- package/assets/css/components/filter-card.component.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/marketing.css.map +1 -1
- package/assets/css/components/multi-step.component.css +1 -0
- package/assets/css/components/multi-step.component.css.map +1 -0
- package/assets/css/components/multiselect.preload.css.map +1 -1
- package/assets/css/components/nav.css.map +1 -1
- package/assets/css/components/nav.docs.css.map +1 -1
- package/assets/css/components/nav.global.css.map +1 -1
- package/assets/css/components/nav.old.css.map +1 -1
- package/assets/css/components/nav.preload.css +1 -1
- package/assets/css/components/nav.preload.css.map +1 -1
- package/assets/css/components/notification.css.map +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- package/assets/css/components/property-searchbar.css.map +1 -1
- package/assets/css/components/record-card.component.css +1 -1
- package/assets/css/components/record-card.component.css.map +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/components/snapshot.css.map +1 -1
- package/assets/css/components/stepper.css.map +1 -1
- package/assets/css/components/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/components/testimonial.css.map +1 -1
- package/assets/css/components/timeline.css.map +1 -1
- package/assets/css/components/video-card.component.css +1 -1
- package/assets/css/components/video-card.component.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/not-found.png +0 -0
- package/assets/js/components/accordion/accordion.component.min.js +2 -2
- package/assets/js/components/actionbar/actionbar.component.min.js +6 -6
- package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +2 -2
- package/assets/js/components/applied-filters/applied-filters.component.min.js +2 -2
- package/assets/js/components/barchart/barchart.component.min.js +2 -2
- package/assets/js/components/card/card.component.min.js +4 -4
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +36 -41
- package/assets/js/components/carousel/carousel.component.min.js +18 -12
- package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
- package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
- package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
- package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +2 -2
- package/assets/js/components/header/header.component.min.js +3 -3
- package/assets/js/components/inline-edit/inline-edit.component.min.js +2 -2
- package/assets/js/components/marketing/marketing.component.min.js +2 -2
- package/assets/js/components/multi-step/multi-step.component.js +162 -0
- package/assets/js/components/multiselect/multiselect.component.min.js +2 -2
- package/assets/js/components/nav/nav.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js +2 -2
- package/assets/js/components/pagination/pagination.component.min.js +2 -2
- package/assets/js/components/record-card/record-card.component.min.js +6 -6
- package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
- package/assets/js/components/search/search.component.min.js +2 -2
- package/assets/js/components/slider/slider.component.min.js +2 -2
- 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.min.js +3 -3
- package/assets/js/components/video-card/video-card.component.min.js +6 -6
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/components.bundle.js +3 -3
- package/assets/js/components.bundle.js.map +1 -1
- package/assets/js/components.js +1 -1
- package/assets/js/modules/card.module.js +4 -1
- package/assets/js/modules/carousel.js +110 -8
- package/assets/js/modules/dialogs.js +5 -123
- package/assets/js/scripts.bundle.js +4 -4
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +3 -3
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/sass/_components.scss +3 -19
- package/assets/sass/_corefiles.scss +15 -0
- package/assets/sass/_func.scss +3 -0
- package/assets/sass/_functions/functions.scss +304 -1
- package/assets/sass/_functions/mixins.scss +458 -2
- package/assets/sass/_functions/utilities.scss +647 -2
- package/assets/sass/_functions/variables.scss +1724 -2
- package/assets/sass/_utilities.scss +126 -7
- package/assets/sass/components/card.module.scss +1 -1
- package/assets/sass/components/carousel.component.scss +605 -0
- package/assets/sass/components/carousel.config.scss +84 -0
- package/assets/sass/components/header.scss +1 -0
- package/assets/sass/components/multi-step.component.scss +148 -0
- package/assets/sass/components/nav.preload.scss +5 -0
- package/assets/sass/components/tabs.scss +1 -1
- package/assets/sass/elements/admin-panel.scss +2 -1
- package/assets/sass/elements/buttons.scss +33 -0
- package/assets/sass/elements/container.scss +16 -6
- package/assets/sass/elements/details.scss +2 -0
- package/assets/sass/elements/forms.scss +236 -24
- package/assets/sass/elements/links.scss +27 -4
- package/assets/sass/elements/lists.scss +46 -0
- package/assets/sass/elements/media.scss +11 -1
- package/assets/sass/elements/modal.scss +138 -238
- package/assets/sass/elements/table.element.scss +35 -0
- package/assets/sass/elements/type.scss +38 -2
- package/assets/sass/error.scss +32 -1
- package/assets/sass/foundations/bs_grid.scss +33 -0
- package/assets/sass/foundations/grid.scss +270 -0
- package/assets/sass/foundations/reboot.scss +71 -49
- package/assets/sass/foundations/root.scss +16 -2
- package/assets/ts/components/carousel/carousel.component.ts +51 -44
- package/assets/ts/components/multi-step/multi-step.component.ts +262 -0
- package/assets/ts/components/table/table.component.ts +2 -1
- package/assets/ts/components.ts +1 -1
- package/assets/ts/modules/card.module.ts +4 -1
- package/assets/ts/modules/carousel.ts +161 -7
- package/assets/ts/modules/dialogs.ts +6 -174
- package/dist/components.es.js +177 -193
- package/dist/components.umd.js +73 -67
- package/dist/style.css +1 -1
- package/package.json +3 -2
- package/src/components/Carousel/Carousel.vue +1 -15
- package/src/components/FilterCard/FilterCard.vue +1 -1
- package/src/components/MultiStep/MultiStep.vue +25 -0
- package/src/components/RecordCard/RecordCard.vue +1 -1
- package/src/components/VideoCard/VideoCard.vue +1 -1
- package/assets/css/components/carousel.css +0 -1
- package/assets/css/components/carousel.css.map +0 -1
- package/assets/css/components/carousel.preload.css +0 -1
- package/assets/css/components/carousel.preload.css.map +0 -1
- package/assets/sass/components/carousel.preload.scss +0 -82
- package/assets/sass/components/carousel.scss +0 -258
- package/assets/ts/tests/dialogs.spec.js +0 -50
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import {trackComponent, trackComponentRegistered} from "../_global";
|
|
3
|
+
|
|
4
|
+
trackComponentRegistered("iam-multi-step");
|
|
5
|
+
|
|
6
|
+
class iamMultiStep extends HTMLElement {
|
|
7
|
+
|
|
8
|
+
constructor(){
|
|
9
|
+
super();
|
|
10
|
+
this.attachShadow({ mode: 'open'});
|
|
11
|
+
|
|
12
|
+
const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
|
|
13
|
+
const loadCSS = `@import "${assetLocation}/css/components/multi-step.component.css";`;
|
|
14
|
+
|
|
15
|
+
const template = document.createElement('template');
|
|
16
|
+
template.innerHTML = `
|
|
17
|
+
<style>
|
|
18
|
+
${loadCSS}
|
|
19
|
+
</style>
|
|
20
|
+
<div class="steps" parts="steps">
|
|
21
|
+
</div>
|
|
22
|
+
<slot></slot>
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
connectedCallback() {
|
|
30
|
+
|
|
31
|
+
const MultiStepComponent = this;
|
|
32
|
+
const steps = this.shadowRoot.querySelector('.steps');
|
|
33
|
+
const form = this.querySelector('form');
|
|
34
|
+
|
|
35
|
+
let fieldsets = Array.from(MultiStepComponent.querySelectorAll('fieldset[data-title]'));
|
|
36
|
+
|
|
37
|
+
fieldsets.forEach((fieldset,index) => {
|
|
38
|
+
|
|
39
|
+
steps.insertAdjacentHTML('beforeend',`<button data-title="${fieldset.getAttribute('data-title')}" type="button" class="${index == 0 ? "active":""}" tabindex="-1">${fieldset.getAttribute('data-title')}</button>`);
|
|
40
|
+
|
|
41
|
+
if(index === 0)
|
|
42
|
+
fieldset.classList.add('active');
|
|
43
|
+
|
|
44
|
+
const btnWrapper = document.createElement("div");
|
|
45
|
+
btnWrapper.classList.add('btn--wrapper');
|
|
46
|
+
fieldset.appendChild(btnWrapper);
|
|
47
|
+
|
|
48
|
+
if(index != 0)
|
|
49
|
+
btnWrapper.innerHTML += `<button data-title="${fieldsets[index-1].getAttribute('data-title')}" class="btn btn-secondary mb-0" data-previous type="button">Previous</button>`;
|
|
50
|
+
|
|
51
|
+
if(index != fieldsets.length - 1)
|
|
52
|
+
btnWrapper.innerHTML += `<button data-title="${fieldsets[index+1].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="button">Next</button>`;
|
|
53
|
+
|
|
54
|
+
// Last fieldset
|
|
55
|
+
if(index == fieldsets.length - 1){
|
|
56
|
+
if(form && form.querySelector(':scope > button[type="submit"]')){
|
|
57
|
+
|
|
58
|
+
let existingButton = form.querySelector(':scope > button[type="submit"]');
|
|
59
|
+
existingButton.classList.add('mb-0')
|
|
60
|
+
|
|
61
|
+
btnWrapper.insertAdjacentElement('beforeend',existingButton);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
btnWrapper.innerHTML += `<button data-title="${fieldsets[index].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="submit">Submit</button>`;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
// Open the fieldset with an error inside
|
|
71
|
+
let validatedFieldsets = Array.from(MultiStepComponent.querySelectorAll('fieldset.was-validated'));
|
|
72
|
+
for (let i = 0; i < validatedFieldsets.length; i++) {
|
|
73
|
+
|
|
74
|
+
let fieldset = validatedFieldsets[i];
|
|
75
|
+
let fieldsetID = fieldset.getAttribute('data-title');
|
|
76
|
+
|
|
77
|
+
if(fieldset.querySelector('.is-invalid')){
|
|
78
|
+
|
|
79
|
+
Array.from(MultiStepComponent.querySelectorAll(`[data-title="${fieldsetID}"]`)).forEach((element, index) => {
|
|
80
|
+
|
|
81
|
+
element.classList.add('active');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
|
|
88
|
+
Array.from(MultiStepComponent.querySelectorAll(`[data-title="${fieldsetID}"]`)).forEach((element, index) => {
|
|
89
|
+
|
|
90
|
+
element.classList.add('valid');
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Prevent the bubble messages
|
|
96
|
+
MultiStepComponent.addEventListener('invalid', (function () {
|
|
97
|
+
return function (e) {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
};
|
|
100
|
+
})(), true);
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
function validateFieldset(button){
|
|
106
|
+
|
|
107
|
+
const currentFieldset = MultiStepComponent.querySelector(`fieldset.active`) ? MultiStepComponent.querySelector(`fieldset.active`) : MultiStepComponent.querySelector(`fieldset[data-title]`);
|
|
108
|
+
const currentFieldsetID = currentFieldset.getAttribute('data-title');
|
|
109
|
+
let isFieldsetValid = true;
|
|
110
|
+
|
|
111
|
+
currentFieldset.classList.add('was-validated');
|
|
112
|
+
|
|
113
|
+
Array.from(currentFieldset.querySelectorAll('input')).forEach((input, index) => {
|
|
114
|
+
|
|
115
|
+
if (!input.checkValidity())
|
|
116
|
+
isFieldsetValid = false;
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// If valid mode to next field set
|
|
120
|
+
if(!isFieldsetValid){
|
|
121
|
+
|
|
122
|
+
Array.from(MultiStepComponent.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
|
|
123
|
+
|
|
124
|
+
element.classList.remove('valid');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
Array.from(MultiStepComponent.shadowRoot.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
|
|
128
|
+
|
|
129
|
+
element.classList.remove('valid');
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
|
|
134
|
+
Array.from(MultiStepComponent.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
|
|
135
|
+
|
|
136
|
+
element.classList.add('valid');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
Array.from(MultiStepComponent.shadowRoot.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
|
|
140
|
+
|
|
141
|
+
element.classList.add('valid');
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Allow the previous button to navigate
|
|
146
|
+
if(isFieldsetValid || !button.hasAttribute('data-next')){
|
|
147
|
+
|
|
148
|
+
const fieldset = MultiStepComponent.querySelector(`fieldset[data-title="${button.getAttribute('data-title')}"]`);
|
|
149
|
+
const step = MultiStepComponent.shadowRoot.querySelector(`.steps button[data-title="${button.getAttribute('data-title')}"]`);
|
|
150
|
+
|
|
151
|
+
Array.from(MultiStepComponent.querySelectorAll('button')).forEach((button, index) => {
|
|
152
|
+
button.classList.remove('active');
|
|
153
|
+
});
|
|
154
|
+
Array.from(MultiStepComponent.querySelectorAll('fieldset')).forEach((button, index) => {
|
|
155
|
+
button.classList.remove('active');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
step.classList.add('active');
|
|
159
|
+
fieldset.classList.add('active');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
let fieldsetCount = Array.from(MultiStepComponent.querySelectorAll(`fieldset`)).length;
|
|
164
|
+
let validFieldsetCount = Array.from(MultiStepComponent.querySelectorAll(`fieldset.valid`)).length;
|
|
165
|
+
|
|
166
|
+
// update the progress bar
|
|
167
|
+
MultiStepComponent.style.setProperty('--progress', `${(validFieldsetCount/(fieldsetCount - 1) * 100)}%`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// remove error messages from server
|
|
171
|
+
MultiStepComponent.addEventListener('keydown', (event) => {
|
|
172
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button')){
|
|
173
|
+
|
|
174
|
+
const button = event.target.closest('button');
|
|
175
|
+
|
|
176
|
+
if(event.keyCode == 13 && button.getAttribute('type') != "submit"){
|
|
177
|
+
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
validateFieldset(button);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('input')){
|
|
185
|
+
const input = event.target.closest('input');
|
|
186
|
+
|
|
187
|
+
input.classList.remove('is-invalid');
|
|
188
|
+
|
|
189
|
+
if(event.keyCode == 13){
|
|
190
|
+
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
MultiStepComponent.addEventListener('click', (event) => {
|
|
198
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button[type="submit"]')){
|
|
199
|
+
|
|
200
|
+
const form = event.target.closest('form');
|
|
201
|
+
form.classList.add('was-validated');
|
|
202
|
+
}
|
|
203
|
+
return null
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
MultiStepComponent.shadowRoot.addEventListener('click', (event) => {
|
|
208
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button[data-title]')){
|
|
209
|
+
|
|
210
|
+
const button = event.target.closest('button[data-title]');
|
|
211
|
+
|
|
212
|
+
validateFieldset(button);
|
|
213
|
+
};
|
|
214
|
+
return null
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
trackComponent(MultiStepComponent,"iam-multi-step",[]);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static get observedAttributes() {
|
|
247
|
+
return ["data-image"];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
attributeChangedCallback(attrName, oldVal, newVal) {
|
|
251
|
+
switch (attrName) {
|
|
252
|
+
case "data-total": {
|
|
253
|
+
if(this.shadowRoot.querySelector('.card__total'))
|
|
254
|
+
this.shadowRoot.querySelector('.card__total').innerHTML = newVal;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export default iamMultiStep;
|
|
@@ -171,10 +171,11 @@ class iamTable extends HTMLElement {
|
|
|
171
171
|
|
|
172
172
|
Array.from(this.table.querySelectorAll('tbody tr')).forEach((row,index) => {
|
|
173
173
|
|
|
174
|
+
|
|
174
175
|
let rowID = `row${uniqueID(index)}`;
|
|
175
176
|
row.insertAdjacentHTML(
|
|
176
177
|
'afterbegin',
|
|
177
|
-
`<td class="td--fixed selectrow"><input type="checkbox" name="row" id="${rowID}"/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`
|
|
178
|
+
`<td class="td--fixed selectrow selected"><input type="checkbox" name="row" id="${rowID}" ${row.hasAttribute('data-selected') ? `checked="true"` : ''}/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`
|
|
178
179
|
);
|
|
179
180
|
});
|
|
180
181
|
|
package/assets/ts/components.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
const components = ["accordion","header","table","tabs",'card','filter-card','video-card','record-card',"filterlist",'applied-filters','pagination','notification','actionbar','nav','collapsible-side','address-lookup','fileupload','search','inline-edit','multiselect','slider','carousel','marketing','barchart'];
|
|
2
|
+
const components = ["accordion","header","table","tabs",'card','filter-card','video-card','record-card',"filterlist",'applied-filters','pagination','notification','actionbar','nav','collapsible-side','address-lookup','fileupload','search','inline-edit','multiselect','multi-step','slider','carousel','marketing','barchart'];
|
|
3
3
|
|
|
4
4
|
const prefix = "iam"
|
|
5
5
|
const options = {
|
|
@@ -38,6 +38,9 @@ export const setupCard = (cardComponent:any) => {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
if(!cardComponent.querySelector('[slot="badges"]')){
|
|
41
|
-
cardComponent.shadowRoot.querySelector('.card__badges').
|
|
41
|
+
cardComponent.shadowRoot.querySelector('.card__badges').classList.add('empty');
|
|
42
|
+
}
|
|
43
|
+
else{
|
|
44
|
+
cardComponent.shadowRoot.querySelector('.card__badges').classList.remove('empty');
|
|
42
45
|
}
|
|
43
46
|
}
|
|
@@ -1,12 +1,94 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
export const generateThumbnailList = function(carouselComponent){
|
|
4
|
+
|
|
5
|
+
let thumbnailImages = [];
|
|
6
|
+
|
|
7
|
+
Array.from(carouselComponent.querySelectorAll(':scope > div')).forEach((slide, index) => {
|
|
8
|
+
|
|
9
|
+
if(slide.hasAttribute('data-thumbnail')){
|
|
10
|
+
|
|
11
|
+
thumbnailImages[index] = slide.getAttribute('data-thumbnail');
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
return thumbnailImages;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
export const generatePipsHTML = function(carouselComponent,thumbnailImages){
|
|
20
|
+
|
|
21
|
+
let itemCount = carouselComponent.querySelectorAll(':scope > div').length;
|
|
22
|
+
|
|
23
|
+
let pips = "";
|
|
24
|
+
for (let i = 1; i <= itemCount; i++) {
|
|
25
|
+
let pipContent = null;
|
|
26
|
+
let pipClass = '';
|
|
27
|
+
|
|
28
|
+
if (thumbnailImages.length && thumbnailImages[i - 1]) {
|
|
29
|
+
pipClass = 'has-thumbnail';
|
|
30
|
+
pipContent = `<img src="${thumbnailImages[i - 1]}" alt="Slide ${i}" height="148"/>`;
|
|
31
|
+
} else {
|
|
32
|
+
pipContent = `Slide ${i}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
pips += `<button class="control-${i} ${pipClass}" data-slide="${i}" ${i == 1 ? "aria-current":""}>${pipContent}</button>`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return pips;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
const getProgressMax = function(itemCount,visibleItems){
|
|
43
|
+
|
|
44
|
+
if(visibleItems == 1){
|
|
45
|
+
return itemCount;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let max = (Math.ceil(itemCount / visibleItems) * visibleItems) - visibleItems;
|
|
49
|
+
|
|
50
|
+
return max + 1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const getProgressPercent = function(value,max){
|
|
54
|
+
|
|
55
|
+
return (((value-1)/(max-1)) * 100);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const carousel = function (carouselComponent) {
|
|
3
59
|
|
|
4
60
|
var scrollTimeout;
|
|
5
61
|
|
|
62
|
+
const carouselElement = carouselComponent.shadowRoot.querySelector('.carousel');
|
|
63
|
+
|
|
6
64
|
let carouselInner = carouselElement.querySelector('.carousel__inner');
|
|
7
65
|
let carouselControls = carouselElement.querySelector('.carousel__controls');
|
|
8
|
-
let
|
|
66
|
+
let carouselProgress = carouselElement.querySelector('.carousel__progress [type="range"]');
|
|
67
|
+
let itemCount = carouselComponent.querySelectorAll(':scope > div').length;
|
|
68
|
+
let scrollArea = carouselInner.clientWidth;
|
|
69
|
+
let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
|
|
70
|
+
let visibleItems = Math.round(scrollArea / itemWidth);
|
|
71
|
+
|
|
72
|
+
carouselProgress.setAttribute('min',1);
|
|
73
|
+
carouselProgress.setAttribute('step',visibleItems);
|
|
74
|
+
|
|
75
|
+
let progressMax = getProgressMax(itemCount,visibleItems);
|
|
76
|
+
|
|
77
|
+
carouselProgress.setAttribute('max',progressMax);
|
|
78
|
+
carouselProgress.value = 1;
|
|
79
|
+
|
|
80
|
+
let percent = getProgressPercent(1,progressMax);
|
|
9
81
|
|
|
82
|
+
carouselProgress.style.setProperty('--percent', percent + "%");
|
|
83
|
+
|
|
84
|
+
let stepperInterval, stepperEvent = "mouseup", stepperStart = "mousedown";
|
|
85
|
+
|
|
86
|
+
if("ontouchstart" in document.documentElement) {
|
|
87
|
+
stepperEvent = "touchend";
|
|
88
|
+
stepperStart = "touchstart";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
10
92
|
// On scroll we need to make sure the buttons get corrected and the next testimonial is shown
|
|
11
93
|
carouselInner.addEventListener('scroll', function(e){
|
|
12
94
|
clearTimeout(scrollTimeout);
|
|
@@ -17,8 +99,8 @@ function carousel(carouselElement, row) {
|
|
|
17
99
|
let scrollLeft = carouselInner.scrollLeft;
|
|
18
100
|
let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
|
|
19
101
|
|
|
20
|
-
let itemWidth =
|
|
21
|
-
let lastItemOffset =
|
|
102
|
+
let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
|
|
103
|
+
let lastItemOffset = carouselComponent.querySelector(':scope > div:last-child').offsetLeft;
|
|
22
104
|
//+60px here is to account for when the next offscreen slide is visible beneath the next arrow
|
|
23
105
|
let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
|
|
24
106
|
|
|
@@ -27,6 +109,9 @@ function carousel(carouselElement, row) {
|
|
|
27
109
|
//Check if theres room for more slides than we have
|
|
28
110
|
let leftOverSpace = (Math.ceil(itemCount / visibleItems) * visibleItems) - itemCount;
|
|
29
111
|
|
|
112
|
+
carouselProgress.setAttribute('step',visibleItems);
|
|
113
|
+
|
|
114
|
+
|
|
30
115
|
if(leftOverSpace > 0 && lastItemInView){
|
|
31
116
|
targetSlide = (Math.floor(itemCount / visibleItems) * visibleItems) + 1;
|
|
32
117
|
}
|
|
@@ -49,6 +134,16 @@ function carousel(carouselElement, row) {
|
|
|
49
134
|
else
|
|
50
135
|
carouselElement.querySelector('.btn-next').removeAttribute('disabled');
|
|
51
136
|
|
|
137
|
+
carouselProgress.value = targetSlide;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
progressMax = getProgressMax(itemCount,visibleItems);
|
|
141
|
+
|
|
142
|
+
carouselProgress.setAttribute('max',progressMax);
|
|
143
|
+
percent = (targetSlide/progressMax) * 100;
|
|
144
|
+
percent = getProgressPercent(targetSlide,progressMax);
|
|
145
|
+
carouselProgress.style.setProperty('--percent', percent + "%");
|
|
146
|
+
|
|
52
147
|
}, 100);
|
|
53
148
|
|
|
54
149
|
}, false);
|
|
@@ -65,8 +160,15 @@ function carousel(carouselElement, row) {
|
|
|
65
160
|
button.removeAttribute('aria-current');
|
|
66
161
|
});
|
|
67
162
|
target.setAttribute('aria-current', true);
|
|
163
|
+
|
|
164
|
+
const customEvent = new CustomEvent("pip-clicked", { detail: {
|
|
165
|
+
'slide': target.getAttribute('data-slide')
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
carouselComponent.dispatchEvent(customEvent);
|
|
68
170
|
|
|
69
|
-
const el =
|
|
171
|
+
const el = carouselComponent.querySelector(`:scope > *:nth-child(${target.getAttribute('data-slide')})`);
|
|
70
172
|
|
|
71
173
|
carouselInner.scroll({
|
|
72
174
|
top: 0,
|
|
@@ -83,11 +185,11 @@ function carousel(carouselElement, row) {
|
|
|
83
185
|
|
|
84
186
|
let scrollArea = carouselInner.clientWidth;
|
|
85
187
|
let scrollWidth = carouselInner.scrollWidth;
|
|
86
|
-
let itemWidth =
|
|
188
|
+
let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
|
|
87
189
|
|
|
88
190
|
let visibleItems = Math.round(scrollArea / itemWidth);
|
|
89
191
|
|
|
90
|
-
let lastItemOffset =
|
|
192
|
+
let lastItemOffset = carouselComponent.querySelector(':scope > div:last-child').offsetLeft;
|
|
91
193
|
let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
|
|
92
194
|
|
|
93
195
|
//Check if theres room for more slides than we have
|
|
@@ -104,6 +206,15 @@ function carousel(carouselElement, row) {
|
|
|
104
206
|
|
|
105
207
|
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
106
208
|
if (typeof target.matches == "function" && target.matches('.btn-next, .btn-prev')) {
|
|
209
|
+
|
|
210
|
+
let direction = target.matches('.btn-next') ? 'next' : 'prev';
|
|
211
|
+
|
|
212
|
+
const customEvent = new CustomEvent(`${direction}-clicked`, { detail: {
|
|
213
|
+
'slide': target.getAttribute('data-go')
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
carouselComponent.dispatchEvent(customEvent);
|
|
107
218
|
|
|
108
219
|
e.preventDefault();
|
|
109
220
|
let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - movement : carouselInner.scrollLeft + carouselInner.clientWidth;
|
|
@@ -117,6 +228,49 @@ function carousel(carouselElement, row) {
|
|
|
117
228
|
}
|
|
118
229
|
}
|
|
119
230
|
}, false);
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
carouselProgress.addEventListener(stepperStart,function(event){
|
|
234
|
+
|
|
235
|
+
clearInterval(stepperInterval);
|
|
236
|
+
stepperInterval = setInterval(function() {
|
|
237
|
+
scrollArea = carouselInner.clientWidth;
|
|
238
|
+
itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
|
|
239
|
+
visibleItems = Math.round(scrollArea / itemWidth);
|
|
240
|
+
carouselProgress.setAttribute('step',visibleItems);
|
|
241
|
+
progressMax = getProgressMax(itemCount,visibleItems);
|
|
242
|
+
carouselProgress.setAttribute('max',progressMax);
|
|
243
|
+
percent = getProgressPercent(carouselProgress.value,progressMax);
|
|
244
|
+
|
|
245
|
+
carouselProgress.style.setProperty('--percent', percent + "%");
|
|
246
|
+
}, 10);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
carouselProgress.addEventListener(stepperEvent,function(event){
|
|
250
|
+
clearInterval(stepperInterval);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
carouselProgress.addEventListener('change', function(e){
|
|
254
|
+
|
|
255
|
+
clearInterval(stepperInterval);
|
|
256
|
+
let target = carouselComponent.querySelector(`:scope > *:nth-child(${carouselProgress.value})`);
|
|
257
|
+
|
|
258
|
+
carouselInner.scroll({
|
|
259
|
+
top: 0,
|
|
260
|
+
left: target ? target.offsetLeft - carouselInner.getBoundingClientRect().left : 0,
|
|
261
|
+
behavior: 'smooth'
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
let direction = target.matches('.btn-next') ? 'next' : 'prev';
|
|
265
|
+
|
|
266
|
+
const customEvent = new CustomEvent(`slider-changed`, { detail: {
|
|
267
|
+
'slide': carouselProgress.value
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
carouselComponent.dispatchEvent(customEvent);
|
|
272
|
+
|
|
273
|
+
}, false);
|
|
120
274
|
}
|
|
121
275
|
|
|
122
276
|
export default carousel
|