11import * as React from 'react' ;
22import _ from 'lodash' ;
3- import * as classNames from 'classnames' ;
3+ import classNames from 'classnames' ;
44import { useTranslation } from 'react-i18next' ;
55import { DomainPropType , DomainTuple } from 'victory-core' ;
66import {
@@ -12,7 +12,7 @@ import {
1212 ChartThemeColor ,
1313 ChartVoronoiContainer ,
1414} from '@patternfly/react-charts' ;
15- import { Card , CardBody , CardTitle } from '@patternfly/react-core' ;
15+ import { Alert , Card , CardBody , CardTitle } from '@patternfly/react-core' ;
1616import {
1717 formatDate ,
1818 getXaxisValues ,
@@ -21,6 +21,7 @@ import {
2121 parsePrometheusDuration ,
2222} from '../pipelines-overview/dateTime' ;
2323import { ALL_NAMESPACES_KEY } from '../../consts' ;
24+ import { LoadingInline } from '../Loading' ;
2425import {
2526 usePipelineMetricsForAllNamespacePoll ,
2627 usePipelineMetricsForNamespaceForPipelinePoll ,
@@ -94,8 +95,13 @@ const PipelinesAverageDurationK8s: React.FC<PipelinesAverageDurationProps> = ({
9495 y : domainY || undefined ,
9596 } ;
9697 const [ tickValues , type ] = getXaxisValues ( timespan ) ;
98+ const [ averageDurationError , setAverageDurationError ] = React . useState <
99+ string | null
100+ > ( null ) ;
101+ const [ averageDurationLoading , setAverageDurationLoading ] =
102+ React . useState ( true ) ;
97103
98- const [ totalPipelineRunsCountData ] =
104+ const [ totalPipelineRunsCountData , countError , countLoading ] =
99105 parentName && namespace
100106 ? usePipelineMetricsForNamespaceForPipelinePoll ( {
101107 namespace,
@@ -105,23 +111,26 @@ const PipelinesAverageDurationK8s: React.FC<PipelinesAverageDurationProps> = ({
105111 name : parentName ,
106112 metricsQuery :
107113 PipelineQuery . PIPELINERUN_COUNT_FOR_NAMESPACE_FOR_PIPELINE ,
114+ timeout : 90000 ,
108115 } )
109116 : namespace == ALL_NAMESPACES_KEY
110117 ? usePipelineMetricsForAllNamespacePoll ( {
111118 timespan,
112119 delay : interval ,
113120 queryPrefix : MetricsQueryPrefix . TEKTON_PIPELINES_CONTROLLER ,
114121 metricsQuery : PipelineQuery . PIPELINERUN_COUNT_FOR_ALL_NAMESPACE ,
122+ timeout : 90000 ,
115123 } )
116124 : usePipelineMetricsForNamespacePoll ( {
117125 namespace,
118126 timespan,
119127 delay : interval ,
120128 queryPrefix : MetricsQueryPrefix . TEKTON_PIPELINES_CONTROLLER ,
121129 metricsQuery : PipelineQuery . PIPELINERUN_COUNT_FOR_NAMESPACE ,
130+ timeout : 90000 ,
122131 } ) ;
123132
124- const [ totalPipelineRunsDurationData ] =
133+ const [ totalPipelineRunsDurationData , durationError , durationLoading ] =
125134 parentName && namespace
126135 ? usePipelineMetricsForNamespaceForPipelinePoll ( {
127136 namespace,
@@ -131,22 +140,38 @@ const PipelinesAverageDurationK8s: React.FC<PipelinesAverageDurationProps> = ({
131140 name : parentName ,
132141 metricsQuery :
133142 PipelineQuery . PIPELINERUN_DURATION_FOR_NAMESPACE_FOR_PIPELINE ,
143+ timeout : 90000 ,
134144 } )
135145 : namespace == ALL_NAMESPACES_KEY
136146 ? usePipelineMetricsForAllNamespacePoll ( {
137147 timespan,
138148 delay : interval ,
139149 queryPrefix : MetricsQueryPrefix . TEKTON_PIPELINES_CONTROLLER ,
140150 metricsQuery : PipelineQuery . PIPELINERUN_DURATION_FOR_ALL_NAMESPACE ,
151+ timeout : 90000 ,
141152 } )
142153 : usePipelineMetricsForNamespacePoll ( {
143154 namespace,
144155 timespan,
145156 delay : interval ,
146157 queryPrefix : MetricsQueryPrefix . TEKTON_PIPELINES_CONTROLLER ,
147158 metricsQuery : PipelineQuery . PIPELINERUN_DURATION_FOR_NAMESPACE ,
159+ timeout : 90000 ,
148160 } ) ;
149161
162+ React . useEffect ( ( ) => {
163+ const hasNonAbortError =
164+ ( countError && countError . name !== 'AbortError' ) ||
165+ ( durationError && durationError . name !== 'AbortError' ) ;
166+ setAverageDurationError (
167+ hasNonAbortError ? t ( 'Unable to load average duration' ) : null ,
168+ ) ;
169+ } , [ countError , durationError ] ) ;
170+
171+ React . useEffect ( ( ) => {
172+ setAverageDurationLoading ( countLoading || durationLoading ) ;
173+ } , [ countLoading , durationLoading ] ) ;
174+
150175 const combinedData = totalPipelineRunsCountData ?. data ?. result [ 0 ] ?. values ?. map (
151176 ( value1 ) => {
152177 const group_value = value1 [ 0 ] ;
@@ -273,42 +298,57 @@ const PipelinesAverageDurationK8s: React.FC<PipelinesAverageDurationProps> = ({
273298 < span > { t ( 'Average duration' ) } </ span >
274299 </ CardTitle >
275300 < CardBody className = "pipeline-overview__number-of-plr-card__body" >
276- < div className = "pipeline-overview__number-of-plr-card__bar-chart-div" >
277- < Chart
278- containerComponent = {
279- < ChartVoronoiContainer
280- labels = { ( { datum } ) => `${ datum . y } m` }
281- constrainToVisibleArea
282- />
283- }
284- scale = { { x : 'time' , y : 'linear' } }
285- domain = { domainValue }
286- domainPadding = { { x : [ 30 , 25 ] } }
287- height = { 145 }
288- width = { 400 }
289- padding = { {
290- top : 10 ,
291- bottom : 55 ,
292- left : 50 ,
293- } }
294- themeColor = { ChartThemeColor . blue }
295- >
296- < ChartAxis
297- tickValues = { tickValues }
298- style = { xAxisStyle }
299- tickFormat = { xTickFormat }
300- label = { showLabel ? dayLabel : '' }
301- />
302- < ChartAxis
303- dependentAxis
304- style = { yAxisStyle }
305- tickFormat = { ( v ) => `${ v } m` }
306- />
307- < ChartGroup >
308- < ChartBar data = { chartData } barWidth = { 18 } />
309- </ ChartGroup >
310- </ Chart >
311- </ div >
301+ { averageDurationError ? (
302+ < Alert
303+ variant = "danger"
304+ isInline
305+ title = { t ( 'Unable to load average duration' ) }
306+ className = "pf-v5-u-my-lg pf-v5-u-ml-lg"
307+ />
308+ ) : (
309+ < div className = "pipeline-overview__number-of-plr-card__bar-chart-div" >
310+ { ! averageDurationLoading ? (
311+ < Chart
312+ containerComponent = {
313+ < ChartVoronoiContainer
314+ labels = { ( { datum } ) => `${ datum . y } m` }
315+ constrainToVisibleArea
316+ />
317+ }
318+ scale = { { x : 'time' , y : 'linear' } }
319+ domain = { domainValue }
320+ domainPadding = { { x : [ 30 , 25 ] } }
321+ height = { 145 }
322+ width = { 400 }
323+ padding = { {
324+ top : 10 ,
325+ bottom : 55 ,
326+ left : 50 ,
327+ } }
328+ themeColor = { ChartThemeColor . blue }
329+ >
330+ < ChartAxis
331+ tickValues = { tickValues }
332+ style = { xAxisStyle }
333+ tickFormat = { xTickFormat }
334+ label = { showLabel ? dayLabel : '' }
335+ />
336+ < ChartAxis
337+ dependentAxis
338+ style = { yAxisStyle }
339+ tickFormat = { ( v ) => `${ v } m` }
340+ />
341+ < ChartGroup >
342+ < ChartBar data = { chartData } barWidth = { 18 } />
343+ </ ChartGroup >
344+ </ Chart >
345+ ) : (
346+ < div className = "pipeline-overview__number-of-plr-card__loading pf-v5-u-h-100" >
347+ < LoadingInline />
348+ </ div >
349+ ) }
350+ </ div >
351+ ) }
312352 </ CardBody >
313353 </ Card >
314354 </ >
0 commit comments