2021-09-23 15:43:43 +05:30
|
|
|
import { Button, Typography } from 'antd';
|
|
|
|
|
import getQueryResult from 'api/widgets/getQuery';
|
|
|
|
|
import { AxiosError } from 'axios';
|
|
|
|
|
import { ChartData } from 'chart.js';
|
2021-10-20 09:24:55 +05:30
|
|
|
import { graphOnClickHandler } from 'components/Graph';
|
2021-09-23 15:43:43 +05:30
|
|
|
import Spinner from 'components/Spinner';
|
|
|
|
|
import TimePreference from 'components/TimePreferenceDropDown';
|
|
|
|
|
import GridGraphComponent from 'container/GridGraphComponent';
|
|
|
|
|
import {
|
|
|
|
|
timeItems,
|
|
|
|
|
timePreferance,
|
|
|
|
|
} from 'container/NewWidget/RightContainer/timeItems';
|
|
|
|
|
import getChartData from 'lib/getChartData';
|
|
|
|
|
import GetMaxMinTime from 'lib/getMaxMinTime';
|
|
|
|
|
import getStartAndEndTime from 'lib/getStartAndEndTime';
|
2021-11-16 21:13:20 +05:30
|
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
2021-09-23 15:43:43 +05:30
|
|
|
import { useSelector } from 'react-redux';
|
|
|
|
|
import { AppState } from 'store/reducers';
|
2021-10-20 09:24:55 +05:30
|
|
|
import { GlobalTime } from 'types/actions/globalTime';
|
2021-09-23 15:43:43 +05:30
|
|
|
import { Widgets } from 'types/api/dashboard/getAll';
|
|
|
|
|
|
2021-10-20 09:24:55 +05:30
|
|
|
import EmptyGraph from './EmptyGraph';
|
2021-09-23 15:43:43 +05:30
|
|
|
import { GraphContainer, NotFoundContainer, TimeContainer } from './styles';
|
|
|
|
|
|
2021-10-20 09:24:55 +05:30
|
|
|
const FullView = ({
|
|
|
|
|
widget,
|
|
|
|
|
fullViewOptions = true,
|
|
|
|
|
onClickHandler,
|
|
|
|
|
noDataGraph = false,
|
|
|
|
|
}: FullViewProps): JSX.Element => {
|
2021-09-23 15:43:43 +05:30
|
|
|
const { minTime, maxTime } = useSelector<AppState, GlobalTime>(
|
|
|
|
|
(state) => state.globalTime,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const [state, setState] = useState<FullViewState>({
|
|
|
|
|
error: false,
|
|
|
|
|
errorMessage: '',
|
|
|
|
|
loading: true,
|
|
|
|
|
payload: undefined,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const getSelectedTime = useCallback(
|
|
|
|
|
() =>
|
|
|
|
|
timeItems.find((e) => e.enum === (widget?.timePreferance || 'GLOBAL_TIME')),
|
|
|
|
|
[widget],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const [selectedTime, setSelectedTime] = useState<timePreferance>({
|
|
|
|
|
name: getSelectedTime()?.name || '',
|
|
|
|
|
enum: widget?.timePreferance || 'GLOBAL_TIME',
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const onFetchDataHandler = useCallback(async () => {
|
|
|
|
|
try {
|
|
|
|
|
const maxMinTime = GetMaxMinTime({
|
|
|
|
|
graphType: widget.panelTypes,
|
|
|
|
|
maxTime,
|
|
|
|
|
minTime,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { end, start } = getStartAndEndTime({
|
|
|
|
|
type: selectedTime.enum,
|
|
|
|
|
maxTime: maxMinTime.maxTime,
|
|
|
|
|
minTime: maxMinTime.minTime,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const response = await Promise.all(
|
|
|
|
|
widget.query
|
|
|
|
|
.filter((e) => e.query.length !== 0)
|
|
|
|
|
.map(async (query) => {
|
|
|
|
|
const result = await getQueryResult({
|
|
|
|
|
end,
|
|
|
|
|
query: query.query,
|
|
|
|
|
start: start,
|
2021-10-20 09:24:55 +05:30
|
|
|
step: '60',
|
2021-09-23 15:43:43 +05:30
|
|
|
});
|
|
|
|
|
return {
|
|
|
|
|
query: query.query,
|
|
|
|
|
queryData: result,
|
|
|
|
|
legend: query.legend,
|
|
|
|
|
};
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const isError = response.find((e) => e.queryData.statusCode !== 200);
|
|
|
|
|
|
|
|
|
|
if (isError !== undefined) {
|
|
|
|
|
setState((state) => ({
|
|
|
|
|
...state,
|
|
|
|
|
error: true,
|
|
|
|
|
errorMessage: isError.queryData.error || 'Something went wrong',
|
|
|
|
|
loading: false,
|
|
|
|
|
}));
|
|
|
|
|
} else {
|
|
|
|
|
const chartDataSet = getChartData({
|
|
|
|
|
queryData: {
|
|
|
|
|
data: response.map((e) => ({
|
|
|
|
|
query: e.query,
|
|
|
|
|
legend: e.legend,
|
|
|
|
|
queryData: e.queryData.payload?.result || [],
|
|
|
|
|
})),
|
|
|
|
|
error: false,
|
|
|
|
|
errorMessage: '',
|
|
|
|
|
loading: false,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
setState((state) => ({
|
|
|
|
|
...state,
|
|
|
|
|
loading: false,
|
|
|
|
|
payload: chartDataSet,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
setState((state) => ({
|
|
|
|
|
...state,
|
|
|
|
|
error: true,
|
|
|
|
|
errorMessage: (error as AxiosError).toString(),
|
|
|
|
|
loading: false,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}, [widget, maxTime, minTime, selectedTime.enum]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
onFetchDataHandler();
|
|
|
|
|
}, [onFetchDataHandler]);
|
|
|
|
|
|
2021-10-20 09:24:55 +05:30
|
|
|
if (state.error && !state.loading) {
|
|
|
|
|
return (
|
|
|
|
|
<NotFoundContainer>
|
|
|
|
|
<Typography>{state.errorMessage}</Typography>
|
|
|
|
|
</NotFoundContainer>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-23 15:43:43 +05:30
|
|
|
if (state.loading || state.payload === undefined) {
|
2021-10-20 09:24:55 +05:30
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
<Spinner height="80vh" size="large" tip="Loading..." />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2021-09-23 15:43:43 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (state.loading === false && state.payload.datasets.length === 0) {
|
|
|
|
|
return (
|
|
|
|
|
<>
|
2021-10-20 09:24:55 +05:30
|
|
|
{fullViewOptions && (
|
|
|
|
|
<TimeContainer>
|
|
|
|
|
<TimePreference
|
|
|
|
|
{...{
|
|
|
|
|
selectedTime,
|
|
|
|
|
setSelectedTime,
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<Button onClick={onFetchDataHandler} type="primary">
|
|
|
|
|
Refresh
|
|
|
|
|
</Button>
|
|
|
|
|
</TimeContainer>
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
{noDataGraph ? (
|
|
|
|
|
<EmptyGraph
|
|
|
|
|
onClickHandler={onClickHandler}
|
|
|
|
|
widget={widget}
|
|
|
|
|
selectedTime={selectedTime}
|
|
|
|
|
/>
|
|
|
|
|
) : (
|
|
|
|
|
<NotFoundContainer>
|
|
|
|
|
<Typography>No Data</Typography>
|
|
|
|
|
</NotFoundContainer>
|
|
|
|
|
)}
|
2021-09-23 15:43:43 +05:30
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
2021-10-20 09:24:55 +05:30
|
|
|
{fullViewOptions && (
|
|
|
|
|
<TimeContainer>
|
|
|
|
|
<TimePreference
|
|
|
|
|
{...{
|
|
|
|
|
selectedTime,
|
|
|
|
|
setSelectedTime,
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<Button onClick={onFetchDataHandler} type="primary">
|
|
|
|
|
Refresh
|
|
|
|
|
</Button>
|
|
|
|
|
</TimeContainer>
|
|
|
|
|
)}
|
2021-09-23 15:43:43 +05:30
|
|
|
|
|
|
|
|
<GraphContainer>
|
|
|
|
|
<GridGraphComponent
|
|
|
|
|
{...{
|
|
|
|
|
GRAPH_TYPES: widget.panelTypes,
|
|
|
|
|
data: state.payload,
|
|
|
|
|
isStacked: widget.isStacked,
|
|
|
|
|
opacity: widget.opacity,
|
|
|
|
|
title: widget.title,
|
2021-10-20 09:24:55 +05:30
|
|
|
onClickHandler: onClickHandler,
|
2021-09-23 15:43:43 +05:30
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</GraphContainer>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
interface FullViewState {
|
|
|
|
|
loading: boolean;
|
|
|
|
|
error: boolean;
|
|
|
|
|
errorMessage: string;
|
|
|
|
|
payload: ChartData | undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface FullViewProps {
|
|
|
|
|
widget: Widgets;
|
2021-10-20 09:24:55 +05:30
|
|
|
fullViewOptions?: boolean;
|
|
|
|
|
onClickHandler?: graphOnClickHandler;
|
|
|
|
|
noDataGraph?: boolean;
|
2021-09-23 15:43:43 +05:30
|
|
|
}
|
|
|
|
|
|
2021-11-16 21:13:20 +05:30
|
|
|
export default FullView;
|