@watermarkinsights/ripple 3.0.1-0 → 3.0.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 (224) hide show
  1. package/dist/{ripple/functions-316c1b23.js → cjs/functions-e3f5ae65.js} +188 -2391
  2. package/dist/cjs/global-1e540de6.js +38 -0
  3. package/dist/cjs/http-service-9e8c4dd5.js +57 -0
  4. package/dist/cjs/index-d930307d.js +1392 -0
  5. package/dist/cjs/index.cjs.js +2 -0
  6. package/dist/cjs/interfaces-30a74c1f.js +35 -0
  7. package/dist/cjs/loader.cjs.js +22 -0
  8. package/dist/cjs/priv-chart-popover.cjs.entry.js +89 -0
  9. package/dist/cjs/priv-datepicker.cjs.entry.js +672 -0
  10. package/dist/cjs/priv-navigator-button.cjs.entry.js +29 -0
  11. package/dist/cjs/priv-navigator-item.cjs.entry.js +34 -0
  12. package/dist/cjs/ripple.cjs.js +20 -0
  13. package/dist/cjs/wm-action-menu_2.cjs.entry.js +318 -0
  14. package/dist/cjs/wm-button.cjs.entry.js +152 -0
  15. package/dist/cjs/wm-chart-slice.cjs.entry.js +22 -0
  16. package/dist/cjs/wm-chart.cjs.entry.js +508 -0
  17. package/dist/cjs/wm-datepicker.cjs.entry.js +257 -0
  18. package/dist/cjs/wm-input.cjs.entry.js +110 -0
  19. package/dist/cjs/wm-modal-footer.cjs.entry.js +43 -0
  20. package/dist/cjs/wm-modal-header.cjs.entry.js +45 -0
  21. package/dist/cjs/wm-modal.cjs.entry.js +149 -0
  22. package/dist/cjs/wm-navigator.cjs.entry.js +279 -0
  23. package/dist/cjs/wm-network-uploader.cjs.entry.js +431 -0
  24. package/dist/cjs/wm-option_2.cjs.entry.js +483 -0
  25. package/dist/cjs/wm-pagination.cjs.entry.js +176 -0
  26. package/dist/cjs/wm-search.cjs.entry.js +231 -0
  27. package/dist/cjs/wm-snackbar.cjs.entry.js +160 -0
  28. package/dist/cjs/wm-tab-item_3.cjs.entry.js +316 -0
  29. package/dist/cjs/wm-tag-input.cjs.entry.js +538 -0
  30. package/dist/cjs/wm-timepicker.cjs.entry.js +386 -0
  31. package/dist/cjs/wm-toggletip.cjs.entry.js +128 -0
  32. package/dist/cjs/wm-uploader.cjs.entry.js +342 -0
  33. package/dist/cjs/wm-wrapper.cjs.entry.js +21 -0
  34. package/dist/collection/collection-manifest.json +131 -0
  35. package/dist/{ripple/ripple.css → collection/components/wm-action-menu/wm-action-menu.css} +80 -42
  36. package/dist/collection/components/wm-action-menu/wm-action-menu.js +392 -0
  37. package/dist/collection/components/wm-button/wm-button.css +572 -0
  38. package/dist/collection/components/wm-button/wm-button.js +365 -0
  39. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.css +132 -0
  40. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.js +232 -0
  41. package/dist/collection/components/wm-chart/wm-chart-slice.js +64 -0
  42. package/dist/collection/components/wm-chart/wm-chart.css +337 -0
  43. package/dist/collection/components/wm-chart/wm-chart.js +710 -0
  44. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.css +374 -0
  45. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +1003 -0
  46. package/dist/collection/components/wm-datepicker/wm-datepicker.css +211 -0
  47. package/dist/collection/components/wm-datepicker/wm-datepicker.js +439 -0
  48. package/dist/collection/components/wm-input/wm-input.css +220 -0
  49. package/dist/collection/components/wm-input/wm-input.js +302 -0
  50. package/dist/collection/components/wm-menuitem/wm-menuitem.css +118 -0
  51. package/dist/collection/components/wm-menuitem/wm-menuitem.js +411 -0
  52. package/dist/collection/components/wm-modal/wm-modal-footer.css +84 -0
  53. package/dist/collection/components/wm-modal/wm-modal-footer.js +159 -0
  54. package/dist/collection/components/wm-modal/wm-modal-header.css +78 -0
  55. package/dist/collection/components/wm-modal/wm-modal-header.js +109 -0
  56. package/dist/collection/components/wm-modal/wm-modal.css +155 -0
  57. package/dist/collection/components/wm-modal/wm-modal.js +356 -0
  58. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.css +94 -0
  59. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +97 -0
  60. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.css +67 -0
  61. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +114 -0
  62. package/dist/collection/components/wm-navigator/wm-navigator.css +137 -0
  63. package/dist/collection/components/wm-navigator/wm-navigator.js +468 -0
  64. package/dist/collection/components/wm-option/wm-option.css +162 -0
  65. package/dist/collection/components/wm-option/wm-option.js +394 -0
  66. package/dist/collection/components/wm-pagination/wm-pagination.css +217 -0
  67. package/dist/collection/components/wm-pagination/wm-pagination.js +348 -0
  68. package/dist/collection/components/wm-search/wm-search.css +155 -0
  69. package/dist/collection/components/wm-search/wm-search.js +439 -0
  70. package/dist/collection/components/wm-select/wm-select.css +315 -0
  71. package/dist/collection/components/wm-select/wm-select.js +676 -0
  72. package/dist/collection/components/wm-snackbar/wm-snackbar.css +331 -0
  73. package/dist/collection/components/wm-snackbar/wm-snackbar.js +240 -0
  74. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.css +104 -0
  75. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +202 -0
  76. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.css +73 -0
  77. package/dist/{ripple/wm-tab-list.entry.js → collection/components/wm-tabs/wm-tab-list/wm-tab-list.js} +131 -17
  78. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.css +57 -0
  79. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +104 -0
  80. package/dist/collection/components/wm-tag-input/wm-tag-input.css +431 -0
  81. package/dist/collection/components/wm-tag-input/wm-tag-input.js +754 -0
  82. package/dist/collection/components/wm-timepicker/wm-timepicker.css +370 -0
  83. package/dist/collection/components/wm-timepicker/wm-timepicker.js +567 -0
  84. package/dist/collection/components/wm-toggletip/wm-toggletip.css +350 -0
  85. package/dist/collection/components/wm-toggletip/wm-toggletip.js +217 -0
  86. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.css +642 -0
  87. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.js +753 -0
  88. package/dist/collection/components/wm-uploader/wm-uploader.css +666 -0
  89. package/dist/collection/components/wm-uploader/wm-uploader.js +673 -0
  90. package/dist/collection/components/wm-wrapper/wm-wrapper.js +27 -0
  91. package/dist/collection/dev/scripts.js +20 -0
  92. package/dist/collection/global/__mocks__/functions.js +5 -0
  93. package/dist/collection/global/functions.js +420 -0
  94. package/dist/{ripple/app-globals-b5693c90.js → collection/global/global.js} +3 -8
  95. package/dist/{ripple/interfaces-50753346.js → collection/global/interfaces.js} +4 -6
  96. package/dist/collection/global/services/__mocks__/http-service.js +130 -0
  97. package/dist/collection/global/services/http-service.js +50 -0
  98. package/dist/collection/lang/lang.js +5 -0
  99. package/dist/collection/lang/piglatin.js +93 -0
  100. package/dist/esm/functions-0deb7f8e.js +6117 -0
  101. package/dist/esm/global-d6b49e98.js +36 -0
  102. package/dist/{ripple → esm}/http-service-5d037e16.js +0 -0
  103. package/dist/esm/index-5a842e48.js +1363 -0
  104. package/dist/esm/index.js +1 -0
  105. package/dist/esm/interfaces-61c6305b.js +32 -0
  106. package/dist/esm/loader.js +18 -0
  107. package/dist/esm/polyfills/core-js.js +11 -0
  108. package/dist/esm/polyfills/css-shim.js +1 -0
  109. package/dist/esm/polyfills/dom.js +79 -0
  110. package/dist/esm/polyfills/es5-html-element.js +1 -0
  111. package/dist/esm/polyfills/index.js +34 -0
  112. package/dist/esm/polyfills/system.js +6 -0
  113. package/dist/{ripple → esm}/priv-chart-popover.entry.js +2 -2
  114. package/dist/{ripple → esm}/priv-datepicker.entry.js +3 -3
  115. package/dist/{ripple → esm}/priv-navigator-button.entry.js +1 -1
  116. package/dist/{ripple → esm}/priv-navigator-item.entry.js +1 -1
  117. package/dist/esm/ripple.js +18 -0
  118. package/dist/{ripple/wm-action-menu.entry.js → esm/wm-action-menu_2.entry.js} +114 -3
  119. package/dist/{ripple → esm}/wm-button.entry.js +3 -3
  120. package/dist/{ripple → esm}/wm-chart-slice.entry.js +1 -1
  121. package/dist/{ripple → esm}/wm-chart.entry.js +2 -2
  122. package/dist/{ripple → esm}/wm-datepicker.entry.js +27 -32
  123. package/dist/{ripple → esm}/wm-input.entry.js +2 -2
  124. package/dist/{ripple → esm}/wm-modal-footer.entry.js +2 -2
  125. package/dist/{ripple → esm}/wm-modal-header.entry.js +2 -2
  126. package/dist/{ripple → esm}/wm-modal.entry.js +2 -2
  127. package/dist/{ripple → esm}/wm-navigator.entry.js +3 -3
  128. package/dist/{ripple → esm}/wm-network-uploader.entry.js +2 -2
  129. package/dist/{ripple/wm-select.entry.js → esm/wm-option_2.entry.js} +119 -3
  130. package/dist/{ripple → esm}/wm-pagination.entry.js +2 -2
  131. package/dist/{ripple → esm}/wm-search.entry.js +2 -2
  132. package/dist/{ripple → esm}/wm-snackbar.entry.js +2 -2
  133. package/dist/esm/wm-tab-item_3.entry.js +310 -0
  134. package/dist/{ripple → esm}/wm-tag-input.entry.js +2 -2
  135. package/dist/{ripple → esm}/wm-timepicker.entry.js +2 -2
  136. package/dist/{ripple → esm}/wm-toggletip.entry.js +2 -2
  137. package/dist/{ripple → esm}/wm-uploader.entry.js +2 -2
  138. package/dist/{ripple → esm}/wm-wrapper.entry.js +1 -1
  139. package/dist/index.cjs.js +1 -0
  140. package/dist/index.js +1 -0
  141. package/dist/loader/cdn.js +3 -0
  142. package/dist/loader/index.cjs.js +3 -0
  143. package/dist/loader/index.d.ts +13 -0
  144. package/dist/loader/index.es2017.js +3 -0
  145. package/dist/loader/index.js +4 -0
  146. package/dist/loader/package.json +10 -0
  147. package/dist/ripple/index.esm.js +0 -1
  148. package/dist/ripple/p-103f8cae.entry.js +1 -0
  149. package/dist/ripple/p-129d94fa.entry.js +1 -0
  150. package/dist/ripple/p-139fe143.entry.js +1 -0
  151. package/dist/ripple/p-16367805.entry.js +1 -0
  152. package/dist/ripple/p-1d334060.entry.js +1 -0
  153. package/dist/ripple/p-2562f330.entry.js +1 -0
  154. package/dist/ripple/p-278b26ef.entry.js +1 -0
  155. package/dist/ripple/p-2c21bb72.entry.js +1 -0
  156. package/dist/ripple/p-2f5fda71.entry.js +1 -0
  157. package/dist/ripple/p-3e6f04d5.entry.js +1 -0
  158. package/dist/ripple/p-7185de7f.entry.js +1 -0
  159. package/dist/ripple/p-770d0798.entry.js +1 -0
  160. package/dist/ripple/p-846b4c5f.entry.js +1 -0
  161. package/dist/ripple/p-888bec42.js +1 -0
  162. package/dist/ripple/p-90779d53.entry.js +1 -0
  163. package/dist/ripple/p-934543f2.js +1 -0
  164. package/dist/ripple/p-9a087fee.entry.js +1 -0
  165. package/dist/ripple/p-a6d6eae7.js +1 -0
  166. package/dist/ripple/p-a942ad10.entry.js +1 -0
  167. package/dist/ripple/p-bfb4652d.entry.js +1 -0
  168. package/dist/ripple/p-c0fe5201.entry.js +1 -0
  169. package/dist/ripple/p-c2e27acc.entry.js +1 -0
  170. package/dist/ripple/p-c2edda64.entry.js +1 -0
  171. package/dist/ripple/p-d1fdcbcf.entry.js +1 -0
  172. package/dist/ripple/p-d40b6afb.entry.js +1 -0
  173. package/dist/ripple/p-da73db1c.entry.js +1 -0
  174. package/dist/ripple/p-e3843249.js +1 -0
  175. package/dist/ripple/p-ea5cd8b8.js +16 -0
  176. package/dist/ripple/p-ed0f43f4.entry.js +1 -0
  177. package/dist/ripple/p-ffafd363.entry.js +1 -0
  178. package/dist/ripple/ripple.esm.js +1 -125
  179. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +43 -0
  180. package/dist/types/components/wm-button/wm-button.d.ts +36 -0
  181. package/dist/types/components/wm-chart/priv-chart-popover/priv-chart-popover.d.ts +23 -0
  182. package/dist/types/components/wm-chart/wm-chart-slice.d.ts +8 -0
  183. package/dist/types/components/wm-chart/wm-chart.d.ts +77 -0
  184. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +75 -0
  185. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +39 -0
  186. package/dist/types/components/wm-input/wm-input.d.ts +30 -0
  187. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +30 -0
  188. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +15 -0
  189. package/dist/types/components/wm-modal/wm-modal-header.d.ts +12 -0
  190. package/dist/types/components/wm-modal/wm-modal.d.ts +34 -0
  191. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +10 -0
  192. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +13 -0
  193. package/dist/types/components/wm-navigator/wm-navigator.d.ts +61 -0
  194. package/dist/types/components/wm-option/wm-option.d.ts +28 -0
  195. package/dist/types/components/wm-pagination/wm-pagination.d.ts +31 -0
  196. package/dist/types/components/wm-search/wm-search.d.ts +78 -0
  197. package/dist/types/components/wm-select/wm-select.d.ts +63 -0
  198. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +32 -0
  199. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +35 -0
  200. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +50 -0
  201. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +20 -0
  202. package/dist/types/components/wm-tag-input/{wm-tag-input.d.ts~ds312_tagInputMaxTags → wm-tag-input.d.ts} +1 -1
  203. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +59 -0
  204. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +25 -0
  205. package/dist/types/components/wm-uploader/wm-network-uploader/wm-network-uploader.d.ts +85 -0
  206. package/dist/types/components/wm-uploader/wm-uploader.d.ts +75 -0
  207. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +7 -0
  208. package/dist/types/{components.d.ts~ds312_tagInputMaxTags → components.d.ts} +0 -0
  209. package/dist/types/global/__mocks__/functions.d.ts +5 -0
  210. package/dist/types/global/global.d.ts +1 -0
  211. package/dist/types/global/interfaces.d.ts +33 -0
  212. package/dist/types/global/services/__mocks__/http-service.d.ts +6 -0
  213. package/dist/types/global/services/http-service.d.ts +4 -0
  214. package/dist/types/lang/lang.d.ts +5 -0
  215. package/dist/types/{stencil-public-runtime.d.ts~ds312_tagInputMaxTags → stencil-public-runtime.d.ts} +190 -182
  216. package/package.json +1 -1
  217. package/dist/ripple/css-shim-bbdf0cc6.js +0 -4
  218. package/dist/ripple/dom-1f98a75f.js +0 -73
  219. package/dist/ripple/index-20b65f86.js +0 -2938
  220. package/dist/ripple/shadow-css-67b66845.js +0 -389
  221. package/dist/ripple/wm-menuitem.entry.js +0 -114
  222. package/dist/ripple/wm-option.entry.js +0 -119
  223. package/dist/ripple/wm-tab-item.entry.js +0 -78
  224. package/dist/ripple/wm-tab-panel.entry.js +0 -38
