@j2inn/fin5-ui-utils 5.2.2-beta.9 → 6.0.1

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