Skip to content

Commit e156326

Browse files
authored
feat: add adaptive zoom to Band (#5929)
* feat: add adaptive zoom to Band * fix: move Time Format into Options in Band's view options
1 parent f33e2ac commit e156326

File tree

2 files changed

+88
-30
lines changed

2 files changed

+88
-30
lines changed

src/visualization/types/Band/options.tsx

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
// Libraries
12
import React, {FC, useEffect} from 'react'
2-
33
import {
44
ButtonShape,
55
Columns,
@@ -14,8 +14,7 @@ import {
1414
SelectGroup,
1515
} from '@influxdata/clockface'
1616

17-
import AutoDomainInput from 'src/shared/components/AutoDomainInput'
18-
import {AXES_SCALE_OPTIONS} from 'src/visualization/constants'
17+
// Utils
1918
import {
2019
FORMAT_OPTIONS,
2120
resolveTimeFormat,
@@ -25,14 +24,23 @@ import {
2524
defaultYColumn,
2625
parseYBounds,
2726
} from 'src/shared/utils/vis'
27+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
28+
29+
// Components
30+
import {AdaptiveZoomToggle} from 'src/visualization/components/internal/AdaptiveZoomOption'
31+
import AutoDomainInput from 'src/shared/components/AutoDomainInput'
2832
import ColorSchemeDropdown from 'src/visualization/components/internal/ColorSchemeDropdown'
2933
import HoverLegend from 'src/visualization/components/internal/HoverLegend'
3034
import StaticLegend from 'src/visualization/components/internal/StaticLegend'
3135
import AxisTicksGenerator from 'src/visualization/components/internal/AxisTicksGenerator'
3236

37+
// Types
3338
import {BandViewProperties} from 'src/types'
3439
import {VisualizationOptionProps} from 'src/visualization'
3540

41+
// Constants
42+
import {AXES_SCALE_OPTIONS} from 'src/visualization/constants'
43+
3644
const {BASE_2, BASE_10} = AXES_SCALE_OPTIONS
3745
const REMOVE_COLUMN = '(none)'
3846

@@ -206,15 +214,13 @@ const BandViewOptions: FC<Props> = ({properties, results, update}) => {
206214
}
207215
/>
208216
</Form.Element>
209-
<Form.Element label="Time Format">
210-
<SelectDropdown
211-
options={FORMAT_OPTIONS.map(option => option.text)}
212-
selectedOption={resolveTimeFormat(properties.timeFormat)}
213-
onSelect={(format: string) => {
214-
update({timeFormat: format})
215-
}}
217+
{isFlagEnabled('zoomRequery') && (
218+
<AdaptiveZoomToggle
219+
adaptiveZoomHide={properties.adaptiveZoomHide}
220+
type={properties.type}
221+
update={update}
216222
/>
217-
</Form.Element>
223+
)}
218224
</Grid.Column>
219225
<Grid.Column
220226
widthXS={Columns.Twelve}
@@ -328,6 +334,15 @@ const BandViewOptions: FC<Props> = ({properties, results, update}) => {
328334
widthLG={Columns.Four}
329335
>
330336
<h5 className="view-options--header">Options</h5>
337+
<Form.Element label="Time Format">
338+
<SelectDropdown
339+
options={FORMAT_OPTIONS.map(option => option.text)}
340+
selectedOption={resolveTimeFormat(properties.timeFormat)}
341+
onSelect={(format: string) => {
342+
update({timeFormat: format})
343+
}}
344+
/>
345+
</Form.Element>
331346
{properties.geom && (
332347
<Form.Element label="Interpolation">
333348
<Dropdown

src/visualization/types/Band/view.tsx

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
// Libraries
2-
import React, {FC, useMemo, useContext} from 'react'
3-
2+
import React, {FC, useContext, useEffect, useMemo, useState} from 'react'
43
import {Config, Plot} from '@influxdata/giraffe'
4+
import {RemoteDataState} from '@influxdata/clockface'
55

66
// Redux
77
import {isAnnotationsModeEnabled} from 'src/annotations/selectors'
8-
98
import {useDispatch, useSelector} from 'react-redux'
109

1110
// Annotations
1211
import {addAnnotationLayer} from 'src/visualization/utils/annotationUtils'
1312

1413
// Components
1514
import EmptyGraphMessage from 'src/shared/components/EmptyGraphMessage'
15+
import ViewLoadingSpinner from 'src/visualization/components/internal/ViewLoadingSpinner'
1616

1717
// Utils
1818
import {useAxisTicksGenerator} from 'src/visualization/utils/useAxisTicksGenerator'
1919
import {getFormatter} from 'src/visualization/utils/getFormatter'
2020
import {useMainColumn} from 'src/visualization/utils/useBandColumns'
2121
import {useLegendOpacity} from 'src/visualization/utils/useLegendOpacity'
2222
import {useStaticLegend} from 'src/visualization/utils/useStaticLegend'
23+
import {useZoomQuery} from 'src/visualization/utils/useZoomQuery'
2324
import {
24-
useVisXDomainSettings,
25-
useVisYDomainSettings,
25+
useZoomRequeryXDomainSettings,
26+
useZoomRequeryYDomainSettings,
2627
} from 'src/visualization/utils/useVisDomainSettings'
2728
import {
2829
geomToInterpolation,
@@ -32,6 +33,11 @@ import {
3233
defaultXColumn,
3334
defaultYColumn,
3435
} from 'src/shared/utils/vis'
36+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
37+
38+
// Types
39+
import {BandViewProperties, InternalFromFluxResult} from 'src/types'
40+
import {VisualizationProps} from 'src/visualization'
3541

3642
// Constants
3743
import {VIS_THEME, VIS_THEME_LIGHT} from 'src/shared/constants'
@@ -44,10 +50,6 @@ import {
4450
} from 'src/visualization/constants'
4551
import {AppSettingContext} from 'src/shared/contexts/app'
4652

47-
// Types
48-
import {BandViewProperties} from 'src/types'
49-
import {VisualizationProps} from 'src/visualization'
50-
5153
interface Props extends VisualizationProps {
5254
properties: BandViewProperties
5355
}
@@ -58,7 +60,19 @@ const BandPlot: FC<Props> = ({
5860
annotations,
5961
cellID,
6062
timeRange,
63+
transmitWindowPeriod,
6164
}) => {
65+
const [resultState, setResultState] = useState(result)
66+
const [preZoomResult, setPreZoomResult] =
67+
useState<InternalFromFluxResult>(null)
68+
const [requeryStatus, setRequeryStatus] = useState<RemoteDataState>(
69+
RemoteDataState.NotStarted
70+
)
71+
72+
useEffect(() => {
73+
setResultState(result)
74+
}, [result])
75+
6276
const mainColumnName = useMainColumn(
6377
properties.mainColumn,
6478
result.resultColumnNames
@@ -106,20 +120,42 @@ const BandPlot: FC<Props> = ({
106120

107121
const groupKey = [...result.fluxGroupKeyUnion, 'result']
108122

109-
const [xDomain, onSetXDomain, onResetXDomain] = useVisXDomainSettings(
110-
storedXDomain,
111-
result.table.getColumn(xColumn, 'number'),
112-
timeRange
113-
)
114-
115123
const memoizedYColumnData = useMemo(
116124
() => result.table.getColumn(yColumn, 'number'),
117125
[result.table, yColumn]
118126
)
119127

120-
const [yDomain, onSetYDomain, onResetYDomain] = useVisYDomainSettings(
121-
storedYDomain,
122-
memoizedYColumnData
128+
const zoomQuery = useZoomQuery(properties)
129+
130+
const [xDomain, onSetXDomain, onResetXDomain] = useZoomRequeryXDomainSettings(
131+
{
132+
adaptiveZoomHide: properties.adaptiveZoomHide,
133+
data: resultState.table.getColumn(xColumn, 'number'),
134+
parsedResult: resultState,
135+
preZoomResult,
136+
query: zoomQuery,
137+
setPreZoomResult,
138+
setRequeryStatus,
139+
setResult: setResultState,
140+
storedDomain: storedXDomain,
141+
timeRange,
142+
transmitWindowPeriod,
143+
}
144+
)
145+
146+
const [yDomain, onSetYDomain, onResetYDomain] = useZoomRequeryYDomainSettings(
147+
{
148+
adaptiveZoomHide: properties.adaptiveZoomHide,
149+
data: memoizedYColumnData,
150+
parsedResult: resultState,
151+
preZoomResult,
152+
query: zoomQuery,
153+
setPreZoomResult,
154+
setRequeryStatus,
155+
setResult: setResultState,
156+
storedDomain: storedYDomain,
157+
transmitWindowPeriod,
158+
}
123159
)
124160

125161
const legendColumns = filterNoisyColumns(
@@ -208,7 +244,14 @@ const BandPlot: FC<Props> = ({
208244
'band'
209245
)
210246

211-
return <Plot config={config} />
247+
return (
248+
<>
249+
{isFlagEnabled('zoomRequery') && (
250+
<ViewLoadingSpinner loading={requeryStatus} />
251+
)}
252+
<Plot config={config} />
253+
</>
254+
)
212255
}
213256

214257
export default BandPlot

0 commit comments

Comments
 (0)