11import React , { useState } from 'react' ;
22import { SelectableValue } from '@grafana/data' ;
3- import { Button , Input , MultiSelect , RadioButtonGroup , Select } from '@grafana/ui' ;
4- import { Filter , FilterOperator , FullField , NullFilter } from '../../types' ;
3+ import { Button , Input , MultiCombobox , RadioButtonGroup , Combobox , ComboboxOption } from '@grafana/ui' ;
4+ import { DateFilterWithValue , Filter , FilterOperator , FullField , NullFilter } from '../../types' ;
55import * as utils from './utils' ;
66import { selectors } from '../../selectors' ;
77import { styles } from '../../styles' ;
@@ -11,11 +11,11 @@ const boolValues: Array<SelectableValue<boolean>> = [
1111 { value : true , label : 'True' } ,
1212 { value : false , label : 'False' } ,
1313] ;
14- const conditions : Array < SelectableValue < 'AND' | 'OR' > > = [
14+ const conditions : Array < ComboboxOption < 'AND' | 'OR' > > = [
1515 { value : 'AND' , label : 'AND' } ,
1616 { value : 'OR' , label : 'OR' } ,
1717] ;
18- const filterOperators : Array < SelectableValue < FilterOperator > > = [
18+ const filterOperators : Array < ComboboxOption < FilterOperator > > = [
1919 { value : FilterOperator . Equals , label : '=' } ,
2020 { value : FilterOperator . NotEquals , label : '!=' } ,
2121 { value : FilterOperator . LessThan , label : '<' } ,
@@ -37,7 +37,7 @@ const filterOperators: Array<SelectableValue<FilterOperator>> = [
3737 { value : FilterOperator . WithInGrafanaTimeRange , label : 'WITHIN DASHBOARD TIME RANGE' } ,
3838 { value : FilterOperator . OutsideGrafanaTimeRange , label : 'OUTSIDE DASHBOARD TIME RANGE' } ,
3939] ;
40- const standardTimeOptions : Array < SelectableValue < string > > = [
40+ const standardTimeOptions : Array < ComboboxOption < string > > = [
4141 { value : "date_trunc('day', now())" , label : 'TODAY' } ,
4242 { value : "date_trunc('day', dateadd('d', -1, now()))" , label : 'YESTERDAY' } ,
4343 { value : 'now()' , label : 'NOW' } ,
@@ -117,7 +117,7 @@ export const FilterValueEditor = (props: {
117117 if ( filter . type === 'picklist' ) {
118118 return (
119119 < div data-testid = "query-builder-filters-multi-picklist-value-container" >
120- < MultiSelect
120+ < MultiCombobox
121121 value = { filter . value }
122122 options = { getOptions ( ) }
123123 onChange = { ( e ) => onMultiFilterValueChange ( e . map ( ( v ) => v . value ! ) ) }
@@ -139,15 +139,15 @@ export const FilterValueEditor = (props: {
139139 return < FilterValueNumberItem value = { filter . value } onChange = { ( value ) => onFilterChange ( { ...filter , value } ) } /> ;
140140 } else if ( utils . isDateFilter ( filter ) ) {
141141 const onDateFilterValueChange = ( value : string ) => {
142- onFilterChange ( { ...filter , value } ) ;
142+ onFilterChange ( { ...filter , value } as DateFilterWithValue ) ;
143143 } ;
144144 //
145145 return utils . isDateFilterWithOutValue ( filter ) ? null : (
146146 < div data-testid = "query-builder-filters-date-value-container" >
147- < Select
147+ < Combobox
148148 value = { filter . value }
149- onChange = { ( e ) => onDateFilterValueChange ( e . value ! ) }
150- allowCustomValue = { true }
149+ onChange = { ( e ) => onDateFilterValueChange ( e . value ) }
150+ createCustomValue = { true }
151151 options = { [ ...standardTimeOptions ] }
152152 />
153153 </ div >
@@ -162,7 +162,7 @@ export const FilterValueEditor = (props: {
162162 ) {
163163 return (
164164 < div data-testid = "query-builder-filters-single-picklist-value-container" >
165- < Select value = { filter . value } onChange = { ( e ) => onStringFilterValueChange ( e . value ! ) } options = { getOptions ( ) } />
165+ < Combobox value = { filter . value } onChange = { ( e ) => onStringFilterValueChange ( e . value ! ) } options = { getOptions ( ) } />
166166 </ div >
167167 ) ;
168168 }
@@ -185,7 +185,6 @@ export const FilterEditor = (props: {
185185 onFilterChange : ( index : number , filter : Filter ) => void ;
186186} ) => {
187187 const { index, filter, fieldsList, onFilterChange } = props ;
188- const [ isOpen , setIsOpen ] = useState ( false ) ;
189188 const getFields = ( ) => {
190189 const values = ( filter . restrictToFields || fieldsList ) . map ( ( f ) => {
191190 return { label : f . label , value : f . name } ;
@@ -197,7 +196,7 @@ export const FilterEditor = (props: {
197196 return values ;
198197 } ;
199198
200- const getFilterOperatorsByType = ( type = 'string' ) : Array < SelectableValue < FilterOperator > > => {
199+ const getFilterOperatorsByType = ( type = 'string' ) : Array < ComboboxOption < FilterOperator > > => {
201200 if ( utils . isBooleanType ( type ) ) {
202201 return filterOperators . filter ( ( f ) => [ FilterOperator . Equals , FilterOperator . NotEquals ] . includes ( f . value ! ) ) ;
203202 } else if ( utils . isGeoHashType ( type ) ) {
@@ -284,7 +283,6 @@ export const FilterEditor = (props: {
284283 }
285284 } ;
286285 const onFilterNameChange = ( fieldName : string ) => {
287- setIsOpen ( false ) ;
288286 const matchingField = fieldsList . find ( ( f ) => f . name === fieldName ) ;
289287 let filterData : { key : string ; type : string } | null = null ;
290288
@@ -346,6 +344,14 @@ export const FilterEditor = (props: {
346344 if ( ! Array . isArray ( newFilter . value ) ) {
347345 newFilter . value = [ newFilter . value || '' ] ;
348346 }
347+ } else {
348+ if ( 'value' in newFilter && Array . isArray ( newFilter . value ) ) {
349+ if ( utils . isDateType ( newFilter . type ) ) {
350+ newFilter . value = '' ;
351+ } else {
352+ newFilter . value = newFilter . value [ 0 ] || '' ;
353+ }
354+ }
349355 }
350356 onFilterChange ( index , newFilter ) ;
351357 } ;
@@ -362,17 +368,14 @@ export const FilterEditor = (props: {
362368 { index !== 0 && (
363369 < RadioButtonGroup options = { conditions } value = { filter . condition } onChange = { ( e ) => onFilterConditionChange ( e ! ) } />
364370 ) }
365- < Select
371+ < Combobox
366372 value = { filter . key }
367373 width = { 30 }
368374 options = { getFields ( ) }
369- isOpen = { isOpen }
370- onOpenMenu = { ( ) => setIsOpen ( true ) }
371- onCloseMenu = { ( ) => setIsOpen ( false ) }
372375 onChange = { ( e ) => onFilterNameChange ( e . value ! ) }
373- allowCustomValue = { true }
376+ createCustomValue = { true }
374377 />
375- < Select
378+ < Combobox
376379 value = { filter . operator }
377380 width = { 30 }
378381 options = { getFilterOperatorsByType ( filter . type ) }
0 commit comments