@j2inn/fin5-ui-utils 8.2.0 → 9.0.0-beta.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 (243) hide show
  1. package/dist/fantomProps/createFin5Props/index.d.ts +12 -12
  2. package/dist/fantomProps/createFin5Props/index.js +146 -146
  3. package/dist/fantomProps/createFin5Props/index.js.map +1 -1
  4. package/dist/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -2
  5. package/dist/fantomProps/createFin5Props/runCreateFin5Props.js +20 -20
  6. package/dist/fantomProps/createFin5Props/runCreateFin5Props.js.map +1 -1
  7. package/dist/fantomProps/fantomPropsToObject.d.ts +8 -8
  8. package/dist/fantomProps/fantomPropsToObject.js +182 -183
  9. package/dist/fantomProps/fantomPropsToObject.js.map +1 -1
  10. package/dist/fantomProps/generateJsonFromFantomPropsFile.d.ts +4 -4
  11. package/dist/fantomProps/generateJsonFromFantomPropsFile.js +51 -41
  12. package/dist/fantomProps/generateJsonFromFantomPropsFile.js.map +1 -1
  13. package/dist/fantomProps/localePropsToJson.d.ts +1 -1
  14. package/dist/fantomProps/localePropsToJson.js +60 -50
  15. package/dist/fantomProps/localePropsToJson.js.map +1 -1
  16. package/dist/fantomProps/readFantomPropsFile.d.ts +5 -5
  17. package/dist/fantomProps/readFantomPropsFile.js +74 -65
  18. package/dist/fantomProps/readFantomPropsFile.js.map +1 -1
  19. package/dist/fin5Top/fin5FileUpload.d.ts +24 -24
  20. package/dist/fin5Top/fin5FileUpload.js +51 -51
  21. package/dist/fin5Top/fin5FileUpload.js.map +1 -1
  22. package/dist/fin5Top/fin5Top.d.ts +188 -188
  23. package/dist/fin5Top/fin5Top.js +86 -86
  24. package/dist/fin5Top/fin5Top.js.map +1 -1
  25. package/dist/fin5Top/finEdge2Cloud.d.ts +6 -6
  26. package/dist/fin5Top/finEdge2Cloud.js +15 -15
  27. package/dist/fin5Top/getFin5BinUrl.d.ts +2 -2
  28. package/dist/fin5Top/getFin5BinUrl.js +9 -9
  29. package/dist/fin5Top/openFin5Alarm.d.ts +22 -22
  30. package/dist/fin5Top/openFin5Alarm.js +23 -23
  31. package/dist/fin5Top/openFin5Alarm.js.map +1 -1
  32. package/dist/fin5Top/openFin5Historian.d.ts +3 -3
  33. package/dist/fin5Top/openFin5Historian.js +19 -19
  34. package/dist/fin5Top/openFin5Historian.js.map +1 -1
  35. package/dist/fin5Top/useFin5AppURLHashParameter.d.ts +18 -18
  36. package/dist/fin5Top/useFin5AppURLHashParameter.js +133 -133
  37. package/dist/fin5Top/useFin5AppURLHashParameter.js.map +1 -1
  38. package/dist/index.d.ts +35 -35
  39. package/dist/index.js +69 -69
  40. package/dist/jobs/jobUtils.d.ts +14 -14
  41. package/dist/jobs/jobUtils.js +15 -15
  42. package/dist/jobs/jobUtils.js.map +1 -1
  43. package/dist/react/app/Fin5AppContainer.d.ts +36 -36
  44. package/dist/react/app/Fin5AppContainer.js +171 -161
  45. package/dist/react/app/Fin5AppContainer.js.map +1 -1
  46. package/dist/react/app/Fin5AppRootStore.d.ts +42 -42
  47. package/dist/react/app/Fin5AppRootStore.js +114 -114
  48. package/dist/react/app/Fin5AppRootStore.js.map +1 -1
  49. package/dist/react/components/ErrorBoundary.d.ts +57 -57
  50. package/dist/react/components/ErrorBoundary.js +160 -150
  51. package/dist/react/components/ErrorBoundary.js.map +1 -1
  52. package/dist/react/components/ErrorDisplayer.d.ts +19 -19
  53. package/dist/react/components/ErrorDisplayer.js +36 -36
  54. package/dist/react/components/ErrorDisplayer.js.map +1 -1
  55. package/dist/react/components/Loader.d.ts +9 -9
  56. package/dist/react/components/Loader.js +17 -17
  57. package/dist/react/components/LoadingSpinner.d.ts +2 -2
  58. package/dist/react/components/LoadingSpinner.js +27 -27
  59. package/dist/react/components/RecordImage.d.ts +20 -20
  60. package/dist/react/components/RecordImage.js +61 -51
  61. package/dist/react/components/RecordImage.js.map +1 -1
  62. package/dist/react/components/charts/QRCode.d.ts +25 -25
  63. package/dist/react/components/charts/QRCode.js +92 -82
  64. package/dist/react/components/charts/QRCode.js.map +1 -1
  65. package/dist/react/components/charts/line-bar/Chart.d.ts +166 -166
  66. package/dist/react/components/charts/line-bar/Chart.js +452 -442
  67. package/dist/react/components/charts/line-bar/Chart.js.map +1 -1
  68. package/dist/react/components/charts/line-bar/HGridChart.d.ts +58 -58
  69. package/dist/react/components/charts/line-bar/HGridChart.js +295 -285
  70. package/dist/react/components/charts/line-bar/HGridChart.js.map +1 -1
  71. package/dist/react/components/charts/pie/PieChart.d.ts +94 -94
  72. package/dist/react/components/charts/pie/PieChart.js +214 -204
  73. package/dist/react/components/charts/pie/PieChart.js.map +1 -1
  74. package/dist/react/components/charts/pie/SimplePieChart.d.ts +21 -21
  75. package/dist/react/components/charts/pie/SimplePieChart.js +65 -55
  76. package/dist/react/components/charts/pie/SimplePieChart.js.map +1 -1
  77. package/dist/react/components/graphics/GraphicViewer.d.ts +10 -10
  78. package/dist/react/components/graphics/GraphicViewer.js +29 -29
  79. package/dist/react/components/graphics/GraphicsTabViewer.d.ts +17 -17
  80. package/dist/react/components/graphics/GraphicsTabViewer.js +100 -90
  81. package/dist/react/components/graphics/GraphicsTabViewer.js.map +1 -1
  82. package/dist/react/components/makeCustomElement.d.ts +16 -16
  83. package/dist/react/components/makeCustomElement.js +150 -150
  84. package/dist/react/components/makeCustomElement.js.map +1 -1
  85. package/dist/react/components/navigation/BasicLayout.d.ts +41 -41
  86. package/dist/react/components/navigation/BasicLayout.js +165 -155
  87. package/dist/react/components/navigation/BasicLayout.js.map +1 -1
  88. package/dist/react/components/navigation/HeaderSiderLayout.d.ts +13 -13
  89. package/dist/react/components/navigation/HeaderSiderLayout.js +119 -110
  90. package/dist/react/components/navigation/HeaderSiderLayout.js.map +1 -1
  91. package/dist/react/components/navigation/MenuPage.d.ts +37 -37
  92. package/dist/react/components/navigation/MenuPage.js +35 -36
  93. package/dist/react/components/navigation/MenuPage.js.map +1 -1
  94. package/dist/react/components/navigation/MenuTrigger.d.ts +9 -9
  95. package/dist/react/components/navigation/MenuTrigger.js +33 -33
  96. package/dist/react/components/navigation/ReactRouterHeaderSiderLayout.d.ts +11 -11
  97. package/dist/react/components/navigation/ReactRouterHeaderSiderLayout.js +25 -25
  98. package/dist/react/components/navigation/ReactRouterHeaderSiderLayout.js.map +1 -1
  99. package/dist/react/components/navigation/ReactRouterLayout.d.ts +45 -46
  100. package/dist/react/components/navigation/ReactRouterLayout.js +142 -132
  101. package/dist/react/components/navigation/ReactRouterLayout.js.map +1 -1
  102. package/dist/react/components/navigation/customRouting/Router.d.ts +12 -12
  103. package/dist/react/components/navigation/customRouting/Router.js +54 -45
  104. package/dist/react/components/navigation/customRouting/Router.js.map +1 -1
  105. package/dist/react/components/navigation/customRouting/RouterLayout.d.ts +11 -11
  106. package/dist/react/components/navigation/customRouting/RouterLayout.js +71 -61
  107. package/dist/react/components/navigation/customRouting/RouterLayout.js.map +1 -1
  108. package/dist/react/components/resolvable/configurationForm/ConfigurationForm.d.ts +26 -27
  109. package/dist/react/components/resolvable/configurationForm/ConfigurationForm.js +105 -95
  110. package/dist/react/components/resolvable/configurationForm/ConfigurationForm.js.map +1 -1
  111. package/dist/react/components/resolvable/configurationForm/ConfigurationFormEntry.d.ts +15 -16
  112. package/dist/react/components/resolvable/configurationForm/ConfigurationFormEntry.js +98 -88
  113. package/dist/react/components/resolvable/configurationForm/ConfigurationFormEntry.js.map +1 -1
  114. package/dist/react/components/resolvable/configurationForm/getSectionDefault.d.ts +16 -16
  115. package/dist/react/components/resolvable/configurationForm/getSectionDefault.js +99 -99
  116. package/dist/react/components/resolvable/configurationForm/getSectionDefault.js.map +1 -1
  117. package/dist/react/hooks/useFin5BinUrl.d.ts +6 -6
  118. package/dist/react/hooks/useFin5BinUrl.js +15 -15
  119. package/dist/react/hooks/useFin5ColorScheme.d.ts +2 -2
  120. package/dist/react/hooks/useFin5ColorScheme.js +55 -56
  121. package/dist/react/hooks/useFin5ColorScheme.js.map +1 -1
  122. package/dist/react/hooks/useScreenSize.d.ts +7 -7
  123. package/dist/react/hooks/useScreenSize.js +31 -31
  124. package/dist_es/fantomProps/createFin5Props/index.d.ts +12 -12
  125. package/dist_es/fantomProps/createFin5Props/index.js +140 -140
  126. package/dist_es/fantomProps/createFin5Props/index.js.map +1 -1
  127. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -2
  128. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.js +15 -15
  129. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.js.map +1 -1
  130. package/dist_es/fantomProps/fantomPropsToObject.d.ts +8 -8
  131. package/dist_es/fantomProps/fantomPropsToObject.js +178 -178
  132. package/dist_es/fantomProps/fantomPropsToObject.js.map +1 -1
  133. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.d.ts +4 -4
  134. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.js +12 -12
  135. package/dist_es/fantomProps/localePropsToJson.d.ts +1 -1
  136. package/dist_es/fantomProps/localePropsToJson.js +21 -21
  137. package/dist_es/fantomProps/localePropsToJson.js.map +1 -1
  138. package/dist_es/fantomProps/readFantomPropsFile.d.ts +5 -5
  139. package/dist_es/fantomProps/readFantomPropsFile.js +38 -39
  140. package/dist_es/fantomProps/readFantomPropsFile.js.map +1 -1
  141. package/dist_es/fin5Top/fin5FileUpload.d.ts +24 -24
  142. package/dist_es/fin5Top/fin5FileUpload.js +47 -47
  143. package/dist_es/fin5Top/fin5FileUpload.js.map +1 -1
  144. package/dist_es/fin5Top/fin5Top.d.ts +188 -188
  145. package/dist_es/fin5Top/fin5Top.js +81 -81
  146. package/dist_es/fin5Top/fin5Top.js.map +1 -1
  147. package/dist_es/fin5Top/finEdge2Cloud.d.ts +6 -6
  148. package/dist_es/fin5Top/finEdge2Cloud.js +11 -11
  149. package/dist_es/fin5Top/getFin5BinUrl.d.ts +2 -2
  150. package/dist_es/fin5Top/getFin5BinUrl.js +5 -5
  151. package/dist_es/fin5Top/openFin5Alarm.d.ts +22 -22
  152. package/dist_es/fin5Top/openFin5Alarm.js +19 -19
  153. package/dist_es/fin5Top/openFin5Alarm.js.map +1 -1
  154. package/dist_es/fin5Top/openFin5Historian.d.ts +3 -3
  155. package/dist_es/fin5Top/openFin5Historian.js +15 -15
  156. package/dist_es/fin5Top/openFin5Historian.js.map +1 -1
  157. package/dist_es/fin5Top/useFin5AppURLHashParameter.d.ts +18 -18
  158. package/dist_es/fin5Top/useFin5AppURLHashParameter.js +124 -124
  159. package/dist_es/fin5Top/useFin5AppURLHashParameter.js.map +1 -1
  160. package/dist_es/index.d.ts +35 -35
  161. package/dist_es/index.js +53 -53
  162. package/dist_es/jobs/jobUtils.d.ts +14 -14
  163. package/dist_es/jobs/jobUtils.js +9 -9
  164. package/dist_es/react/app/Fin5AppContainer.d.ts +36 -36
  165. package/dist_es/react/app/Fin5AppContainer.js +132 -132
  166. package/dist_es/react/app/Fin5AppContainer.js.map +1 -1
  167. package/dist_es/react/app/Fin5AppRootStore.d.ts +42 -42
  168. package/dist_es/react/app/Fin5AppRootStore.js +110 -110
  169. package/dist_es/react/app/Fin5AppRootStore.js.map +1 -1
  170. package/dist_es/react/components/ErrorBoundary.d.ts +57 -57
  171. package/dist_es/react/components/ErrorBoundary.js +123 -123
  172. package/dist_es/react/components/ErrorDisplayer.d.ts +19 -19
  173. package/dist_es/react/components/ErrorDisplayer.js +28 -28
  174. package/dist_es/react/components/ErrorDisplayer.js.map +1 -1
  175. package/dist_es/react/components/Loader.d.ts +9 -9
  176. package/dist_es/react/components/Loader.js +12 -12
  177. package/dist_es/react/components/LoadingSpinner.d.ts +2 -2
  178. package/dist_es/react/components/LoadingSpinner.js +20 -20
  179. package/dist_es/react/components/RecordImage.d.ts +20 -20
  180. package/dist_es/react/components/RecordImage.js +24 -24
  181. package/dist_es/react/components/RecordImage.js.map +1 -1
  182. package/dist_es/react/components/charts/QRCode.d.ts +25 -25
  183. package/dist_es/react/components/charts/QRCode.js +52 -52
  184. package/dist_es/react/components/charts/QRCode.js.map +1 -1
  185. package/dist_es/react/components/charts/line-bar/Chart.d.ts +166 -166
  186. package/dist_es/react/components/charts/line-bar/Chart.js +415 -415
  187. package/dist_es/react/components/charts/line-bar/Chart.js.map +1 -1
  188. package/dist_es/react/components/charts/line-bar/HGridChart.d.ts +58 -58
  189. package/dist_es/react/components/charts/line-bar/HGridChart.js +250 -250
  190. package/dist_es/react/components/charts/line-bar/HGridChart.js.map +1 -1
  191. package/dist_es/react/components/charts/pie/PieChart.d.ts +94 -94
  192. package/dist_es/react/components/charts/pie/PieChart.js +177 -177
  193. package/dist_es/react/components/charts/pie/PieChart.js.map +1 -1
  194. package/dist_es/react/components/charts/pie/SimplePieChart.d.ts +21 -21
  195. package/dist_es/react/components/charts/pie/SimplePieChart.js +25 -25
  196. package/dist_es/react/components/graphics/GraphicViewer.d.ts +10 -10
  197. package/dist_es/react/components/graphics/GraphicViewer.js +22 -22
  198. package/dist_es/react/components/graphics/GraphicsTabViewer.d.ts +17 -17
  199. package/dist_es/react/components/graphics/GraphicsTabViewer.js +60 -60
  200. package/dist_es/react/components/graphics/GraphicsTabViewer.js.map +1 -1
  201. package/dist_es/react/components/makeCustomElement.d.ts +16 -16
  202. package/dist_es/react/components/makeCustomElement.js +142 -142
  203. package/dist_es/react/components/makeCustomElement.js.map +1 -1
  204. package/dist_es/react/components/navigation/BasicLayout.d.ts +41 -41
  205. package/dist_es/react/components/navigation/BasicLayout.js +124 -124
  206. package/dist_es/react/components/navigation/BasicLayout.js.map +1 -1
  207. package/dist_es/react/components/navigation/HeaderSiderLayout.d.ts +13 -13
  208. package/dist_es/react/components/navigation/HeaderSiderLayout.js +80 -80
  209. package/dist_es/react/components/navigation/HeaderSiderLayout.js.map +1 -1
  210. package/dist_es/react/components/navigation/MenuPage.d.ts +37 -37
  211. package/dist_es/react/components/navigation/MenuPage.js +30 -30
  212. package/dist_es/react/components/navigation/MenuPage.js.map +1 -1
  213. package/dist_es/react/components/navigation/MenuTrigger.d.ts +9 -9
  214. package/dist_es/react/components/navigation/MenuTrigger.js +28 -28
  215. package/dist_es/react/components/navigation/ReactRouterHeaderSiderLayout.d.ts +11 -11
  216. package/dist_es/react/components/navigation/ReactRouterHeaderSiderLayout.js +18 -18
  217. package/dist_es/react/components/navigation/ReactRouterHeaderSiderLayout.js.map +1 -1
  218. package/dist_es/react/components/navigation/ReactRouterLayout.d.ts +45 -46
  219. package/dist_es/react/components/navigation/ReactRouterLayout.js +99 -99
  220. package/dist_es/react/components/navigation/ReactRouterLayout.js.map +1 -1
  221. package/dist_es/react/components/navigation/customRouting/Router.d.ts +12 -12
  222. package/dist_es/react/components/navigation/customRouting/Router.js +18 -18
  223. package/dist_es/react/components/navigation/customRouting/Router.js.map +1 -1
  224. package/dist_es/react/components/navigation/customRouting/RouterLayout.d.ts +11 -11
  225. package/dist_es/react/components/navigation/customRouting/RouterLayout.js +34 -34
  226. package/dist_es/react/components/navigation/customRouting/RouterLayout.js.map +1 -1
  227. package/dist_es/react/components/resolvable/configurationForm/ConfigurationForm.d.ts +26 -27
  228. package/dist_es/react/components/resolvable/configurationForm/ConfigurationForm.js +64 -64
  229. package/dist_es/react/components/resolvable/configurationForm/ConfigurationForm.js.map +1 -1
  230. package/dist_es/react/components/resolvable/configurationForm/ConfigurationFormEntry.d.ts +15 -16
  231. package/dist_es/react/components/resolvable/configurationForm/ConfigurationFormEntry.js +58 -58
  232. package/dist_es/react/components/resolvable/configurationForm/ConfigurationFormEntry.js.map +1 -1
  233. package/dist_es/react/components/resolvable/configurationForm/getSectionDefault.d.ts +16 -16
  234. package/dist_es/react/components/resolvable/configurationForm/getSectionDefault.js +94 -94
  235. package/dist_es/react/components/resolvable/configurationForm/getSectionDefault.js.map +1 -1
  236. package/dist_es/react/hooks/useFin5BinUrl.d.ts +6 -6
  237. package/dist_es/react/hooks/useFin5BinUrl.js +11 -11
  238. package/dist_es/react/hooks/useFin5ColorScheme.d.ts +2 -2
  239. package/dist_es/react/hooks/useFin5ColorScheme.js +52 -52
  240. package/dist_es/react/hooks/useFin5ColorScheme.js.map +1 -1
  241. package/dist_es/react/hooks/useScreenSize.d.ts +7 -7
  242. package/dist_es/react/hooks/useScreenSize.js +27 -27
  243. package/package.json +26 -49