@@ -0,0 +1,710 @@
1
+ import { Component, Element, h, Host, Prop, State, Listen } from "@stencil/core";
2
+ import { forceUpdate } from "@stencil/core";
3
+ import { debounce, generateId, checkForActiveElInShadow, getPosition, intl, findParentWithScrollbar, } from "../../global/functions";
4
+ export class Chart {
5
+ constructor() {
6
+ this.chartType = "doughnut1";
7
+ this.showLegend = true;
8
+ this.notStartedColor = false;
9
+ this.isTabbing = false;
10
+ this.uid = generateId();
11
+ this.slicesData = [];
12
+ this.colors = {
13
+ salmon: "#ff5f4e",
14
+ cyan: "#19a1a9",
15
+ sleet: "#7f97ad",
16
+ midnight: "#2e1b46",
17
+ lavender: "#8b86ca",
18
+ };
19
+ this.types = {
20
+ doughnut0: {
21
+ size: 155,
22
+ colors: [this.colors.cyan, "#bfbfbf"],
23
+ thickness: 0.73,
24
+ padding: 25,
25
+ isBar: false,
26
+ },
27
+ doughnut1: {
28
+ size: 130,
29
+ colors: [this.colors.lavender, this.colors.midnight, "#d4d4d4"],
30
+ thickness: 0.5,
31
+ padding: 90,
32
+ isBar: false,
33
+ },
34
+ doughnut2: {
35
+ size: 130,
36
+ colors: [this.colors.cyan, this.colors.salmon, "#d4d4d4"],
37
+ thickness: 0.5,
38
+ padding: 90,
39
+ isBar: false,
40
+ },
41
+ doughnut3: {
42
+ size: 130,
43
+ colors: [this.colors.lavender, this.colors.midnight, "#919834", "#c177cf", "#c16e00", "#029af2", "#2a6993"],
44
+ thickness: 0.5,
45
+ padding: 90,
46
+ isBar: false,
47
+ },
48
+ bar1: {
49
+ size: 350,
50
+ colors: [this.colors.cyan, "#bfbfbf"],
51
+ padding: 0,
52
+ isBar: true,
53
+ },
54
+ bar2: {
55
+ size: 400,
56
+ colors: ["#d4d4d4", this.colors.sleet, this.colors.cyan, this.colors.salmon],
57
+ padding: 0,
58
+ isBar: true,
59
+ },
60
+ bar3: {
61
+ size: 300,
62
+ colors: ["#0d696e", this.colors.cyan, "#8e4129", this.colors.salmon],
63
+ padding: 0,
64
+ isBar: true,
65
+ },
66
+ bar4: {
67
+ size: 400,
68
+ colors: ["#d4d4d4", this.colors.sleet, "#33a919"],
69
+ padding: 0,
70
+ isBar: true,
71
+ },
72
+ bar5: {
73
+ size: 400,
74
+ colors: [
75
+ "#d4d4d4",
76
+ this.colors.lavender,
77
+ this.colors.midnight,
78
+ "#919834",
79
+ "#c177cf",
80
+ "#c16e00",
81
+ "#029af2",
82
+ "#2a6993",
83
+ ],
84
+ padding: 0,
85
+ isBar: true,
86
+ },
87
+ };
88
+ /* LIFECYCLE METHODS + EVENTS FROM THE CHILDREN */
89
+ this.debouncedUpdate = debounce(async () => {
90
+ this.setHybridType();
91
+ await this.getData();
92
+ forceUpdate(this.el);
93
+ }, 30);
94
+ this.debouncedSliceUpdate = debounce(async () => {
95
+ await this.getData();
96
+ forceUpdate(this.el);
97
+ }, 100);
98
+ }
99
+ toggleTabbingOn() {
100
+ this.isTabbing = true;
101
+ }
102
+ toggleTabbingOff() {
103
+ this.isTabbing = false;
104
+ }
105
+ handleKeydown(ev) {
106
+ switch (ev.keyCode) {
107
+ // arrow up / left
108
+ case 37:
109
+ case 38:
110
+ ev.preventDefault();
111
+ this.isTabbing = true; // shd already be true. just in case user clicked on chart then pressed an arrow key
112
+ this.focusPrevious();
113
+ break;
114
+ // arrow right / down
115
+ case 39:
116
+ case 40:
117
+ ev.preventDefault();
118
+ this.isTabbing = true; // shd already be true. just in case user clicked on chart then pressed an arrow key
119
+ this.focusNext();
120
+ break;
121
+ // tab
122
+ case 9:
123
+ this.exitChart();
124
+ break;
125
+ case 27:
126
+ this.popoverEl.open = false;
127
+ break;
128
+ }
129
+ }
130
+ focusNext() {
131
+ const activeEl = checkForActiveElInShadow(document.activeElement);
132
+ const index =
133
+ // if the active el is not in the array the first element gets focused
134
+ (this.sliceEls.indexOf(activeEl) + 1) % this.sliceEls.length;
135
+ this.focusSlice(index);
136
+ }
137
+ focusPrevious() {
138
+ if (this.sliceEls) {
139
+ const activeEl = checkForActiveElInShadow(document.activeElement);
140
+ let index = this.sliceEls.indexOf(activeEl);
141
+ if (index === -1) {
142
+ // not in the array : focus the first slice
143
+ index = 0;
144
+ }
145
+ else if (index === 0) {
146
+ // first slice : focus the last slice
147
+ index = this.sliceEls.length - 1;
148
+ }
149
+ else {
150
+ // anything else: focus previous
151
+ index -= 1;
152
+ }
153
+ this.focusSlice(index);
154
+ }
155
+ }
156
+ focusSlice(index) {
157
+ if (this.sliceEls && this.el) {
158
+ if (this.popoverEl) {
159
+ this.popoverEl.open = false;
160
+ }
161
+ this.el.tabIndex = -1;
162
+ // @ts-ignore
163
+ this.el.focusable = false; // for Edge
164
+ this.sliceEls.map((p) => {
165
+ p.tabIndex = -1;
166
+ // @ts-ignore
167
+ p.focusable = false; // for Edge
168
+ });
169
+ this.sliceEls[index].tabIndex = 0;
170
+ // @ts-ignore
171
+ this.sliceEls[index].focusable = true; // for Edge
172
+ this.sliceEls[index].focus();
173
+ window.setTimeout(() => {
174
+ if (this.popoverEl) {
175
+ this.popoverEl.open = true;
176
+ }
177
+ }, 10);
178
+ }
179
+ }
180
+ exitChart() {
181
+ this.sliceEls &&
182
+ this.sliceEls.map((p) => {
183
+ p.tabIndex = -1;
184
+ // @ts-ignore
185
+ p.focusable = false; // for Edge
186
+ });
187
+ // delay so that we can tab out of component before chart becomes focusable again
188
+ // and in case user was still pressing an arrow key when they pressed tab
189
+ window.setTimeout(() => {
190
+ if (this.el) {
191
+ this.el.tabIndex = 0;
192
+ // @ts-ignore
193
+ this.el.focusable = true; // for Edge
194
+ if (this.popoverEl) {
195
+ this.popoverEl.open = false;
196
+ }
197
+ }
198
+ }, 100);
199
+ }
200
+ openPopover(s) {
201
+ if (!!this.popoverEl && !!s.title && !!s.text) {
202
+ this.popoverEl.popoverTitle = s.title;
203
+ this.popoverEl.popoverText = s.text;
204
+ this.popoverEl.buttonText = s.buttonText;
205
+ this.popoverEl.coords = s.coords;
206
+ this.popoverEl.sliceRef = s.sliceRef;
207
+ window.setTimeout(() => {
208
+ if (this.popoverEl) {
209
+ this.popoverEl.open = true;
210
+ }
211
+ }, 30);
212
+ const debouncedClosePopover = debounce(async () => {
213
+ this.popoverEl.open = false;
214
+ }, 10);
215
+ // set up event listeners for scrolling
216
+ // to close popover on page scroll
217
+ document.addEventListener("scroll", () => {
218
+ debouncedClosePopover();
219
+ });
220
+ // ... and on parent scroll
221
+ const scrollableParent = findParentWithScrollbar(this.el);
222
+ if (!!scrollableParent) {
223
+ scrollableParent.addEventListener("scroll", () => {
224
+ debouncedClosePopover();
225
+ });
226
+ }
227
+ }
228
+ }
229
+ /* UTILS */
230
+ amountToPercent(val, asInt) {
231
+ return asInt ? Math.round((val * 100) / this.total) : Math.round((val * 10000) / this.total) / 100; // with 2 decimals
232
+ }
233
+ amountToDegree(val) {
234
+ return (val * 360) / this.total;
235
+ }
236
+ toFixed(number) {
237
+ var val = parseFloat((Math.floor(number * 100) / 100).toFixed(2));
238
+ return val;
239
+ }
240
+ polarToCartesian(half, radius, startAngle, endAngle) {
241
+ var x = this.toFixed(half + half * radius * Math.cos((Math.PI * startAngle) / 180));
242
+ var y = this.toFixed(half + half * radius * Math.sin((Math.PI * startAngle) / 180));
243
+ if (endAngle !== undefined) {
244
+ // if a 2nd angle value was passed, return 2 pairs of coords
245
+ var x2 = this.toFixed(half + half * radius * Math.cos((Math.PI * endAngle) / 180));
246
+ var y2 = this.toFixed(half + half * radius * Math.sin((Math.PI * endAngle) / 180));
247
+ return { x1: x, y1: y, x2, y2 };
248
+ }
249
+ return { x, y };
250
+ }
251
+ /* CRUNCH THE NUMBERS */
252
+ getPathData(amount, offset) {
253
+ var startAngle = this.amountToDegree(offset) - 90; // start at noon, not at 3 o'clock
254
+ var activeAngle = (amount / this.total) * 360;
255
+ var endAngle = startAngle + activeAngle;
256
+ var largeArcFlagOuter = activeAngle > 180 ? "1 1" : "0 1";
257
+ var largeArcFlagInner = activeAngle > 180 ? "1 0" : "0 0";
258
+ var half = this.chartData.size / 2;
259
+ var innerRadius = this.chartData.thickness;
260
+ var outerRadius = 1;
261
+ if (activeAngle === 360) {
262
+ // fix to avoid bad svg shape when the path goes all around (100%)
263
+ endAngle -= 0.01;
264
+ }
265
+ var outerCoords = this.polarToCartesian(half, outerRadius, startAngle + 1.5, // 1.5 for slice separator
266
+ endAngle);
267
+ var innerCoords = this.polarToCartesian(half, innerRadius, startAngle + 3, // 3 for slice separator
268
+ endAngle);
269
+ const moveTo = `M ${outerCoords.x1}, ${outerCoords.y1} `;
270
+ const arc1 = this.getArc(outerRadius, largeArcFlagOuter, outerCoords.x2, outerCoords.y2);
271
+ const line = ` L ${innerCoords.x2}, ${innerCoords.y2} `;
272
+ const arc2 = this.getArc(innerRadius, largeArcFlagInner, innerCoords.x1, innerCoords.y1);
273
+ return moveTo + arc1 + line + arc2 + " z";
274
+ }
275
+ getArc(radius, largeArcFlag, x, y) {
276
+ var z = this.toFixed((this.chartData.size / 2) * radius);
277
+ return `A ${z}, ${z} 0 ${largeArcFlag} ${this.toFixed(x)}, ${this.toFixed(y)}`;
278
+ }
279
+ setHybridType() {
280
+ this.hybridType = window.innerWidth > 1340 ? "doughnut0" : "bar1";
281
+ }
282
+ getType() {
283
+ return this.chartType === "hybrid" ? this.hybridType : this.chartType;
284
+ }
285
+ /* GET THE DATA */
286
+ async getData() {
287
+ this.slicesData = [];
288
+ let acc = 0;
289
+ const children = this.el.querySelectorAll("wm-chart-slice");
290
+ this.total = Array.from(children).reduce((total, slice) => (total += parseInt(slice.getAttribute("amount") || "0")), 0);
291
+ children.forEach((c, i) => {
292
+ const amount = parseInt(c.getAttribute("amount") || "0");
293
+ const perc = this.amountToPercent(amount, true);
294
+ // determine whether the slice is in a cluster of small values
295
+ // to avoid percentage text overlap for small values
296
+ const prev = children[i === 0 ? children.length - 1 : i - 1];
297
+ const prevPerc = this.amountToPercent(parseInt(prev.getAttribute("amount") || "0"), true);
298
+ const next = children[i === children.length - 1 ? 0 : i + 1];
299
+ const nextPerc = this.amountToPercent(parseInt(next.getAttribute("amount") || "0"), true);
300
+ const isSmall = perc < 4;
301
+ const prevIsSmall = prevPerc < 5;
302
+ const nextIsSmall = nextPerc < 5;
303
+ let inSmallCluster = isSmall && (prevIsSmall || nextIsSmall);
304
+ // because <1% slice percentage text has an additional character
305
+ // the inSmallCluster threshold needs to be widened for that slice only
306
+ const lessThanOnePerc = perc === 0 && amount > 0;
307
+ if (lessThanOnePerc && (nextPerc < 8 || prevPerc < 8)) {
308
+ inSmallCluster = true;
309
+ }
310
+ // for bar5, first color should be skipped unless notStartedColor is set to true
311
+ const ind = this.getType() === "bar5" ? (this.notStartedColor ? i : i + 1) : i;
312
+ const color = this.types[this.getType()].colors[ind];
313
+ const sliceData = {
314
+ amount: amount,
315
+ perc: perc,
316
+ legend: c.getAttribute("legend"),
317
+ color: color || "#d4d4d4",
318
+ offset: acc,
319
+ id: `${this.uid}-${i + 1}`,
320
+ title: c.getAttribute("popover-title"),
321
+ text: c.getAttribute("popover-text"),
322
+ buttonText: c.getAttribute("popover-button-text"),
323
+ sliceRef: c,
324
+ inSmallCluster: inSmallCluster,
325
+ };
326
+ acc += amount;
327
+ this.slicesData.push(sliceData);
328
+ });
329
+ this.chartData = this.types[this.getType()];
330
+ }
331
+ getSliceEls() {
332
+ if (this.svgEl) {
333
+ this.sliceEls = Array.from(this.svgEl.querySelectorAll(this.chartData.isBar ? "rect" : "path"));
334
+ }
335
+ }
336
+ handleResize() {
337
+ if (this.chartType === "hybrid") {
338
+ this.debouncedUpdate();
339
+ }
340
+ }
341
+ async componentWillLoad() {
342
+ if (!this.label) {
343
+ throw new Error("For accessibility purposes, you must provide a label for the chart. See https://components.watermarkinsights.com/chart for more information.");
344
+ }
345
+ if (this.chartType === "hybrid") {
346
+ this.setHybridType();
347
+ }
348
+ await this.getData();
349
+ }
350
+ componentDidLoad() {
351
+ this.getSliceEls();
352
+ }
353
+ componentDidUpdate() {
354
+ this.getSliceEls();
355
+ }
356
+ handleSliceUpdate() {
357
+ this.debouncedSliceUpdate();
358
+ }
359
+ /* RENDERING */
360
+ renderFilter() {
361
+ return (h("defs", null,
362
+ h("filter", { id: "wmHoverDropShadow" },
363
+ h("feGaussianBlur", { stdDeviation: "3" }),
364
+ h("feOffset", { result: "offsetblur" }),
365
+ h("feFlood", { "flood-color": "#333" }),
366
+ h("feComposite", { operator: "in", in2: "offsetblur" }),
367
+ h("feMerge", null,
368
+ h("feMergeNode", null),
369
+ h("feMergeNode", { in: "SourceGraphic" })))));
370
+ }
371
+ // DOUGHNUT
372
+ renderDoughnut() {
373
+ const outerSize = this.chartData.size + this.chartData.padding;
374
+ return (h("div", { class: "svg-wrapper doughnut-wrapper" },
375
+ h("svg", { width: outerSize + "px", height: outerSize + "px", ref: (el) => (this.svgEl = el), id: `graphic-${this.uid}`, class: `chart-svg doughnut-svg ${this.isTabbing ? "user-is-tabbing" : ""}` },
376
+ this.renderFilter(),
377
+ this.slicesData.map((s) => this.renderPath(s)),
378
+ this.getType() === "doughnut0" ? (h("text", { class: "value", x: "50%", y: "50%", "font-size": "1.5rem", "font-weight": "500", "text-anchor": "middle", "dominant-baseline": "middle" }, this.amountToPercent(this.slicesData[0].amount, true) + "%")) : (h("g", { transform: `translate(${this.chartData.padding / 2}, ${this.chartData.padding / 2})`, "text-anchor": "middle", "dominant-baseline": "middle" }, this.slicesData.map((s) => (s.amount > 0 ? this.renderDoughnutText(s) : "")))))));
379
+ }
380
+ renderPath(s) {
381
+ return (h("g", { transform: `translate(${this.chartData.padding / 2}, ${this.chartData.padding / 2})` },
382
+ h("path", { id: s.id, fill: s.amount ? s.color : "transparent", d: this.getPathData(s.amount, s.offset), onClick: (ev) => {
383
+ if (this.popoverEl) {
384
+ if (!this.isTabbing) {
385
+ s.coords = { x: ev.clientX, y: ev.clientY };
386
+ this.openPopover(s);
387
+ }
388
+ }
389
+ }, onFocus: (ev) => {
390
+ if (this.popoverEl) {
391
+ if (this.isTabbing) {
392
+ s.coords = getPosition(ev.target);
393
+ this.openPopover(s);
394
+ }
395
+ }
396
+ }, onKeyDown: (ev) => {
397
+ if (this.popoverEl && this.popoverEl.open && ev.keyCode === 13) {
398
+ const popoverBtn = this.popoverEl.querySelector("button");
399
+ popoverBtn && popoverBtn.click();
400
+ }
401
+ } }),
402
+ h("text", { class: "sr-only" }, s.legend)));
403
+ }
404
+ renderDoughnutText(s) {
405
+ if (!s.inSmallCluster) {
406
+ const arcMiddle = this.amountToDegree(s.offset + s.amount / 2);
407
+ let { x, y } = this.polarToCartesian(this.chartData.size / 2, 1.4, arcMiddle - 90);
408
+ return (h("text", { class: "value", x: x + "px", y: y + "px" }, `${s.perc > 0 ? s.perc : "<1"}%`));
409
+ }
410
+ }
411
+ // BAR
412
+ renderBar() {
413
+ return (h("div", { class: "svg-wrapper bar-wrapper" },
414
+ this.getType() === "bar1" ? (h("div", { class: "single-perc" }, this.amountToPercent(this.slicesData[0].amount, true) + "%")) : (""),
415
+ this.drawAxis(),
416
+ h("svg", { ref: (el) => (this.svgEl = el), id: `graphic-${this.uid}`, class: {
417
+ "chart-svg bar-svg": true,
418
+ "user-is-tabbing": this.isTabbing,
419
+ "show-values": this.showValues === "percentage" || this.showValues === "amount",
420
+ } },
421
+ this.renderFilter(),
422
+ h("foreignObject", { class: this.getType() === "bar2" || this.getType() === "bar4" || this.getType() === "bar5" ? "focus-offset" : "" },
423
+ h("div", {
424
+ // @ts-ignore
425
+ xmlns: "http://www.w3.org/1999/xhtml", class: "tabbing-focus" })),
426
+ this.slicesData.map((s, idx) => this.renderRect(s, idx)),
427
+ this.getType() !== "bar1" ? (h("g", { class: "percs" }, this.slicesData.map((s) => (s.perc > 0 ? this.renderBarText(s) : "")))) : (""))));
428
+ }
429
+ renderRect(s, idx) {
430
+ let y;
431
+ switch (this.getType()) {
432
+ case "bar2":
433
+ case "bar4":
434
+ case "bar5":
435
+ y = this.showValues === "percentage" || this.showValues === "amount" ? "30px" : "0";
436
+ break;
437
+ default:
438
+ y = "0";
439
+ }
440
+ return (h("g", { class: "barcontainer" },
441
+ h("style", null, ` #${s.id} {
442
+ fill:${s.color};
443
+ x: ${`${this.amountToPercent(s.offset, false)}%`};
444
+ y: ${y};
445
+ height: 30px;
446
+ width: calc(${this.amountToPercent(s.amount, false)}%${idx !== this.slicesData.length - 1 ? " - 2px" : ""});
447
+ }`),
448
+ h("rect", { id: s.id, onClick: (ev) => {
449
+ if (this.popoverEl) {
450
+ if (!this.isTabbing) {
451
+ s.coords = { x: ev.clientX, y: ev.clientY };
452
+ this.openPopover(s);
453
+ }
454
+ }
455
+ }, onFocus: (ev) => {
456
+ if (this.popoverEl) {
457
+ if (this.isTabbing) {
458
+ s.coords = getPosition(ev.target);
459
+ this.openPopover(s);
460
+ }
461
+ }
462
+ }, onKeyDown: (ev) => {
463
+ if (this.popoverEl && this.popoverEl.open && ev.keyCode === 13) {
464
+ const popoverBtn = this.popoverEl.querySelector("button");
465
+ popoverBtn && popoverBtn.click();
466
+ }
467
+ } }),
468
+ h("text", { class: "sr-only" }, s.legend)));
469
+ }
470
+ renderBarText(s) {
471
+ let val;
472
+ if (this.showValues === "percentage") {
473
+ val = s.perc + "%";
474
+ }
475
+ else if (this.showValues === "amount") {
476
+ val = s.amount;
477
+ }
478
+ else {
479
+ return;
480
+ }
481
+ return (h("text", { class: "value", x: `${this.amountToPercent(s.offset, false) + this.amountToPercent(s.amount, false) / 2}%` }, val));
482
+ }
483
+ drawAxis() {
484
+ if (this.getType() === "bar3") {
485
+ return (h("svg", { class: "axis" },
486
+ h("line", { x1: "0", x2: "100%", y1: "0", y2: "0" }),
487
+ h("line", { x1: "0", x2: "0", y1: "0", y2: "-85px" }),
488
+ h("line", { class: "tick", x1: "0.5", x2: "0.5", y1: "0", y2: "6" }),
489
+ h("text", { x: "0.5", y: "-6" }, "0%"),
490
+ h("line", { class: "tick", x1: "100%", x2: "100%", y1: "0", y2: "6" }),
491
+ h("text", { x: "100%", y: "-6" }, "100%")));
492
+ }
493
+ }
494
+ renderCompletionMessage() {
495
+ if (this.chartType === "hybrid" && this.completionMessage) {
496
+ return h("span", { class: "completion-message" }, this.completionMessage);
497
+ }
498
+ }
499
+ renderLegend() {
500
+ // legend is hidden for bar1 type regardless of showLegend value
501
+ if (this.showLegend) {
502
+ const hasCluster = this.slicesData.reduce((hasCluster, cur) => (hasCluster = cur.inSmallCluster ? true : hasCluster), false);
503
+ return (h("div", { class: "legend-wrapper" },
504
+ h("div", { class: `legend ${this.chartData.isBar ? "--top" : "--bottom"}`, "aria-hidden": "true" }, this.total > 0
505
+ ? this.slicesData.map((s) => {
506
+ // when both legend and amount are omitted, the legend is not shown for that particular option (it's been deactivated by the user)
507
+ if (!!s.amount || !!s.legend) {
508
+ return (h("div", { class: "legend-item" },
509
+ h("div", { class: "legend-color", style: { "background-color": s.color } }),
510
+ h("div", { class: "legend-text" }, s.legend)));
511
+ }
512
+ })
513
+ : ""),
514
+ !this.chartData.isBar && hasCluster ? (h("div", { class: "cluster-warning" },
515
+ intl.formatMessage({
516
+ id: "chart.hiddenPercentages",
517
+ defaultMessage: "Percentages smaller than 5% are not shown when too close to each other.",
518
+ }),
519
+ h("br", null),
520
+ intl.formatMessage({
521
+ id: "chart.clickToSeeDetails",
522
+ defaultMessage: "Click or use arrow keys to see details.",
523
+ }))) : ("")));
524
+ }
525
+ }
526
+ render() {
527
+ return (h(Host, { role: "application", "aria-label": this.label +
528
+ ", " +
529
+ intl.formatMessage({
530
+ id: "chart.interactiveChart",
531
+ defaultMessage: "Interactive chart. Use arrow keys to browse elements, press Tab to exit.",
532
+ }), tabindex: "0" },
533
+ h("div", { class: `component-wrapper ${this.getType()}` },
534
+ h("label", { class: "label", id: `label-${this.uid}`, htmlFor: `graphic-${this.uid}` },
535
+ h("span", { class: "label-text" }, this.label),
536
+ this.subinfo ? h("span", { class: "subinfo" }, this.subinfo) : ""),
537
+ this.chartData.isBar ? this.renderLegend() : "",
538
+ this.total > 0 && this.chartData.isBar ? this.renderBar() : this.renderDoughnut(),
539
+ !this.chartData.isBar ? this.renderLegend() : "",
540
+ h("priv-chart-popover", { class: this.isTabbing ? "user-is-tabbing" : "", ref: (el) => (this.popoverEl = el) }),
541
+ this.renderCompletionMessage())));
542
+ }
543
+ static get is() { return "wm-chart"; }
544
+ static get encapsulation() { return "shadow"; }
545
+ static get originalStyleUrls() { return {
546
+ "$": ["wm-chart.scss"]
547
+ }; }
548
+ static get styleUrls() { return {
549
+ "$": ["wm-chart.css"]
550
+ }; }
551
+ static get properties() { return {
552
+ "chartType": {
553
+ "type": "string",
554
+ "mutable": false,
555
+ "complexType": {
556
+ "original": "\"doughnut1\" | \"doughnut2\" | \"doughnut3\" | \"hybrid\" | \"bar1\" | \"bar2\" | \"bar3\" | \"bar4\" | \"bar5\"",
557
+ "resolved": "\"bar1\" | \"bar2\" | \"bar3\" | \"bar4\" | \"bar5\" | \"doughnut1\" | \"doughnut2\" | \"doughnut3\" | \"hybrid\"",
558
+ "references": {}
559
+ },
560
+ "required": false,
561
+ "optional": false,
562
+ "docs": {
563
+ "tags": [],
564
+ "text": ""
565
+ },
566
+ "attribute": "chart-type",
567
+ "reflect": false,
568
+ "defaultValue": "\"doughnut1\""
569
+ },
570
+ "label": {
571
+ "type": "string",
572
+ "mutable": false,
573
+ "complexType": {
574
+ "original": "string",
575
+ "resolved": "string | undefined",
576
+ "references": {}
577
+ },
578
+ "required": false,
579
+ "optional": true,
580
+ "docs": {
581
+ "tags": [],
582
+ "text": ""
583
+ },
584
+ "attribute": "label",
585
+ "reflect": false
586
+ },
587
+ "subinfo": {
588
+ "type": "string",
589
+ "mutable": false,
590
+ "complexType": {
591
+ "original": "string",
592
+ "resolved": "string | undefined",
593
+ "references": {}
594
+ },
595
+ "required": false,
596
+ "optional": true,
597
+ "docs": {
598
+ "tags": [],
599
+ "text": ""
600
+ },
601
+ "attribute": "subinfo",
602
+ "reflect": false
603
+ },
604
+ "completionMessage": {
605
+ "type": "string",
606
+ "mutable": false,
607
+ "complexType": {
608
+ "original": "string",
609
+ "resolved": "string | undefined",
610
+ "references": {}
611
+ },
612
+ "required": false,
613
+ "optional": true,
614
+ "docs": {
615
+ "tags": [],
616
+ "text": ""
617
+ },
618
+ "attribute": "completion-message",
619
+ "reflect": false
620
+ },
621
+ "showValues": {
622
+ "type": "string",
623
+ "mutable": false,
624
+ "complexType": {
625
+ "original": "\"percentage\" | \"amount\"",
626
+ "resolved": "\"amount\" | \"percentage\" | undefined",
627
+ "references": {}
628
+ },
629
+ "required": false,
630
+ "optional": true,
631
+ "docs": {
632
+ "tags": [],
633
+ "text": ""
634
+ },
635
+ "attribute": "show-values",
636
+ "reflect": false
637
+ },
638
+ "showLegend": {
639
+ "type": "boolean",
640
+ "mutable": false,
641
+ "complexType": {
642
+ "original": "boolean",
643
+ "resolved": "boolean",
644
+ "references": {}
645
+ },
646
+ "required": false,
647
+ "optional": false,
648
+ "docs": {
649
+ "tags": [],
650
+ "text": ""
651
+ },
652
+ "attribute": "show-legend",
653
+ "reflect": false,
654
+ "defaultValue": "true"
655
+ },
656
+ "notStartedColor": {
657
+ "type": "boolean",
658
+ "mutable": false,
659
+ "complexType": {
660
+ "original": "boolean",
661
+ "resolved": "boolean",
662
+ "references": {}
663
+ },
664
+ "required": false,
665
+ "optional": false,
666
+ "docs": {
667
+ "tags": [],
668
+ "text": ""
669
+ },
670
+ "attribute": "not-started-color",
671
+ "reflect": false,
672
+ "defaultValue": "false"
673
+ }
674
+ }; }
675
+ static get states() { return {
676
+ "isTabbing": {}
677
+ }; }
678
+ static get elementRef() { return "el"; }
679
+ static get listeners() { return [{
680
+ "name": "wmUserIsTabbing",
681
+ "method": "toggleTabbingOn",
682
+ "target": "window",
683
+ "capture": false,
684
+ "passive": false
685
+ }, {
686
+ "name": "wmUserIsNotTabbing",
687
+ "method": "toggleTabbingOff",
688
+ "target": "window",
689
+ "capture": false,
690
+ "passive": false
691
+ }, {
692
+ "name": "keydown",
693
+ "method": "handleKeydown",
694
+ "target": undefined,
695
+ "capture": false,
696
+ "passive": false
697
+ }, {
698
+ "name": "resize",
699
+ "method": "handleResize",
700
+ "target": "window",
701
+ "capture": false,
702
+ "passive": true
703
+ }, {
704
+ "name": "wmChartSliceUpdated",
705
+ "method": "handleSliceUpdate",
706
+ "target": undefined,
707
+ "capture": false,
708
+ "passive": false
709
+ }]; }
710
+ }