Skip to content

Commit 7dd435a

Browse files
authored
fix: atomic query builder actions (#4321)
1 parent 912a4d9 commit 7dd435a

File tree

4 files changed

+101
-72
lines changed

4 files changed

+101
-72
lines changed

src/flows/pipes/QueryBuilder/AddButton.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {SquareButton, IconFont} from '@influxdata/clockface'
44
import {RemoteDataState} from 'src/types'
55

66
import {QueryBuilderContext} from 'src/flows/pipes/QueryBuilder/context'
7+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
78

89
import {event} from 'src/cloud/utils/reporting'
910

@@ -19,6 +20,14 @@ const AddButton: FC = () => {
1920
return null
2021
}
2122

23+
if (
24+
isFlagEnabled('newQueryBuilder') &&
25+
!cards[0]?.values?.selected?.length &&
26+
cards.length < 2
27+
) {
28+
return null
29+
}
30+
2231
const {keys} = cards[cards.length - 1]
2332
if (keys.results.length === 0 && keys.loading === RemoteDataState.Done) {
2433
return null

src/flows/pipes/QueryBuilder/BucketSelector.tsx

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,18 @@ import React, {FC, useState, useContext, useEffect} from 'react'
55
import {Input, ComponentSize, List, Gradients} from '@influxdata/clockface'
66
import {Bucket, RemoteDataState} from 'src/types'
77
import BuilderCard from 'src/timeMachine/components/builderCard/BuilderCard'
8+
import {QueryBuilderContext} from 'src/flows/pipes/QueryBuilder/context'
89
import {BucketContext} from 'src/flows/context/bucket.scoped'
910
import {PipeContext} from 'src/flows/context/pipe'
10-
1111
import {event} from 'src/cloud/utils/reporting'
1212

1313
// this is used by notebooks
1414
const BucketSelector: FC = () => {
15-
const {data, update} = useContext(PipeContext)
15+
const {data} = useContext(PipeContext)
1616
const {loading, buckets, addBucket} = useContext(BucketContext)
17+
const {selectBucket} = useContext(QueryBuilderContext)
1718

1819
const [search, setSearch] = useState('')
19-
const [selected, setSelected] = useState(null)
20-
21-
useEffect(() => {
22-
const bucks = data.buckets.filter(b => !!b)
23-
if (!selected && bucks.length) {
24-
setSelected(bucks[0].name)
25-
}
26-
}, [selected, data.buckets])
2720

2821
useEffect(() => {
2922
const allBuckets = new Set(buckets.map(b => b.name))
@@ -37,28 +30,6 @@ const BucketSelector: FC = () => {
3730
})
3831
}, [buckets, data.buckets])
3932

40-
const selectBucket = (item?: string): void => {
41-
let bucket
42-
if (!item) {
43-
data.buckets = []
44-
} else if (item !== selected) {
45-
data.buckets = [buckets.find(b => b.name === item)]
46-
bucket = item
47-
event('Query Builder Bucket Selected', {
48-
usedSearch: !!search.length ? 'yus' : 'nah',
49-
})
50-
} else {
51-
data.buckets = []
52-
bucket = null
53-
}
54-
55-
data.tags = []
56-
update(data)
57-
if (item) {
58-
setSelected(bucket)
59-
}
60-
}
61-
6233
if (loading === RemoteDataState.Done && !buckets.length) {
6334
return (
6435
<BuilderCard testID="bucket-selector">
@@ -67,7 +38,14 @@ const BucketSelector: FC = () => {
6738
</BuilderCard>
6839
)
6940
}
70-
41+
const _selectBucket = (bucket?: string) => {
42+
if (bucket) {
43+
event('Query Builder Bucket Selected', {
44+
usedSearch: !!search.length ? 'yus' : 'nah',
45+
})
46+
}
47+
selectBucket(bucket)
48+
}
7149
const filteredBuckets = buckets.filter(
7250
bucket =>
7351
!search.length ||
@@ -99,6 +77,7 @@ const BucketSelector: FC = () => {
9977
{user: [], system: [], sample: []}
10078
)
10179

80+
const selected = data?.buckets[0]?.name
10281
const renderListItem = item => {
10382
const isSelected = selected === item.name
10483
const title = isSelected
@@ -111,7 +90,7 @@ const BucketSelector: FC = () => {
11190
testID={`selector-list ${item.name}`}
11291
key={item.name}
11392
value={item.name}
114-
onClick={selectBucket}
93+
onClick={_selectBucket}
11594
title={title}
11695
selected={isSelected}
11796
size={ComponentSize.ExtraSmall}

src/flows/pipes/QueryBuilder/CardList.tsx

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,15 @@ interface Props {
5555
}
5656

5757
const Card: FC<Props> = ({idx}) => {
58-
const {cards, add, update, remove, loadKeys, loadValues} = useContext(
59-
QueryBuilderContext
60-
)
58+
const {
59+
cards,
60+
selectMeasurement,
61+
add,
62+
update,
63+
remove,
64+
loadKeys,
65+
loadValues,
66+
} = useContext(QueryBuilderContext)
6167
const {data} = useContext(PipeContext)
6268
const card = cards[idx]
6369
const [keySearches, setKeySearches] = useState([])
@@ -125,23 +131,27 @@ const Card: FC<Props> = ({idx}) => {
125131
card.values.selected.length <= 1
126132

127133
const valueSelect = val => {
128-
let _vals = [...card.values.selected]
134+
const _vals = [...card.values.selected]
129135
const index = _vals.indexOf(val)
130136

131-
if (index === -1) {
132-
event('Query Builder Value Selected')
133-
if (isCompliant) {
134-
_vals = [val]
137+
if (isCompliant) {
138+
if (index === -1) {
139+
event('Query Builder Value Selected')
140+
selectMeasurement(val)
135141
} else {
136-
_vals.push(val)
142+
event('Query Builder Value Unselected')
143+
selectMeasurement(null)
137144
}
145+
146+
return
147+
}
148+
149+
if (index === -1) {
150+
event('Query Builder Value Selected')
151+
_vals.push(val)
138152
} else {
139153
event('Query Builder Value Unselected')
140-
if (isCompliant) {
141-
_vals = []
142-
} else {
143-
_vals.splice(index, 1)
144-
}
154+
_vals.splice(index, 1)
145155
}
146156

147157
update(idx, {

src/flows/pipes/QueryBuilder/context.tsx

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import React, {
66
useState,
77
useCallback,
88
useMemo,
9-
useEffect,
109
} from 'react'
1110

1211
// Contexts
@@ -63,6 +62,9 @@ const getDefaultCard = (): QueryBuilderCard => ({
6362
interface QueryBuilderContextType {
6463
cards: QueryBuilderCard[]
6564

65+
selectBucket: (bucket?: string) => void
66+
selectMeasurement: (measurement?: string) => void
67+
6668
add: () => void
6769
remove: (idx: number) => void
6870
update: (idx: number, card: Partial<QueryBuilderCard>) => void
@@ -72,6 +74,10 @@ interface QueryBuilderContextType {
7274

7375
export const DEFAULT_CONTEXT: QueryBuilderContextType = {
7476
cards: [getDefaultCard()],
77+
78+
selectBucket: _ => {},
79+
selectMeasurement: _ => {},
80+
7581
add: () => {},
7682
remove: (_idx: number) => {},
7783
update: (_idx: number, _card: QueryBuilderCard) => {},
@@ -120,33 +126,19 @@ export const QueryBuilderProvider: FC = ({children}) => {
120126
})
121127
)
122128

123-
useEffect(() => {
124-
// Migrate old data
125-
if (typeof data.buckets[0] === 'string') {
126-
const buck = buckets.find(b => b.name === data.buckets[0])
127-
128-
if (!buck) {
129-
update({
130-
buckets: [{type: 'user', name: data.buckets[0]}],
131-
})
132-
133-
return
134-
}
129+
const selectBucket = (bucket?: string) => {
130+
const card = getDefaultCard()
135131

132+
if (!bucket || bucket === data?.buckets[0]?.name) {
133+
update({buckets: [], tags: [card].map(toBuilderConfig)})
134+
} else {
135+
card.keys.selected = ['_measurement']
136136
update({
137-
buckets: [buck],
137+
buckets: [buckets.find(b => b.name === bucket)],
138+
tags: [card].map(toBuilderConfig),
138139
})
139-
140-
return
141-
}
142-
143-
if (data.tags.length) {
144-
return
145140
}
146141

147-
const card = getDefaultCard()
148-
card.keys.selected = ['_measurement']
149-
update({tags: [card].map(toBuilderConfig)})
150142
setCardMeta([
151143
{
152144
keys: [],
@@ -155,7 +147,42 @@ export const QueryBuilderProvider: FC = ({children}) => {
155147
loadingValues: RemoteDataState.NotStarted,
156148
},
157149
])
158-
}, [data.buckets])
150+
}
151+
152+
const selectMeasurement = (measurement?: string) => {
153+
if (measurement) {
154+
update({
155+
tags: [
156+
{
157+
...data.tags[0],
158+
values: [measurement],
159+
},
160+
toBuilderConfig(getDefaultCard()),
161+
],
162+
})
163+
164+
setCardMeta([
165+
cardMeta[0],
166+
{
167+
keys: [],
168+
values: [],
169+
loadingKeys: RemoteDataState.NotStarted,
170+
loadingValues: RemoteDataState.NotStarted,
171+
},
172+
])
173+
} else {
174+
update({
175+
tags: [
176+
{
177+
...data.tags[0],
178+
values: [],
179+
},
180+
],
181+
})
182+
183+
setCardMeta([cardMeta[0]])
184+
}
185+
}
159186

160187
const cards = useMemo(
161188
() => data.tags.map((tag, idx) => fromBuilderConfig(tag, cardMeta[idx])),
@@ -442,6 +469,10 @@ export const QueryBuilderProvider: FC = ({children}) => {
442469
<QueryBuilderContext.Provider
443470
value={{
444471
cards,
472+
473+
selectBucket,
474+
selectMeasurement,
475+
445476
add,
446477
remove,
447478
update: updater,

0 commit comments

Comments
 (0)