@centreon/ui 23.10.30-MON-19324-dashboard-section-navigation.3 → 23.10.30

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 (205) hide show
  1. package/package.json +9 -12
  2. package/src/@assets/icons/downtime.icon.svg +1 -0
  3. package/src/Dashboard/DashboardLayout.stories.tsx +5 -3
  4. package/src/Dashboard/Layout.tsx +4 -4
  5. package/src/Dashboard/utils.ts +28 -28
  6. package/src/Graph/BasicComponents/Axes/UnitLabel.tsx +20 -0
  7. package/src/Graph/BasicComponents/Axes/index.tsx +88 -0
  8. package/src/Graph/BasicComponents/Axes/models.ts +26 -0
  9. package/src/Graph/BasicComponents/Axes/useAxisY.ts +100 -0
  10. package/src/Graph/BasicComponents/Grids/index.tsx +20 -0
  11. package/src/Graph/BasicComponents/Lines/RegularLines/index.tsx +91 -0
  12. package/src/Graph/BasicComponents/Lines/RegularLines/useRegularLines.ts +15 -0
  13. package/src/Graph/BasicComponents/Lines/StackedLines/index.tsx +76 -0
  14. package/src/Graph/BasicComponents/Lines/StackedLines/useStackedLines.ts +39 -0
  15. package/src/Graph/BasicComponents/Lines/Threshold/BasicThreshold.tsx +51 -0
  16. package/src/Graph/BasicComponents/Lines/Threshold/Circle.tsx +43 -0
  17. package/src/Graph/BasicComponents/Lines/Threshold/ThresholdWithPatternLines.tsx +73 -0
  18. package/src/Graph/BasicComponents/Lines/Threshold/ThresholdWithVariation.tsx +59 -0
  19. package/src/Graph/BasicComponents/Lines/Threshold/helpers/index.ts +69 -0
  20. package/src/Graph/BasicComponents/Lines/Threshold/index.tsx +138 -0
  21. package/src/Graph/BasicComponents/Lines/Threshold/models.ts +105 -0
  22. package/src/Graph/BasicComponents/Lines/Threshold/useCoordinateCircle.ts +46 -0
  23. package/src/Graph/BasicComponents/Lines/Threshold/useScaleThreshold.ts +171 -0
  24. package/src/Graph/BasicComponents/Lines/index.tsx +180 -0
  25. package/src/Graph/BasicComponents/Lines/models.ts +42 -0
  26. package/src/Graph/BasicComponents/LoadingProgress.tsx +46 -0
  27. package/src/Graph/BasicComponents/useFilterLines.ts +60 -0
  28. package/src/Graph/Graph.styles.ts +45 -0
  29. package/src/Graph/Graph.tsx +217 -0
  30. package/src/Graph/Header/index.tsx +65 -0
  31. package/src/Graph/Icons/Downtime.tsx +9 -0
  32. package/src/Graph/InteractiveComponents/AnchorPoint/AnchorPoint.styles.ts +58 -0
  33. package/src/Graph/InteractiveComponents/AnchorPoint/GuidingLines.tsx +45 -0
  34. package/src/Graph/InteractiveComponents/AnchorPoint/RegularAnchorPoint.tsx +66 -0
  35. package/src/Graph/InteractiveComponents/AnchorPoint/StackedAnchorPoint.tsx +76 -0
  36. package/src/Graph/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +70 -0
  37. package/src/Graph/InteractiveComponents/AnchorPoint/index.tsx +20 -0
  38. package/src/Graph/InteractiveComponents/AnchorPoint/models.ts +62 -0
  39. package/src/Graph/InteractiveComponents/AnchorPoint/useTickGraph.ts +94 -0
  40. package/src/Graph/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +107 -0
  41. package/src/Graph/InteractiveComponents/Annotations/Annotation/Area.tsx +114 -0
  42. package/src/Graph/InteractiveComponents/Annotations/Annotation/Line.tsx +103 -0
  43. package/src/Graph/InteractiveComponents/Annotations/Annotation/index.tsx +81 -0
  44. package/src/Graph/InteractiveComponents/Annotations/Area/Downtime.tsx +27 -0
  45. package/src/Graph/InteractiveComponents/Annotations/EventAnnotations.tsx +61 -0
  46. package/src/Graph/InteractiveComponents/Annotations/Line/Acknowledgement.tsx +27 -0
  47. package/src/Graph/InteractiveComponents/Annotations/Line/Comments.tsx +25 -0
  48. package/src/Graph/InteractiveComponents/Annotations/annotationsAtoms.ts +183 -0
  49. package/src/Graph/InteractiveComponents/Annotations/index.tsx +49 -0
  50. package/src/Graph/InteractiveComponents/Annotations/models.ts +25 -0
  51. package/src/Graph/InteractiveComponents/Annotations/useAnnotation.ts +56 -0
  52. package/src/Graph/InteractiveComponents/Bar.tsx +21 -0
  53. package/src/Graph/InteractiveComponents/TimeShiftZones/TimeShiftIcon.tsx +62 -0
  54. package/src/Graph/InteractiveComponents/TimeShiftZones/TimeShiftZone.tsx +74 -0
  55. package/src/Graph/InteractiveComponents/TimeShiftZones/index.tsx +85 -0
  56. package/src/Graph/InteractiveComponents/TimeShiftZones/models.ts +12 -0
  57. package/src/Graph/InteractiveComponents/TimeShiftZones/useTimeShiftZones.ts +72 -0
  58. package/src/Graph/InteractiveComponents/Tooltip/index.tsx +59 -0
  59. package/src/Graph/InteractiveComponents/Tooltip/models.ts +9 -0
  60. package/src/Graph/InteractiveComponents/Tooltip/useGraphTooltip.ts +67 -0
  61. package/src/Graph/InteractiveComponents/ZoomPreview/index.tsx +38 -0
  62. package/src/Graph/InteractiveComponents/ZoomPreview/models.ts +9 -0
  63. package/src/Graph/InteractiveComponents/ZoomPreview/useZoomPreview.ts +107 -0
  64. package/src/Graph/InteractiveComponents/ZoomPreview/zoomPreviewAtoms.ts +3 -0
  65. package/src/Graph/InteractiveComponents/index.tsx +168 -0
  66. package/src/Graph/InteractiveComponents/interactionWithGraphAtoms.ts +51 -0
  67. package/src/Graph/Legend/InteractiveValue.tsx +22 -0
  68. package/src/Graph/Legend/Legend.styles.ts +71 -0
  69. package/src/Graph/Legend/LegendContent.tsx +27 -0
  70. package/src/Graph/Legend/LegendHeader.tsx +45 -0
  71. package/src/Graph/Legend/Marker.tsx +43 -0
  72. package/src/Graph/Legend/index.tsx +166 -0
  73. package/src/Graph/Legend/models.ts +11 -0
  74. package/src/Graph/Legend/useInteractiveValues.ts +86 -0
  75. package/src/Graph/Legend/useLegend.ts +114 -0
  76. package/src/Graph/LoadingSkeleton.tsx +44 -0
  77. package/src/Graph/common/index.ts +35 -0
  78. package/src/Graph/graphAtoms.ts +6 -0
  79. package/src/Graph/helpers/doc.ts +560 -0
  80. package/src/Graph/helpers/index.ts +58 -0
  81. package/src/Graph/index.stories.tsx +372 -0
  82. package/src/Graph/index.tsx +90 -0
  83. package/src/Graph/mockedData/annotationData.json +326 -0
  84. package/src/Graph/mockedData/exclusionPeriodFirstPeriod.json +588 -0
  85. package/src/Graph/mockedData/exclusionPeriodSecondPeriod.json +588 -0
  86. package/src/Graph/mockedData/exclusionPeriodThirdPeriod.json +581 -0
  87. package/src/Graph/mockedData/lastDay.json +1326 -0
  88. package/src/Graph/mockedData/lastDayAreaStack.json +3106 -0
  89. package/src/Graph/mockedData/lastDayForward.json +1338 -0
  90. package/src/Graph/mockedData/lastDayThreshold.json +2352 -0
  91. package/src/Graph/mockedData/lastMonth.json +1674 -0
  92. package/src/Graph/mockedData/lastWeek.json +2202 -0
  93. package/src/Graph/mockedData/zoomPreview.json +742 -0
  94. package/src/Graph/models.ts +150 -0
  95. package/src/Graph/timeSeries/index.test.ts +506 -0
  96. package/src/Graph/timeSeries/index.ts +512 -0
  97. package/src/Graph/timeSeries/models.ts +120 -0
  98. package/src/Graph/translatedLabels.ts +9 -0
  99. package/src/Graph/useGraphData.ts +47 -0
  100. package/src/Graph/useGraphIntersection.ts +36 -0
  101. package/src/ThemeProvider/index.tsx +5 -6
  102. package/src/ThemeProvider/palettes.ts +215 -385
  103. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +51 -0
  104. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.tsx +95 -0
  105. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/ErrorText.tsx +14 -0
  106. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/PickersStartEndDate.tsx +163 -0
  107. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/index.tsx +76 -0
  108. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/models.ts +61 -0
  109. package/src/TimePeriods/CustomTimePeriod/PopoverCustomTimePeriod/usePickersStartEndDate.ts +82 -0
  110. package/src/TimePeriods/CustomTimePeriod/index.tsx +66 -0
  111. package/src/TimePeriods/DateTimePickerInput.tsx +49 -0
  112. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +65 -0
  113. package/src/TimePeriods/SelectedTimePeriod.tsx +102 -0
  114. package/src/TimePeriods/TimePeriods.cypress.spec.tsx +510 -0
  115. package/src/TimePeriods/TimePeriods.styles.ts +22 -0
  116. package/src/TimePeriods/helpers/index.ts +26 -0
  117. package/src/TimePeriods/index.stories.tsx +98 -0
  118. package/src/TimePeriods/index.tsx +78 -0
  119. package/src/TimePeriods/mockedData.ts +12 -0
  120. package/src/TimePeriods/models.ts +97 -0
  121. package/src/TimePeriods/timePeriodsAtoms.ts +102 -0
  122. package/src/TimePeriods/translatedLabels.ts +9 -0
  123. package/src/TimePeriods/useSortTimePeriods.ts +31 -0
  124. package/src/TimePeriods/useTimePeriod.ts +49 -0
  125. package/src/api/TestQueryProvider.tsx +1 -2
  126. package/src/api/useFetchQuery/index.ts +7 -8
  127. package/src/api/useMutationQuery/index.ts +10 -11
  128. package/src/components/Button/Button.styles.ts +3 -17
  129. package/src/components/Button/Button.tsx +3 -6
  130. package/src/components/Button/Icon/IconButton.styles.ts +2 -9
  131. package/src/components/DataTable/DataTable.stories.tsx +0 -9
  132. package/src/components/DataTable/DataTable.styles.ts +0 -5
  133. package/src/components/DataTable/DataTable.tsx +6 -8
  134. package/src/components/DataTable/EmptyState/DataTableEmptyState.tsx +1 -4
  135. package/src/components/DataTable/Item/DataTableItem.styles.ts +2 -5
  136. package/src/components/DataTable/Item/DataTableItem.tsx +18 -36
  137. package/src/components/Header/Header.stories.tsx +27 -0
  138. package/src/components/Header/Header.styles.ts +27 -0
  139. package/src/components/Header/Header.tsx +23 -0
  140. package/src/components/Header/index.ts +1 -1
  141. package/src/components/Modal/index.ts +0 -2
  142. package/src/components/index.ts +0 -3
  143. package/src/index.ts +2 -0
  144. package/src/layout/TiledListingPage/TiledListingActions.tsx +15 -0
  145. package/src/layout/TiledListingPage/TiledListingContent.tsx +21 -0
  146. package/src/layout/TiledListingPage/TiledListingList.tsx +11 -0
  147. package/src/layout/TiledListingPage/TiledListingPage.styles.ts +16 -0
  148. package/src/layout/TiledListingPage/TiledListingPage.tsx +15 -0
  149. package/src/layout/TiledListingPage/index.ts +4 -0
  150. package/src/screens/dashboard/DashboardsOverview.stories.tsx +102 -110
  151. package/src/utils/index.ts +1 -1
  152. package/src/utils/sanitizedHTML.ts +1 -1
  153. package/test/setupTests.js +0 -3
  154. package/src/base/tokens/README.md +0 -3
  155. package/src/base/tokens/source/$metadata.json +0 -5
  156. package/src/base/tokens/source/base.json +0 -142
  157. package/src/base/tokens/themes/base.tokens.d.ts +0 -38
  158. package/src/base/tokens/themes/base.tokens.json +0 -695
  159. package/src/base/tokens/themes/base.tokens.ts +0 -38
  160. package/src/base/tokens/themes/ui-dark.tokens.d.ts +0 -38
  161. package/src/base/tokens/themes/ui-dark.tokens.json +0 -695
  162. package/src/base/tokens/themes/ui-dark.tokens.ts +0 -38
  163. package/src/base/tokens/themes/ui-light.tokens.d.ts +0 -38
  164. package/src/base/tokens/themes/ui-light.tokens.json +0 -695
  165. package/src/base/tokens/themes/ui-light.tokens.ts +0 -38
  166. package/src/components/Header/PageHeader/PageHeader.stories.tsx +0 -88
  167. package/src/components/Header/PageHeader/PageHeader.styles.ts +0 -99
  168. package/src/components/Header/PageHeader/PageHeader.tsx +0 -15
  169. package/src/components/Header/PageHeader/PageHeaderActions.tsx +0 -17
  170. package/src/components/Header/PageHeader/PageHeaderMain.tsx +0 -15
  171. package/src/components/Header/PageHeader/PageHeaderMenu.tsx +0 -15
  172. package/src/components/Header/PageHeader/PageHeaderTitle.tsx +0 -47
  173. package/src/components/Header/PageHeader/index.ts +0 -12
  174. package/src/components/Layout/AreaIndicator.styles.ts +0 -33
  175. package/src/components/Layout/AreaIndicator.tsx +0 -35
  176. package/src/components/Layout/PageLayout/PageLayout.stories.tsx +0 -81
  177. package/src/components/Layout/PageLayout/PageLayout.styles.ts +0 -40
  178. package/src/components/Layout/PageLayout/PageLayout.tsx +0 -21
  179. package/src/components/Layout/PageLayout/PageLayoutActions.tsx +0 -15
  180. package/src/components/Layout/PageLayout/PageLayoutBody.tsx +0 -24
  181. package/src/components/Layout/PageLayout/PageLayoutHeader.tsx +0 -15
  182. package/src/components/Layout/PageLayout/index.ts +0 -10
  183. package/src/components/Layout/index.ts +0 -1
  184. package/src/components/Menu/Button/MenuButton.stories.tsx +0 -16
  185. package/src/components/Menu/Button/MenuButton.styles.ts +0 -27
  186. package/src/components/Menu/Button/MenuButton.tsx +0 -59
  187. package/src/components/Menu/Button/index.ts +0 -1
  188. package/src/components/Menu/Menu.stories.tsx +0 -71
  189. package/src/components/Menu/Menu.styles.ts +0 -70
  190. package/src/components/Menu/Menu.tsx +0 -25
  191. package/src/components/Menu/MenuDivider.tsx +0 -13
  192. package/src/components/Menu/MenuItem.tsx +0 -36
  193. package/src/components/Menu/MenuItems.tsx +0 -35
  194. package/src/components/Menu/index.ts +0 -12
  195. package/src/components/Menu/useMenu.tsx +0 -79
  196. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.stories.tsx +0 -71
  197. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.styles.ts +0 -5
  198. package/src/components/Tooltip/TextOverflowTooltip/TextOverflowTooltip.tsx +0 -115
  199. package/src/components/Tooltip/TextOverflowTooltip/index.tsx +0 -1
  200. package/src/components/Tooltip/Tooltip.stories.tsx +0 -41
  201. package/src/components/Tooltip/Tooltip.styles.ts +0 -5
  202. package/src/components/Tooltip/Tooltip.tsx +0 -46
  203. package/src/components/Tooltip/index.ts +0 -1
  204. package/src/screens/dashboard/DashboardsDetail.stories.tsx +0 -108
  205. package/src/utils/useResizeObserver.ts +0 -6
