@@ -7,19 +7,17 @@ import React, {
77 useState ,
88 useRef ,
99} from 'react'
10-
11- // Styles
12- import './view.scss'
10+ import { Icon , IconFont } from '@influxdata/clockface'
1311
1412// Components
15- import { Icon , IconFont } from '@influxdata/clockface '
13+ import SearchWidget from 'src/shared/components/search_widget/SearchWidget '
1614
1715// Utilities
1816import { View } from 'src/visualization'
1917
2018// Types
2119import { RemoteDataState , SimpleTableViewProperties } from 'src/types'
22- import { PipeProp } from 'src/types/flows'
20+ import { PipeProp , FluxResult } from 'src/types/flows'
2321
2422import { PipeContext } from 'src/flows/context/pipe'
2523import { FlowQueryContext } from 'src/flows/context/flow.query'
@@ -31,6 +29,9 @@ import {downloadTextFile} from 'src/shared/utils/download'
3129// Constants
3230import { UNPROCESSED_PANEL_TEXT } from 'src/flows'
3331
32+ // Styles
33+ import './view.scss'
34+
3435const QueryStat : FC = ( ) => {
3536 const { loading, results} = useContext ( PipeContext )
3637 const queryStart = useRef ( 0 )
@@ -93,6 +94,7 @@ const Table: FC<PipeProp> = ({Context}) => {
9394 const { id, data, range, loading, results} = useContext ( PipeContext )
9495 const { basic, getPanelQueries} = useContext ( FlowQueryContext )
9596 const { register} = useContext ( SidebarContext )
97+ const [ search , setSearch ] = useState ( '' )
9698
9799 const dataExists = ! ! ( results ?. parsed ?. table || [ ] ) . length
98100
@@ -108,6 +110,56 @@ const Table: FC<PipeProp> = ({Context}) => {
108110 } )
109111 }
110112
113+ const res = useMemo ( ( ) => {
114+ if ( ! search . trim ( ) || ! results ?. parsed ) {
115+ return results ?. parsed
116+ }
117+
118+ const dupped = {
119+ fluxGroupKeyUnion : [ ...results . parsed . fluxGroupKeyUnion ] ,
120+ resultColumnNames : [ ...results . parsed . resultColumnNames ] ,
121+ table : {
122+ length : 0 ,
123+ columns : Object . entries ( results . parsed . table . columns ) . reduce (
124+ ( acc , [ k , v ] ) => {
125+ acc [ k ] = { ...v , data : [ ] }
126+ return acc
127+ } ,
128+ { }
129+ ) ,
130+ } ,
131+ }
132+
133+ const len = results . parsed . table . length
134+ const keys = Object . keys ( results . parsed . table . columns )
135+ let newLen = 0 ,
136+ ni = 0
137+
138+ const _search = search . toLocaleLowerCase ( )
139+ const oldCols = results . parsed . table . columns
140+ const newCols = dupped . table . columns
141+
142+ for ( ; ni < len ; ni ++ ) {
143+ if (
144+ ! keys . reduce (
145+ ( acc , curr ) =>
146+ acc ||
147+ ( '' + oldCols [ curr ] . data [ ni ] ) . toLocaleLowerCase ( ) . includes ( _search ) ,
148+ false
149+ )
150+ ) {
151+ continue
152+ }
153+
154+ keys . forEach ( k => ( newCols [ k ] . data [ newLen ] = oldCols [ k ] . data [ ni ] ) )
155+ newLen ++
156+ }
157+
158+ dupped . table . length = newLen
159+
160+ return dupped as FluxResult [ 'parsed' ]
161+ } , [ search , results ?. parsed ] )
162+
111163 const loadingText = useMemo ( ( ) => {
112164 if ( loading === RemoteDataState . Loading ) {
113165 return 'Loading'
@@ -182,8 +234,15 @@ const Table: FC<PipeProp> = ({Context}) => {
182234 return (
183235 < Context resizes controls = { caveat } >
184236 < div className = "flow-visualization" id = { id } >
185- < div className = "flow-visualization--view" >
237+ < div className = "flow-visualization--header" >
238+ < SearchWidget
239+ placeholderText = "Search results..."
240+ onSearch = { setSearch }
241+ searchTerm = { search }
242+ />
186243 < QueryStat />
244+ </ div >
245+ < div className = "flow-visualization--view" >
187246 < View
188247 loading = { loading }
189248 properties = {
@@ -192,7 +251,7 @@ const Table: FC<PipeProp> = ({Context}) => {
192251 showAll : false ,
193252 } as SimpleTableViewProperties
194253 }
195- result = { results . parsed }
254+ result = { res }
196255 timeRange = { range }
197256 />
198257 </ div >
0 commit comments