@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.
- 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/carousel.css +1 -1
- package/assets/css/components/carousel.css.map +1 -1
- 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/fileupload.css +1 -1
- package/assets/css/components/fileupload.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 +1 -0
- package/assets/css/components/marketing.css.map +1 -0
- package/assets/css/components/nav.css +1 -1
- package/assets/css/components/nav.css.map +1 -1
- package/assets/css/components/nav.global.css +1 -0
- package/assets/css/components/nav.global.css.map +1 -0
- package/assets/css/components/notification.global.css +1 -0
- package/assets/css/components/notification.global.css.map +1 -0
- package/assets/css/components/pagination.css +1 -1
- package/assets/css/components/pagination.css.map +1 -1
- 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/img/signin-bg.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 +18 -4
- package/assets/js/components/address-lookup/address-lookup.component.min.js +5 -5
- 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 +6 -1
- package/assets/js/components/card/card.component.min.js +6 -4
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.js +61 -0
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.js +6 -12
- package/assets/js/components/header/header.component.min.js +8 -14
- package/assets/js/components/header/header.component.min.js.map +1 -1
- package/assets/js/components/marketing/marketing.component.js +37 -0
- package/assets/js/components/nav/nav.component.js +8 -36
- package/assets/js/components/nav/nav.component.min.js +10 -12
- 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 +2 -2
- package/assets/js/components/search/search.component.js +148 -0
- package/assets/js/components/search/search.component.min.js +14 -0
- package/assets/js/components/search/search.component.min.js.map +1 -0
- 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 +6 -6
- 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.js +1 -1
- package/assets/js/dynamic.min.js +5 -5
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/modules/carousel.js +15 -23
- package/assets/js/modules/dynamicEvents.js +28 -13
- package/assets/js/modules/helpers.js +4 -1
- package/assets/js/modules/inputs.js +44 -3
- package/assets/js/modules/table.js +8 -6
- package/assets/js/modules/tabs.js +29 -31
- package/assets/js/scripts.bundle.js +31 -35
- 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 +9 -88
- package/assets/sass/_elements.scss +1 -2
- package/assets/sass/_functions/mixins.scss +16 -0
- package/assets/sass/_functions/utilities.scss +0 -17
- package/assets/sass/_functions/variables.scss +1 -0
- 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 +44 -3
- package/assets/sass/components/carousel.scss +86 -159
- package/assets/sass/components/component.native.scss +120 -0
- package/assets/sass/components/component.reset.scss +1 -3
- package/assets/sass/components/fileupload.scss +1 -1
- package/assets/sass/components/header.scss +55 -52
- package/assets/sass/components/marketing.scss +64 -0
- package/assets/sass/components/{nav-global.scss → nav.global.scss} +2 -1
- package/assets/sass/components/nav.scss +7 -1
- package/assets/sass/components/notification.global.scss +41 -0
- package/assets/sass/components/pagination.scss +4 -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/admin-panel.scss +9 -7
- package/assets/sass/elements/badge.scss +29 -0
- package/assets/sass/elements/container.scss +17 -0
- package/assets/sass/elements/dialog.scss +4 -4
- package/assets/sass/elements/forms.scss +142 -14
- package/assets/sass/elements/links.scss +2 -1
- package/assets/sass/elements/table.element.scss +1 -2
- package/assets/sass/error.scss +1 -1
- package/assets/sass/foundations/reboot.scss +59 -12
- package/assets/sass/foundations/root.scss +11 -3
- package/assets/sass/helpers/max-height.scss +78 -4
- package/assets/sass/main.scss +0 -1
- package/assets/sass/templates/auth.scss +112 -0
- 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 +24 -5
- package/assets/ts/components/card/card.component.ts +7 -1
- package/assets/ts/components/carousel/README.md +39 -0
- package/assets/ts/components/carousel/carousel.component.ts +75 -0
- package/assets/ts/components/header/header.component.ts +6 -12
- package/assets/ts/components/marketing/marketing.component.ts +49 -0
- package/assets/ts/components/nav/README.md +2 -13
- package/assets/ts/components/nav/nav.component.ts +9 -47
- package/assets/ts/components/notification/notification.component.ts +4 -0
- package/assets/ts/components/search/search.component.ts +177 -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/dynamic.ts +1 -1
- package/assets/ts/modules/carousel.ts +21 -33
- package/assets/ts/modules/dynamicEvents.ts +44 -24
- package/assets/ts/modules/helpers.ts +8 -2
- package/assets/ts/modules/inputs.ts +61 -4
- package/assets/ts/modules/table.ts +11 -14
- package/assets/ts/modules/tabs.ts +38 -41
- package/assets/ts/tests/slider.spec.ts +33 -0
- package/dist/components.es.js +893 -1542
- package/dist/components.umd.js +328 -161
- 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/Carousel/Carousel.vue +18 -103
- package/src/components/Header/Header.vue +10 -6
- package/src/components/Marketing/Marketing.vue +39 -0
- package/src/components/Marketing/README.md +20 -0
- package/src/components/Nav/Nav.vue +1 -1
- package/src/components/Nav/README.md +1 -12
- package/src/components/Search/Search.vue +25 -0
- 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/css/components/nav-global.css +0 -1
- package/assets/css/components/nav-global.css.map +0 -1
- 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
|
|
8
|
-
let
|
|
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 =
|
|
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
|
|
26
|
-
|
|
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(
|
|
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
|
-
|
|
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('
|
|
50
|
+
if (typeof target.matches == "function" && target.matches('button')) {
|
|
52
51
|
|
|
53
52
|
e.preventDefault();
|
|
54
53
|
|
|
55
|
-
Array.from(
|
|
56
|
-
|
|
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 =
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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
|
-
|
|
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
|
+
});
|