Skip to content

Commit 871bb6f

Browse files
authored
feat: add loading spinner for re-query (#4921)
1 parent aae8dfc commit 871bb6f

File tree

3 files changed

+54
-17
lines changed

3 files changed

+54
-17
lines changed

src/visualization/components/internal/ViewLoadingSpinner.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {RemoteDataState} from 'src/types'
88
// Components
99
import {TechnoSpinner, ComponentSize} from '@influxdata/clockface'
1010

11+
const VISUALIZATION_LOADING_SPINNER_DIAMETER = 66
12+
1113
interface Props {
1214
loading: RemoteDataState
1315
}
@@ -50,7 +52,10 @@ const ViewLoadingSpinner: FunctionComponent<Props> = ({loading}) => {
5052
if (loading === RemoteDataState.Loading) {
5153
return (
5254
<div className="view-loading-spinner">
53-
<TechnoSpinner diameterPixels={66} strokeWidth={ComponentSize.Medium} />
55+
<TechnoSpinner
56+
diameterPixels={VISUALIZATION_LOADING_SPINNER_DIAMETER}
57+
strokeWidth={ComponentSize.Medium}
58+
/>
5459
<div className={timerElementClass}>{`${Math.round(seconds * 10) /
5560
10}s`}</div>
5661
</div>

src/visualization/types/Graph/view.tsx

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import {
1212
lineTransform,
1313
LineLayerConfig,
1414
} from '@influxdata/giraffe'
15+
import {RemoteDataState} from '@influxdata/clockface'
1516
import memoizeOne from 'memoize-one'
1617

1718
// Components
1819
import EmptyGraphMessage from 'src/shared/components/EmptyGraphMessage'
20+
import ViewLoadingSpinner from 'src/visualization/components/internal/ViewLoadingSpinner'
1921

2022
// Context
2123
import {AppSettingContext} from 'src/shared/contexts/app'
@@ -82,6 +84,9 @@ const XYPlot: FC<Props> = ({
8284
const [preZoomResult, setPreZoomResult] = useState<InternalFromFluxResult>(
8385
null
8486
)
87+
const [requeryStatus, setRequeryStatus] = useState<RemoteDataState>(
88+
RemoteDataState.NotStarted
89+
)
8590

8691
useEffect(() => {
8792
setResultState(result)
@@ -179,24 +184,26 @@ const XYPlot: FC<Props> = ({
179184
if (isFlagEnabled('zoomRequery')) {
180185
useXDomainSettings = ({storedDomain, parsedResult, timeRange}) =>
181186
useZoomRequeryXDomainSettings({
187+
data: parsedResult.table.getColumn(xColumn, 'number'),
182188
parsedResult,
183-
setResult: setResultState,
184189
preZoomResult,
185-
setPreZoomResult,
186190
query: properties?.queries?.[0]?.text ?? '',
191+
setPreZoomResult,
192+
setRequeryStatus,
193+
setResult: setResultState,
187194
storedDomain,
188-
data: parsedResult.table.getColumn(xColumn, 'number'),
189195
timeRange,
190196
})
191197
useYDomainSettings = ({storedDomain, parsedResult}) =>
192198
useZoomRequeryYDomainSettings({
199+
data: memoizedYColumnData,
193200
parsedResult,
194-
setResult: setResultState,
195201
preZoomResult,
196-
setPreZoomResult,
197202
query: properties?.queries?.[0]?.text ?? '',
203+
setPreZoomResult,
204+
setRequeryStatus,
205+
setResult: setResultState,
198206
storedDomain,
199-
data: memoizedYColumnData,
200207
})
201208
}
202209

@@ -327,7 +334,14 @@ const XYPlot: FC<Props> = ({
327334
dispatch
328335
)
329336

330-
return <Plot config={config} />
337+
return (
338+
<>
339+
{isFlagEnabled('zoomRequery') && (
340+
<ViewLoadingSpinner loading={requeryStatus} />
341+
)}
342+
<Plot config={config} />
343+
</>
344+
)
331345
}
332346

333347
export default XYPlot

src/visualization/utils/useVisDomainSettings.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323

2424
// Types
2525
import {AppState, InternalFromFluxResult, TimeRange} from 'src/types'
26+
import {RemoteDataState} from '@influxdata/clockface'
2627
/*
2728
This hook helps map the domain setting stored for line graph to the
2829
appropriate settings on a @influxdata/giraffe `Config` object.
@@ -137,13 +138,14 @@ export const useVisYDomainSettings = (
137138
}
138139

139140
interface ZoomRequeryArgs {
141+
data: NumericColumnData | string[]
140142
parsedResult: InternalFromFluxResult
141-
setResult: Function
142143
preZoomResult: InternalFromFluxResult
143-
setPreZoomResult: Function
144144
query: string
145+
setPreZoomResult: Function
146+
setRequeryStatus: Function
147+
setResult: Function
145148
storedDomain: number[]
146-
data: NumericColumnData | string[]
147149
timeRange?: TimeRange
148150
}
149151

@@ -152,13 +154,14 @@ const isNotEqual = (firstValue: any, secondValue: any): boolean =>
152154

153155
export const useZoomRequeryXDomainSettings = (args: ZoomRequeryArgs) => {
154156
const {
157+
data,
155158
parsedResult,
156-
setResult,
157159
preZoomResult,
158-
setPreZoomResult,
159160
query,
161+
setPreZoomResult,
162+
setRequeryStatus,
163+
setResult,
160164
storedDomain,
161-
data,
162165
timeRange = null,
163166
} = args
164167

@@ -204,11 +207,16 @@ export const useZoomRequeryXDomainSettings = (args: ZoomRequeryArgs) => {
204207
variables,
205208
zoomQueryWindowVariable
206209
)
210+
211+
setRequeryStatus(RemoteDataState.Loading)
207212
runQuery(orgId, query, extern).promise.then(
208213
(result: RunQueryResult) => {
209214
if (result.type === 'SUCCESS') {
215+
setRequeryStatus(RemoteDataState.Done)
210216
const parsed = fromFlux(result.csv)
211217
setResult(parsed)
218+
} else {
219+
setRequeryStatus(RemoteDataState.Error)
212220
}
213221
}
214222
)
@@ -217,6 +225,7 @@ export const useZoomRequeryXDomainSettings = (args: ZoomRequeryArgs) => {
217225
}, [domain]) // eslint-disable-line react-hooks/exhaustive-deps
218226

219227
const setZoomDomain = (updatedDomain: number[]) => {
228+
setRequeryStatus(RemoteDataState.NotStarted)
220229
if (!preZoomResult) {
221230
setPreZoomResult(parsedResult)
222231
}
@@ -225,6 +234,7 @@ export const useZoomRequeryXDomainSettings = (args: ZoomRequeryArgs) => {
225234
}
226235

227236
const resetDomain = () => {
237+
setRequeryStatus(RemoteDataState.NotStarted)
228238
if (preZoomResult) {
229239
setResult(preZoomResult)
230240
setPreZoomResult(null)
@@ -238,13 +248,14 @@ export const useZoomRequeryXDomainSettings = (args: ZoomRequeryArgs) => {
238248

239249
export const useZoomRequeryYDomainSettings = (args: ZoomRequeryArgs) => {
240250
const {
251+
data,
241252
parsedResult,
242-
setResult,
243253
preZoomResult,
244-
setPreZoomResult,
245254
query,
255+
setPreZoomResult,
256+
setRequeryStatus,
257+
setResult,
246258
storedDomain,
247-
data,
248259
timeRange = null,
249260
} = args
250261

@@ -295,11 +306,16 @@ export const useZoomRequeryYDomainSettings = (args: ZoomRequeryArgs) => {
295306
variables,
296307
zoomQueryWindowVariable
297308
)
309+
310+
setRequeryStatus(RemoteDataState.Loading)
298311
runQuery(orgId, query, extern).promise.then(
299312
(result: RunQueryResult) => {
300313
if (result.type === 'SUCCESS') {
314+
setRequeryStatus(RemoteDataState.Done)
301315
const parsed = fromFlux(result.csv)
302316
setResult(parsed)
317+
} else {
318+
setRequeryStatus(RemoteDataState.Error)
303319
}
304320
}
305321
)
@@ -308,6 +324,7 @@ export const useZoomRequeryYDomainSettings = (args: ZoomRequeryArgs) => {
308324
}, [domain]) // eslint-disable-line react-hooks/exhaustive-deps
309325

310326
const setZoomDomain = (updatedDomain: number[]) => {
327+
setRequeryStatus(RemoteDataState.NotStarted)
311328
if (!preZoomResult) {
312329
setPreZoomResult(parsedResult)
313330
}
@@ -316,6 +333,7 @@ export const useZoomRequeryYDomainSettings = (args: ZoomRequeryArgs) => {
316333
}
317334

318335
const resetDomain = () => {
336+
setRequeryStatus(RemoteDataState.NotStarted)
319337
if (preZoomResult) {
320338
setResult(preZoomResult)
321339
setPreZoomResult(null)

0 commit comments

Comments
 (0)