@@ -0,0 +1,51 @@
1
+ import { curveBasis } from '@visx/curve';
2
+ import { Threshold } from '@visx/threshold';
3
+
4
+ import { TimeValue } from '../../../timeSeries/models';
5
+
6
+ interface Props {
7
+ fillAboveArea: string;
8
+ fillBelowArea: string;
9
+ fillOpacity?: number;
10
+ getX: (timeValue: TimeValue) => number;
11
+ getY0: (timeValue: TimeValue) => number;
12
+ getY1: (timeValue: TimeValue) => number;
13
+ graphHeight: number;
14
+ id: string;
15
+ timeSeries: Array<TimeValue>;
16
+ }
17
+
18
+ const BasicThreshold = ({
19
+ getX,
20
+ getY0,
21
+ getY1,
22
+ graphHeight,
23
+ timeSeries,
24
+ fillOpacity = 0.1,
25
+ id,
26
+ fillAboveArea,
27
+ fillBelowArea
28
+ }: Props): JSX.Element => {
29
+ return (
30
+ <Threshold
31
+ aboveAreaProps={{
32
+ fill: fillAboveArea,
33
+ fillOpacity
34
+ }}
35
+ belowAreaProps={{
36
+ fill: fillBelowArea,
37
+ fillOpacity
38
+ }}
39
+ clipAboveTo={0}
40
+ clipBelowTo={graphHeight}
41
+ curve={curveBasis}
42
+ data={timeSeries}
43
+ id={id}
44
+ x={getX}
45
+ y0={getY0}
46
+ y1={getY1}
47
+ />
48
+ );
49
+ };
50
+
51
+ export default BasicThreshold;
@@ -0,0 +1,43 @@
1
+ import { Shape } from '@visx/visx';
2
+ import { isEmpty, isNil } from 'ramda';
3
+
4
+ import { Circle } from './models';
5
+ import useCoordinateCircle from './useCoordinateCircle';
6
+
7
+ const Circle = ({
8
+ getY0Variation,
9
+ getY1Variation,
10
+ getYOrigin,
11
+ timeSeries,
12
+ getX,
13
+ getCountDisplayedCircles
14
+ }: Circle): JSX.Element | null => {
15
+ const coordinates = useCoordinateCircle({
16
+ getCountDisplayedCircles,
17
+ getX,
18
+ getY0Variation,
19
+ getY1Variation,
20
+ getYOrigin,
21
+ timeSeries
22
+ });
23
+
24
+ if (isEmpty(coordinates) || isNil(coordinates)) {
25
+ return null;
26
+ }
27
+
28
+ return (
29
+ <g>
30
+ {coordinates.map(({ x, y }) => (
31
+ <Shape.Circle
32
+ cx={x}
33
+ cy={y}
34
+ fill="red"
35
+ key={`${x.toString()}-${y.toString()}`}
36
+ r={2}
37
+ />
38
+ ))}
39
+ </g>
40
+ );
41
+ };
42
+
43
+ export default Circle;
@@ -0,0 +1,73 @@
1
+ import { PatternLines } from '@visx/pattern';
2
+ import { ScaleLinear } from 'd3-scale';
3
+
4
+ import { useTheme } from '@mui/material/styles';
5
+
6
+ import { adjustGraphData } from '../../../helpers/index';
7
+ import { GraphData, PatternOrientation } from '../../../models';
8
+
9
+ import BasicThreshold from './BasicThreshold';
10
+ import useScaleThreshold from './useScaleThreshold';
11
+
12
+ interface Props {
13
+ data: GraphData;
14
+ graphHeight: number;
15
+ id: string;
16
+ leftScale: ScaleLinear<number, number>;
17
+ orientation?: Array<PatternOrientation>;
18
+ rightScale: ScaleLinear<number, number>;
19
+ xScale: ScaleLinear<number, number>;
20
+ }
21
+
22
+ const ThresholdWithPatternLines = ({
23
+ graphHeight,
24
+ data,
25
+ orientation = ['diagonal'],
26
+ leftScale,
27
+ rightScale,
28
+ xScale,
29
+ id
30
+ }: Props): JSX.Element | null => {
31
+ const theme = useTheme();
32
+
33
+ const { lines, timeSeries } = adjustGraphData(data);
34
+
35
+ const result = useScaleThreshold({
36
+ leftScale,
37
+ lines,
38
+ rightScale,
39
+ xScale
40
+ });
41
+ if (!result) {
42
+ return null;
43
+ }
44
+
45
+ const { getX, getY0, getY1 } = result;
46
+
47
+ return (
48
+ <>
49
+ <BasicThreshold
50
+ fillAboveArea={"url('#lines')"}
51
+ fillBelowArea={"url('#lines')"}
52
+ fillOpacity={0.8}
53
+ getX={getX}
54
+ getY0={getY0}
55
+ getY1={getY1}
56
+ graphHeight={graphHeight}
57
+ id={id}
58
+ timeSeries={timeSeries}
59
+ />
60
+ <PatternLines
61
+ data-testid="patternLinesExclusionPeriods"
62
+ height={5}
63
+ id="lines"
64
+ orientation={orientation}
65
+ stroke={theme.palette.text.primary}
66
+ strokeWidth={1}
67
+ width={5}
68
+ />
69
+ </>
70
+ );
71
+ };
72
+
73
+ export default ThresholdWithPatternLines;
@@ -0,0 +1,59 @@
1
+ import { curveBasis } from '@visx/curve';
2
+ import { LinePath } from '@visx/shape';
3
+
4
+ import { useTheme } from '@mui/material/styles';
5
+
6
+ import { TimeValue } from '../../../timeSeries/models';
7
+
8
+ import BasicThreshold from './BasicThreshold';
9
+
10
+ interface Props {
11
+ getX: (timeValue: TimeValue) => number;
12
+ getY0Variation: (timeValue: TimeValue) => number;
13
+ getY1Variation: (timeValue: TimeValue) => number;
14
+ graphHeight: number;
15
+ lineColorY0: string;
16
+ lineColorY1: string;
17
+ timeSeries: Array<TimeValue>;
18
+ }
19
+
20
+ const ThresholdWithVariation = ({
21
+ timeSeries,
22
+ getX,
23
+ getY0Variation,
24
+ getY1Variation,
25
+ graphHeight,
26
+ lineColorY1,
27
+ lineColorY0
28
+ }: Props): JSX.Element => {
29
+ const theme = useTheme();
30
+
31
+ const props = {
32
+ curve: curveBasis,
33
+ data: timeSeries,
34
+ stroke: theme.palette.secondary.main,
35
+ strokeDasharray: 5,
36
+ strokeOpacity: 0.9,
37
+ x: getX
38
+ };
39
+
40
+ return (
41
+ <>
42
+ <BasicThreshold
43
+ fillAboveArea={lineColorY1}
44
+ fillBelowArea={lineColorY0}
45
+ getX={getX}
46
+ getY0={getY0Variation}
47
+ getY1={getY1Variation}
48
+ graphHeight={graphHeight}
49
+ id="ThresholdWithVariation"
50
+ timeSeries={timeSeries}
51
+ />
52
+
53
+ <LinePath {...props} y={getY0Variation} />
54
+ <LinePath {...props} y={getY1Variation} />
55
+ </>
56
+ );
57
+ };
58
+
59
+ export default ThresholdWithVariation;
@@ -0,0 +1,69 @@
1
+ import { isNil } from 'ramda';
2
+
3
+ import {
4
+ ArePointsOnline,
5
+ EnvelopeVariationFormula,
6
+ Online,
7
+ Point
8
+ } from '../models';
9
+
10
+ export const checkArePointsOnline = ({
11
+ pointOrigin,
12
+ pointUpper,
13
+ pointLower
14
+ }: ArePointsOnline): Point | null => {
15
+ const isPointDefined = ({ x, y }: Point): boolean => !isNil(x) && !isNil(y);
16
+
17
+ const arePointsDefined =
18
+ isPointDefined(pointOrigin) &&
19
+ isPointDefined(pointUpper) &&
20
+ isPointDefined(pointLower);
21
+
22
+ const isOnLine = ({
23
+ pointOrigin: origin,
24
+ pointLower: firstPoint,
25
+ pointUpper: secondPoint,
26
+ maxDistance = 0
27
+ }: Online): boolean => {
28
+ const { x, y } = origin;
29
+ const { x: x1, y: y1 } = firstPoint;
30
+ const { x: x2, y: y2 } = secondPoint;
31
+
32
+ const dxL = x2 - x1;
33
+ const dyL = y2 - y1;
34
+ const dxP = x - x1;
35
+ const dyP = y - y1;
36
+
37
+ const squareLen = dxL * dxL + dyL * dyL;
38
+ const dotProd = dxP * dxL + dyP * dyL;
39
+ const crossProd = dyP * dxL - dxP * dyL;
40
+
41
+ const distance = Math.abs(crossProd) / Math.sqrt(squareLen);
42
+
43
+ return distance <= maxDistance && dotProd >= 0 && dotProd <= squareLen;
44
+ };
45
+
46
+ const arePointsOnline = isOnLine({
47
+ pointLower,
48
+ pointOrigin,
49
+ pointUpper
50
+ });
51
+
52
+ return !arePointsOnline && arePointsDefined ? pointOrigin : null;
53
+ };
54
+
55
+ export const envelopeVariationFormula = ({
56
+ upperRealValue,
57
+ lowerRealValue,
58
+ factorsData
59
+ }: EnvelopeVariationFormula): number => {
60
+ const { currentFactorMultiplication, simulatedFactorMultiplication } =
61
+ factorsData;
62
+
63
+ const variation = upperRealValue - lowerRealValue;
64
+
65
+ const factor =
66
+ 1 - simulatedFactorMultiplication / currentFactorMultiplication;
67
+
68
+ return (variation / 2) * factor;
69
+ };
@@ -0,0 +1,138 @@
1
+ import { equals, isNil } from 'ramda';
2
+
3
+ import { displayArea } from '../../../helpers/index';
4
+ import {
5
+ PatternThreshold,
6
+ ThresholdType,
7
+ VariationThreshold
8
+ } from '../../../models';
9
+ import { TimeValue } from '../../../timeSeries/models';
10
+
11
+ import BasicThreshold from './BasicThreshold';
12
+ import Circle from './Circle';
13
+ import ThresholdWithPatternLines from './ThresholdWithPatternLines';
14
+ import ThresholdWithVariation from './ThresholdWithVariation';
15
+ import { WrapperThresholdLinesModel } from './models';
16
+ import useScaleThreshold from './useScaleThreshold';
17
+
18
+ interface Props extends WrapperThresholdLinesModel {
19
+ graphHeight: number;
20
+ timeSeries: Array<TimeValue>;
21
+ }
22
+
23
+ const WrapperThresholdLines = ({
24
+ areaThresholdLines,
25
+ graphHeight,
26
+ leftScale,
27
+ lines,
28
+ rightScale,
29
+ timeSeries,
30
+ xScale
31
+ }: Props): JSX.Element | null => {
32
+ const data = useScaleThreshold({
33
+ areaThresholdLines,
34
+ leftScale,
35
+ lines,
36
+ rightScale,
37
+ xScale
38
+ });
39
+
40
+ if (!data) {
41
+ return null;
42
+ }
43
+
44
+ const { getX, getY0, getY1, lineColorY0, lineColorY1, ...rest } = data;
45
+
46
+ const commonProps = {
47
+ fillAboveArea: lineColorY0,
48
+ fillBelowArea: lineColorY1,
49
+ getX,
50
+ graphHeight,
51
+ timeSeries
52
+ };
53
+
54
+ const thresholdLines = areaThresholdLines?.map((item, index) => {
55
+ const { type } = item;
56
+
57
+ if (equals(type, ThresholdType.basic)) {
58
+ return [
59
+ {
60
+ Component: BasicThreshold,
61
+ key: index,
62
+ props: { ...commonProps, getY0, getY1 }
63
+ }
64
+ ];
65
+ }
66
+ if (equals(type, ThresholdType.variation)) {
67
+ const dataVariation = item as VariationThreshold;
68
+ if (!rest?.getY0Variation || !rest.getY1Variation || !rest.getYOrigin) {
69
+ return null;
70
+ }
71
+
72
+ return [
73
+ {
74
+ Component: ThresholdWithVariation,
75
+ key: index,
76
+ props: {
77
+ factors: dataVariation.factors,
78
+ ...commonProps,
79
+ ...rest
80
+ }
81
+ },
82
+ {
83
+ Component: Circle,
84
+ key: 'circle',
85
+ props: {
86
+ ...rest,
87
+ getCountDisplayedCircles: dataVariation?.getCountDisplayedCircles,
88
+ getX,
89
+ timeSeries
90
+ }
91
+ }
92
+ ];
93
+ }
94
+ if (equals(type, ThresholdType.pattern)) {
95
+ const dataPattern = item as PatternThreshold;
96
+
97
+ if (!displayArea(dataPattern?.data)) {
98
+ return null;
99
+ }
100
+
101
+ const { data: pattern } = dataPattern;
102
+
103
+ return pattern.map((element, ind) => ({
104
+ Component: ThresholdWithPatternLines,
105
+ key: ind,
106
+ props: {
107
+ data: element,
108
+ graphHeight,
109
+ key: ind,
110
+ leftScale,
111
+ orientation: dataPattern?.orientation,
112
+ rightScale,
113
+ xScale
114
+ }
115
+ }));
116
+ }
117
+
118
+ return null;
119
+ });
120
+
121
+ const filteredThresholdLines = thresholdLines?.filter((item) => !isNil(item));
122
+
123
+ if (!filteredThresholdLines) {
124
+ return null;
125
+ }
126
+
127
+ return (
128
+ <g>
129
+ {filteredThresholdLines.map((element) =>
130
+ element?.map(({ Component, props, key }) => (
131
+ <Component {...props} id={key} key={key} />
132
+ ))
133
+ )}
134
+ </g>
135
+ );
136
+ };
137
+
138
+ export default WrapperThresholdLines;
@@ -0,0 +1,105 @@
1
+ import { ScaleLinear } from 'd3-scale';
2
+ import { equals, reject } from 'ramda';
3
+
4
+ import { GlobalAreaLines, ThresholdType } from '../../../models';
5
+ import { Line, TimeValue } from '../../../timeSeries/models';
6
+
7
+ export interface Data {
8
+ lineColor: string;
9
+ metric: string;
10
+ yScale: ScaleLinear<number, number>;
11
+ }
12
+
13
+ export interface Point {
14
+ x: number;
15
+ y: number;
16
+ }
17
+
18
+ export interface ArePointsOnline {
19
+ pointLower: Point;
20
+ pointOrigin: Point;
21
+ pointUpper: Point;
22
+ }
23
+ export interface Online extends ArePointsOnline {
24
+ maxDistance?: number;
25
+ }
26
+
27
+ export interface FactorsVariation {
28
+ currentFactorMultiplication: number;
29
+ simulatedFactorMultiplication: number;
30
+ }
31
+
32
+ export interface Result {
33
+ getX: (timeValue: TimeValue) => number;
34
+ getY0: (timeValue: TimeValue) => number;
35
+ getY1: (timeValue: TimeValue) => number;
36
+ lineColorY0: string;
37
+ lineColorY1: string;
38
+ }
39
+
40
+ export interface EnvelopeVariationFormula {
41
+ factorsData: FactorsVariation;
42
+ lowerRealValue: number;
43
+ upperRealValue: number;
44
+ }
45
+
46
+ export interface ThresholdLinesModel {
47
+ dataY0: Data;
48
+ dataY1: Data;
49
+ graphHeight: number;
50
+ timeSeries: Array<TimeValue>;
51
+ xScale: ScaleLinear<number, number>;
52
+ }
53
+
54
+ export interface LinesThreshold {
55
+ lineLower: Line;
56
+ lineOrigin: Line;
57
+ lineUpper: Line;
58
+ }
59
+
60
+ export interface WrapperThresholdLinesModel {
61
+ areaThresholdLines?: GlobalAreaLines['areaThresholdLines'];
62
+ leftScale: ScaleLinear<number, number>;
63
+ lines: Array<Line>;
64
+ rightScale: ScaleLinear<number, number>;
65
+ xScale: ScaleLinear<number, number>;
66
+ }
67
+
68
+ export interface ScaleVariationThreshold {
69
+ getY0Variation: (timeValue: TimeValue) => number;
70
+ getY1Variation: (timeValue: TimeValue) => number;
71
+ getYOrigin: (timeValue: TimeValue) => number;
72
+ }
73
+
74
+ export interface Circle extends ScaleVariationThreshold {
75
+ getCountDisplayedCircles?: (value: number) => void;
76
+ getX: (timeValue: TimeValue) => number;
77
+ timeSeries: Array<TimeValue>;
78
+ }
79
+
80
+ export const lowerLineName = 'Lower Threshold';
81
+ export const upperLineName = 'Upper Threshold';
82
+
83
+ // upper,lower and origin
84
+ export const requiredNumberLinesThreshold = 3;
85
+
86
+ export const findLineOfOriginMetricThreshold = (
87
+ lines: Array<Line>
88
+ ): Array<Line> => {
89
+ const metrics = lines.map((line) => {
90
+ const { metric } = line;
91
+
92
+ return metric.includes('_upper_thresholds')
93
+ ? metric.replace('_upper_thresholds', '')
94
+ : null;
95
+ });
96
+
97
+ const originMetric = metrics.find((element) => element);
98
+
99
+ return reject((line: Line) => !equals(line.name, originMetric), lines);
100
+ };
101
+
102
+ export const canDisplayThreshold = (
103
+ areaThresholdLines: GlobalAreaLines['areaThresholdLines']
104
+ ): boolean =>
105
+ !!areaThresholdLines?.find((item) => item && item.type in ThresholdType);
@@ -0,0 +1,46 @@
1
+ import { useEffect } from 'react';
2
+
3
+ import { isNil } from 'ramda';
4
+
5
+ import { checkArePointsOnline } from './helpers';
6
+ import { Circle, Point } from './models';
7
+
8
+ const useCoordinateCircle = ({
9
+ timeSeries,
10
+ getX,
11
+ getY0Variation,
12
+ getY1Variation,
13
+ getYOrigin,
14
+ getCountDisplayedCircles
15
+ }: Circle): Array<Point> => {
16
+ const getCoordinate = (): Array<Point | null> => {
17
+ return timeSeries.map((timeValue) => {
18
+ const x = getX(timeValue);
19
+ const y = getYOrigin(timeValue);
20
+
21
+ const y0 = getY0Variation(timeValue);
22
+ const y1 = getY1Variation(timeValue);
23
+
24
+ return checkArePointsOnline({
25
+ pointLower: { x, y: y0 },
26
+ pointOrigin: { x, y },
27
+ pointUpper: { x, y: y1 }
28
+ });
29
+ });
30
+ };
31
+
32
+ const coordinates = getCoordinate()?.filter(
33
+ (element) => !isNil(element)
34
+ ) as Array<Point>;
35
+
36
+ useEffect(() => {
37
+ if (!coordinates) {
38
+ return;
39
+ }
40
+ getCountDisplayedCircles?.(coordinates.length);
41
+ }, [coordinates.length]);
42
+
43
+ return coordinates;
44
+ };
45
+
46
+ export default useCoordinateCircle;