@centreon/ui 24.4.1-MON-24235-Filter-App-token.14 → 24.4.1-MON-develop-dashboard.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/Dialog/Confirm/index.tsx +2 -10
- package/src/Dialog/index.tsx +1 -8
- package/src/Graph/Gauge/Gauge.cypress.spec.tsx +102 -0
- package/src/Graph/Gauge/Gauge.tsx +1 -1
- package/src/Graph/HeatMap/HeatMap.cypress.spec.tsx +145 -0
- package/src/Graph/HeatMap/HeatMap.stories.tsx +0 -25
- package/src/Graph/HeatMap/ResponsiveHeatMap.tsx +8 -2
- package/src/Graph/LineChart/Legend/Legend.styles.ts +1 -1
- package/src/Graph/LineChart/Legend/LegendHeader.tsx +1 -1
- package/src/Graph/LineChart/Legend/useInteractiveValues.ts +2 -2
- package/src/Graph/LineChart/index.tsx +1 -1
- package/src/Graph/SingleBar/SingleBar.cypress.spec.tsx +121 -0
- package/src/Graph/Text/Text.cypress.spec.tsx +101 -0
- package/src/Graph/Text/Text.tsx +1 -1
- package/src/Graph/common/testUtils.ts +71 -0
- package/src/Graph/common/timeSeries/index.ts +19 -11
- package/src/Graph/index.ts +1 -0
- package/src/InputField/Select/Autocomplete/Multi/index.tsx +2 -4
- package/src/InputField/Select/Autocomplete/index.tsx +1 -2
- package/src/Listing/ActionBar/index.tsx +9 -8
- package/src/Listing/Cell/DataCell.styles.ts +3 -0
- package/src/Listing/Cell/DataCell.tsx +8 -4
- package/src/Listing/Listing.cypress.spec.tsx +80 -4
- package/src/Listing/Listing.styles.ts +3 -5
- package/src/Listing/index.stories.tsx +25 -2
- package/src/Listing/index.test.tsx +1 -1
- package/src/Listing/index.tsx +3 -1
- package/src/Listing/models.ts +1 -0
- package/src/api/useMutationQuery/index.test.ts +4 -4
- package/src/api/useMutationQuery/index.ts +24 -13
- package/src/components/Form/AccessRights/ShareInput/ContactSwitch.tsx +3 -3
- package/src/components/Form/AccessRights/ShareInput/ShareInput.tsx +1 -0
- package/src/components/List/Item/ListItem.tsx +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@centreon/ui",
|
|
3
|
-
"version": "24.4.1-MON-
|
|
3
|
+
"version": "24.4.1-MON-develop-dashboard.0",
|
|
4
4
|
"description": "Centreon UI Components",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"eslint": "eslint ./src --ext .js,.jsx,.ts,.tsx --max-warnings 0",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"author": {
|
|
29
29
|
"name": "centreon@centreon.com"
|
|
30
30
|
},
|
|
31
|
+
"baseCodeCoveragePercentage": 60,
|
|
31
32
|
"license": "GPL-2.0",
|
|
32
33
|
"bugs": {
|
|
33
34
|
"url": "https://github.com/centreon/centreon/issues"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DialogContentText, Typography } from '@mui/material';
|
|
2
2
|
|
|
3
3
|
import Dialog, { Props as DialogProps } from '..';
|
|
4
4
|
|
|
@@ -6,23 +6,15 @@ type Props = DialogProps & {
|
|
|
6
6
|
children?: JSX.Element;
|
|
7
7
|
labelMessage?: string | null;
|
|
8
8
|
labelSecondMessage?: string | null;
|
|
9
|
-
restCancelButtonProps?: ButtonProps;
|
|
10
|
-
restConfirmButtonProps?: ButtonProps;
|
|
11
9
|
};
|
|
12
10
|
|
|
13
11
|
const Confirm = ({
|
|
14
12
|
labelMessage,
|
|
15
13
|
labelSecondMessage,
|
|
16
14
|
children,
|
|
17
|
-
restCancelButtonProps,
|
|
18
|
-
restConfirmButtonProps,
|
|
19
15
|
...rest
|
|
20
16
|
}: Props): JSX.Element => (
|
|
21
|
-
<Dialog
|
|
22
|
-
restCancelButtonProps={restCancelButtonProps}
|
|
23
|
-
restConfirmButtonProps={restConfirmButtonProps}
|
|
24
|
-
{...rest}
|
|
25
|
-
>
|
|
17
|
+
<Dialog {...rest}>
|
|
26
18
|
<DialogContentText>
|
|
27
19
|
{labelMessage && <Typography>{labelMessage}</Typography>}
|
|
28
20
|
{labelSecondMessage && <Typography>{labelSecondMessage}</Typography>}
|
package/src/Dialog/index.tsx
CHANGED
|
@@ -9,8 +9,7 @@ import {
|
|
|
9
9
|
DialogContent,
|
|
10
10
|
DialogActions,
|
|
11
11
|
DialogProps,
|
|
12
|
-
CircularProgress
|
|
13
|
-
ButtonProps
|
|
12
|
+
CircularProgress
|
|
14
13
|
} from '@mui/material';
|
|
15
14
|
|
|
16
15
|
import { DataTestAttributes } from '../@types/data-attributes';
|
|
@@ -49,8 +48,6 @@ export type Props = {
|
|
|
49
48
|
onClose?: () => void;
|
|
50
49
|
onConfirm: (event, value?) => void;
|
|
51
50
|
open: boolean;
|
|
52
|
-
restCancelButtonProps?: ButtonProps;
|
|
53
|
-
restConfirmButtonProps?: ButtonProps;
|
|
54
51
|
submitting?: boolean;
|
|
55
52
|
} & DialogProps &
|
|
56
53
|
DataTestAttributes;
|
|
@@ -73,8 +70,6 @@ const Dialog = ({
|
|
|
73
70
|
dialogContentClassName,
|
|
74
71
|
dialogActionsClassName,
|
|
75
72
|
dialogConfirmButtonClassName,
|
|
76
|
-
restCancelButtonProps,
|
|
77
|
-
restConfirmButtonProps,
|
|
78
73
|
...rest
|
|
79
74
|
}: Props): JSX.Element => {
|
|
80
75
|
const { classes, cx } = useStyles({ contentWidth });
|
|
@@ -106,7 +101,6 @@ const Dialog = ({
|
|
|
106
101
|
data-testid="Cancel"
|
|
107
102
|
disabled={cancelDisabled}
|
|
108
103
|
onClick={onCancel}
|
|
109
|
-
{...restCancelButtonProps}
|
|
110
104
|
>
|
|
111
105
|
{labelCancel}
|
|
112
106
|
</Button>
|
|
@@ -119,7 +113,6 @@ const Dialog = ({
|
|
|
119
113
|
disabled={confirmDisabled}
|
|
120
114
|
endIcon={submitting && <CircularProgress size={15} />}
|
|
121
115
|
onClick={onConfirm}
|
|
122
|
-
{...restConfirmButtonProps}
|
|
123
116
|
>
|
|
124
117
|
{labelConfirm}
|
|
125
118
|
</Button>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import dataLastWeek from '../LineChart/mockedData/lastWeek.json';
|
|
2
|
+
import {
|
|
3
|
+
criticalThresholds,
|
|
4
|
+
rangedThresholds,
|
|
5
|
+
successThresholds,
|
|
6
|
+
warningThresholds
|
|
7
|
+
} from '../common/testUtils';
|
|
8
|
+
|
|
9
|
+
import { Props, Gauge } from './Gauge';
|
|
10
|
+
|
|
11
|
+
const initialize = (
|
|
12
|
+
args: Omit<Props, 'data' | 'labels' | 'baseColor'>
|
|
13
|
+
): void => {
|
|
14
|
+
cy.mount({
|
|
15
|
+
Component: (
|
|
16
|
+
<div style={{ height: '100vh', width: '100vw' }}>
|
|
17
|
+
<Gauge
|
|
18
|
+
baseColor="#000"
|
|
19
|
+
data={dataLastWeek}
|
|
20
|
+
labels={{
|
|
21
|
+
critical: 'Critical',
|
|
22
|
+
warning: 'Warning'
|
|
23
|
+
}}
|
|
24
|
+
{...args}
|
|
25
|
+
/>
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
describe('Gauge', () => {
|
|
32
|
+
it('does not display the gauge when there is no data', () => {
|
|
33
|
+
initialize({ data: undefined, thresholds: successThresholds });
|
|
34
|
+
|
|
35
|
+
cy.contains('0.41 s').should('not.exist');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('displays the gauge as success when corresponding thresholds are set', () => {
|
|
39
|
+
initialize({ thresholds: successThresholds });
|
|
40
|
+
|
|
41
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(136, 185, 34)');
|
|
42
|
+
cy.findByTestId('1.1500000000000001-arc').should('be.visible');
|
|
43
|
+
cy.findByTestId('0.15000000000000013-arc').should('be.visible');
|
|
44
|
+
|
|
45
|
+
cy.makeSnapshot();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('displays the gauge as warning when corresponding thresholds are set', () => {
|
|
49
|
+
initialize({ thresholds: warningThresholds });
|
|
50
|
+
|
|
51
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(253, 155, 39)');
|
|
52
|
+
cy.findByTestId('1.25-arc').should('be.visible');
|
|
53
|
+
cy.findByTestId('0.15000000000000013-arc').should('be.visible');
|
|
54
|
+
|
|
55
|
+
cy.makeSnapshot();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('displays the gauge as critical when corresponding thresholds are set', () => {
|
|
59
|
+
initialize({ thresholds: criticalThresholds });
|
|
60
|
+
|
|
61
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(255, 74, 74)');
|
|
62
|
+
cy.findByTestId('0.6399999999999999-arc').should('be.visible');
|
|
63
|
+
cy.findByTestId('0.54-arc').should('be.visible');
|
|
64
|
+
|
|
65
|
+
cy.makeSnapshot();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('displays ranged thresholds', () => {
|
|
69
|
+
initialize({ thresholds: rangedThresholds });
|
|
70
|
+
|
|
71
|
+
cy.findByTestId('0.37-arc').should('be.visible');
|
|
72
|
+
cy.findByTestId('0.09999999999999998-arc').should('be.visible');
|
|
73
|
+
|
|
74
|
+
cy.makeSnapshot();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('displays the threshold tooltip when a threshold is hovered', () => {
|
|
78
|
+
initialize({ thresholds: successThresholds });
|
|
79
|
+
|
|
80
|
+
cy.findByTestId('1.1500000000000001-arc').trigger('mouseover', {
|
|
81
|
+
force: true
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
cy.contains('Warning').should('be.visible');
|
|
85
|
+
|
|
86
|
+
cy.findByTestId('0.15000000000000013-arc').trigger('mouseover', {
|
|
87
|
+
force: true
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
cy.contains('Critical').should('be.visible');
|
|
91
|
+
|
|
92
|
+
cy.makeSnapshot();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('displays the value as raw when the prop is set', () => {
|
|
96
|
+
initialize({ displayAsRaw: true, thresholds: successThresholds });
|
|
97
|
+
|
|
98
|
+
cy.contains('0.40663333333 s').should('be.visible');
|
|
99
|
+
|
|
100
|
+
cy.makeSnapshot();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { pluck } from 'ramda';
|
|
2
|
+
|
|
3
|
+
import { Box, Typography } from '@mui/material';
|
|
4
|
+
|
|
5
|
+
import EllipsisTypography from '../../Typography/EllipsisTypography';
|
|
6
|
+
|
|
7
|
+
import HeatMap from './HeatMap';
|
|
8
|
+
import heatMapData from './HeatMapData.json';
|
|
9
|
+
import { HeatMapProps } from './model';
|
|
10
|
+
|
|
11
|
+
const dataIds = pluck('id', heatMapData);
|
|
12
|
+
|
|
13
|
+
interface Data {
|
|
14
|
+
counter: number;
|
|
15
|
+
host: string;
|
|
16
|
+
service: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const TileContent = ({
|
|
20
|
+
isSmallestSize,
|
|
21
|
+
data
|
|
22
|
+
}: {
|
|
23
|
+
data: Data;
|
|
24
|
+
isSmallestSize: boolean;
|
|
25
|
+
}): JSX.Element | false =>
|
|
26
|
+
!isSmallestSize && (
|
|
27
|
+
<Box
|
|
28
|
+
sx={{
|
|
29
|
+
alignItems: 'center',
|
|
30
|
+
color: 'common.black',
|
|
31
|
+
display: 'flex',
|
|
32
|
+
flexDirection: 'column',
|
|
33
|
+
width: '100%'
|
|
34
|
+
}}
|
|
35
|
+
>
|
|
36
|
+
<EllipsisTypography textAlign="center">{data.host}</EllipsisTypography>
|
|
37
|
+
<EllipsisTypography textAlign="center">{data.service}</EllipsisTypography>
|
|
38
|
+
<EllipsisTypography textAlign="center">{data.counter}</EllipsisTypography>
|
|
39
|
+
</Box>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const initialize = ({
|
|
43
|
+
width = '100vw',
|
|
44
|
+
height = '100vh',
|
|
45
|
+
...args
|
|
46
|
+
}: Omit<HeatMapProps<Data>, 'tiles' | 'children'> & {
|
|
47
|
+
height?: string;
|
|
48
|
+
width?: string;
|
|
49
|
+
}): void => {
|
|
50
|
+
cy.mount({
|
|
51
|
+
Component: (
|
|
52
|
+
<div style={{ height, width }}>
|
|
53
|
+
<HeatMap tiles={heatMapData} {...args}>
|
|
54
|
+
{TileContent}
|
|
55
|
+
</HeatMap>
|
|
56
|
+
</div>
|
|
57
|
+
)
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
describe('HeatMap', () => {
|
|
62
|
+
it('displays tiles', () => {
|
|
63
|
+
initialize({});
|
|
64
|
+
dataIds.forEach((id) => {
|
|
65
|
+
cy.findByTestId(id).should('be.visible');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('does not display the tooltip when the prop is not set and the tile is hovered', () => {
|
|
70
|
+
initialize({});
|
|
71
|
+
|
|
72
|
+
cy.findByTestId(dataIds[0]).trigger('mouseover');
|
|
73
|
+
|
|
74
|
+
cy.findByTestId(`tooltip-${dataIds[0]}`).should('not.exist');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('displays the tooltip when the prop is set and the tile is hovered', () => {
|
|
78
|
+
initialize({
|
|
79
|
+
tooltipContent: ({ data }) => (
|
|
80
|
+
<Typography>
|
|
81
|
+
This is the tooltip for {data.host}-{data.service}-{data.counter}
|
|
82
|
+
</Typography>
|
|
83
|
+
)
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
cy.findByTestId(dataIds[0]).trigger('mouseover');
|
|
87
|
+
|
|
88
|
+
cy.contains(`This is the tooltip for Server-Service Counter-53`).should(
|
|
89
|
+
'be.visible'
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('displays the tooltip conditionally when the prop is set and the tile is hovered', () => {
|
|
94
|
+
initialize({
|
|
95
|
+
displayTooltipCondition: ({ counter }) => counter > 100,
|
|
96
|
+
tooltipContent: ({ data }) => (
|
|
97
|
+
<Typography>
|
|
98
|
+
This is the tooltip for {data.host}-{data.service}-{data.counter}
|
|
99
|
+
</Typography>
|
|
100
|
+
)
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
cy.findByTestId(dataIds[0]).trigger('mouseover');
|
|
104
|
+
|
|
105
|
+
cy.contains(`This is the tooltip for Server-Service Counter-53`).should(
|
|
106
|
+
'not.exist'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
cy.findByTestId(dataIds[1]).trigger('mouseover');
|
|
110
|
+
|
|
111
|
+
cy.contains(`This is the tooltip for Server-Service Counter-779`).should(
|
|
112
|
+
'be.visible'
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('displays tiles with fixed size', () => {
|
|
117
|
+
initialize({ height: '200px', tileSizeFixed: true, width: '590px' });
|
|
118
|
+
dataIds.forEach((id) => {
|
|
119
|
+
cy.findByTestId(id).should('be.visible');
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('displays tiles as small when the container width is under the breakpoint', () => {
|
|
124
|
+
initialize({ height: '200px', width: '590px' });
|
|
125
|
+
dataIds.forEach((id) => {
|
|
126
|
+
cy.findByTestId(id).should('be.visible');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
cy.makeSnapshot();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('does not display tiles as small when the contains width is 0', () => {
|
|
133
|
+
initialize({ height: '200px', width: '0px' });
|
|
134
|
+
dataIds.forEach((id) => {
|
|
135
|
+
cy.findByTestId(id).should('not.exist');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
cy.makeSnapshot();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('displays a single tile', () => {
|
|
142
|
+
initialize({ tiles: [heatMapData[0]] });
|
|
143
|
+
cy.findByTestId(dataIds[0]).should('be.visible');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -3,8 +3,6 @@ import { makeStyles } from 'tss-react/mui';
|
|
|
3
3
|
|
|
4
4
|
import { Box, Typography } from '@mui/material';
|
|
5
5
|
|
|
6
|
-
import EllipsisTypography from '../../Typography/EllipsisTypography';
|
|
7
|
-
|
|
8
6
|
import heatMapData from './HeatMapData.json';
|
|
9
7
|
|
|
10
8
|
import { HeatMap } from '.';
|
|
@@ -22,29 +20,6 @@ const meta: Meta<typeof HeatMap<Data>> = {
|
|
|
22
20
|
export default meta;
|
|
23
21
|
type Story = StoryObj<typeof HeatMap<Data>>;
|
|
24
22
|
|
|
25
|
-
const TileContent = ({
|
|
26
|
-
isSmallestSize,
|
|
27
|
-
data
|
|
28
|
-
}: {
|
|
29
|
-
data: Data;
|
|
30
|
-
isSmallestSize: boolean;
|
|
31
|
-
}): JSX.Element | false =>
|
|
32
|
-
!isSmallestSize && (
|
|
33
|
-
<Box
|
|
34
|
-
sx={{
|
|
35
|
-
alignItems: 'center',
|
|
36
|
-
color: 'common.black',
|
|
37
|
-
display: 'flex',
|
|
38
|
-
flexDirection: 'column',
|
|
39
|
-
width: '100%'
|
|
40
|
-
}}
|
|
41
|
-
>
|
|
42
|
-
<EllipsisTypography textAlign="center">{data.host}</EllipsisTypography>
|
|
43
|
-
<EllipsisTypography textAlign="center">{data.service}</EllipsisTypography>
|
|
44
|
-
<EllipsisTypography textAlign="center">{data.counter}</EllipsisTypography>
|
|
45
|
-
</Box>
|
|
46
|
-
);
|
|
47
|
-
|
|
48
23
|
const TooltipContent = ({ data }: { data: Data }): JSX.Element => {
|
|
49
24
|
return (
|
|
50
25
|
<Box sx={{ backgroundColor: 'common.white', color: 'common.black' }}>
|
|
@@ -40,7 +40,7 @@ const ResponsiveHeatMap = <TData,>({
|
|
|
40
40
|
const theoricalTotalTilesWidth =
|
|
41
41
|
tilesLength * tileWidth + (tilesLength - 1) * gap;
|
|
42
42
|
|
|
43
|
-
if (lt(width, 680) && gt(maxTotalTilesWidth, width)) {
|
|
43
|
+
if (lt(width, 680) && gt(maxTotalTilesWidth, width) && !tileSizeFixed) {
|
|
44
44
|
return smallestTileSize;
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -66,13 +66,19 @@ const ResponsiveHeatMap = <TData,>({
|
|
|
66
66
|
}}
|
|
67
67
|
>
|
|
68
68
|
{tiles.map(({ backgroundColor, id, data }) => (
|
|
69
|
-
<Box
|
|
69
|
+
<Box
|
|
70
|
+
className={classes.heatMapTile}
|
|
71
|
+
data-testid={id}
|
|
72
|
+
key={id}
|
|
73
|
+
sx={{ backgroundColor }}
|
|
74
|
+
>
|
|
70
75
|
<Tooltip
|
|
71
76
|
hasCaret
|
|
72
77
|
classes={{
|
|
73
78
|
arrow: cx(classes.heatMapTooltipArrow, arrowClassName),
|
|
74
79
|
tooltip: classes.heatMapTooltip
|
|
75
80
|
}}
|
|
81
|
+
data-testid={`tooltip-${data?.id}`}
|
|
76
82
|
followCursor={false}
|
|
77
83
|
label={
|
|
78
84
|
displayTooltipCondition?.(data) &&
|
|
@@ -8,7 +8,7 @@ interface MakeStylesProps {
|
|
|
8
8
|
|
|
9
9
|
export const legendWidth = 21;
|
|
10
10
|
const legendItemHeight = 5.25;
|
|
11
|
-
const legendItemHeightCompact =
|
|
11
|
+
const legendItemHeightCompact = 2;
|
|
12
12
|
|
|
13
13
|
export const useStyles = makeStyles<MakeStylesProps>()(
|
|
14
14
|
(theme, { limitLegendRows }) => ({
|
|
@@ -5,7 +5,7 @@ import { equals, find, isNil } from 'ramda';
|
|
|
5
5
|
|
|
6
6
|
import { mousePositionAtom } from '../InteractiveComponents/interactionWithGraphAtoms';
|
|
7
7
|
import {
|
|
8
|
-
|
|
8
|
+
formatMetricValueWithUnit,
|
|
9
9
|
getLineForMetric,
|
|
10
10
|
getMetrics,
|
|
11
11
|
getTimeValue
|
|
@@ -73,7 +73,7 @@ const useInteractiveValues = ({
|
|
|
73
73
|
metric_id
|
|
74
74
|
}) as Line;
|
|
75
75
|
|
|
76
|
-
const formattedValue =
|
|
76
|
+
const formattedValue = formatMetricValueWithUnit({
|
|
77
77
|
base,
|
|
78
78
|
unit,
|
|
79
79
|
value
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import dataLastWeek from '../LineChart/mockedData/lastWeek.json';
|
|
2
|
+
import {
|
|
3
|
+
criticalThresholds,
|
|
4
|
+
rangedThresholds,
|
|
5
|
+
successThresholds,
|
|
6
|
+
warningThresholds
|
|
7
|
+
} from '../common/testUtils';
|
|
8
|
+
|
|
9
|
+
import SingleBar from './SingleBar';
|
|
10
|
+
import { SingleBarProps } from './models';
|
|
11
|
+
|
|
12
|
+
const initialize = (
|
|
13
|
+
args: Omit<SingleBarProps, 'data' | 'labels' | 'baseColor'>
|
|
14
|
+
): void => {
|
|
15
|
+
cy.mount({
|
|
16
|
+
Component: (
|
|
17
|
+
<div style={{ height: '100vh', width: '100vw' }}>
|
|
18
|
+
<SingleBar
|
|
19
|
+
baseColor="#000"
|
|
20
|
+
data={dataLastWeek}
|
|
21
|
+
labels={{
|
|
22
|
+
critical: 'Critical',
|
|
23
|
+
warning: 'Warning'
|
|
24
|
+
}}
|
|
25
|
+
{...args}
|
|
26
|
+
/>
|
|
27
|
+
</div>
|
|
28
|
+
)
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
describe('Single bar', () => {
|
|
33
|
+
it('displays the single bar as success when corresponding thresholds are set', () => {
|
|
34
|
+
initialize({ thresholds: successThresholds });
|
|
35
|
+
|
|
36
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(136, 185, 34)');
|
|
37
|
+
cy.findByTestId('warning-line-0.5').should('be.visible');
|
|
38
|
+
cy.findByTestId('warning-line-0.5-tooltip').should('be.visible');
|
|
39
|
+
cy.findByTestId('critical-line-1.5').should('be.visible');
|
|
40
|
+
cy.findByTestId('critical-line-1.5-tooltip').should('be.visible');
|
|
41
|
+
|
|
42
|
+
cy.makeSnapshot();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('displays the single bar as warning when corresponding thresholds are set', () => {
|
|
46
|
+
initialize({ thresholds: warningThresholds });
|
|
47
|
+
|
|
48
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(253, 155, 39)');
|
|
49
|
+
cy.findByTestId('warning-line-0.4').should('be.visible');
|
|
50
|
+
cy.findByTestId('warning-line-0.4-tooltip').should('be.visible');
|
|
51
|
+
cy.findByTestId('critical-line-1.5').should('be.visible');
|
|
52
|
+
cy.findByTestId('critical-line-1.5-tooltip').should('be.visible');
|
|
53
|
+
|
|
54
|
+
cy.makeSnapshot();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('displays the single bar as critical when corresponding thresholds are set', () => {
|
|
58
|
+
initialize({ thresholds: criticalThresholds });
|
|
59
|
+
|
|
60
|
+
cy.contains('0.41 s').should('have.css', 'fill', 'rgb(255, 74, 74)');
|
|
61
|
+
cy.findByTestId('warning-line-0.2').should('be.visible');
|
|
62
|
+
cy.findByTestId('warning-line-0.2-tooltip').should('be.visible');
|
|
63
|
+
cy.findByTestId('critical-line-0.3').should('be.visible');
|
|
64
|
+
cy.findByTestId('critical-line-0.3-tooltip').should('be.visible');
|
|
65
|
+
|
|
66
|
+
cy.makeSnapshot();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('displays ranged thresholds', () => {
|
|
70
|
+
initialize({ thresholds: rangedThresholds });
|
|
71
|
+
|
|
72
|
+
cy.findByTestId('warning-line-0.13').should('be.visible');
|
|
73
|
+
cy.findByTestId('warning-line-0.13-tooltip').should('be.visible');
|
|
74
|
+
cy.findByTestId('warning-line-0.5').should('be.visible');
|
|
75
|
+
cy.findByTestId('warning-line-0.5-tooltip').should('be.visible');
|
|
76
|
+
cy.findByTestId('critical-line-0.55').should('be.visible');
|
|
77
|
+
cy.findByTestId('critical-line-0.55-tooltip').should('be.visible');
|
|
78
|
+
cy.findByTestId('critical-line-0.65').should('be.visible');
|
|
79
|
+
cy.findByTestId('critical-line-0.65-tooltip').should('be.visible');
|
|
80
|
+
|
|
81
|
+
cy.makeSnapshot();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('displays the threshold tooltip when a threshold is hovered', () => {
|
|
85
|
+
initialize({ thresholds: successThresholds });
|
|
86
|
+
|
|
87
|
+
cy.findByTestId('warning-line-0.5-tooltip').trigger('mouseover');
|
|
88
|
+
|
|
89
|
+
cy.contains('Warning').should('be.visible');
|
|
90
|
+
|
|
91
|
+
cy.findByTestId('critical-line-1.5-tooltip').trigger('mouseover');
|
|
92
|
+
|
|
93
|
+
cy.contains('Critical').should('be.visible');
|
|
94
|
+
|
|
95
|
+
cy.makeSnapshot();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('displays single bar as small when the props is set', () => {
|
|
99
|
+
initialize({ size: 'small', thresholds: successThresholds });
|
|
100
|
+
|
|
101
|
+
cy.findByTestId('warning-line-0.5-tooltip').should('be.visible');
|
|
102
|
+
|
|
103
|
+
cy.makeSnapshot();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('displays the value as raw when the prop is set', () => {
|
|
107
|
+
initialize({ displayAsRaw: true, thresholds: successThresholds });
|
|
108
|
+
|
|
109
|
+
cy.contains('0.40663333333 s').should('be.visible');
|
|
110
|
+
|
|
111
|
+
cy.makeSnapshot();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('does not display the value when the prop is set', () => {
|
|
115
|
+
initialize({ showLabels: false, thresholds: successThresholds });
|
|
116
|
+
|
|
117
|
+
cy.contains('0.41 s').should('not.exist');
|
|
118
|
+
|
|
119
|
+
cy.makeSnapshot();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import dataLastWeek from '../LineChart/mockedData/lastWeek.json';
|
|
2
|
+
import {
|
|
3
|
+
criticalThresholds,
|
|
4
|
+
rangedThresholds,
|
|
5
|
+
successThresholds,
|
|
6
|
+
warningThresholds
|
|
7
|
+
} from '../common/testUtils';
|
|
8
|
+
|
|
9
|
+
import { Text, Props } from './Text';
|
|
10
|
+
|
|
11
|
+
const initialize = (
|
|
12
|
+
args: Omit<Props, 'data' | 'labels' | 'baseColor'>
|
|
13
|
+
): void => {
|
|
14
|
+
cy.mount({
|
|
15
|
+
Component: (
|
|
16
|
+
<div style={{ height: '100vh', width: '100vw' }}>
|
|
17
|
+
<Text
|
|
18
|
+
baseColor="#000"
|
|
19
|
+
data={dataLastWeek}
|
|
20
|
+
labels={{
|
|
21
|
+
critical: 'Critical',
|
|
22
|
+
warning: 'Warning'
|
|
23
|
+
}}
|
|
24
|
+
{...args}
|
|
25
|
+
/>
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
describe('Text', () => {
|
|
32
|
+
it('displays the text as success when corresponding thresholds are set', () => {
|
|
33
|
+
initialize({ thresholds: successThresholds });
|
|
34
|
+
|
|
35
|
+
cy.contains('0.41 s').should('have.css', 'color', 'rgb(136, 185, 34)');
|
|
36
|
+
cy.contains('Warning: 0.5 s').should('be.visible');
|
|
37
|
+
cy.contains('Critical: 1.5 s').should('be.visible');
|
|
38
|
+
|
|
39
|
+
cy.makeSnapshot();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('displays the text as warning when corresponding thresholds are set', () => {
|
|
43
|
+
initialize({ thresholds: warningThresholds });
|
|
44
|
+
|
|
45
|
+
cy.contains('0.41 s').should('have.css', 'color', 'rgb(253, 155, 39)');
|
|
46
|
+
cy.contains('Warning: 0.4 s').should('be.visible');
|
|
47
|
+
cy.contains('Critical: 1.5 s').should('be.visible');
|
|
48
|
+
|
|
49
|
+
cy.makeSnapshot();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('displays the text as critical when corresponding thresholds are set', () => {
|
|
53
|
+
initialize({ thresholds: criticalThresholds });
|
|
54
|
+
|
|
55
|
+
cy.contains('0.41 s').should('have.css', 'color', 'rgb(255, 74, 74)');
|
|
56
|
+
cy.contains('Warning: 0.2 s').should('be.visible');
|
|
57
|
+
cy.contains('Critical: 0.3 s').should('be.visible');
|
|
58
|
+
|
|
59
|
+
cy.makeSnapshot();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('displays ranged thresholds', () => {
|
|
63
|
+
initialize({ thresholds: rangedThresholds });
|
|
64
|
+
|
|
65
|
+
cy.contains('Warning: 0.13 s - 0.5 s').should('be.visible');
|
|
66
|
+
cy.contains('Critical: 0.55 s - 0.65 s').should('be.visible');
|
|
67
|
+
|
|
68
|
+
cy.makeSnapshot();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('displays the value as raw when the prop is set', () => {
|
|
72
|
+
initialize({ displayAsRaw: true, thresholds: successThresholds });
|
|
73
|
+
|
|
74
|
+
cy.contains('0.40663333333 s').should('be.visible');
|
|
75
|
+
|
|
76
|
+
cy.makeSnapshot();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('does not display the text', () => {
|
|
80
|
+
initialize({ data: undefined, thresholds: successThresholds });
|
|
81
|
+
|
|
82
|
+
cy.contains('0.41 s').should('not.exist');
|
|
83
|
+
|
|
84
|
+
cy.makeSnapshot();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('displays text with default values when the data is empty', () => {
|
|
88
|
+
initialize({
|
|
89
|
+
data: {
|
|
90
|
+
global: {},
|
|
91
|
+
metrics: [],
|
|
92
|
+
times: []
|
|
93
|
+
},
|
|
94
|
+
thresholds: successThresholds
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
cy.contains('0').should('be.visible');
|
|
98
|
+
|
|
99
|
+
cy.makeSnapshot();
|
|
100
|
+
});
|
|
101
|
+
});
|