@iamproperty/components 3.1.0 → 3.2.0

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.
Files changed (160) hide show
  1. package/README.md +141 -16
  2. package/assets/.DS_Store +0 -0
  3. package/assets/css/core.min.css +1 -1
  4. package/assets/css/core.min.css.map +1 -1
  5. package/assets/css/email.min.css +1 -1
  6. package/assets/css/email.min.css.map +1 -1
  7. package/assets/css/error.min.css +1 -1
  8. package/assets/css/error.min.css.map +1 -1
  9. package/assets/css/style.min.css +1 -1
  10. package/assets/css/style.min.css.map +1 -1
  11. package/assets/favicons/manifest.json +31 -31
  12. package/assets/js/main.js +57 -57
  13. package/assets/js/modules/accordion.js +32 -32
  14. package/assets/js/modules/alert.js +56 -56
  15. package/assets/js/modules/carousel.js +101 -101
  16. package/assets/js/modules/chart.js +218 -218
  17. package/assets/js/modules/drawer.js +15 -15
  18. package/assets/js/modules/file-upload.js +48 -48
  19. package/assets/js/modules/form.js +168 -168
  20. package/assets/js/modules/helpers.js +119 -119
  21. package/assets/js/modules/modal.js +89 -89
  22. package/assets/js/modules/nav.js +28 -28
  23. package/assets/js/modules/orderablelist.js +122 -122
  24. package/assets/js/modules/table.js +585 -585
  25. package/assets/js/modules/testimonial.js +82 -82
  26. package/assets/js/modules/youtubevideo.js +145 -145
  27. package/assets/js/scripts.bundle.js +220 -214
  28. package/assets/js/scripts.bundle.js.map +1 -1
  29. package/assets/js/scripts.bundle.min.js +1 -1
  30. package/assets/js/scripts.bundle.min.js.map +1 -1
  31. package/assets/sass/_components.scss +14 -14
  32. package/assets/sass/_corefiles.scss +40 -40
  33. package/assets/sass/_fonts.scss +16 -16
  34. package/assets/sass/_forms.scss +9 -9
  35. package/assets/sass/_func.scss +12 -12
  36. package/assets/sass/_functions/functions.scss +141 -141
  37. package/assets/sass/_functions/mixins.scss +170 -170
  38. package/assets/sass/_functions/utilities.scss +143 -143
  39. package/assets/sass/_functions/variables.scss +467 -467
  40. package/assets/sass/_print.scss +61 -61
  41. package/assets/sass/_tests/colours.spec.scss +44 -44
  42. package/assets/sass/_tests/func.spec.scss +232 -232
  43. package/assets/sass/_tests/mixins.spec.scss +194 -194
  44. package/assets/sass/_tests/sass.spec.js +9 -9
  45. package/assets/sass/_tests/typography.spec.scss +35 -35
  46. package/assets/sass/components/accordion.scss +197 -197
  47. package/assets/sass/components/alert.scss +98 -98
  48. package/assets/sass/components/cardDeck.scss +107 -107
  49. package/assets/sass/components/carousel.scss +234 -234
  50. package/assets/sass/components/charts.scss +569 -569
  51. package/assets/sass/components/drawer.scss +46 -46
  52. package/assets/sass/components/header.scss +63 -63
  53. package/assets/sass/components/modal.scss +136 -136
  54. package/assets/sass/components/nav.scss +960 -960
  55. package/assets/sass/components/property-searchbar.scss +143 -143
  56. package/assets/sass/components/snapshot.scss +70 -70
  57. package/assets/sass/components/stepper.scss +164 -164
  58. package/assets/sass/components/tabs.scss +87 -87
  59. package/assets/sass/components/testimonial.scss +132 -132
  60. package/assets/sass/components/timeline.scss +95 -95
  61. package/assets/sass/core.scss +6 -6
  62. package/assets/sass/elements/buttons.scss +251 -251
  63. package/assets/sass/elements/card.scss +288 -288
  64. package/assets/sass/elements/container.scss +236 -236
  65. package/assets/sass/elements/forms.scss +261 -261
  66. package/assets/sass/elements/links.scss +97 -97
  67. package/assets/sass/elements/lists.scss +159 -159
  68. package/assets/sass/elements/panel.scss +161 -161
  69. package/assets/sass/elements/tables.scss +290 -290
  70. package/assets/sass/elements/tooltips.scss +84 -84
  71. package/assets/sass/elements/type.scss +136 -136
  72. package/assets/sass/email.scss +65 -65
  73. package/assets/sass/error.scss +4 -4
  74. package/assets/sass/foundations/brand.scss +76 -72
  75. package/assets/sass/foundations/circles.scss +74 -74
  76. package/assets/sass/foundations/icons.scss +80 -80
  77. package/assets/sass/foundations/media.scss +50 -50
  78. package/assets/sass/foundations/reboot.scss +130 -130
  79. package/assets/sass/foundations/root.scss +125 -125
  80. package/assets/sass/main.scss +7 -7
  81. package/assets/svg/icons.svg +598 -598
  82. package/assets/svg/logo.svg +49 -43
  83. package/assets/ts/main.js +56 -56
  84. package/assets/ts/main.ts +68 -68
  85. package/assets/ts/modules/accordion.js +32 -32
  86. package/assets/ts/modules/accordion.ts +43 -43
  87. package/dist/components.es.js +381 -381
  88. package/dist/components.umd.js +16 -16
  89. package/package.json +96 -108
  90. package/src/.DS_Store +0 -0
  91. package/src/components/Accordion/Accordion.screenshot.vue +57 -57
  92. package/src/components/Accordion/Accordion.spec.js +63 -63
  93. package/src/components/Accordion/Accordion.vue +22 -22
  94. package/src/components/Accordion/AccordionItem.vue +52 -52
  95. package/src/components/Accordion/README.md +34 -34
  96. package/src/components/Alert/Alert.spec.js +49 -49
  97. package/src/components/Alert/Alert.vue +39 -39
  98. package/src/components/Alert/README.md +28 -28
  99. package/src/components/Banner/Banner.spec.js +28 -28
  100. package/src/components/Banner/Banner.vue +38 -38
  101. package/src/components/Banner/README.md +23 -23
  102. package/src/components/CardDeck/CardDeck.spec.js +99 -99
  103. package/src/components/CardDeck/CardDeck.vue +77 -77
  104. package/src/components/CardDeck/README.md +24 -24
  105. package/src/components/Carousel/Carousel.spec.js +45 -45
  106. package/src/components/Carousel/Carousel.vue +85 -85
  107. package/src/components/Carousel/README.md +19 -19
  108. package/src/components/Chart/Chart.spec.js +201 -201
  109. package/src/components/Chart/Chart.vue +88 -88
  110. package/src/components/Chart/README.md +17 -17
  111. package/src/components/Drawer/Drawer.vue +53 -53
  112. package/src/components/Drawer/README.md +22 -22
  113. package/src/components/Header/Header.spec.js +33 -33
  114. package/src/components/Header/Header.vue +38 -38
  115. package/src/components/Header/README.md +27 -27
  116. package/src/components/Modal/Modal.spec.js +22 -22
  117. package/src/components/Modal/Modal.vue +43 -43
  118. package/src/components/Modal/README.md +19 -19
  119. package/src/components/Nav/Nav.spec.js +35 -35
  120. package/src/components/Nav/Nav.vue +215 -215
  121. package/src/components/Nav/README.md +22 -22
  122. package/src/components/NoteFeed/NoteFeed.vue +79 -79
  123. package/src/components/NoteFeed/README.md +16 -16
  124. package/src/components/PropertySearchbar/PropertySearchbar.vue +204 -204
  125. package/src/components/PropertySearchbar/README.md +25 -25
  126. package/src/components/Snapshot/README.md +20 -20
  127. package/src/components/Snapshot/Snapshot.vue +32 -32
  128. package/src/components/Stepper/README.md +32 -32
  129. package/src/components/Stepper/Step.vue +28 -28
  130. package/src/components/Stepper/Stepper.spec.js +99 -99
  131. package/src/components/Stepper/Stepper.vue +33 -33
  132. package/src/components/Tabs/README.md +27 -27
  133. package/src/components/Tabs/Tab.vue +32 -32
  134. package/src/components/Tabs/Tabs.vue +77 -77
  135. package/src/components/Testimonial/README.md +25 -25
  136. package/src/components/Testimonial/Testimonial.spec.js +57 -57
  137. package/src/components/Testimonial/Testimonial.vue +60 -60
  138. package/src/components/Timeline/README.md +18 -18
  139. package/src/components/Timeline/Timeline.spec.js +17 -17
  140. package/src/components/Timeline/Timeline.vue +24 -24
  141. package/src/elements/Card/Card.vue +122 -122
  142. package/src/elements/Card/README.md +24 -24
  143. package/src/elements/FileUploads/FileUploads.vue +48 -48
  144. package/src/elements/FileUploads/README.md +24 -24
  145. package/src/elements/Input/Input.vue +272 -272
  146. package/src/elements/Input/README.md +19 -19
  147. package/src/elements/Table/README.md +62 -62
  148. package/src/elements/Table/Table.spec.js +90 -90
  149. package/src/elements/Table/Table.vue +129 -129
  150. package/src/foundations/Icon/Icon.spec.js +24 -24
  151. package/src/foundations/Icon/Icon.vue +24 -24
  152. package/src/foundations/Icon/README.md +11 -11
  153. package/src/foundations/Logo/Logo.spec.js +56 -56
  154. package/src/foundations/Logo/Logo.vue +39 -39
  155. package/src/foundations/Logo/README.md +20 -20
  156. package/src/foundations/YoutubeVideo/README.md +11 -11
  157. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +24 -24
  158. package/src/helpers/strings.js +12 -12
  159. package/src/index.js +27 -27
  160. package/src/vue-shim.d.ts +6 -6