@@ -1,443 +1,453 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2025, J2 Innovations. All Rights Reserved
4
- */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || function (mod) {
22
- if (mod && mod.__esModule) return mod;
23
- var result = {};
24
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
- __setModuleDefault(result, mod);
26
- return result;
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Chart = exports.LegendPlacement = exports.AxisPlacement = exports.UnitPlacement = void 0;
30
- const am5 = __importStar(require("@amcharts/amcharts5"));
31
- const am5xy = __importStar(require("@amcharts/amcharts5/xy"));
32
- const lodash_1 = require("lodash");
33
- const react_1 = __importStar(require("react"));
34
- const react_jss_1 = require("react-jss");
35
- const useStyles = (0, react_jss_1.createUseStyles)({
36
- root: {
37
- width: '100%',
38
- height: '100%',
39
- },
40
- });
41
- /**
42
- * Returns a color palette selecting some colors from the theme.
43
- * @param theme The theme
44
- * @returns An array of colors
45
- */
46
- const getDefaultChartColors = (theme) => {
47
- return {
48
- interfaceColors: {
49
- text: theme.textColor,
50
- },
51
- series: [
52
- theme.palette.lime,
53
- theme.palette.cyan,
54
- theme.palette.orange,
55
- theme.palette.blue,
56
- theme.palette.volcano,
57
- theme.palette.green,
58
- theme.palette.purple,
59
- theme.palette.magenta,
60
- theme.palette.grey,
61
- theme.palette.gold,
62
- theme.palette.red,
63
- theme.palette.yellow,
64
- ],
65
- };
66
- };
67
- const buildYRenderer = (root, opposite = false, gridSettings) => {
68
- const yRenderer = am5xy.AxisRendererY.new(root, {
69
- strokeOpacity: 0,
70
- forceHidden: true,
71
- opposite,
72
- });
73
- yRenderer.grid.template.setAll({
74
- strokeOpacity: 1,
75
- ...gridSettings,
76
- });
77
- yRenderer.labels.template.setAll({
78
- fontSize: '0.7rem',
79
- });
80
- return yRenderer;
81
- };
82
- const buildValueAxis = (root, chart, axes, chartSeriesProps, unitPlacement, gridSettings, valueAxisSettings) => {
83
- const unit = chartSeriesProps.unit ?? '';
84
- const cachedAxis = axes.get(unit);
85
- if (cachedAxis) {
86
- return cachedAxis;
87
- }
88
- const opposite = (chartSeriesProps.axisPlacement ?? AxisPlacement.left) ==
89
- AxisPlacement.right;
90
- const renderer = buildYRenderer(root, opposite, gridSettings);
91
- const axisToSync = axes.values().next()?.value;
92
- const axis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
93
- renderer: renderer,
94
- numberFormat: unitPlacement == UnitPlacement.axis && unit
95
- ? `#' ${unit}'`
96
- : undefined,
97
- marginTop: unitPlacement == UnitPlacement.top ? 15 : 0,
98
- syncWithAxis: axisToSync,
99
- visible: chartSeriesProps.hideAxis
100
- ? !chartSeriesProps.hideAxis
101
- : true,
102
- ...valueAxisSettings,
103
- }));
104
- if (unitPlacement == UnitPlacement.top) {
105
- addUnitTextLabels(root, chart, unit, opposite);
106
- }
107
- axes.set(unit, axis);
108
- return axis;
109
- };
110
- const addUnitTextLabels = (root, chart, unit, opposite) => {
111
- if (unit) {
112
- const unitTextStyle = {
113
- ignoreFormatting: true,
114
- fontSize: '0.7rem',
115
- height: 18,
116
- marginBottom: 15,
117
- position: 'absolute',
118
- };
119
- const x = am5.percent(!opposite ? 0 : 100);
120
- const centerX = am5.percent(!opposite ? 0 : 100);
121
- chart.children.unshift(am5.Label.new(root, {
122
- text: `[${unit}]`,
123
- x: x,
124
- centerX: centerX,
125
- ...unitTextStyle,
126
- }));
127
- }
128
- };
129
- const buildLabelText = (unit, numberFormat) => `[bold]{name}[/]: {valueY.formatNumber(${numberFormat ? `"${numberFormat}"` : ''})}${unit ? ` ${unit}` : ''}\n{valueX.formatDate("d MMM HH:mm")}`;
130
- const addLineSeries = (data, root, chart, xAxis, yAxes, dateField, unitPlacement, legendRef, gridSettings, valueAxisSettings, translateLabel, lineSeriesSettings, tooltipSettings) => {
131
- data.forEach((lineSeries) => {
132
- const lineYAxis = buildValueAxis(root, chart, yAxes, lineSeries, unitPlacement, gridSettings, valueAxisSettings);
133
- const series = chart.series.push(am5xy.LineSeries.new(root, {
134
- name: lineSeries.dis ??
135
- translateLabel?.(lineSeries.seriesName) ??
136
- lineSeries.seriesName,
137
- xAxis: xAxis,
138
- yAxis: lineYAxis,
139
- valueYField: 'value',
140
- valueXField: dateField,
141
- fill: lineSeries.strokeSettings?.stroke,
142
- tooltip: am5.Tooltip.new(root, {
143
- labelText: buildLabelText(lineSeries.unit, '#.##'),
144
- }),
145
- ...lineSeriesSettings,
146
- ...lineSeries.strokeSettings,
147
- }));
148
- if (tooltipSettings) {
149
- series.get('tooltip')?.label.setAll(tooltipSettings);
150
- }
151
- if (lineSeries.strokeSettings) {
152
- series.strokes.template.setAll(lineSeries.strokeSettings);
153
- series.fills.template.setAll(lineSeries.strokeSettings);
154
- }
155
- series.data.setAll(lineSeries.data);
156
- legendRef.current?.data.push(series);
157
- });
158
- };
159
- const addBarSeries = (data, root, chart, xAxis, yAxes, dateField, unitPlacement, stacked = false, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings) => {
160
- data.forEach((barSeries) => {
161
- const seriesName = barSeries.seriesName;
162
- // Setup Y axes, one on the left and one on the right
163
- const barYAxis = buildValueAxis(root, chart, yAxes, barSeries, unitPlacement, gridSettings, valueAxisSettings);
164
- const seriesOptions = {
165
- name: translateLabel?.(seriesName) ?? barSeries.dis ?? seriesName,
166
- xAxis: xAxis,
167
- yAxis: barYAxis,
168
- stacked: stacked,
169
- tooltip: am5.Tooltip.new(root, {
170
- labelText: buildLabelText(barSeries.unit),
171
- }),
172
- valueYField: 'value',
173
- valueXField: dateField,
174
- };
175
- if (barSeries.stroke) {
176
- seriesOptions.fill = barSeries.stroke;
177
- }
178
- const series = chart.series.push(am5xy.ColumnSeries.new(root, {
179
- ...seriesOptions,
180
- ...barSeriesSettings,
181
- }));
182
- series.columns.template.setAll({
183
- ...columnSettings,
184
- });
185
- if (tooltipSettings) {
186
- series.columns.template
187
- .get('tooltip')
188
- ?.label.setAll(tooltipSettings);
189
- }
190
- series.data.setAll(barSeries.data);
191
- legendRef.current?.data.push(series);
192
- });
193
- };
194
- const addRanges = (root, axis, rangesData) => {
195
- rangesData?.forEach((rangeData) => {
196
- addRange(root, axis, rangeData, rangeData.placeBelow);
197
- });
198
- };
199
- const addRange = (root, axis, rangeData, shifted = false) => {
200
- const rangeDataItem = axis.makeDataItem({
201
- value: rangeData.startValue,
202
- endValue: rangeData.endValue,
203
- isRange: true,
204
- });
205
- axis.createAxisRange(rangeDataItem);
206
- const axisFill = rangeDataItem.get('axisFill');
207
- axisFill?.setAll({
208
- fill: rangeData.color,
209
- fillOpacity: 0,
210
- visible: true,
211
- });
212
- const label = rangeDataItem.get('label');
213
- label?.setAll({
214
- text: rangeData.showText ? rangeData.text : '',
215
- fill: rangeData.foreground,
216
- html: rangeData.html,
217
- fontSize: '0.8rem',
218
- height: 24,
219
- location: 0,
220
- centerX: 0,
221
- tooltipText: rangeData.tooltip,
222
- layer: -1,
223
- background: am5.Rectangle.new(root, {
224
- fill: rangeData.color,
225
- fillOpacity: rangeData.opacity ?? 0.2,
226
- strokeWidth: 1,
227
- stroke: rangeData.foreground,
228
- }),
229
- });
230
- axisFill?.events.on('boundschanged', (e) => {
231
- label?.setAll({
232
- width: e.target.width(),
233
- maxWidth: e.target.width(),
234
- oversizedBehavior: 'truncate',
235
- y: shifted ? 24 : 0,
236
- });
237
- });
238
- };
239
- const setupLegend = (root, chart, legendPlacement, legendSettings, legendLabelsSettings, legendMarkersSettings) => {
240
- const legendItem = am5.Legend.new(root, {
241
- paddingTop: legendPlacement == LegendPlacement.bottom ? 20 : 0,
242
- paddingBottom: legendPlacement == LegendPlacement.top ? 20 : 0,
243
- forceHidden: legendPlacement == LegendPlacement.hidden,
244
- layout: legendPlacement == LegendPlacement.left ||
245
- legendPlacement == LegendPlacement.right
246
- ? root.verticalLayout
247
- : root.gridLayout,
248
- ...legendSettings,
249
- });
250
- // Setup legend
251
- const legend = legendPlacement == LegendPlacement.left ||
252
- legendPlacement == LegendPlacement.top
253
- ? chart.children.unshift(legendItem)
254
- : chart.children.push(legendItem);
255
- legend.labels.template.setAll({
256
- fontSize: '0.8rem',
257
- ...legendLabelsSettings,
258
- });
259
- legend.valueLabels.template.setAll({
260
- forceHidden: true,
261
- });
262
- legend.markers.template.setAll({
263
- width: 12,
264
- height: 12,
265
- ...legendMarkersSettings,
266
- });
267
- if (legendMarkersSettings?.rounded) {
268
- legend.markerRectangles.template.setAll({
269
- cornerRadiusTL: 100,
270
- cornerRadiusTR: 100,
271
- cornerRadiusBL: 100,
272
- cornerRadiusBR: 100,
273
- });
274
- }
275
- return legend;
276
- };
277
- var UnitPlacement;
278
- (function (UnitPlacement) {
279
- UnitPlacement["none"] = "none";
280
- UnitPlacement["top"] = "top";
281
- UnitPlacement["axis"] = "axis";
282
- })(UnitPlacement = exports.UnitPlacement || (exports.UnitPlacement = {}));
283
- var AxisPlacement;
284
- (function (AxisPlacement) {
285
- AxisPlacement["left"] = "left";
286
- AxisPlacement["right"] = "right";
287
- })(AxisPlacement = exports.AxisPlacement || (exports.AxisPlacement = {}));
288
- var LegendPlacement;
289
- (function (LegendPlacement) {
290
- LegendPlacement["top"] = "top";
291
- LegendPlacement["bottom"] = "bottom";
292
- LegendPlacement["left"] = "left";
293
- LegendPlacement["right"] = "right";
294
- LegendPlacement["hidden"] = "hidden";
295
- })(LegendPlacement = exports.LegendPlacement || (exports.LegendPlacement = {}));
296
- /**
297
- * Customizable stacked column and line chart component based on amcharts5
298
- *
299
- * This component wraps some of the chart configuration trying to make it more react-friendly
300
- */
301
- const Chart = ({ DOMtargetId, baseInterval, barSeriesData, stackedBarSeriesData, lineSeriesData, rangesData, dateField, colorPalette, numberFormat, chartThemes, chartSettings, legendSettings, legendLabelsSettings, legendMarkersSettings, dateAxisSettings, dateAxisRendererSettings, valueAxisSettings, gridSettings, barSeriesSettings, lineSeriesSettings, columnSettings, tooltipSettings, cursor = false, unitPlacement = UnitPlacement.none, legendPlacement = LegendPlacement.bottom, translateLabel, }) => {
302
- // Colors configuration
303
- const theme = (0, react_jss_1.useTheme)();
304
- const colors = { ...getDefaultChartColors(theme), ...colorPalette };
305
- // Chart lifecycle
306
- const [id, setId] = (0, react_1.useState)(DOMtargetId ?? `amchart-${Math.random()}`);
307
- const containerRef = (0, react_1.useRef)(null);
308
- const rootRef = (0, react_1.useRef)(null);
309
- const chartRef = (0, react_1.useRef)(null);
310
- const legendRef = (0, react_1.useRef)(null);
311
- (0, react_1.useEffect)(() => {
312
- if (DOMtargetId && DOMtargetId !== id) {
313
- setId(DOMtargetId);
314
- }
315
- }, [DOMtargetId]);
316
- // Chart setup
317
- (0, react_1.useLayoutEffect)(() => {
318
- const root = am5.Root.new(id);
319
- root.autoResize = false;
320
- // Setup amcharts theme
321
- if (chartThemes) {
322
- root.setThemes(chartThemes.map((t) => t.new(root)));
323
- }
324
- // Setup interface colors, see https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Interface_colors
325
- if (colors.interfaceColors) {
326
- // Remap settings to use amcharts Color objects
327
- for (const setting in colors.interfaceColors) {
328
- const color = colors.interfaceColors[setting];
329
- // Apply defined interfaceColor on the chart
330
- root.interfaceColors.set(setting, am5.color(color));
331
- }
332
- }
333
- // Setup chart settings
334
- const chart = root.container.children.push(am5xy.XYChart.new(root, {
335
- layout: legendPlacement == LegendPlacement.left ||
336
- legendPlacement == LegendPlacement.right
337
- ? root.horizontalLayout
338
- : root.verticalLayout,
339
- paddingLeft: 0,
340
- paddingRight: 0,
341
- paddingBottom: 0,
342
- paddingTop: legendPlacement == LegendPlacement.top ||
343
- unitPlacement == UnitPlacement.top
344
- ? 35
345
- : 10,
346
- ...chartSettings,
347
- }));
348
- // Setup cursor
349
- if (cursor) {
350
- chart.set('cursor', am5xy.XYCursor.new(root, {}));
351
- }
352
- // Setup series colors
353
- if (colors?.series) {
354
- chart.get('colors')?.set('colors', colors.series.map((c) => am5.color(c)));
355
- }
356
- const legend = setupLegend(root, chart, legendPlacement, legendSettings, legendLabelsSettings, legendMarkersSettings);
357
- rootRef.current = root;
358
- chartRef.current = chart;
359
- legendRef.current = legend;
360
- // Clean up before component removal from the DOM
361
- return () => {
362
- legendRef.current?.dispose();
363
- legendRef.current = null;
364
- chartRef.current?.dispose();
365
- chartRef.current = null;
366
- root?.dispose();
367
- rootRef.current = null;
368
- };
369
- }, [id, colors, chartThemes, chartSettings, legendSettings]);
370
- // Set data
371
- (0, react_1.useEffect)(() => {
372
- const root = rootRef.current;
373
- const chart = chartRef.current;
374
- if (chart && root) {
375
- chart.series.clear();
376
- if (barSeriesData?.length == 0 &&
377
- stackedBarSeriesData?.length == 0 &&
378
- lineSeriesData?.length == 0) {
379
- return;
380
- }
381
- // Setup axes
382
- const xRenderer = am5xy.AxisRendererX.new(root, {
383
- strokeWidth: 0,
384
- minGridDistance: 30,
385
- ...dateAxisRendererSettings,
386
- });
387
- const xAxis = chart.xAxes.push(am5xy.DateAxis.new(root, {
388
- baseInterval,
389
- renderer: xRenderer,
390
- ...dateAxisSettings,
391
- }));
392
- xRenderer.grid.template.setAll({
393
- strokeWidth: 0,
394
- forceHidden: true,
395
- });
396
- xRenderer.labels.template.setAll({
397
- location: 0.5,
398
- fontSize: '0.7rem',
399
- textAlign: 'center',
400
- });
401
- xAxis.data.setAll(Array.prototype.concat(stackedBarSeriesData ?? [], lineSeriesData ?? [], barSeriesData ?? []));
402
- addRanges(root, xAxis, rangesData);
403
- const yAxes = new Map();
404
- if (barSeriesData) {
405
- addBarSeries(barSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, false, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings);
406
- }
407
- if (stackedBarSeriesData) {
408
- addBarSeries(stackedBarSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, true, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings);
409
- }
410
- if (lineSeriesData) {
411
- addLineSeries(lineSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, legendRef, gridSettings, valueAxisSettings, translateLabel, lineSeriesSettings, tooltipSettings);
412
- }
413
- }
414
- }, [
415
- stackedBarSeriesData,
416
- barSeriesData,
417
- lineSeriesData,
418
- chartRef.current,
419
- colors?.series,
420
- barSeriesSettings,
421
- lineSeriesSettings,
422
- ]);
423
- (0, react_1.useEffect)(() => {
424
- if (numberFormat) {
425
- rootRef.current?.numberFormatter.set('numberFormat', numberFormat);
426
- }
427
- }, [rootRef.current, numberFormat]);
428
- (0, react_1.useEffect)(() => {
429
- let resizeObserver;
430
- if (containerRef.current) {
431
- const onResize = (0, lodash_1.debounce)(() => rootRef.current?.resize(), 100);
432
- resizeObserver = new ResizeObserver(onResize);
433
- resizeObserver.observe(containerRef.current);
434
- }
435
- return () => resizeObserver?.disconnect();
436
- }, [containerRef.current, rootRef.current]);
437
- const classes = useStyles();
438
- return typeof id === 'string' ? (react_1.default.createElement("div", { id: id, className: classes.root })) : (
439
- // If the DOM target is an HTML element, do not render another div. The chart will be attached to the existing element.
440
- react_1.default.createElement(react_1.default.Fragment, null));
441
- };
442
- exports.Chart = Chart;
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2025, J2 Innovations. All Rights Reserved
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Chart = exports.LegendPlacement = exports.AxisPlacement = exports.UnitPlacement = void 0;
40
+ const am5 = __importStar(require("@amcharts/amcharts5"));
41
+ const am5xy = __importStar(require("@amcharts/amcharts5/xy"));
42
+ const lodash_1 = require("lodash");
43
+ const react_1 = __importStar(require("react"));
44
+ const react_jss_1 = require("react-jss");
45
+ const useStyles = (0, react_jss_1.createUseStyles)({
46
+ root: {
47
+ width: '100%',
48
+ height: '100%',
49
+ },
50
+ });
51
+ /**
52
+ * Returns a color palette selecting some colors from the theme.
53
+ * @param theme The theme
54
+ * @returns An array of colors
55
+ */
56
+ const getDefaultChartColors = (theme) => {
57
+ return {
58
+ interfaceColors: {
59
+ text: theme.textColor,
60
+ },
61
+ series: [
62
+ theme.palette.lime,
63
+ theme.palette.cyan,
64
+ theme.palette.orange,
65
+ theme.palette.blue,
66
+ theme.palette.volcano,
67
+ theme.palette.green,
68
+ theme.palette.purple,
69
+ theme.palette.magenta,
70
+ theme.palette.grey,
71
+ theme.palette.gold,
72
+ theme.palette.red,
73
+ theme.palette.yellow,
74
+ ],
75
+ };
76
+ };
77
+ const buildYRenderer = (root, opposite = false, gridSettings) => {
78
+ const yRenderer = am5xy.AxisRendererY.new(root, {
79
+ strokeOpacity: 0,
80
+ forceHidden: true,
81
+ opposite,
82
+ });
83
+ yRenderer.grid.template.setAll({
84
+ strokeOpacity: 1,
85
+ ...gridSettings,
86
+ });
87
+ yRenderer.labels.template.setAll({
88
+ fontSize: '0.7rem',
89
+ });
90
+ return yRenderer;
91
+ };
92
+ const buildValueAxis = (root, chart, axes, chartSeriesProps, unitPlacement, gridSettings, valueAxisSettings) => {
93
+ const unit = chartSeriesProps.unit ?? '';
94
+ const cachedAxis = axes.get(unit);
95
+ if (cachedAxis) {
96
+ return cachedAxis;
97
+ }
98
+ const opposite = (chartSeriesProps.axisPlacement ?? AxisPlacement.left) ==
99
+ AxisPlacement.right;
100
+ const renderer = buildYRenderer(root, opposite, gridSettings);
101
+ const axisToSync = axes.values().next()?.value;
102
+ const axis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
103
+ renderer: renderer,
104
+ numberFormat: unitPlacement == UnitPlacement.axis && unit
105
+ ? `#' ${unit}'`
106
+ : undefined,
107
+ marginTop: unitPlacement == UnitPlacement.top ? 15 : 0,
108
+ syncWithAxis: axisToSync,
109
+ visible: chartSeriesProps.hideAxis
110
+ ? !chartSeriesProps.hideAxis
111
+ : true,
112
+ ...valueAxisSettings,
113
+ }));
114
+ if (unitPlacement == UnitPlacement.top) {
115
+ addUnitTextLabels(root, chart, unit, opposite);
116
+ }
117
+ axes.set(unit, axis);
118
+ return axis;
119
+ };
120
+ const addUnitTextLabels = (root, chart, unit, opposite) => {
121
+ if (unit) {
122
+ const unitTextStyle = {
123
+ ignoreFormatting: true,
124
+ fontSize: '0.7rem',
125
+ height: 18,
126
+ marginBottom: 15,
127
+ position: 'absolute',
128
+ };
129
+ const x = am5.percent(!opposite ? 0 : 100);
130
+ const centerX = am5.percent(!opposite ? 0 : 100);
131
+ chart.children.unshift(am5.Label.new(root, {
132
+ text: `[${unit}]`,
133
+ x: x,
134
+ centerX: centerX,
135
+ ...unitTextStyle,
136
+ }));
137
+ }
138
+ };
139
+ const buildLabelText = (unit, numberFormat) => `[bold]{name}[/]: {valueY.formatNumber(${numberFormat ? `"${numberFormat}"` : ''})}${unit ? ` ${unit}` : ''}\n{valueX.formatDate("d MMM HH:mm")}`;
140
+ const addLineSeries = (data, root, chart, xAxis, yAxes, dateField, unitPlacement, legendRef, gridSettings, valueAxisSettings, translateLabel, lineSeriesSettings, tooltipSettings) => {
141
+ data.forEach((lineSeries) => {
142
+ const lineYAxis = buildValueAxis(root, chart, yAxes, lineSeries, unitPlacement, gridSettings, valueAxisSettings);
143
+ const series = chart.series.push(am5xy.LineSeries.new(root, {
144
+ name: lineSeries.dis ??
145
+ translateLabel?.(lineSeries.seriesName) ??
146
+ lineSeries.seriesName,
147
+ xAxis: xAxis,
148
+ yAxis: lineYAxis,
149
+ valueYField: 'value',
150
+ valueXField: dateField,
151
+ fill: lineSeries.strokeSettings?.stroke,
152
+ tooltip: am5.Tooltip.new(root, {
153
+ labelText: buildLabelText(lineSeries.unit, '#.##'),
154
+ }),
155
+ ...lineSeriesSettings,
156
+ ...lineSeries.strokeSettings,
157
+ }));
158
+ if (tooltipSettings) {
159
+ series.get('tooltip')?.label.setAll(tooltipSettings);
160
+ }
161
+ if (lineSeries.strokeSettings) {
162
+ series.strokes.template.setAll(lineSeries.strokeSettings);
163
+ series.fills.template.setAll(lineSeries.strokeSettings);
164
+ }
165
+ series.data.setAll(lineSeries.data);
166
+ legendRef.current?.data.push(series);
167
+ });
168
+ };
169
+ const addBarSeries = (data, root, chart, xAxis, yAxes, dateField, unitPlacement, stacked = false, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings) => {
170
+ data.forEach((barSeries) => {
171
+ const seriesName = barSeries.seriesName;
172
+ // Setup Y axes, one on the left and one on the right
173
+ const barYAxis = buildValueAxis(root, chart, yAxes, barSeries, unitPlacement, gridSettings, valueAxisSettings);
174
+ const seriesOptions = {
175
+ name: translateLabel?.(seriesName) ?? barSeries.dis ?? seriesName,
176
+ xAxis: xAxis,
177
+ yAxis: barYAxis,
178
+ stacked: stacked,
179
+ tooltip: am5.Tooltip.new(root, {
180
+ labelText: buildLabelText(barSeries.unit),
181
+ }),
182
+ valueYField: 'value',
183
+ valueXField: dateField,
184
+ };
185
+ if (barSeries.stroke) {
186
+ seriesOptions.fill = barSeries.stroke;
187
+ }
188
+ const series = chart.series.push(am5xy.ColumnSeries.new(root, {
189
+ ...seriesOptions,
190
+ ...barSeriesSettings,
191
+ }));
192
+ series.columns.template.setAll({
193
+ ...columnSettings,
194
+ });
195
+ if (tooltipSettings) {
196
+ series.columns.template
197
+ .get('tooltip')
198
+ ?.label.setAll(tooltipSettings);
199
+ }
200
+ series.data.setAll(barSeries.data);
201
+ legendRef.current?.data.push(series);
202
+ });
203
+ };
204
+ const addRanges = (root, axis, rangesData) => {
205
+ rangesData?.forEach((rangeData) => {
206
+ addRange(root, axis, rangeData, rangeData.placeBelow);
207
+ });
208
+ };
209
+ const addRange = (root, axis, rangeData, shifted = false) => {
210
+ const rangeDataItem = axis.makeDataItem({
211
+ value: rangeData.startValue,
212
+ endValue: rangeData.endValue,
213
+ isRange: true,
214
+ });
215
+ axis.createAxisRange(rangeDataItem);
216
+ const axisFill = rangeDataItem.get('axisFill');
217
+ axisFill?.setAll({
218
+ fill: rangeData.color,
219
+ fillOpacity: 0,
220
+ visible: true,
221
+ });
222
+ const label = rangeDataItem.get('label');
223
+ label?.setAll({
224
+ text: rangeData.showText ? rangeData.text : '',
225
+ fill: rangeData.foreground,
226
+ html: rangeData.html,
227
+ fontSize: '0.8rem',
228
+ height: 24,
229
+ location: 0,
230
+ centerX: 0,
231
+ tooltipText: rangeData.tooltip,
232
+ layer: -1, // put below axis
233
+ background: am5.Rectangle.new(root, {
234
+ fill: rangeData.color,
235
+ fillOpacity: rangeData.opacity ?? 0.2,
236
+ strokeWidth: 1,
237
+ stroke: rangeData.foreground,
238
+ }),
239
+ });
240
+ axisFill?.events.on('boundschanged', (e) => {
241
+ label?.setAll({
242
+ width: e.target.width(),
243
+ maxWidth: e.target.width(),
244
+ oversizedBehavior: 'truncate',
245
+ y: shifted ? 24 : 0,
246
+ });
247
+ });
248
+ };
249
+ const setupLegend = (root, chart, legendPlacement, legendSettings, legendLabelsSettings, legendMarkersSettings) => {
250
+ const legendItem = am5.Legend.new(root, {
251
+ paddingTop: legendPlacement == LegendPlacement.bottom ? 20 : 0,
252
+ paddingBottom: legendPlacement == LegendPlacement.top ? 20 : 0,
253
+ forceHidden: legendPlacement == LegendPlacement.hidden,
254
+ layout: legendPlacement == LegendPlacement.left ||
255
+ legendPlacement == LegendPlacement.right
256
+ ? root.verticalLayout
257
+ : root.gridLayout,
258
+ ...legendSettings,
259
+ });
260
+ // Setup legend
261
+ const legend = legendPlacement == LegendPlacement.left ||
262
+ legendPlacement == LegendPlacement.top
263
+ ? chart.children.unshift(legendItem)
264
+ : chart.children.push(legendItem);
265
+ legend.labels.template.setAll({
266
+ fontSize: '0.8rem',
267
+ ...legendLabelsSettings,
268
+ });
269
+ legend.valueLabels.template.setAll({
270
+ forceHidden: true,
271
+ });
272
+ legend.markers.template.setAll({
273
+ width: 12,
274
+ height: 12,
275
+ ...legendMarkersSettings,
276
+ });
277
+ if (legendMarkersSettings?.rounded) {
278
+ legend.markerRectangles.template.setAll({
279
+ cornerRadiusTL: 100,
280
+ cornerRadiusTR: 100,
281
+ cornerRadiusBL: 100,
282
+ cornerRadiusBR: 100,
283
+ });
284
+ }
285
+ return legend;
286
+ };
287
+ var UnitPlacement;
288
+ (function (UnitPlacement) {
289
+ UnitPlacement["none"] = "none";
290
+ UnitPlacement["top"] = "top";
291
+ UnitPlacement["axis"] = "axis";
292
+ })(UnitPlacement || (exports.UnitPlacement = UnitPlacement = {}));
293
+ var AxisPlacement;
294
+ (function (AxisPlacement) {
295
+ AxisPlacement["left"] = "left";
296
+ AxisPlacement["right"] = "right";
297
+ })(AxisPlacement || (exports.AxisPlacement = AxisPlacement = {}));
298
+ var LegendPlacement;
299
+ (function (LegendPlacement) {
300
+ LegendPlacement["top"] = "top";
301
+ LegendPlacement["bottom"] = "bottom";
302
+ LegendPlacement["left"] = "left";
303
+ LegendPlacement["right"] = "right";
304
+ LegendPlacement["hidden"] = "hidden";
305
+ })(LegendPlacement || (exports.LegendPlacement = LegendPlacement = {}));
306
+ /**
307
+ * Customizable stacked column and line chart component based on amcharts5
308
+ *
309
+ * This component wraps some of the chart configuration trying to make it more react-friendly
310
+ */
311
+ const Chart = ({ DOMtargetId, baseInterval, barSeriesData, stackedBarSeriesData, lineSeriesData, rangesData, dateField, colorPalette, numberFormat, chartThemes, chartSettings, legendSettings, legendLabelsSettings, legendMarkersSettings, dateAxisSettings, dateAxisRendererSettings, valueAxisSettings, gridSettings, barSeriesSettings, lineSeriesSettings, columnSettings, tooltipSettings, cursor = false, unitPlacement = UnitPlacement.none, legendPlacement = LegendPlacement.bottom, translateLabel, }) => {
312
+ // Colors configuration
313
+ const theme = (0, react_jss_1.useTheme)();
314
+ const colors = { ...getDefaultChartColors(theme), ...colorPalette };
315
+ // Chart lifecycle
316
+ const [id, setId] = (0, react_1.useState)(DOMtargetId ?? `amchart-${Math.random()}`);
317
+ const containerRef = (0, react_1.useRef)(null);
318
+ const rootRef = (0, react_1.useRef)(null);
319
+ const chartRef = (0, react_1.useRef)(null);
320
+ const legendRef = (0, react_1.useRef)(null);
321
+ (0, react_1.useEffect)(() => {
322
+ if (DOMtargetId && DOMtargetId !== id) {
323
+ setId(DOMtargetId);
324
+ }
325
+ }, [DOMtargetId]);
326
+ // Chart setup
327
+ (0, react_1.useLayoutEffect)(() => {
328
+ const root = am5.Root.new(id);
329
+ root.autoResize = false;
330
+ // Setup amcharts theme
331
+ if (chartThemes) {
332
+ root.setThemes(chartThemes.map((t) => t.new(root)));
333
+ }
334
+ // Setup interface colors, see https://www.amcharts.com/docs/v5/concepts/colors-gradients-and-patterns/#Interface_colors
335
+ if (colors.interfaceColors) {
336
+ // Remap settings to use amcharts Color objects
337
+ for (const setting in colors.interfaceColors) {
338
+ const color = colors.interfaceColors[setting];
339
+ // Apply defined interfaceColor on the chart
340
+ root.interfaceColors.set(setting, am5.color(color));
341
+ }
342
+ }
343
+ // Setup chart settings
344
+ const chart = root.container.children.push(am5xy.XYChart.new(root, {
345
+ layout: legendPlacement == LegendPlacement.left ||
346
+ legendPlacement == LegendPlacement.right
347
+ ? root.horizontalLayout
348
+ : root.verticalLayout,
349
+ paddingLeft: 0,
350
+ paddingRight: 0,
351
+ paddingBottom: 0,
352
+ paddingTop: legendPlacement == LegendPlacement.top ||
353
+ unitPlacement == UnitPlacement.top
354
+ ? 35
355
+ : 10,
356
+ ...chartSettings,
357
+ }));
358
+ // Setup cursor
359
+ if (cursor) {
360
+ chart.set('cursor', am5xy.XYCursor.new(root, {}));
361
+ }
362
+ // Setup series colors
363
+ if (colors?.series) {
364
+ chart.get('colors')?.set('colors', colors.series.map((c) => am5.color(c)));
365
+ }
366
+ const legend = setupLegend(root, chart, legendPlacement, legendSettings, legendLabelsSettings, legendMarkersSettings);
367
+ rootRef.current = root;
368
+ chartRef.current = chart;
369
+ legendRef.current = legend;
370
+ // Clean up before component removal from the DOM
371
+ return () => {
372
+ legendRef.current?.dispose();
373
+ legendRef.current = null;
374
+ chartRef.current?.dispose();
375
+ chartRef.current = null;
376
+ root?.dispose();
377
+ rootRef.current = null;
378
+ };
379
+ }, [id, colors, chartThemes, chartSettings, legendSettings]);
380
+ // Set data
381
+ (0, react_1.useEffect)(() => {
382
+ const root = rootRef.current;
383
+ const chart = chartRef.current;
384
+ if (chart && root) {
385
+ chart.series.clear();
386
+ if (barSeriesData?.length == 0 &&
387
+ stackedBarSeriesData?.length == 0 &&
388
+ lineSeriesData?.length == 0) {
389
+ return;
390
+ }
391
+ // Setup axes
392
+ const xRenderer = am5xy.AxisRendererX.new(root, {
393
+ strokeWidth: 0,
394
+ minGridDistance: 30,
395
+ ...dateAxisRendererSettings,
396
+ });
397
+ const xAxis = chart.xAxes.push(am5xy.DateAxis.new(root, {
398
+ baseInterval,
399
+ renderer: xRenderer,
400
+ ...dateAxisSettings,
401
+ }));
402
+ xRenderer.grid.template.setAll({
403
+ strokeWidth: 0,
404
+ forceHidden: true,
405
+ });
406
+ xRenderer.labels.template.setAll({
407
+ location: 0.5,
408
+ fontSize: '0.7rem',
409
+ textAlign: 'center',
410
+ });
411
+ xAxis.data.setAll(Array.prototype.concat(stackedBarSeriesData ?? [], lineSeriesData ?? [], barSeriesData ?? []));
412
+ addRanges(root, xAxis, rangesData);
413
+ const yAxes = new Map();
414
+ if (barSeriesData) {
415
+ addBarSeries(barSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, false, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings);
416
+ }
417
+ if (stackedBarSeriesData) {
418
+ addBarSeries(stackedBarSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, true, legendRef, gridSettings, valueAxisSettings, translateLabel, barSeriesSettings, columnSettings, tooltipSettings);
419
+ }
420
+ if (lineSeriesData) {
421
+ addLineSeries(lineSeriesData, root, chart, xAxis, yAxes, dateField, unitPlacement, legendRef, gridSettings, valueAxisSettings, translateLabel, lineSeriesSettings, tooltipSettings);
422
+ }
423
+ }
424
+ }, [
425
+ stackedBarSeriesData,
426
+ barSeriesData,
427
+ lineSeriesData,
428
+ chartRef.current,
429
+ colors?.series,
430
+ barSeriesSettings,
431
+ lineSeriesSettings,
432
+ ]);
433
+ (0, react_1.useEffect)(() => {
434
+ if (numberFormat) {
435
+ rootRef.current?.numberFormatter.set('numberFormat', numberFormat);
436
+ }
437
+ }, [rootRef.current, numberFormat]);
438
+ (0, react_1.useEffect)(() => {
439
+ let resizeObserver;
440
+ if (containerRef.current) {
441
+ const onResize = (0, lodash_1.debounce)(() => rootRef.current?.resize(), 100);
442
+ resizeObserver = new ResizeObserver(onResize);
443
+ resizeObserver.observe(containerRef.current);
444
+ }
445
+ return () => resizeObserver?.disconnect();
446
+ }, [containerRef.current, rootRef.current]);
447
+ const classes = useStyles();
448
+ return typeof id === 'string' ? (react_1.default.createElement("div", { id: id, className: classes.root })) : (
449
+ // If the DOM target is an HTML element, do not render another div. The chart will be attached to the existing element.
450
+ react_1.default.createElement(react_1.default.Fragment, null));
451
+ };
452
+ exports.Chart = Chart;
443
453
  //# sourceMappingURL=Chart.js.map