@iamproperty/components 3.2.0 → 3.4.5
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/README.md +30 -66
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/main.js +9 -9
- package/assets/js/modules/accordion.js +1 -0
- package/assets/js/modules/alert.js +37 -53
- package/assets/js/modules/carousel.js +74 -100
- package/assets/js/modules/chart.js +142 -209
- package/assets/js/modules/drawer.js +9 -15
- package/assets/js/modules/file-upload.js +30 -45
- package/assets/js/modules/form.js +111 -157
- package/assets/js/modules/helpers.js +64 -93
- package/assets/js/modules/modal.js +67 -88
- package/assets/js/modules/nav.js +17 -27
- package/assets/js/modules/orderablelist.js +84 -115
- package/assets/js/modules/table.js +387 -521
- package/assets/js/modules/testimonial.js +61 -80
- package/assets/js/modules/youtubevideo.js +104 -135
- package/assets/js/scripts.bundle.js +870 -936
- 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/_corefiles.scss +9 -9
- package/assets/sass/_forms.scss +1 -1
- package/assets/sass/_tests/{sass.spec.js → colours.spec.js} +2 -2
- package/assets/sass/_tests/func.spec.js +9 -0
- package/assets/sass/_tests/mixins.spec.js +9 -0
- package/assets/sass/_tests/typography.spec.js +9 -0
- package/assets/ts/main.ts +9 -9
- package/assets/ts/modules/accordion.ts +1 -0
- package/assets/ts/modules/alert.ts +58 -0
- package/assets/ts/modules/carousel.ts +103 -0
- package/assets/ts/modules/chart.ts +219 -0
- package/assets/ts/modules/drawer.ts +17 -0
- package/assets/ts/modules/file-upload.ts +49 -0
- package/assets/ts/modules/form.ts +169 -0
- package/assets/ts/modules/helpers.ts +120 -0
- package/assets/ts/modules/modal.ts +91 -0
- package/assets/ts/modules/nav.ts +29 -0
- package/assets/ts/modules/orderablelist.ts +123 -0
- package/assets/ts/modules/table.ts +586 -0
- package/assets/ts/modules/testimonial.ts +84 -0
- package/assets/ts/modules/youtubevideo.ts +146 -0
- package/dist/components.es.js +671 -750
- package/dist/components.umd.js +13 -13
- package/dist/style.css +1 -1
- package/package.json +54 -38
- package/src/components/Accordion/Accordion.vue +1 -1
- package/src/components/Alert/Alert.vue +1 -1
- package/src/{elements → components}/Card/Card.vue +1 -1
- package/src/components/CardDeck/CardDeck.spec.js +1 -1
- package/src/components/CardDeck/CardDeck.vue +1 -1
- package/src/components/Carousel/Carousel.vue +2 -2
- package/src/components/Chart/Chart.vue +2 -2
- package/src/{elements → components}/FileUploads/FileUploads.vue +1 -1
- package/src/components/Modal/Modal.vue +1 -1
- package/src/components/Nav/Nav.vue +2 -2
- package/src/components/NoteFeed/NoteFeed.vue +2 -2
- package/src/components/PropertySearchbar/PropertySearchbar.vue +1 -1
- package/src/{elements → components}/Table/Table.vue +1 -1
- package/src/components/Testimonial/Testimonial.vue +1 -1
- package/src/foundations/YoutubeVideo/YoutubeVideo.vue +1 -1
- package/src/index.js +4 -5
- package/assets/.DS_Store +0 -0
- package/assets/css/email.min.css +0 -1
- package/assets/css/email.min.css.map +0 -1
- package/assets/css/error.min.css +0 -1
- package/assets/css/error.min.css.map +0 -1
- package/assets/sass/components/drawer.scss +0 -47
- package/assets/ts/main.js +0 -57
- package/assets/ts/main.js.map +0 -1
- package/assets/ts/modules/accordion.js +0 -33
- package/assets/ts/modules/accordion.js.map +0 -1
- package/src/.DS_Store +0 -0
- package/src/components/Accordion/Accordion.screenshot.vue +0 -57
- package/src/components/Accordion/__screenshots__/win32/laptop/Accordion.png +0 -0
- package/src/components/Accordion/__screenshots__/win32/mobile/Accordion.png +0 -0
- package/src/components/Accordion/__screenshots__/win32/tablet/Accordion.png +0 -0
- package/src/components/Drawer/Drawer.vue +0 -53
- package/src/components/Drawer/README.md +0 -23
- /package/assets/sass/{elements → components}/buttons.scss +0 -0
- /package/assets/sass/{elements → components}/card.scss +0 -0
- /package/assets/sass/{elements → components}/container.scss +0 -0
- /package/assets/sass/{elements → components}/forms.scss +0 -0
- /package/assets/sass/{elements → components}/links.scss +0 -0
- /package/assets/sass/{elements → components}/lists.scss +0 -0
- /package/assets/sass/{elements → components}/panel.scss +0 -0
- /package/assets/sass/{elements → components}/tables.scss +0 -0
- /package/assets/sass/{elements → components}/tooltips.scss +0 -0
- /package/assets/sass/{elements → foundations}/type.scss +0 -0
- /package/src/{elements → components}/Card/README.md +0 -0
- /package/src/{elements → components}/FileUploads/README.md +0 -0
- /package/src/{elements → components}/Input/Input.vue +0 -0
- /package/src/{elements → components}/Input/README.md +0 -0
- /package/src/{elements → components}/Table/README.md +0 -0
- /package/src/{elements → components}/Table/Table.spec.js +0 -0
|
@@ -1,57 +1,41 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
function alert(element) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
// Create a dissmissable button
|
|
4
|
+
element.addEventListener('click', function (e) {
|
|
5
|
+
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
6
|
+
if (target.matches('.btn-close')) {
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
element.classList.remove('show');
|
|
9
|
+
setTimeout(function () {
|
|
10
|
+
element.remove();
|
|
11
|
+
}, 300); // Execute something() 1 second later.
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}, false);
|
|
16
|
+
// Self disappearing alert
|
|
17
|
+
if (element.hasAttribute('data-timeout')) {
|
|
18
|
+
let timeOut = element.getAttribute('data-timeout');
|
|
12
19
|
setTimeout(function () {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
element.classList.remove('show');
|
|
21
|
+
setTimeout(function () {
|
|
22
|
+
element.remove();
|
|
23
|
+
}, 300); // Execute something() 1 second later.
|
|
24
|
+
}, timeOut); // Execute something() 1 second later.
|
|
25
|
+
}
|
|
26
|
+
// Create an alert holder thats fixed to the bottom of the page, alerts with the class of alert--fix are then moved to this area. Creating a fixed but scrollable area that alerts can be stacked up on.
|
|
27
|
+
if (!document.querySelector('.alert__holder')) {
|
|
28
|
+
var bodyElement = document.getElementsByTagName("BODY")[0];
|
|
29
|
+
let newDiv = document.createElement("div");
|
|
30
|
+
newDiv.classList.add('alert__holder');
|
|
31
|
+
if (document.querySelector('main'))
|
|
32
|
+
document.querySelector('main').appendChild(newDiv);
|
|
33
|
+
else
|
|
34
|
+
document.body.appendChild(newDiv);
|
|
35
|
+
}
|
|
36
|
+
let alertHolder = document.querySelector('.alert__holder');
|
|
37
|
+
if (element.classList.contains('alert--fixed') && !element.parentNode.classList.contains('alert__wrapper')) {
|
|
38
|
+
alertHolder.appendChild(element);
|
|
18
39
|
}
|
|
19
|
-
}, false);
|
|
20
|
-
|
|
21
|
-
// Self disappearing alert
|
|
22
|
-
if(element.hasAttribute('data-timeout')){
|
|
23
|
-
|
|
24
|
-
let timeOut = element.getAttribute('data-timeout');
|
|
25
|
-
|
|
26
|
-
setTimeout(function () {
|
|
27
|
-
element.classList.remove('show');
|
|
28
|
-
setTimeout(function () {
|
|
29
|
-
element.remove();
|
|
30
|
-
}, 300); // Execute something() 1 second later.
|
|
31
|
-
}, timeOut); // Execute something() 1 second later.
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// Create an alert holder thats fixed to the bottom of the page, alerts with the class of alert--fix are then moved to this area. Creating a fixed but scrollable area that alerts can be stacked up on.
|
|
37
|
-
if(!document.querySelector('.alert__holder')){
|
|
38
|
-
var bodyElement = document.getElementsByTagName("BODY")[0];
|
|
39
|
-
|
|
40
|
-
let newDiv = document.createElement("div");
|
|
41
|
-
newDiv.classList.add('alert__holder');
|
|
42
|
-
|
|
43
|
-
if(document.querySelector('main'))
|
|
44
|
-
document.querySelector('main').appendChild(newDiv);
|
|
45
|
-
else
|
|
46
|
-
document.body.appendChild(newDiv);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
let alertHolder = document.querySelector('.alert__holder');
|
|
50
|
-
|
|
51
|
-
if(element.classList.contains('alert--fixed') && !element.parentNode.classList.contains('alert__wrapper')){
|
|
52
|
-
|
|
53
|
-
alertHolder.appendChild(element);
|
|
54
|
-
}
|
|
55
40
|
}
|
|
56
|
-
|
|
57
|
-
export default alert
|
|
41
|
+
export default alert;
|
|
@@ -1,102 +1,76 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
function carousel(carouselElement) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
75
|
-
if (target.matches('.btn-next, .btn-prev')) {
|
|
76
|
-
|
|
77
|
-
e.preventDefault();
|
|
78
|
-
let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
|
|
79
|
-
|
|
80
|
-
carouselInner.scroll({
|
|
81
|
-
top: 0,
|
|
82
|
-
left: scrollTo,
|
|
83
|
-
behavior: 'smooth'
|
|
84
|
-
});
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}, false);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
// Add responsive hide button classes
|
|
92
|
-
if(itemCount == 1)
|
|
93
|
-
carouselElement.classList.add('hide-btns');
|
|
94
|
-
|
|
95
|
-
if(smCols >= itemCount)
|
|
96
|
-
carouselElement.classList.add('hide-sm-btns');
|
|
97
|
-
|
|
98
|
-
if(mdCols >= itemCount)
|
|
99
|
-
carouselElement.classList.add('hide-md-btns');
|
|
3
|
+
var scrollTimeout;
|
|
4
|
+
let carouselInner = carouselElement.querySelector('.carousel__inner');
|
|
5
|
+
let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
|
|
6
|
+
let cols = carouselElement.getAttribute('data-cols');
|
|
7
|
+
let smCols = carouselElement.getAttribute('data-sm-cols');
|
|
8
|
+
let mdCols = carouselElement.getAttribute('data-md-cols');
|
|
9
|
+
carouselElement.querySelector('.carousel__controls a').classList.add('active');
|
|
10
|
+
// On scroll we need to make sure the buttons get corrected and the next testimonial is shown
|
|
11
|
+
carouselInner.addEventListener('scroll', function (e) {
|
|
12
|
+
clearTimeout(scrollTimeout);
|
|
13
|
+
scrollTimeout = setTimeout(function () {
|
|
14
|
+
let scrollArea = carouselInner.clientWidth;
|
|
15
|
+
let scrollWidth = carouselInner.scrollWidth;
|
|
16
|
+
let scrollLeft = carouselInner.scrollLeft;
|
|
17
|
+
let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
|
|
18
|
+
let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
|
|
19
|
+
Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
|
|
20
|
+
link.classList.remove('active');
|
|
21
|
+
});
|
|
22
|
+
carouselElement.querySelector('.control-' + targetSlide).classList.add('active');
|
|
23
|
+
// Disable the previous button
|
|
24
|
+
if (targetSlide == 1)
|
|
25
|
+
carouselElement.querySelector('.btn-prev').setAttribute('disabled', 'disabled');
|
|
26
|
+
else
|
|
27
|
+
carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
|
|
28
|
+
// Disable the next button if the last item is in view
|
|
29
|
+
if (carouselInner.scrollLeft + scrollArea > lastItemOffset)
|
|
30
|
+
carouselElement.querySelector('.btn-next').setAttribute('disabled', 'disabled');
|
|
31
|
+
else
|
|
32
|
+
carouselElement.querySelector('.btn-next').removeAttribute('disabled');
|
|
33
|
+
}, 100);
|
|
34
|
+
}, false);
|
|
35
|
+
// when the buttons are used we need to make sure the carousel scrolls to the correct place
|
|
36
|
+
carouselElement.addEventListener('click', function (e) {
|
|
37
|
+
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
38
|
+
if (target.matches('.carousel__controls a')) {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
|
|
41
|
+
link.classList.remove('active');
|
|
42
|
+
});
|
|
43
|
+
target.classList.add('active');
|
|
44
|
+
const el = document.querySelector(target.getAttribute('href'));
|
|
45
|
+
carouselInner.scroll({
|
|
46
|
+
top: 0,
|
|
47
|
+
left: el.offsetLeft,
|
|
48
|
+
behavior: 'smooth'
|
|
49
|
+
});
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}, false);
|
|
54
|
+
carouselElement.addEventListener('click', function (e) {
|
|
55
|
+
for (var target = e.target; target && target != this; target = target.parentNode) {
|
|
56
|
+
if (target.matches('.btn-next, .btn-prev')) {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - carouselInner.clientWidth : carouselInner.scrollLeft + carouselInner.clientWidth;
|
|
59
|
+
carouselInner.scroll({
|
|
60
|
+
top: 0,
|
|
61
|
+
left: scrollTo,
|
|
62
|
+
behavior: 'smooth'
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}, false);
|
|
68
|
+
// Add responsive hide button classes
|
|
69
|
+
if (itemCount == 1)
|
|
70
|
+
carouselElement.classList.add('hide-btns');
|
|
71
|
+
if (smCols >= itemCount)
|
|
72
|
+
carouselElement.classList.add('hide-sm-btns');
|
|
73
|
+
if (mdCols >= itemCount)
|
|
74
|
+
carouselElement.classList.add('hide-md-btns');
|
|
100
75
|
}
|
|
101
|
-
|
|
102
|
-
export default carousel
|
|
76
|
+
export default carousel;
|
|
@@ -1,218 +1,151 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function chart(chartElement,min,max,type) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
// If the value is negative the position below the 0 line
|
|
44
|
-
if(min < 0){
|
|
45
|
-
bottom = Math.abs((min)/(max)*100);
|
|
46
|
-
if(value < 0){
|
|
47
|
-
bottom = bottom - percent;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
td.setAttribute("style",`--bottom:${bottom}%;--percent:${percent}%;`);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
td.innerHTML = `<span data-group="${group}" data-label="${label}">${content}</span>`;
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { ucfirst, unsnake } from './helpers.js';
|
|
3
|
+
function chart(chartElement, min, max, type) {
|
|
4
|
+
let chartKey = chartElement.querySelector('.chart__key');
|
|
5
|
+
let chartYaxis = chartElement.querySelector('.chart__yaxis');
|
|
6
|
+
let chartGuidelines = chartElement.querySelector('.chart__guidelines');
|
|
7
|
+
// Chart key
|
|
8
|
+
if (chartKey && chartKey.childElementCount == 0) {
|
|
9
|
+
createChartKey(chartElement);
|
|
10
|
+
}
|
|
11
|
+
// Y Axis and Guidelines
|
|
12
|
+
if (chartYaxis && chartYaxis.childElementCount == 0) {
|
|
13
|
+
createChartYaxis(chartElement);
|
|
14
|
+
}
|
|
15
|
+
if (chartGuidelines && chartGuidelines.childElementCount == 0) {
|
|
16
|
+
createChartGuidelines(chartElement);
|
|
17
|
+
}
|
|
18
|
+
// Create lines for line graph
|
|
19
|
+
if (type == "line")
|
|
20
|
+
createLines(chartElement, min, max);
|
|
21
|
+
// Create pies
|
|
22
|
+
if (type == "pie")
|
|
23
|
+
createPies(chartElement);
|
|
24
|
+
// Add css vars to cells
|
|
25
|
+
Array.from(chartElement.querySelectorAll('tbody tr')).forEach((tr, index) => {
|
|
26
|
+
let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').innerHTML : '';
|
|
27
|
+
Array.from(tr.querySelectorAll('td[data-numeric]:not([data-numeric="0"]):not(:first-child)')).forEach((td, index) => {
|
|
28
|
+
const value = Number.parseFloat(td.getAttribute('data-numeric'));
|
|
29
|
+
let percent = ((value - min) / (max)) * 100;
|
|
30
|
+
const content = td.innerHTML;
|
|
31
|
+
const label = td.getAttribute('data-label');
|
|
32
|
+
let bottom = 0;
|
|
33
|
+
// If the value is negative the position below the 0 line
|
|
34
|
+
if (min < 0) {
|
|
35
|
+
bottom = Math.abs((min) / (max) * 100);
|
|
36
|
+
if (value < 0) {
|
|
37
|
+
bottom = bottom - percent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
td.setAttribute("style", `--bottom:${bottom}%;--percent:${percent}%;`);
|
|
41
|
+
td.innerHTML = `<span data-group="${group}" data-label="${label}">${content}</span>`;
|
|
42
|
+
});
|
|
54
43
|
});
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export const createChartKey = function(chartElement){
|
|
59
|
-
|
|
60
|
-
let chartKey = chartElement.querySelector('.chart__key');
|
|
61
|
-
|
|
62
|
-
Array.from(chartElement.querySelectorAll('thead th')).forEach((arrayElement, index) => {
|
|
63
|
-
|
|
64
|
-
chartKey.innerHTML += `<div class="key">${arrayElement.innerText}</div>`;
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export const createChartGuidelines = function(chartElement){
|
|
69
|
-
|
|
70
|
-
let chartGuidelines = chartElement.querySelector('.chart__guidelines');
|
|
71
|
-
const max = chartElement.getAttribute('data-max');
|
|
72
|
-
const min = chartElement.getAttribute('data-min');
|
|
73
|
-
|
|
74
|
-
chartGuidelines.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
|
|
75
|
-
chartGuidelines.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export const createChartYaxis = function(chartElement){
|
|
79
|
-
|
|
80
|
-
let chartYaxis = chartElement.querySelector('.chart__yaxis');
|
|
81
|
-
const max = chartElement.getAttribute('data-max');
|
|
82
|
-
const min = chartElement.getAttribute('data-min');
|
|
83
|
-
|
|
84
|
-
chartYaxis.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
|
|
85
|
-
chartYaxis.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
|
|
86
44
|
}
|
|
87
|
-
|
|
45
|
+
export const createChartKey = function (chartElement) {
|
|
46
|
+
let chartKey = chartElement.querySelector('.chart__key');
|
|
47
|
+
Array.from(chartElement.querySelectorAll('thead th')).forEach((arrayElement, index) => {
|
|
48
|
+
chartKey.innerHTML += `<div class="key">${arrayElement.innerText}</div>`;
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
export const createChartGuidelines = function (chartElement) {
|
|
52
|
+
let chartGuidelines = chartElement.querySelector('.chart__guidelines');
|
|
53
|
+
const max = chartElement.getAttribute('data-max');
|
|
54
|
+
const min = chartElement.getAttribute('data-min');
|
|
55
|
+
chartGuidelines.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
|
|
56
|
+
chartGuidelines.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
|
|
57
|
+
};
|
|
58
|
+
export const createChartYaxis = function (chartElement) {
|
|
59
|
+
let chartYaxis = chartElement.querySelector('.chart__yaxis');
|
|
60
|
+
const max = chartElement.getAttribute('data-max');
|
|
61
|
+
const min = chartElement.getAttribute('data-min');
|
|
62
|
+
chartYaxis.innerHTML += `<div style="--value: 0;--percent:0%;" class="axis__point"><span>0</span></div>`;
|
|
63
|
+
chartYaxis.innerHTML += `<div style="--value: ${max};--percent:100%;" class="axis__point"><span>${max}</span></div>`;
|
|
64
|
+
};
|
|
88
65
|
function getCoordinatesForPercent(percent) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
66
|
+
const x = Math.cos(2 * Math.PI * percent);
|
|
67
|
+
const y = Math.sin(2 * Math.PI * percent);
|
|
68
|
+
return [x * 100, y * 100];
|
|
92
69
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
70
|
+
export const createPies = function (chartElement) {
|
|
71
|
+
let returnString = '';
|
|
72
|
+
let pieWrapper = chartElement.querySelector('.pies');
|
|
73
|
+
Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
|
|
74
|
+
let paths = '';
|
|
75
|
+
let tooltips = '';
|
|
76
|
+
let cumulativePercent = 0;
|
|
77
|
+
let total = 0;
|
|
78
|
+
let titleKey = item.querySelectorAll('td')[0];
|
|
79
|
+
let title = titleKey.innerHTML;
|
|
80
|
+
Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
|
|
81
|
+
if (subindex != 0) {
|
|
82
|
+
let value = cell.getAttribute('data-numeric');
|
|
83
|
+
value = value.replace('£', '');
|
|
84
|
+
value = value.replace('%', '');
|
|
85
|
+
value = Number.parseInt(value);
|
|
86
|
+
total += value;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
|
|
90
|
+
if (subindex != 0) {
|
|
91
|
+
let value = cell.getAttribute('data-numeric');
|
|
92
|
+
value = value.replace('£', '');
|
|
93
|
+
value = value.replace('%', '');
|
|
94
|
+
value = Number.parseInt(value);
|
|
95
|
+
let percent = value / total;
|
|
96
|
+
//lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
|
|
97
|
+
const [startX, startY] = getCoordinatesForPercent(cumulativePercent);
|
|
98
|
+
// each slice starts where the last slice ended, so keep a cumulative percent
|
|
99
|
+
cumulativePercent += percent;
|
|
100
|
+
const [endX, endY] = getCoordinatesForPercent(cumulativePercent);
|
|
101
|
+
// if the slice is more than 50%, take the large arc (the long way around)
|
|
102
|
+
const largeArcFlag = percent > .5 ? 1 : 0;
|
|
103
|
+
// create an array and join it just for code readability
|
|
104
|
+
const pathData = [
|
|
105
|
+
`M ${startX} ${startY}`,
|
|
106
|
+
`A 100 100 0 ${largeArcFlag} 1 ${endX} ${endY}`,
|
|
107
|
+
`L 0 0`, // Line
|
|
108
|
+
].join(' ');
|
|
109
|
+
paths += `<path d="${pathData}"></path>`;
|
|
110
|
+
tooltips += `<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0"><span class="total d-block">${ucfirst(unsnake(title))}</span> ${ucfirst(unsnake(cell.getAttribute('data-label')))}<br/> ${cell.innerHTML}</span></div></foreignObject>`;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
returnString += `<div class="pie"><svg viewBox="-105 -105 210 210" style="transform: rotate(-90deg)" preserveAspectRatio="none">${paths}<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0">${title}</span></div></foreignObject>${tooltips}</svg></div>`;
|
|
123
114
|
});
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
//lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
|
|
138
|
-
const [startX, startY] = getCoordinatesForPercent(cumulativePercent);
|
|
139
|
-
|
|
140
|
-
// each slice starts where the last slice ended, so keep a cumulative percent
|
|
141
|
-
cumulativePercent += percent;
|
|
142
|
-
|
|
143
|
-
const [endX, endY] = getCoordinatesForPercent(cumulativePercent);
|
|
144
|
-
|
|
145
|
-
// if the slice is more than 50%, take the large arc (the long way around)
|
|
146
|
-
const largeArcFlag = percent > .5 ? 1 : 0;
|
|
147
|
-
|
|
148
|
-
// create an array and join it just for code readability
|
|
149
|
-
const pathData = [
|
|
150
|
-
`M ${startX} ${startY}`, // Move
|
|
151
|
-
`A 100 100 0 ${largeArcFlag} 1 ${endX} ${endY}`, // Arc
|
|
152
|
-
`L 0 0`, // Line
|
|
153
|
-
].join(' ');
|
|
154
|
-
|
|
155
|
-
paths += `<path d="${pathData}"></path>`;
|
|
156
|
-
tooltips += `<foreignObject x="-70" y="-70" width="140" height="140" style="transform: rotate(90deg)"><div><span class="h5 mb-0"><span class="total d-block">${ucfirst(unsnake(title))}</span> ${ucfirst(unsnake(cell.getAttribute('data-label')))}<br/> ${cell.innerHTML}</span></div></foreignObject>`;
|
|
157
|
-
}
|
|
115
|
+
pieWrapper.innerHTML = returnString;
|
|
116
|
+
};
|
|
117
|
+
export const createLines = function (chartElement, min, max) {
|
|
118
|
+
let returnString = '';
|
|
119
|
+
let linesWrapper = chartElement.querySelector('.lines');
|
|
120
|
+
let items = Array.from(chartElement.querySelectorAll('tbody tr'));
|
|
121
|
+
let lines = Array();
|
|
122
|
+
let spacer = 200 / (items.length - 1);
|
|
123
|
+
// Creates the lines array from the fields array
|
|
124
|
+
Array.from(chartElement.querySelectorAll('thead th')).forEach((field, index) => {
|
|
125
|
+
if (index != 0) {
|
|
126
|
+
lines[index - 1] = '';
|
|
127
|
+
}
|
|
158
128
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
let lines = Array();
|
|
174
|
-
let spacer = 200/(items.length - 1);
|
|
175
|
-
|
|
176
|
-
// Creates the lines array from the fields array
|
|
177
|
-
Array.from(chartElement.querySelectorAll('thead th')).forEach((field, index) => {
|
|
178
|
-
|
|
179
|
-
if(index != 0){
|
|
180
|
-
|
|
181
|
-
lines[index-1] = '';
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// populate the lines array from the items array
|
|
186
|
-
Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
|
|
187
|
-
|
|
188
|
-
Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
|
|
189
|
-
|
|
190
|
-
if(subindex != 0){
|
|
191
|
-
|
|
192
|
-
let value = cell.getAttribute('data-numeric');
|
|
193
|
-
|
|
194
|
-
value = value.replace('£','');
|
|
195
|
-
value = value.replace('%','');
|
|
196
|
-
value = Number.parseFloat(value) - min;
|
|
197
|
-
|
|
198
|
-
const percent = (value/max) * 100;
|
|
199
|
-
|
|
200
|
-
let command = index == 0 ? 'M' : 'L';
|
|
201
|
-
|
|
202
|
-
lines[subindex-1] += `${command} ${spacer * index} ${100-percent} `;
|
|
203
|
-
}
|
|
129
|
+
// populate the lines array from the items array
|
|
130
|
+
Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
|
|
131
|
+
Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
|
|
132
|
+
if (subindex != 0) {
|
|
133
|
+
let value = cell.getAttribute('data-numeric');
|
|
134
|
+
value = value.replace('£', '');
|
|
135
|
+
value = value.replace('%', '');
|
|
136
|
+
value = Number.parseFloat(value) - min;
|
|
137
|
+
const percent = (value / max) * 100;
|
|
138
|
+
let command = index == 0 ? 'M' : 'L';
|
|
139
|
+
lines[subindex - 1] += `${command} ${spacer * index} ${100 - percent} `;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
204
142
|
});
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
lines.forEach((line, index) => {
|
|
208
|
-
|
|
209
|
-
returnString += `
|
|
143
|
+
lines.forEach((line, index) => {
|
|
144
|
+
returnString += `
|
|
210
145
|
<svg viewBox="0 0 200 100" class="line" preserveAspectRatio="none">
|
|
211
146
|
<path fill="none" d="${line}"></path>
|
|
212
|
-
</svg
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
export default chart
|
|
147
|
+
</svg>`;
|
|
148
|
+
});
|
|
149
|
+
linesWrapper.innerHTML = returnString;
|
|
150
|
+
};
|
|
151
|
+
export default chart;
|