@j2inn/fin5-ui-utils 6.0.5-beta.0 → 6.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +5 -5
  2. package/dist/fantomProps/createFin5Props/index.d.ts +12 -12
  3. package/dist/fantomProps/createFin5Props/index.js +146 -146
  4. package/dist/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -2
  5. package/dist/fantomProps/createFin5Props/runCreateFin5Props.js +16 -16
  6. package/dist/fantomProps/fantomPropsToObject.d.ts +8 -8
  7. package/dist/fantomProps/fantomPropsToObject.js +183 -183
  8. package/dist/fantomProps/generateJsonFromFantomPropsFile.d.ts +4 -4
  9. package/dist/fantomProps/generateJsonFromFantomPropsFile.js +41 -41
  10. package/dist/fantomProps/localePropsToJson.d.ts +1 -1
  11. package/dist/fantomProps/localePropsToJson.js +50 -50
  12. package/dist/fantomProps/readFantomPropsFile.d.ts +5 -5
  13. package/dist/fantomProps/readFantomPropsFile.js +65 -66
  14. package/dist/fantomProps/readFantomPropsFile.js.map +1 -1
  15. package/dist/fin5Top/fin5FileUpload.d.ts +24 -24
  16. package/dist/fin5Top/fin5FileUpload.js +51 -51
  17. package/dist/fin5Top/fin5Top.d.ts +124 -124
  18. package/dist/fin5Top/fin5Top.js +53 -53
  19. package/dist/fin5Top/finEdge2Cloud.d.ts +6 -6
  20. package/dist/fin5Top/finEdge2Cloud.js +15 -15
  21. package/dist/fin5Top/getFin5BinUrl.d.ts +2 -2
  22. package/dist/fin5Top/getFin5BinUrl.js +9 -9
  23. package/dist/fin5Top/openFin5Alarm.d.ts +22 -22
  24. package/dist/fin5Top/openFin5Alarm.js +23 -23
  25. package/dist/fin5Top/openFin5Historian.d.ts +3 -3
  26. package/dist/fin5Top/openFin5Historian.js +19 -19
  27. package/dist/fin5Top/useFin5AppURLHashParameter.d.ts +18 -18
  28. package/dist/fin5Top/useFin5AppURLHashParameter.js +133 -133
  29. package/dist/index.d.ts +35 -35
  30. package/dist/index.js +69 -69
  31. package/dist/jobs/jobUtils.d.ts +14 -14
  32. package/dist/jobs/jobUtils.js +15 -15
  33. package/dist/react/app/Fin5AppContainer.d.ts +36 -36
  34. package/dist/react/app/Fin5AppContainer.js +102 -102
  35. package/dist/react/app/Fin5AppRootStore.d.ts +40 -40
  36. package/dist/react/app/Fin5AppRootStore.js +69 -69
  37. package/dist/react/components/ErrorBoundary.d.ts +57 -57
  38. package/dist/react/components/ErrorBoundary.js +150 -150
  39. package/dist/react/components/ErrorDisplayer.d.ts +19 -19
  40. package/dist/react/components/ErrorDisplayer.js +36 -36
  41. package/dist/react/components/Loader.d.ts +9 -9
  42. package/dist/react/components/Loader.js +17 -17
  43. package/dist/react/components/LoadingSpinner.d.ts +2 -2
  44. package/dist/react/components/LoadingSpinner.js +27 -27
  45. package/dist/react/components/RecordImage.d.ts +20 -20
  46. package/dist/react/components/RecordImage.js +51 -51
  47. package/dist/react/components/charts/QRCode.d.ts +25 -25
  48. package/dist/react/components/charts/QRCode.js +82 -82
  49. package/dist/react/components/charts/line-bar/Chart.d.ts +166 -166
  50. package/dist/react/components/charts/line-bar/Chart.js +442 -442
  51. package/dist/react/components/charts/line-bar/HGridChart.d.ts +58 -58
  52. package/dist/react/components/charts/line-bar/HGridChart.js +285 -285
  53. package/dist/react/components/charts/pie/PieChart.d.ts +94 -94
  54. package/dist/react/components/charts/pie/PieChart.js +204 -204
  55. package/dist/react/components/charts/pie/SimplePieChart.d.ts +21 -21
  56. package/dist/react/components/charts/pie/SimplePieChart.js +55 -55
  57. package/dist/react/components/graphics/GraphicViewer.d.ts +10 -10
  58. package/dist/react/components/graphics/GraphicViewer.js +29 -29
  59. package/dist/react/components/graphics/GraphicsTabViewer.d.ts +17 -17
  60. package/dist/react/components/graphics/GraphicsTabViewer.js +90 -90
  61. package/dist/react/components/makeCustomElement.d.ts +16 -16
  62. package/dist/react/components/makeCustomElement.js +150 -150
  63. package/dist/react/components/navigation/BasicLayout.d.ts +41 -41
  64. package/dist/react/components/navigation/BasicLayout.js +155 -155
  65. package/dist/react/components/navigation/HeaderSiderLayout.d.ts +13 -13
  66. package/dist/react/components/navigation/HeaderSiderLayout.js +110 -110
  67. package/dist/react/components/navigation/MenuPage.d.ts +37 -37
  68. package/dist/react/components/navigation/MenuPage.js +36 -36
  69. package/dist/react/components/navigation/MenuTrigger.d.ts +9 -9
  70. package/dist/react/components/navigation/MenuTrigger.js +33 -33
  71. package/dist/react/components/navigation/ReactRouterHeaderSiderLayout.d.ts +11 -11
  72. package/dist/react/components/navigation/ReactRouterHeaderSiderLayout.js +25 -25
  73. package/dist/react/components/navigation/ReactRouterLayout.d.ts +46 -46
  74. package/dist/react/components/navigation/ReactRouterLayout.js +132 -132
  75. package/dist/react/components/navigation/customRouting/Router.d.ts +12 -12
  76. package/dist/react/components/navigation/customRouting/Router.js +45 -45
  77. package/dist/react/components/navigation/customRouting/RouterLayout.d.ts +11 -11
  78. package/dist/react/components/navigation/customRouting/RouterLayout.js +61 -61
  79. package/dist/react/components/resolvable/configurationForm/ConfigurationForm.d.ts +27 -27
  80. package/dist/react/components/resolvable/configurationForm/ConfigurationForm.js +95 -95
  81. package/dist/react/components/resolvable/configurationForm/ConfigurationFormEntry.d.ts +16 -16
  82. package/dist/react/components/resolvable/configurationForm/ConfigurationFormEntry.js +88 -88
  83. package/dist/react/components/resolvable/configurationForm/getSectionDefault.d.ts +16 -16
  84. package/dist/react/components/resolvable/configurationForm/getSectionDefault.js +99 -99
  85. package/dist/react/hooks/useFin5BinUrl.d.ts +6 -6
  86. package/dist/react/hooks/useFin5BinUrl.js +15 -15
  87. package/dist/react/hooks/useFin5ColorScheme.d.ts +2 -2
  88. package/dist/react/hooks/useFin5ColorScheme.js +49 -49
  89. package/dist/react/hooks/useScreenSize.d.ts +7 -7
  90. package/dist/react/hooks/useScreenSize.js +31 -31
  91. package/dist_es/fantomProps/createFin5Props/index.d.ts +12 -12
  92. package/dist_es/fantomProps/createFin5Props/index.js +140 -140
  93. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -2
  94. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.js +11 -11
  95. package/dist_es/fantomProps/fantomPropsToObject.d.ts +8 -8
  96. package/dist_es/fantomProps/fantomPropsToObject.js +178 -178
  97. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.d.ts +4 -4
  98. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.js +12 -12
  99. package/dist_es/fantomProps/localePropsToJson.d.ts +1 -1
  100. package/dist_es/fantomProps/localePropsToJson.js +21 -21
  101. package/dist_es/fantomProps/readFantomPropsFile.d.ts +5 -5
  102. package/dist_es/fantomProps/readFantomPropsFile.js +39 -40
  103. package/dist_es/fantomProps/readFantomPropsFile.js.map +1 -1
  104. package/dist_es/fin5Top/fin5FileUpload.d.ts +24 -24
  105. package/dist_es/fin5Top/fin5FileUpload.js +47 -47
  106. package/dist_es/fin5Top/fin5Top.d.ts +124 -124
  107. package/dist_es/fin5Top/fin5Top.js +49 -49
  108. package/dist_es/fin5Top/finEdge2Cloud.d.ts +6 -6
  109. package/dist_es/fin5Top/finEdge2Cloud.js +11 -11
  110. package/dist_es/fin5Top/getFin5BinUrl.d.ts +2 -2
  111. package/dist_es/fin5Top/getFin5BinUrl.js +5 -5
  112. package/dist_es/fin5Top/openFin5Alarm.d.ts +22 -22
  113. package/dist_es/fin5Top/openFin5Alarm.js +19 -19
  114. package/dist_es/fin5Top/openFin5Historian.d.ts +3 -3
  115. package/dist_es/fin5Top/openFin5Historian.js +15 -15
  116. package/dist_es/fin5Top/useFin5AppURLHashParameter.d.ts +18 -18
  117. package/dist_es/fin5Top/useFin5AppURLHashParameter.js +124 -124
  118. package/dist_es/index.d.ts +35 -35
  119. package/dist_es/index.js +53 -53
  120. package/dist_es/jobs/jobUtils.d.ts +14 -14
  121. package/dist_es/jobs/jobUtils.js +9 -9
  122. package/dist_es/react/app/Fin5AppContainer.d.ts +36 -36
  123. package/dist_es/react/app/Fin5AppContainer.js +73 -73
  124. package/dist_es/react/app/Fin5AppRootStore.d.ts +40 -40
  125. package/dist_es/react/app/Fin5AppRootStore.js +65 -65
  126. package/dist_es/react/components/ErrorBoundary.d.ts +57 -57
  127. package/dist_es/react/components/ErrorBoundary.js +123 -123
  128. package/dist_es/react/components/ErrorDisplayer.d.ts +19 -19
  129. package/dist_es/react/components/ErrorDisplayer.js +28 -28
  130. package/dist_es/react/components/Loader.d.ts +9 -9
  131. package/dist_es/react/components/Loader.js +12 -12
  132. package/dist_es/react/components/LoadingSpinner.d.ts +2 -2
  133. package/dist_es/react/components/LoadingSpinner.js +20 -20
  134. package/dist_es/react/components/RecordImage.d.ts +20 -20
  135. package/dist_es/react/components/RecordImage.js +24 -24
  136. package/dist_es/react/components/charts/QRCode.d.ts +25 -25
  137. package/dist_es/react/components/charts/QRCode.js +52 -52
  138. package/dist_es/react/components/charts/line-bar/Chart.d.ts +166 -166
  139. package/dist_es/react/components/charts/line-bar/Chart.js +415 -415
  140. package/dist_es/react/components/charts/line-bar/HGridChart.d.ts +58 -58
  141. package/dist_es/react/components/charts/line-bar/HGridChart.js +250 -250
  142. package/dist_es/react/components/charts/pie/PieChart.d.ts +94 -94
  143. package/dist_es/react/components/charts/pie/PieChart.js +177 -177
  144. package/dist_es/react/components/charts/pie/SimplePieChart.d.ts +21 -21
  145. package/dist_es/react/components/charts/pie/SimplePieChart.js +25 -25
  146. package/dist_es/react/components/graphics/GraphicViewer.d.ts +10 -10
  147. package/dist_es/react/components/graphics/GraphicViewer.js +22 -22
  148. package/dist_es/react/components/graphics/GraphicsTabViewer.d.ts +17 -17
  149. package/dist_es/react/components/graphics/GraphicsTabViewer.js +60 -60
  150. package/dist_es/react/components/makeCustomElement.d.ts +16 -16
  151. package/dist_es/react/components/makeCustomElement.js +142 -142
  152. package/dist_es/react/components/navigation/BasicLayout.d.ts +41 -41
  153. package/dist_es/react/components/navigation/BasicLayout.js +124 -124
  154. package/dist_es/react/components/navigation/HeaderSiderLayout.d.ts +13 -13
  155. package/dist_es/react/components/navigation/HeaderSiderLayout.js +80 -80
  156. package/dist_es/react/components/navigation/MenuPage.d.ts +37 -37
  157. package/dist_es/react/components/navigation/MenuPage.js +30 -30
  158. package/dist_es/react/components/navigation/MenuTrigger.d.ts +9 -9
  159. package/dist_es/react/components/navigation/MenuTrigger.js +28 -28
  160. package/dist_es/react/components/navigation/ReactRouterHeaderSiderLayout.d.ts +11 -11
  161. package/dist_es/react/components/navigation/ReactRouterHeaderSiderLayout.js +18 -18
  162. package/dist_es/react/components/navigation/ReactRouterLayout.d.ts +46 -46
  163. package/dist_es/react/components/navigation/ReactRouterLayout.js +99 -99
  164. package/dist_es/react/components/navigation/customRouting/Router.d.ts +12 -12
  165. package/dist_es/react/components/navigation/customRouting/Router.js +18 -18
  166. package/dist_es/react/components/navigation/customRouting/RouterLayout.d.ts +11 -11
  167. package/dist_es/react/components/navigation/customRouting/RouterLayout.js +34 -34
  168. package/dist_es/react/components/resolvable/configurationForm/ConfigurationForm.d.ts +27 -27
  169. package/dist_es/react/components/resolvable/configurationForm/ConfigurationForm.js +64 -64
  170. package/dist_es/react/components/resolvable/configurationForm/ConfigurationFormEntry.d.ts +16 -16
  171. package/dist_es/react/components/resolvable/configurationForm/ConfigurationFormEntry.js +58 -58
  172. package/dist_es/react/components/resolvable/configurationForm/getSectionDefault.d.ts +16 -16
  173. package/dist_es/react/components/resolvable/configurationForm/getSectionDefault.js +94 -94
  174. package/dist_es/react/hooks/useFin5BinUrl.d.ts +6 -6
  175. package/dist_es/react/hooks/useFin5BinUrl.js +11 -11
  176. package/dist_es/react/hooks/useFin5ColorScheme.d.ts +2 -2
  177. package/dist_es/react/hooks/useFin5ColorScheme.js +45 -45
  178. package/dist_es/react/hooks/useScreenSize.d.ts +7 -7
  179. package/dist_es/react/hooks/useScreenSize.js +27 -27
  180. package/package.json +1 -1
  181. package/dist_es/react/app/Fin5AppContainer.jsx +0 -82
  182. package/dist_es/react/app/Fin5AppContainer.jsx.map +0 -1
  183. package/dist_es/react/components/ErrorBoundary.jsx +0 -150
  184. package/dist_es/react/components/ErrorBoundary.jsx.map +0 -1
  185. package/dist_es/react/components/ErrorDisplayer.jsx +0 -36
  186. package/dist_es/react/components/ErrorDisplayer.jsx.map +0 -1
  187. package/dist_es/react/components/Loader.jsx +0 -13
  188. package/dist_es/react/components/Loader.jsx.map +0 -1
  189. package/dist_es/react/components/LoadingSpinner.jsx +0 -22
  190. package/dist_es/react/components/LoadingSpinner.jsx.map +0 -1
  191. package/dist_es/react/components/charts/line-bar/ZincGridChart.d.ts +0 -12
  192. package/dist_es/react/components/charts/line-bar/ZincGridChart.js +0 -17
  193. package/dist_es/react/components/charts/line-bar/ZincGridChart.js.map +0 -1
  194. package/dist_es/react/components/graphics/GraphicViewer.jsx +0 -23
  195. package/dist_es/react/components/graphics/GraphicViewer.jsx.map +0 -1
  196. package/dist_es/react/components/graphics/GraphicsTabViewer.jsx +0 -63
  197. package/dist_es/react/components/graphics/GraphicsTabViewer.jsx.map +0 -1
  198. package/dist_es/react/components/navigation/BasicLayout.jsx +0 -133
  199. package/dist_es/react/components/navigation/BasicLayout.jsx.map +0 -1
  200. package/dist_es/react/components/navigation/MenuPage.jsx +0 -31
  201. package/dist_es/react/components/navigation/MenuPage.jsx.map +0 -1
  202. package/dist_es/react/components/navigation/Router.d.ts +0 -12
  203. package/dist_es/react/components/navigation/Router.js +0 -19
  204. package/dist_es/react/components/navigation/Router.js.map +0 -1
  205. package/dist_es/react/components/navigation/Router.jsx +0 -19
  206. package/dist_es/react/components/navigation/Router.jsx.map +0 -1
  207. package/dist_es/react/components/navigation/react-router/BasicLayout.d.ts +0 -23
  208. package/dist_es/react/components/navigation/react-router/BasicLayout.js +0 -82
  209. package/dist_es/react/components/navigation/react-router/BasicLayout.js.map +0 -1
  210. package/dist_es/react/components/navigation/react-router/ReactRouterBasicLayout.d.ts +0 -24
  211. package/dist_es/react/components/navigation/react-router/ReactRouterBasicLayout.js +0 -82
  212. package/dist_es/react/components/navigation/react-router/ReactRouterBasicLayout.js.map +0 -1
@@ -1,443 +1,443 @@
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 (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;
443
443
  //# sourceMappingURL=Chart.js.map