@iamproperty/components 3.0.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 (161) 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 -0
  19. package/assets/js/modules/form.js +168 -159
  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 -0
  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 +256 -242
  28. package/assets/js/scripts.bundle.js.map +1 -1
  29. package/assets/js/scripts.bundle.min.js +2 -2
  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 -250
  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 -918
  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 -209
  63. package/assets/sass/elements/card.scss +289 -177
  64. package/assets/sass/elements/container.scss +236 -225
  65. package/assets/sass/elements/forms.scss +262 -194
  66. package/assets/sass/elements/links.scss +97 -96
  67. package/assets/sass/elements/lists.scss +159 -112
  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 -72
  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 -106
  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 +393 -379
  88. package/dist/components.umd.js +16 -16
  89. package/dist/style.css +1 -1
  90. package/package.json +96 -108
  91. package/src/.DS_Store +0 -0
  92. package/src/components/Accordion/Accordion.screenshot.vue +57 -57
  93. package/src/components/Accordion/Accordion.spec.js +63 -63
  94. package/src/components/Accordion/Accordion.vue +22 -22
  95. package/src/components/Accordion/AccordionItem.vue +52 -52
  96. package/src/components/Accordion/README.md +34 -34
  97. package/src/components/Alert/Alert.spec.js +49 -49
  98. package/src/components/Alert/Alert.vue +39 -39
  99. package/src/components/Alert/README.md +28 -28
  100. package/src/components/Banner/Banner.spec.js +28 -28
  101. package/src/components/Banner/Banner.vue +38 -38
  102. package/src/components/Banner/README.md +23 -23
  103. package/src/components/CardDeck/CardDeck.spec.js +99 -99
  104. package/src/components/CardDeck/CardDeck.vue +77 -77
  105. package/src/components/CardDeck/README.md +24 -24
  106. package/src/components/Carousel/Carousel.spec.js +45 -45
  107. package/src/components/Carousel/Carousel.vue +85 -85
  108. package/src/components/Carousel/README.md +19 -19
  109. package/src/components/Chart/Chart.spec.js +201 -201
  110. package/src/components/Chart/Chart.vue +88 -88
  111. package/src/components/Chart/README.md +17 -17
  112. package/src/components/Drawer/Drawer.vue +53 -53
  113. package/src/components/Drawer/README.md +22 -22
  114. package/src/components/Header/Header.spec.js +33 -33
  115. package/src/components/Header/Header.vue +38 -38
  116. package/src/components/Header/README.md +27 -27
  117. package/src/components/Modal/Modal.spec.js +22 -22
  118. package/src/components/Modal/Modal.vue +43 -43
  119. package/src/components/Modal/README.md +19 -19
  120. package/src/components/Nav/Nav.spec.js +35 -35
  121. package/src/components/Nav/Nav.vue +215 -215
  122. package/src/components/Nav/README.md +22 -22
  123. package/src/components/NoteFeed/NoteFeed.vue +79 -79
  124. package/src/components/NoteFeed/README.md +16 -16
  125. package/src/components/PropertySearchbar/PropertySearchbar.vue +204 -204
  126. package/src/components/PropertySearchbar/README.md +25 -25
  127. package/src/components/Snapshot/README.md +20 -20
  128. package/src/components/Snapshot/Snapshot.vue +32 -32
  129. package/src/components/Stepper/README.md +32 -32
  130. package/src/components/Stepper/Step.vue +28 -28
  131. package/src/components/Stepper/Stepper.spec.js +99 -99
  132. package/src/components/Stepper/Stepper.vue +33 -33
  133. package/src/components/Tabs/README.md +27 -27
  134. package/src/components/Tabs/Tab.vue +32 -32
  135. package/src/components/Tabs/Tabs.vue +77 -77
  136. package/src/components/Testimonial/README.md +25 -25
  137. package/src/components/Testimonial/Testimonial.spec.js +57 -57
  138. package/src/components/Testimonial/Testimonial.vue +60 -60
  139. package/src/components/Timeline/README.md +18 -18
  140. package/src/components/Timeline/Timeline.spec.js +17 -17
  141. package/src/components/Timeline/Timeline.vue +24 -24
  142. package/src/elements/Card/Card.vue +122 -113
  143. package/src/elements/Card/README.md +24 -24
  144. package/src/elements/FileUploads/FileUploads.vue +48 -48
  145. package/src/elements/FileUploads/README.md +24 -24
  146. package/src/elements/Input/Input.vue +272 -268
  147. package/src/elements/Input/README.md +19 -19
  148. package/src/elements/Table/README.md +62 -62
  149. package/src/elements/Table/Table.spec.js +90 -90
  150. package/src/elements/Table/Table.vue +129 -129
  151. package/src/foundations/Icon/Icon.spec.js +24 -24
  152. package/src/foundations/Icon/Icon.vue +24 -24
  153. package/src/foundations/Icon/README.md +11 -11
  154. package/src/foundations/Logo/Logo.spec.js +56 -56
  155. package/src/foundations/Logo/Logo.vue +39 -39
  156. package/src/foundations/Logo/README.md +20 -20
  157. package/src/foundations/YoutubeVideo/README.md +11 -11
  158. package/src/foundations/YoutubeVideo/YoutubeVideo.vue +24 -24
  159. package/src/helpers/strings.js +12 -12
  160. package/src/index.js +27 -27
  161. 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