@@ -1,102 +1,102 @@
1
- function carousel(carouselElement) {
2
-
3
- var scrollTimeout;
4
-
5
- let carouselInner = carouselElement.querySelector('.carousel__inner');
6
- let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
7
- let cols = carouselElement.getAttribute('data-cols');
8
- let smCols = carouselElement.getAttribute('data-sm-cols');
9
- let mdCols = carouselElement.getAttribute('data-md-cols');
10
-
11
- carouselElement.querySelector('.carousel__controls a').classList.add('active');
12
-
13
- // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
14
- carouselInner.addEventListener('scroll', function(e){
15
- clearTimeout(scrollTimeout);
16
- scrollTimeout = setTimeout(function(){
17
-
18
- let scrollArea = carouselInner.clientWidth;
19
- let scrollWidth = carouselInner.scrollWidth;
20
- let scrollLeft = carouselInner.scrollLeft;
21
- let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
22
- let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
23
-
24
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
25
- link.classList.remove('active');
26
- });
27
-
28
- carouselElement.querySelector('.control-'+targetSlide).classList.add('active');
29
-
30
- // Disable the previous button
31
- if(targetSlide == 1)
32
- carouselElement.querySelector('.btn-prev').setAttribute('disabled','disabled');
33
- else
34
- carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
35
-
36
- // Disable the next button if the last item is in view
37
- if(carouselInner.scrollLeft + scrollArea > lastItemOffset)
38
- carouselElement.querySelector('.btn-next').setAttribute('disabled','disabled');
39
- else
40
- carouselElement.querySelector('.btn-next').removeAttribute('disabled');
41
-
42
- }, 100);
43
-
44
- }, false);
45
-
46
- // when the buttons are used we need to make sure the carousel scrolls to the correct place
47
- carouselElement.addEventListener('click', function(e){
48
-
49
- for (var target = e.target; target && target != this; target = target.parentNode) {
50
- if (target.matches('.carousel__controls a')) {
51
-
52
- e.preventDefault();
53
-
54
- Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
55
- link.classList.remove('active');
56
- });
57
- target.classList.add('active');
58
-
59
- const el = document.querySelector(target.getAttribute('href'));
60
-
61
- carouselInner.scroll({
62
- top: 0,
63
- left: el.offsetLeft,
64
- behavior: 'smooth'
65
- });
66
-
67
- break;
68
- }
69
- }
70
- }, false);
71
-
72
- carouselElement.addEventListener('click', function(e){
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');
100
- }
101
-
1
+ function carousel(carouselElement) {
2
+
3
+ var scrollTimeout;
4
+
5
+ let carouselInner = carouselElement.querySelector('.carousel__inner');
6
+ let itemCount = carouselElement.querySelectorAll('.carousel__item').length;
7
+ let cols = carouselElement.getAttribute('data-cols');
8
+ let smCols = carouselElement.getAttribute('data-sm-cols');
9
+ let mdCols = carouselElement.getAttribute('data-md-cols');
10
+
11
+ carouselElement.querySelector('.carousel__controls a').classList.add('active');
12
+
13
+ // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
14
+ carouselInner.addEventListener('scroll', function(e){
15
+ clearTimeout(scrollTimeout);
16
+ scrollTimeout = setTimeout(function(){
17
+
18
+ let scrollArea = carouselInner.clientWidth;
19
+ let scrollWidth = carouselInner.scrollWidth;
20
+ let scrollLeft = carouselInner.scrollLeft;
21
+ let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
22
+ let lastItemOffset = carouselElement.querySelector('.carousel__item:last-child').offsetLeft;
23
+
24
+ Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
25
+ link.classList.remove('active');
26
+ });
27
+
28
+ carouselElement.querySelector('.control-'+targetSlide).classList.add('active');
29
+
30
+ // Disable the previous button
31
+ if(targetSlide == 1)
32
+ carouselElement.querySelector('.btn-prev').setAttribute('disabled','disabled');
33
+ else
34
+ carouselElement.querySelector('.btn-prev').removeAttribute('disabled');
35
+
36
+ // Disable the next button if the last item is in view
37
+ if(carouselInner.scrollLeft + scrollArea > lastItemOffset)
38
+ carouselElement.querySelector('.btn-next').setAttribute('disabled','disabled');
39
+ else
40
+ carouselElement.querySelector('.btn-next').removeAttribute('disabled');
41
+
42
+ }, 100);
43
+
44
+ }, false);
45
+
46
+ // when the buttons are used we need to make sure the carousel scrolls to the correct place
47
+ carouselElement.addEventListener('click', function(e){
48
+
49
+ for (var target = e.target; target && target != this; target = target.parentNode) {
50
+ if (target.matches('.carousel__controls a')) {
51
+
52
+ e.preventDefault();
53
+
54
+ Array.from(carouselElement.querySelectorAll('.carousel__controls a')).forEach((link, index) => {
55
+ link.classList.remove('active');
56
+ });
57
+ target.classList.add('active');
58
+
59
+ const el = document.querySelector(target.getAttribute('href'));
60
+
61
+ carouselInner.scroll({
62
+ top: 0,
63
+ left: el.offsetLeft,
64
+ behavior: 'smooth'
65
+ });
66
+
67
+ break;
68
+ }
69
+ }
70
+ }, false);
71
+
72
+ carouselElement.addEventListener('click', function(e){
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');
100
+ }
101
+
102
102
  export default carousel
@@ -1,218 +1,218 @@
1
- import { ucfirst, unsnake } from './helpers'
2
-
3
- function chart(chartElement,min,max,type) {
4
-
5
- let chartKey = chartElement.querySelector('.chart__key');
6
- let chartYaxis = chartElement.querySelector('.chart__yaxis');
7
- let chartGuidelines = chartElement.querySelector('.chart__guidelines');
8
-
9
- // Chart key
10
- if(chartKey && chartKey.childElementCount == 0){
11
- createChartKey(chartElement);
12
- }
13
-
14
- // Y Axis and Guidelines
15
- if(chartYaxis && chartYaxis.childElementCount == 0){
16
- createChartYaxis(chartElement);
17
- }
18
- if(chartGuidelines && chartGuidelines.childElementCount == 0){
19
- createChartGuidelines(chartElement);
20
- }
21
-
22
- // Create lines for line graph
23
- if(type == "line")
24
- createLines(chartElement,min,max);
25
-
26
- // Create pies
27
- if(type == "pie")
28
- createPies(chartElement);
29
-
30
- // Add css vars to cells
31
- Array.from(chartElement.querySelectorAll('tbody tr')).forEach((tr, index) => {
32
-
33
- let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').innerHTML : '';
34
-
35
- Array.from(tr.querySelectorAll('td[data-numeric]:not([data-numeric="0"]):not(:first-child)')).forEach((td, index) => {
36
-
37
- const value = Number.parseFloat(td.getAttribute('data-numeric'));
38
- let percent = ((value - min)/(max)) * 100;
39
- const content = td.innerHTML;
40
- const label = td.getAttribute('data-label');
41
- let bottom = 0;
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>`;
54
- });
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
- }
87
-
88
- function getCoordinatesForPercent(percent) {
89
- const x = Math.cos(2 * Math.PI * percent);
90
- const y = Math.sin(2 * Math.PI * percent);
91
- return [x*100, y*100];
92
- }
93
-
94
- export const createPies = function(chartElement){
95
-
96
- let returnString = '';
97
- let pieWrapper = chartElement.querySelector('.pies');
98
-
99
- Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
100
-
101
- let paths = '';
102
- let tooltips = '';
103
-
104
- let cumulativePercent = 0;
105
-
106
- let total = 0;
107
-
108
- let titleKey = item.querySelectorAll('td')[0]
109
- let title = titleKey.innerHTML;
110
-
111
- Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
112
-
113
- if(subindex != 0){
114
-
115
- let value = cell.getAttribute('data-numeric');
116
-
117
- value = value.replace('£','');
118
- value = value.replace('%','');
119
- value = Number.parseInt(value);
120
-
121
- total += value;
122
- }
123
- });
124
-
125
- Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
126
-
127
- if(subindex != 0){
128
-
129
- let value = cell.getAttribute('data-numeric');
130
-
131
- value = value.replace('£','');
132
- value = value.replace('%','');
133
- value = Number.parseInt(value);
134
-
135
- let percent = value/total;
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
- }
158
- });
159
-
160
- 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>`
161
- });
162
-
163
- pieWrapper.innerHTML = returnString;
164
- }
165
-
166
- export const createLines = function(chartElement,min,max){
167
-
168
- let returnString = '';
169
- let linesWrapper = chartElement.querySelector('.lines');
170
-
171
- let items = Array.from(chartElement.querySelectorAll('tbody tr'));
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
- }
204
- });
205
- });
206
-
207
- lines.forEach((line, index) => {
208
-
209
- returnString += `
210
- <svg viewBox="0 0 200 100" class="line" preserveAspectRatio="none">
211
- <path fill="none" d="${line}"></path>
212
- </svg>`
213
- });
214
-
215
- linesWrapper.innerHTML = returnString;
216
- }
217
-
218
- export default chart
1
+ import { ucfirst, unsnake } from './helpers'
2
+
3
+ function chart(chartElement,min,max,type) {
4
+
5
+ let chartKey = chartElement.querySelector('.chart__key');
6
+ let chartYaxis = chartElement.querySelector('.chart__yaxis');
7
+ let chartGuidelines = chartElement.querySelector('.chart__guidelines');
8
+
9
+ // Chart key
10
+ if(chartKey && chartKey.childElementCount == 0){
11
+ createChartKey(chartElement);
12
+ }
13
+
14
+ // Y Axis and Guidelines
15
+ if(chartYaxis && chartYaxis.childElementCount == 0){
16
+ createChartYaxis(chartElement);
17
+ }
18
+ if(chartGuidelines && chartGuidelines.childElementCount == 0){
19
+ createChartGuidelines(chartElement);
20
+ }
21
+
22
+ // Create lines for line graph
23
+ if(type == "line")
24
+ createLines(chartElement,min,max);
25
+
26
+ // Create pies
27
+ if(type == "pie")
28
+ createPies(chartElement);
29
+
30
+ // Add css vars to cells
31
+ Array.from(chartElement.querySelectorAll('tbody tr')).forEach((tr, index) => {
32
+
33
+ let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').innerHTML : '';
34
+
35
+ Array.from(tr.querySelectorAll('td[data-numeric]:not([data-numeric="0"]):not(:first-child)')).forEach((td, index) => {
36
+
37
+ const value = Number.parseFloat(td.getAttribute('data-numeric'));
38
+ let percent = ((value - min)/(max)) * 100;
39
+ const content = td.innerHTML;
40
+ const label = td.getAttribute('data-label');
41
+ let bottom = 0;
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>`;
54
+ });
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
+ }
87
+
88
+ function getCoordinatesForPercent(percent) {
89
+ const x = Math.cos(2 * Math.PI * percent);
90
+ const y = Math.sin(2 * Math.PI * percent);
91
+ return [x*100, y*100];
92
+ }
93
+
94
+ export const createPies = function(chartElement){
95
+
96
+ let returnString = '';
97
+ let pieWrapper = chartElement.querySelector('.pies');
98
+
99
+ Array.from(chartElement.querySelectorAll('tbody tr')).forEach((item, index) => {
100
+
101
+ let paths = '';
102
+ let tooltips = '';
103
+
104
+ let cumulativePercent = 0;
105
+
106
+ let total = 0;
107
+
108
+ let titleKey = item.querySelectorAll('td')[0]
109
+ let title = titleKey.innerHTML;
110
+
111
+ Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
112
+
113
+ if(subindex != 0){
114
+
115
+ let value = cell.getAttribute('data-numeric');
116
+
117
+ value = value.replace('£','');
118
+ value = value.replace('%','');
119
+ value = Number.parseInt(value);
120
+
121
+ total += value;
122
+ }
123
+ });
124
+
125
+ Array.from(item.querySelectorAll('td')).forEach((cell, subindex) => {
126
+
127
+ if(subindex != 0){
128
+
129
+ let value = cell.getAttribute('data-numeric');
130
+
131
+ value = value.replace('£','');
132
+ value = value.replace('%','');
133
+ value = Number.parseInt(value);
134
+
135
+ let percent = value/total;
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
+ }
158
+ });
159
+
160
+ 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>`
161
+ });
162
+
163
+ pieWrapper.innerHTML = returnString;
164
+ }
165
+
166
+ export const createLines = function(chartElement,min,max){
167
+
168
+ let returnString = '';
169
+ let linesWrapper = chartElement.querySelector('.lines');
170
+
171
+ let items = Array.from(chartElement.querySelectorAll('tbody tr'));
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
+ }
204
+ });
205
+ });
206
+
207
+ lines.forEach((line, index) => {
208
+
209
+ returnString += `
210
+ <svg viewBox="0 0 200 100" class="line" preserveAspectRatio="none">
211
+ <path fill="none" d="${line}"></path>
212
+ </svg>`
213
+ });
214
+
215
+ linesWrapper.innerHTML = returnString;
216
+ }
217
+
218
+ export default chart