Skip to content

Commit f33e2ac

Browse files
authored
feat: add adaptive zoom to Graph + Single Stat (#5978)
1 parent a46899b commit f33e2ac

File tree

4 files changed

+102
-39
lines changed

4 files changed

+102
-39
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
"@docsearch/react": "^3.0.0-alpha.37",
167167
"@influxdata/clockface": "^6.3.7",
168168
"@influxdata/flux-lsp-browser": "0.8.35",
169-
"@influxdata/giraffe": "^2.36.0",
169+
"@influxdata/giraffe": "^2.37.0",
170170
"@influxdata/influxdb-templates": "0.9.0",
171171
"@influxdata/react-custom-scrollbars": "4.3.8",
172172
"abortcontroller-polyfill": "^1.3.0",

src/visualization/types/SingleStatWithLine/options.tsx

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
// Libraries
12
import React, {FC, useCallback} from 'react'
2-
33
import {
44
Input,
55
InputType,
@@ -19,12 +19,7 @@ import {
1919
InputLabel,
2020
} from '@influxdata/clockface'
2121

22-
import AutoDomainInput from 'src/shared/components/AutoDomainInput'
23-
import {
24-
AXES_SCALE_OPTIONS,
25-
MIN_DECIMAL_PLACES,
26-
MAX_DECIMAL_PLACES,
27-
} from 'src/visualization/constants'
22+
// Utils
2823
import {convertUserInputToNumOrNaN} from 'src/shared/utils/convertUserInput'
2924
import {
3025
FORMAT_OPTIONS,
@@ -35,10 +30,10 @@ import {
3530
defaultYColumn,
3631
parseYBounds,
3732
} from 'src/shared/utils/vis'
38-
import {
39-
THRESHOLD_TYPE_TEXT,
40-
THRESHOLD_TYPE_BG,
41-
} from 'src/shared/constants/thresholds'
33+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
34+
35+
// Components
36+
import {AdaptiveZoomToggle} from 'src/visualization/components/internal/AdaptiveZoomOption'
4237
import ColorSchemeDropdown from 'src/visualization/components/internal/ColorSchemeDropdown'
4338
import AxisTicksGenerator from 'src/visualization/components/internal/AxisTicksGenerator'
4439
import ThresholdsSettings from 'src/visualization/components/internal/ThresholdsSettings'
@@ -47,6 +42,18 @@ import StaticLegend from 'src/visualization/components/internal/StaticLegend'
4742
import {LinePlusSingleStatProperties, Color} from 'src/types'
4843
import {VisualizationOptionProps} from 'src/visualization'
4944

45+
// Constants
46+
import AutoDomainInput from 'src/shared/components/AutoDomainInput'
47+
import {
48+
AXES_SCALE_OPTIONS,
49+
MIN_DECIMAL_PLACES,
50+
MAX_DECIMAL_PLACES,
51+
} from 'src/visualization/constants'
52+
import {
53+
THRESHOLD_TYPE_TEXT,
54+
THRESHOLD_TYPE_BG,
55+
} from 'src/shared/constants/thresholds'
56+
5057
const {BASE_2, BASE_10} = AXES_SCALE_OPTIONS
5158

5259
interface Props extends VisualizationOptionProps {
@@ -200,6 +207,20 @@ const SingleStatWithLineOptions: FC<Props> = ({
200207
}
201208
/>
202209
</Form.Element>
210+
{isFlagEnabled('zoomRequery') && (
211+
<AdaptiveZoomToggle
212+
adaptiveZoomHide={properties.adaptiveZoomHide}
213+
type={properties.type}
214+
update={update}
215+
/>
216+
)}
217+
</Grid.Column>
218+
<Grid.Column
219+
widthXS={Columns.Twelve}
220+
widthMD={Columns.Six}
221+
widthLG={Columns.Four}
222+
>
223+
<h5 className="view-options--header">Options</h5>
203224
<Form.Element label="Time Format">
204225
<SelectDropdown
205226
options={FORMAT_OPTIONS.map(option => option.text)}
@@ -209,13 +230,6 @@ const SingleStatWithLineOptions: FC<Props> = ({
209230
}}
210231
/>
211232
</Form.Element>
212-
</Grid.Column>
213-
<Grid.Column
214-
widthXS={Columns.Twelve}
215-
widthMD={Columns.Six}
216-
widthLG={Columns.Four}
217-
>
218-
<h5 className="view-options--header">Options</h5>
219233
<Form.Element label="Line Colors">
220234
<ColorSchemeDropdown
221235
value={properties.colors.filter(c => c.type === 'scale')}

src/visualization/types/SingleStatWithLine/view.tsx

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,39 @@
11
// Libraries
2-
import React, {FC, useMemo, useContext} from 'react'
2+
import React, {FC, useContext, useEffect, useMemo, useState} from 'react'
33
import {
44
Config,
55
DomainLabel,
66
LINE_COUNT,
77
Plot,
8+
SINGLE_STAT_SVG_NO_USER_SELECT,
89
STACKED_LINE_CUMULATIVE,
910
SingleStatLayerConfig,
1011
createGroupIDColumn,
1112
getDomainDataFromLines,
1213
getLatestValues,
1314
lineTransform,
1415
} from '@influxdata/giraffe'
16+
import {RemoteDataState} from '@influxdata/clockface'
1517

1618
// Redux
1719
import {isAnnotationsModeEnabled} from 'src/annotations/selectors'
1820

1921
// Component
2022
import EmptyGraphMessage from 'src/shared/components/EmptyGraphMessage'
23+
import ViewLoadingSpinner from 'src/visualization/components/internal/ViewLoadingSpinner'
24+
25+
// Context
26+
import {AppSettingContext} from 'src/shared/contexts/app'
2127

2228
// Utils
2329
import {useAxisTicksGenerator} from 'src/visualization/utils/useAxisTicksGenerator'
2430
import {getFormatter} from 'src/visualization/utils/getFormatter'
2531
import {useLegendOpacity} from 'src/visualization/utils/useLegendOpacity'
2632
import {useStaticLegend} from 'src/visualization/utils/useStaticLegend'
33+
import {useZoomQuery} from 'src/visualization/utils/useZoomQuery'
2734
import {
28-
useVisXDomainSettings,
29-
useVisYDomainSettings,
35+
useZoomRequeryXDomainSettings,
36+
useZoomRequeryYDomainSettings,
3037
} from 'src/visualization/utils/useVisDomainSettings'
3138
import {
3239
geomToInterpolation,
@@ -36,16 +43,16 @@ import {
3643
defaultXColumn,
3744
defaultYColumn,
3845
} from 'src/shared/utils/vis'
39-
import {generateThresholdsListHexs} from 'src/shared/constants/colorOperations'
40-
import {AppSettingContext} from 'src/shared/contexts/app'
46+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
4147

4248
// Constants
4349
import {VIS_THEME, VIS_THEME_LIGHT} from 'src/shared/constants'
4450
import {DEFAULT_LINE_COLORS} from 'src/shared/constants/graphColorPalettes'
4551
import {INVALID_DATA_COPY} from 'src/visualization/constants'
52+
import {generateThresholdsListHexs} from 'src/shared/constants/colorOperations'
4653

4754
// Types
48-
import {LinePlusSingleStatProperties} from 'src/types'
55+
import {LinePlusSingleStatProperties, InternalFromFluxResult} from 'src/types'
4956
import {VisualizationProps} from 'src/visualization'
5057

5158
// Annotations
@@ -63,7 +70,19 @@ const SingleStatWithLine: FC<Props> = ({
6370
timeRange,
6471
annotations,
6572
cellID,
73+
transmitWindowPeriod,
6674
}) => {
75+
const [resultState, setResultState] = useState(result)
76+
const [preZoomResult, setPreZoomResult] =
77+
useState<InternalFromFluxResult>(null)
78+
const [requeryStatus, setRequeryStatus] = useState<RemoteDataState>(
79+
RemoteDataState.NotStarted
80+
)
81+
82+
useEffect(() => {
83+
setResultState(result)
84+
}, [result])
85+
6786
const {theme, timeZone} = useContext(AppSettingContext)
6887
const axisTicksOptions = useAxisTicksGenerator(properties)
6988
const tooltipOpacity = useLegendOpacity(properties.legendOpacity)
@@ -116,12 +135,6 @@ const SingleStatWithLine: FC<Props> = ({
116135
[result]
117136
)
118137

119-
const [xDomain, onSetXDomain, onResetXDomain] = useVisXDomainSettings(
120-
storedXDomain,
121-
result.table.getColumn(xColumn, 'number'),
122-
timeRange
123-
)
124-
125138
const memoizedYColumnData = useMemo(() => {
126139
if (properties.position === 'stacked') {
127140
const {lineData} = lineTransform(
@@ -145,9 +158,37 @@ const SingleStatWithLine: FC<Props> = ({
145158
properties.position,
146159
])
147160

148-
const [yDomain, onSetYDomain, onResetYDomain] = useVisYDomainSettings(
149-
storedYDomain,
150-
memoizedYColumnData
161+
const zoomQuery = useZoomQuery(properties)
162+
163+
const [xDomain, onSetXDomain, onResetXDomain] = useZoomRequeryXDomainSettings(
164+
{
165+
adaptiveZoomHide: properties.adaptiveZoomHide,
166+
data: resultState.table.getColumn(xColumn, 'number'),
167+
parsedResult: resultState,
168+
preZoomResult,
169+
query: zoomQuery,
170+
setPreZoomResult,
171+
setRequeryStatus,
172+
setResult: setResultState,
173+
storedDomain: storedXDomain,
174+
timeRange,
175+
transmitWindowPeriod,
176+
}
177+
)
178+
179+
const [yDomain, onSetYDomain, onResetYDomain] = useZoomRequeryYDomainSettings(
180+
{
181+
adaptiveZoomHide: properties.adaptiveZoomHide,
182+
data: memoizedYColumnData,
183+
parsedResult: resultState,
184+
preZoomResult,
185+
query: zoomQuery,
186+
setPreZoomResult,
187+
setRequeryStatus,
188+
setResult: setResultState,
189+
storedDomain: storedYDomain,
190+
transmitWindowPeriod,
191+
}
151192
)
152193

153194
const legendColumns = filterNoisyColumns(
@@ -250,6 +291,7 @@ const SingleStatWithLine: FC<Props> = ({
250291
svgTextAttributes: {
251292
'data-testid': 'single-stat--text',
252293
},
294+
svgStyle: SINGLE_STAT_SVG_NO_USER_SELECT,
253295
}
254296

255297
config.layers.push(statLayer)
@@ -270,7 +312,14 @@ const SingleStatWithLine: FC<Props> = ({
270312
'singleStatWline'
271313
)
272314

273-
return <Plot config={config} />
315+
return (
316+
<>
317+
{isFlagEnabled('zoomRequery') && (
318+
<ViewLoadingSpinner loading={requeryStatus} />
319+
)}
320+
<Plot config={config} />
321+
</>
322+
)
274323
}
275324

276325
export default SingleStatWithLine

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,10 +1449,10 @@
14491449
resolved "https://registry.yarnpkg.com/@influxdata/flux-lsp-browser/-/flux-lsp-browser-0.8.35.tgz#ed92117d46f297bacf6aec7e7ace451d55bdff79"
14501450
integrity sha512-d/zlUAx+O67aTBVNIr0XznuDl2jkGELlahRL2OIPOawfnAkNNREuC8iMhov8dq+Bw9d5w+mT041UKzhxZXl1Kg==
14511451

1452-
"@influxdata/giraffe@^2.36.0":
1453-
version "2.36.0"
1454-
resolved "https://registry.yarnpkg.com/@influxdata/giraffe/-/giraffe-2.36.0.tgz#8dcffa66a8cc497c3bc5d0c9e001d745244cb899"
1455-
integrity sha512-AMBtb9lOc9VXiTc8JBlbFe+PwyRBX8X+SvS9NRMSzrttWB6Anddy6H2mL34swbpCGreNhuElNT5GPj5ePwDFqw==
1452+
"@influxdata/giraffe@^2.37.0":
1453+
version "2.37.0"
1454+
resolved "https://registry.yarnpkg.com/@influxdata/giraffe/-/giraffe-2.37.0.tgz#a4e06aed4d10dc85067feb79830ff31037175161"
1455+
integrity sha512-XTGC9fo6g70pbwgD9XV0Yvi1JHMGypI8CR3UAg7nJGq5MgbCgo9nzLaxvilKdcvngrQGCzARvw+ixawfIUHrJg==
14561456
dependencies:
14571457
merge-images "^2.0.0"
14581458

0 commit comments

Comments
 (0)