@iamproperty/components 3.4.6 → 3.4.7
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.map +1 -1
- package/assets/css/components/applied-filters.css +1 -0
- package/assets/css/components/applied-filters.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/charts.css +1 -1
- package/assets/css/components/charts.css.map +1 -1
- package/assets/css/components/container.css +1 -1
- package/assets/css/components/container.css.map +1 -1
- package/assets/css/components/dialog.css +1 -0
- package/assets/css/components/dialog.css.map +1 -0
- package/assets/css/components/forms.css +1 -1
- package/assets/css/components/forms.css.map +1 -1
- package/assets/css/components/lists.css +1 -1
- package/assets/css/components/lists.css.map +1 -1
- package/assets/css/components/nav.css +1 -1
- package/assets/css/components/nav.css.map +1 -1
- package/assets/css/components/pagination.css +1 -0
- package/assets/css/components/pagination.css.map +1 -0
- package/assets/css/components/table.css +1 -0
- package/assets/css/components/table.css.map +1 -0
- 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/js/bundle.js +18 -11
- package/assets/js/components/accordion/accordion.component.js +6 -0
- package/assets/js/components/accordion/accordion.component.min.js +3 -3
- package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.js +26 -0
- package/assets/js/components/card/card.component.js +91 -0
- package/assets/js/components/card/card.component.min.js +21 -0
- package/assets/js/components/card/card.component.min.js.map +1 -0
- package/assets/js/components/filterlist/filterlist.component.js +49 -0
- package/assets/js/components/filterlist/filterlist.component.min.js +23 -0
- package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -0
- package/assets/js/components/header/header.component.js +6 -0
- package/assets/js/components/header/header.component.min.js +2 -2
- package/assets/js/components/header/header.component.min.js.map +1 -1
- package/assets/js/components/pagination/pagination.component.js +34 -0
- package/assets/js/components/table/table.component.js +104 -0
- package/assets/js/components/table/table.component.min.js +24 -0
- package/assets/js/components/table/table.component.min.js.map +1 -0
- package/assets/js/components/tabs/tabs.component.js +6 -0
- package/assets/js/components/tabs/tabs.component.min.js +17 -0
- package/assets/js/components/tabs/tabs.component.min.js.map +1 -0
- package/assets/js/dynamic.js +7 -18
- package/assets/js/dynamic.min.js +2 -53
- package/assets/js/dynamic.min.js.map +1 -1
- package/assets/js/flat-components.js +27 -9
- package/assets/js/modules/applied-filters.js +100 -0
- package/assets/js/modules/data-layer.js +45 -0
- package/assets/js/modules/filterlist.js +32 -0
- package/assets/js/modules/helpers.js +77 -49
- package/assets/js/modules/pagination.js +33 -0
- package/assets/js/modules/table.js +507 -420
- package/assets/js/modules/tabs.js +6 -0
- package/assets/js/modules/youtubevideo.js +53 -61
- package/assets/js/scripts.bundle.js +77 -62
- 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/filterlist.spec.js +22 -0
- package/assets/js/tests/pagination.spec.js +15 -0
- package/assets/js/tests/table.spec.js +147 -0
- package/assets/sass/_components.scss +1 -2
- package/assets/sass/_corefiles.scss +5 -4
- package/assets/sass/_functions/utilities.scss +16 -0
- package/assets/sass/_functions/variables.scss +32 -18
- package/assets/sass/_tests/colours.spec.scss +1 -1
- package/assets/sass/components/applied-filters.scss +65 -0
- package/assets/sass/components/card.scss +177 -233
- package/assets/sass/components/charts.scss +4 -0
- package/assets/sass/components/container.scss +7 -2
- package/assets/sass/components/dialog.scss +202 -0
- package/assets/sass/components/forms.scss +37 -5
- package/assets/sass/components/lists.scss +15 -0
- package/assets/sass/components/nav.scss +5 -1
- package/assets/sass/components/pagination.scss +140 -0
- package/assets/sass/components/table.scss +419 -0
- package/assets/sass/foundations/icons.scss +1 -1
- package/assets/sass/{components → foundations}/links.scss +26 -0
- package/assets/sass/foundations/reboot.scss +19 -13
- package/assets/svg/illustrations/table.svg +165 -0
- package/assets/ts/bundle.ts +23 -12
- package/assets/ts/components/accordion/accordion.component.ts +7 -0
- package/assets/ts/components/applied-filters/README.md +5 -0
- package/assets/ts/components/applied-filters/applied-filters.component.ts +33 -0
- package/assets/ts/components/card/README.md +22 -0
- package/assets/ts/components/card/card.component.ts +117 -0
- package/assets/ts/components/filterlist/README.md +17 -0
- package/assets/ts/components/filterlist/filterlist.component.ts +60 -0
- package/assets/ts/components/header/header.component.ts +8 -0
- package/assets/ts/components/pagination/README.md +11 -0
- package/assets/ts/components/pagination/pagination.component.ts +45 -0
- package/assets/ts/components/table/README.md +23 -0
- package/assets/ts/components/table/table.component.ts +128 -0
- package/assets/ts/components/tabs/tabs.component.ts +7 -0
- package/assets/ts/dynamic.ts +12 -19
- package/assets/ts/flat-components.ts +37 -9
- package/assets/ts/modules/applied-filters.ts +146 -0
- package/assets/ts/modules/data-layer.ts +58 -0
- package/assets/ts/modules/filterlist.ts +46 -0
- package/assets/ts/modules/helpers.ts +90 -60
- package/assets/ts/modules/pagination.ts +44 -0
- package/assets/ts/modules/table.ts +598 -433
- package/assets/ts/modules/tabs.ts +8 -1
- package/assets/ts/modules/youtubevideo.ts +58 -63
- package/assets/ts/tests/filterlist.spec.ts +29 -0
- package/assets/ts/tests/pagination.spec.ts +21 -0
- package/assets/ts/tests/table.spec.ts +191 -0
- package/dist/components.es.js +1264 -1296
- package/dist/components.umd.js +70 -65
- package/dist/style.css +1 -1
- package/package.json +7 -5
- package/src/components/AppliedFilters/AppliedFilters.vue +20 -0
- package/src/components/AppliedFilters/README.md +5 -0
- package/src/components/Card/Card.vue +11 -112
- package/src/components/Card/README.md +16 -18
- package/src/components/Carousel/Carousel.vue +49 -10
- package/src/components/Chart/Chart.vue +46 -4
- package/src/components/Filterlist/Filterlist.vue +20 -0
- package/src/components/Filterlist/README.md +17 -0
- package/src/components/Pagination/Pagination.vue +30 -0
- package/src/components/Pagination/README.md +11 -0
- package/src/components/Table/README.md +29 -44
- package/src/components/Table/Table.spec.js +5 -37
- package/src/components/Table/Table.vue +16 -91
- package/src/foundations/YoutubeVideo/YoutubeVideo.vue +1 -1
- package/src/index.js +3 -2
- package/assets/css/components/cardDeck.css +0 -1
- package/assets/css/components/cardDeck.css.map +0 -1
- package/assets/css/components/links.css +0 -1
- package/assets/css/components/links.css.map +0 -1
- package/assets/css/components/modal.css +0 -1
- package/assets/css/components/modal.css.map +0 -1
- package/assets/css/components/tables.css +0 -1
- package/assets/css/components/tables.css.map +0 -1
- package/assets/js/modules/modal.js +0 -69
- package/assets/sass/components/cardDeck.scss +0 -108
- package/assets/sass/components/modal.scss +0 -136
- package/assets/sass/components/tables.scss +0 -291
- package/assets/ts/modules/modal.ts +0 -91
- package/src/components/CardDeck/CardDeck.spec.js +0 -99
- package/src/components/CardDeck/CardDeck.vue +0 -77
- package/src/components/CardDeck/README.md +0 -25
- package/src/components/Modal/Modal.spec.js +0 -22
- package/src/components/Modal/Modal.vue +0 -43
- package/src/components/Modal/README.md +0 -20
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
function createAppliedFilters(container, filters) {
|
|
3
|
+
function addFilterButton(filters, input) {
|
|
4
|
+
let shouldRemoveFilter = false;
|
|
5
|
+
let inputName = input.getAttribute('name');
|
|
6
|
+
if (inputName.includes('[]'))
|
|
7
|
+
inputName = inputName.replace('[]', `[${input.value}]`);
|
|
8
|
+
let filter = filters.querySelector(`[data-name="${inputName}"]`);
|
|
9
|
+
if (filter && input.getAttribute('type') == 'checkbox')
|
|
10
|
+
shouldRemoveFilter = true;
|
|
11
|
+
let filterText = input.getAttribute('data-filter-text');
|
|
12
|
+
if (!filter) {
|
|
13
|
+
filter = document.createElement('button');
|
|
14
|
+
filters.appendChild(filter);
|
|
15
|
+
}
|
|
16
|
+
filter.setAttribute('type', 'button');
|
|
17
|
+
filter.classList.add('filter');
|
|
18
|
+
filter.setAttribute('data-name', inputName);
|
|
19
|
+
filter.innerHTML = filterText.replace('$value', input.value);
|
|
20
|
+
// If the value
|
|
21
|
+
if (!input.value || shouldRemoveFilter)
|
|
22
|
+
filter.remove();
|
|
23
|
+
// If input has an ancestor with data-filter and all of inputs in that parent have been filled in then we need to transform the filter
|
|
24
|
+
if (input.parentNode.closest('[data-filter-text]')) {
|
|
25
|
+
let parent = input.parentNode.closest('[data-filter-text]');
|
|
26
|
+
let allValuesSet = true;
|
|
27
|
+
inputName = "";
|
|
28
|
+
parent.querySelectorAll('input').forEach((element, index) => {
|
|
29
|
+
let name = element.getAttribute('name');
|
|
30
|
+
// create a joined inputname for the parent filter
|
|
31
|
+
inputName += `${index != 0 ? ',' : ''}${name}`;
|
|
32
|
+
if (filters.querySelector(`[data-name="${name}"]`))
|
|
33
|
+
filters.querySelector(`[data-name="${name}"]`).remove();
|
|
34
|
+
if (element.value) {
|
|
35
|
+
let childFilter = document.createElement('button');
|
|
36
|
+
childFilter.setAttribute('type', 'button');
|
|
37
|
+
childFilter.classList.add('filter');
|
|
38
|
+
childFilter.setAttribute('data-name', name);
|
|
39
|
+
childFilter.innerHTML = filterText.replace('$value', element.value);
|
|
40
|
+
filters.appendChild(childFilter);
|
|
41
|
+
}
|
|
42
|
+
else
|
|
43
|
+
allValuesSet = false;
|
|
44
|
+
});
|
|
45
|
+
if (filters.querySelector(`[data-name="${inputName}"]`))
|
|
46
|
+
filters.querySelector(`[data-name="${inputName}"]`).remove();
|
|
47
|
+
if (allValuesSet) {
|
|
48
|
+
let newFilterText = parent.getAttribute('data-filter-text');
|
|
49
|
+
parent.querySelectorAll('input').forEach((element, index) => {
|
|
50
|
+
let name = element.getAttribute('name');
|
|
51
|
+
// Remove all the child filter tags
|
|
52
|
+
if (filters.querySelector(`[data-name="${name}"]`))
|
|
53
|
+
filters.querySelector(`[data-name="${name}"]`).remove();
|
|
54
|
+
newFilterText = newFilterText.replace(`$${index + 1}`, element.value);
|
|
55
|
+
});
|
|
56
|
+
let parentFilter = document.createElement('button');
|
|
57
|
+
parentFilter.setAttribute('type', 'button');
|
|
58
|
+
parentFilter.classList.add('filter');
|
|
59
|
+
parentFilter.setAttribute('data-name', inputName);
|
|
60
|
+
parentFilter.innerHTML = newFilterText;
|
|
61
|
+
filters.appendChild(parentFilter);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// check for inputs on load
|
|
66
|
+
Array.from(container.querySelectorAll('input[type="checkbox"]:checked')).forEach((input, index) => {
|
|
67
|
+
addFilterButton(filters, input);
|
|
68
|
+
});
|
|
69
|
+
container.addEventListener('change', function (event) {
|
|
70
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('input[data-filter-text]')) {
|
|
71
|
+
let input = event.target.closest('input[data-filter-text]');
|
|
72
|
+
addFilterButton(filters, input);
|
|
73
|
+
}
|
|
74
|
+
;
|
|
75
|
+
}, false);
|
|
76
|
+
filters.addEventListener('click', function (event) {
|
|
77
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('.filter')) {
|
|
78
|
+
let filter = event.target.closest('.filter');
|
|
79
|
+
let names = filter.getAttribute('data-name').split(',');
|
|
80
|
+
for (var t = 0; t < names.length; t++) {
|
|
81
|
+
let name = names[t];
|
|
82
|
+
let selector = `[name="${name}"]`;
|
|
83
|
+
if (name.match(/\[(.*)\]/)) {
|
|
84
|
+
let newName = name.replace(/\[(.*)\]/, `[]`);
|
|
85
|
+
let value = name.replace(/.*\[(.*)\]/, `$1`);
|
|
86
|
+
selector = `[name="${newName}"][value="${value}"]`;
|
|
87
|
+
}
|
|
88
|
+
let inputs = container.querySelectorAll(selector);
|
|
89
|
+
for (var i = 0; i < inputs.length; i++) {
|
|
90
|
+
let input = inputs[i];
|
|
91
|
+
if (input.getAttribute('type') != 'radio' && input.getAttribute('type') != 'checkbox')
|
|
92
|
+
inputs[i].value = "";
|
|
93
|
+
inputs[i].checked = false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
filter.remove();
|
|
97
|
+
}
|
|
98
|
+
}, false);
|
|
99
|
+
}
|
|
100
|
+
export default createAppliedFilters;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function createDataLayer() {
|
|
2
|
+
window.dataLayer = window.dataLayer || [];
|
|
3
|
+
window.dataLayer.push({
|
|
4
|
+
"event": "Pageview",
|
|
5
|
+
"pageTitle": document.title
|
|
6
|
+
});
|
|
7
|
+
// Global events to track
|
|
8
|
+
document.addEventListener('click', (event) => {
|
|
9
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[open] summary')) {
|
|
10
|
+
window.dataLayer.push({
|
|
11
|
+
"event": "closeDetails",
|
|
12
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
13
|
+
"detailsTitle": event.target.closest('summary').textContent
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else if (event && event.target instanceof HTMLElement && event.target.closest('summary')) {
|
|
17
|
+
window.dataLayer.push({
|
|
18
|
+
"event": "openDetails",
|
|
19
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
20
|
+
"detailsTitle": event.target.closest('summary').textContent
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('a')) {
|
|
24
|
+
window.dataLayer.push({
|
|
25
|
+
"event": "linkClicked",
|
|
26
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
27
|
+
"linkText": event.target.closest('a').hasAttribute('title') ? event.target.closest('a').getAttribute('title') : event.target.closest('a').textContent,
|
|
28
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
29
|
+
"class": (event.target.closest('a').hasAttribute('class') ? event.target.closest('a').getAttribute('class') : ''),
|
|
30
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
31
|
+
"href": event.target.closest('a').getAttribute('href')
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('button')) {
|
|
35
|
+
window.dataLayer.push({
|
|
36
|
+
"event": "buttonClicked",
|
|
37
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
38
|
+
"buttonText": event.target.closest('button').textContent,
|
|
39
|
+
// @ts-ignore: Object is possibly 'null'.
|
|
40
|
+
"class": (event.target.closest('button').hasAttribute('class') ? event.target.closest('button').getAttribute('class') : '')
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export default createDataLayer;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
function filterlist(list, input) {
|
|
3
|
+
addFilterlistEventListeners(list, input);
|
|
4
|
+
}
|
|
5
|
+
function addFilterlistEventListeners(list, input) {
|
|
6
|
+
var timer;
|
|
7
|
+
input.addEventListener('keyup', (event) => {
|
|
8
|
+
clearTimeout(timer);
|
|
9
|
+
timer = setTimeout(function () {
|
|
10
|
+
filterTheList(list, input.value);
|
|
11
|
+
}, 500);
|
|
12
|
+
});
|
|
13
|
+
input.addEventListener('change', (event) => {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
filterTheList(list, input.value);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export const filterTheList = function (list, searchTerm) {
|
|
19
|
+
Array.from(list.querySelectorAll(':scope > li')).forEach((item, index) => {
|
|
20
|
+
let content = item.textContent.toLowerCase();
|
|
21
|
+
item.classList.add('d-none');
|
|
22
|
+
if (content.includes(searchTerm.toLowerCase()))
|
|
23
|
+
item.classList.remove('d-none');
|
|
24
|
+
});
|
|
25
|
+
// Data layer Web component created
|
|
26
|
+
window.dataLayer = window.dataLayer || [];
|
|
27
|
+
window.dataLayer.push({
|
|
28
|
+
"event": "Filtered list",
|
|
29
|
+
"value": searchTerm
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
export default filterlist;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
+
import { createEmbed } from "./youtubevideo.js";
|
|
2
3
|
/**
|
|
3
4
|
* Global helper functions to help maintain and enhance framework elements.
|
|
4
5
|
* @module Helpers
|
|
@@ -19,62 +20,89 @@ export const addBodyClasses = (body) => {
|
|
|
19
20
|
* @param {HTMLElement} body Dom element, this doesn't have to be the body but it is recommended.
|
|
20
21
|
*/
|
|
21
22
|
export const addGlobalEvents = (body) => {
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
window.addEventListener('hashchange', function () {
|
|
28
|
-
const hash = location.hash.replace('#', '');
|
|
29
|
-
const label = document.querySelector(`label[for="${hash}"]`);
|
|
30
|
-
const summary = document.querySelector(location.hash + ' summary');
|
|
23
|
+
const checkElements = function (hash) {
|
|
24
|
+
const label = document.querySelector(`label[for="${hash.replace('#', '')}"]`);
|
|
25
|
+
const summary = document.querySelector(hash + ' summary');
|
|
26
|
+
const dialog = document.querySelector(`dialog${hash}`);
|
|
31
27
|
if (label instanceof HTMLElement)
|
|
32
28
|
label.click();
|
|
33
29
|
else if (summary instanceof HTMLElement)
|
|
34
30
|
summary.click();
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
31
|
+
else if (dialog instanceof HTMLElement)
|
|
32
|
+
dialog.showModal();
|
|
33
|
+
};
|
|
34
|
+
if (location.hash)
|
|
35
|
+
checkElements(location.hash);
|
|
36
|
+
window.addEventListener('hashchange', function () { checkElements(location.hash); }, false);
|
|
37
|
+
addEventListener("popstate", (event) => {
|
|
38
|
+
if (event.state.type == "pagination") {
|
|
39
|
+
let form = document.querySelector(`#${event.state.form}`);
|
|
40
|
+
let pageInput = document.querySelector(`#${event.state.form} [data-pagination]`);
|
|
41
|
+
if (pageInput)
|
|
42
|
+
pageInput.value = event.state.page;
|
|
43
|
+
else
|
|
44
|
+
form.innerHTML += `<input name="page" type="hidden" data-pagination="true" value="${event.state.page}" />`;
|
|
45
|
+
form.dispatchEvent(new Event("submit"));
|
|
46
|
+
}
|
|
47
47
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
48
|
+
// Dialogs/modals
|
|
49
|
+
document.addEventListener('click', (event) => {
|
|
50
|
+
// Modal
|
|
51
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('[data-modal]')) {
|
|
52
|
+
const button = event.target.closest('[data-modal]');
|
|
53
|
+
const modalID = button.getAttribute('data-modal');
|
|
54
|
+
const dialog = document.querySelector(`dialog#${modalID}`);
|
|
55
|
+
// Create close button is needed
|
|
56
|
+
if (dialog.parentNode.closest('form') && !dialog.querySelector(':scope > .dialog__close:first-child'))
|
|
57
|
+
dialog.innerHTML = `<button class="dialog__close" formmethod="dialog">Close</button>${dialog.innerHTML}`;
|
|
58
|
+
else if (!dialog.parentNode.closest('form') && !dialog.querySelector(':scope > form:first-child'))
|
|
59
|
+
dialog.innerHTML = `<form><button class="dialog__close" formmethod="dialog">Close</button></form>${dialog.innerHTML}`;
|
|
60
|
+
let videoButton = dialog.querySelector('.youtube-embed a');
|
|
61
|
+
if (videoButton) {
|
|
62
|
+
createEmbed(videoButton);
|
|
63
|
+
}
|
|
64
|
+
dialog.showModal();
|
|
65
|
+
window.dataLayer = window.dataLayer || [];
|
|
66
|
+
window.dataLayer.push({
|
|
67
|
+
"event": "openModal",
|
|
68
|
+
"id": modalID
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
;
|
|
72
|
+
// Close modal
|
|
73
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('dialog[open]')) {
|
|
74
|
+
const dialog = event.target.closest('dialog[open]');
|
|
75
|
+
const dialogDimensions = dialog.getBoundingClientRect();
|
|
76
|
+
if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
|
|
77
|
+
dialog.close();
|
|
78
|
+
window.dataLayer = window.dataLayer || [];
|
|
79
|
+
window.dataLayer.push({
|
|
80
|
+
"event": "closeModal",
|
|
81
|
+
"id": dialog.getAttribute('id')
|
|
82
|
+
});
|
|
75
83
|
}
|
|
76
|
-
}
|
|
84
|
+
}
|
|
85
|
+
// Popover
|
|
86
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__wrapper > button')) {
|
|
87
|
+
let btn = event.target.closest('.dialog__wrapper > button');
|
|
88
|
+
let parent = event.target.closest('.dialog__wrapper > button').parentNode;
|
|
89
|
+
let dataEvent = "openPopover";
|
|
90
|
+
let popover = parent.querySelector(':scope > dialog');
|
|
91
|
+
if (popover.hasAttribute('open')) {
|
|
92
|
+
popover.close();
|
|
93
|
+
dataEvent = "closePopover";
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
popover.show();
|
|
97
|
+
window.dataLayer = window.dataLayer || [];
|
|
98
|
+
window.dataLayer.push({
|
|
99
|
+
"event": dataEvent,
|
|
100
|
+
"id": btn.textContent
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
;
|
|
77
104
|
});
|
|
105
|
+
return null;
|
|
78
106
|
};
|
|
79
107
|
export const isNumeric = function (str) {
|
|
80
108
|
if (typeof str != "string")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const createPaginationButttons = function (controller, pagination) {
|
|
2
|
+
if (!controller.getAttribute('data-pages'))
|
|
3
|
+
return false;
|
|
4
|
+
if (!controller.getAttribute('data-page'))
|
|
5
|
+
controller.setAttribute('data-page', 1);
|
|
6
|
+
let currentPage = controller.getAttribute('data-page');
|
|
7
|
+
let numberPages = controller.getAttribute('data-pages');
|
|
8
|
+
let numberRows = controller.getAttribute('data-total');
|
|
9
|
+
let showRows = controller.getAttribute('data-show');
|
|
10
|
+
let addRows = controller.getAttribute('data-increment');
|
|
11
|
+
if (numberPages <= 1) {
|
|
12
|
+
pagination.innerHTML = '';
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
let strButtons = '';
|
|
16
|
+
for (let i = 1; i <= numberPages; i++) {
|
|
17
|
+
if (i == currentPage)
|
|
18
|
+
strButtons += `<li class="page-item active" aria-current="page"><span class="page-link">${i}</span></li>`;
|
|
19
|
+
else
|
|
20
|
+
strButtons += `<li class="page-item"><a href="?page=${i}" class="page-link" data-page="${i}">${i}</a></li>`;
|
|
21
|
+
}
|
|
22
|
+
pagination.innerHTML = `<ul class="pagination mb-0 d-none d-sm-flex">
|
|
23
|
+
${currentPage == 1 ? `<li class="page-item disabled"><span class="page-link">Previous</span></li>` : `<li class="page-item"><a href="?page=${parseInt(currentPage) - 1}" class="page-link" data-page="${parseInt(currentPage) - 1}">Previous</a></li>`}
|
|
24
|
+
${strButtons}
|
|
25
|
+
${currentPage == numberPages ? `<li class="page-item disabled"><span class="page-link">Next</span></li>` : `<li class="page-item"><a href="?page=${parseInt(currentPage) + 1}" class="page-link" data-page="${parseInt(currentPage) + 1}">Next</a></li>`}
|
|
26
|
+
</ul>`;
|
|
27
|
+
pagination.innerHTML += `<div class="d-sm-none text-center">
|
|
28
|
+
<span class="d-block pb-2">You've viewed ${showRows} of ${numberRows} results</span>
|
|
29
|
+
<a href="?show=${parseInt(showRows) + parseInt(addRows)}" class="btn btn-primary w-100 m-0" data-show="${parseInt(showRows) + parseInt(addRows)}">Load more results</a>
|
|
30
|
+
</div>`;
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
|
+
export default createPaginationButttons;
|