Skip to content

Commit 64eab26

Browse files
authored
feat: add adaptive zoom to Scatter (#5930)
1 parent a5eb6e8 commit 64eab26

File tree

3 files changed

+78
-24
lines changed

3 files changed

+78
-24
lines changed

src/shared/components/cells/Cell.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ class CellComponent extends Component<Props, State> {
130130
switch (type) {
131131
case 'xy':
132132
case 'line-plus-single-stat':
133-
case 'band': {
133+
case 'band':
134+
case 'scatter': {
134135
if (this.props.windowPeriodFromQueryBuilder === AGG_WINDOW_AUTO) {
135136
return (
136137
<span className="cell--window-period">

src/visualization/types/Scatter/options.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
// Libraries
12
import React, {FC} from 'react'
2-
33
import {
44
Input,
55
Grid,
@@ -10,21 +10,28 @@ import {
1010
MultiSelectDropdown,
1111
} from '@influxdata/clockface'
1212

13+
// Components
14+
import {AdaptiveZoomToggle} from 'src/visualization/components/internal/AdaptiveZoomOption'
1315
import AutoDomainInput from 'src/shared/components/AutoDomainInput'
1416
import HexColorSchemeDropdown from 'src/visualization/components/internal/HexColorSchemeDropdown'
1517
import HoverLegend from 'src/visualization/components/internal/HoverLegend'
1618
import AxisTicksGenerator from 'src/visualization/components/internal/AxisTicksGenerator'
17-
import {TimeDomainAutoToggle} from 'src/visualization/types/Scatter/TimeAutoToggle'
19+
20+
// Utils
1821
import {
1922
FORMAT_OPTIONS,
2023
resolveTimeFormat,
2124
} from 'src/visualization/utils/timeFormat'
22-
import {GIRAFFE_COLOR_SCHEMES} from 'src/shared/constants'
23-
2425
import {defaultXColumn, defaultYColumn} from 'src/shared/utils/vis'
26+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
27+
28+
// Types
2529
import {ScatterViewProperties} from 'src/types'
30+
import {TimeDomainAutoToggle} from 'src/visualization/types/Scatter/TimeAutoToggle'
2631
import {VisualizationOptionProps} from 'src/visualization'
2732

33+
// Constants
34+
import {GIRAFFE_COLOR_SCHEMES} from 'src/shared/constants'
2835
interface Props extends VisualizationOptionProps {
2936
properties: ScatterViewProperties
3037
}
@@ -167,6 +174,14 @@ const ScatterOptions: FC<Props> = ({properties, results, update}) => {
167174
}
168175
/>
169176
</Form.Element>
177+
{isFlagEnabled('zoomRequery') && (
178+
<AdaptiveZoomToggle
179+
adaptiveZoomHide={properties.adaptiveZoomHide}
180+
type={properties.type}
181+
update={update}
182+
/>
183+
)}
184+
<h5 className="view-options--header">Options</h5>
170185
<Form.Element label="Time Format">
171186
<SelectDropdown
172187
options={FORMAT_OPTIONS.map(option => option.text)}
@@ -185,7 +200,6 @@ const ScatterOptions: FC<Props> = ({properties, results, update}) => {
185200
/>
186201
</Form.Element>
187202
)}
188-
<h5 className="view-options--header">Options</h5>
189203
<Form.Element label="Color Scheme">
190204
<HexColorSchemeDropdown
191205
colorSchemes={GIRAFFE_COLOR_SCHEMES}

src/visualization/types/Scatter/view.tsx

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
// Libraries
2-
import React, {FunctionComponent, useContext} from 'react'
2+
import React, {FunctionComponent, useContext, useEffect, useState} from 'react'
33
import {useDispatch, useSelector} from 'react-redux'
44
import {Config, Plot} from '@influxdata/giraffe'
5+
import {RemoteDataState} from '@influxdata/clockface'
56

67
// Components
78
import EmptyGraphMessage from 'src/shared/components/EmptyGraphMessage'
9+
import ViewLoadingSpinner from 'src/visualization/components/internal/ViewLoadingSpinner'
810

911
// Utils
1012
import {useAxisTicksGenerator} from 'src/visualization/utils/useAxisTicksGenerator'
1113
import {getFormatter} from 'src/visualization/utils/getFormatter'
1214
import {useLegendOpacity} from 'src/visualization/utils/useLegendOpacity'
15+
import {useZoomQuery} from 'src/visualization/utils/useZoomQuery'
1316
import {
14-
useVisXDomainSettings,
15-
useVisYDomainSettings,
17+
useZoomRequeryXDomainSettings,
18+
useZoomRequeryYDomainSettings,
1619
} from 'src/visualization/utils/useVisDomainSettings'
1720
import {defaultXColumn, defaultYColumn} from 'src/shared/utils/vis'
1821
import {AppSettingContext} from 'src/shared/contexts/app'
1922
import {handleUnsupportedGraphType} from 'src/visualization/utils/annotationUtils'
23+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
2024

2125
// Constants
2226
import {VIS_THEME, VIS_THEME_LIGHT} from 'src/shared/constants'
2327
import {DEFAULT_LINE_COLORS} from 'src/shared/constants/graphColorPalettes'
2428
import {INVALID_DATA_COPY} from 'src/visualization/constants'
2529

2630
// Types
27-
import {ScatterViewProperties} from 'src/types'
31+
import {ScatterViewProperties, InternalFromFluxResult} from 'src/types'
2832
import {VisualizationProps} from 'src/visualization'
2933

3034
// Selectors
@@ -38,7 +42,19 @@ const ScatterPlot: FunctionComponent<Props> = ({
3842
properties,
3943
result,
4044
timeRange,
45+
transmitWindowPeriod,
4146
}) => {
47+
const [resultState, setResultState] = useState(result)
48+
const [preZoomResult, setPreZoomResult] =
49+
useState<InternalFromFluxResult>(null)
50+
const [requeryStatus, setRequeryStatus] = useState<RemoteDataState>(
51+
RemoteDataState.NotStarted
52+
)
53+
54+
useEffect(() => {
55+
setResultState(result)
56+
}, [result])
57+
4258
const {theme, timeZone} = useContext(AppSettingContext)
4359
const fillColumns = properties.fillColumns || result.fluxGroupKeyUnion || []
4460
const symbolColumns =
@@ -54,21 +70,37 @@ const ScatterPlot: FunctionComponent<Props> = ({
5470
const tooltipColorize = properties.legendColorizeRows
5571
const tooltipOrientationThreshold = properties.legendOrientationThreshold
5672

57-
let timerange
58-
59-
if (xColumn === '_time') {
60-
timerange = timeRange
61-
}
62-
63-
const [xDomain, onSetXDomain, onResetXDomain] = useVisXDomainSettings(
64-
properties.xDomain,
65-
result.table.getColumn(xColumn, 'number'),
66-
timerange
73+
const zoomQuery = useZoomQuery(properties)
74+
75+
const [xDomain, onSetXDomain, onResetXDomain] = useZoomRequeryXDomainSettings(
76+
{
77+
adaptiveZoomHide: properties.adaptiveZoomHide,
78+
data: resultState.table.getColumn(xColumn, 'number'),
79+
parsedResult: resultState,
80+
preZoomResult,
81+
query: zoomQuery,
82+
setPreZoomResult,
83+
setRequeryStatus,
84+
setResult: setResultState,
85+
storedDomain: properties.xDomain,
86+
timeRange: xColumn === '_time' ? timeRange : null,
87+
transmitWindowPeriod,
88+
}
6789
)
6890

69-
const [yDomain, onSetYDomain, onResetYDomain] = useVisYDomainSettings(
70-
properties.yDomain,
71-
result.table.getColumn(yColumn, 'number')
91+
const [yDomain, onSetYDomain, onResetYDomain] = useZoomRequeryYDomainSettings(
92+
{
93+
adaptiveZoomHide: properties.adaptiveZoomHide,
94+
data: resultState.table.getColumn(yColumn, 'number'),
95+
parsedResult: resultState,
96+
preZoomResult,
97+
query: zoomQuery,
98+
setPreZoomResult,
99+
setRequeryStatus,
100+
setResult: setResultState,
101+
storedDomain: properties.yDomain,
102+
transmitWindowPeriod,
103+
}
72104
)
73105

74106
const dispatch = useDispatch()
@@ -146,7 +178,14 @@ const ScatterPlot: FunctionComponent<Props> = ({
146178
}
147179
}
148180

149-
return <Plot config={config} />
181+
return (
182+
<>
183+
{isFlagEnabled('zoomRequery') && (
184+
<ViewLoadingSpinner loading={requeryStatus} />
185+
)}
186+
<Plot config={config} />
187+
</>
188+
)
150189
}
151190

152191
export default ScatterPlot

0 commit comments

Comments
 (0)