From 1ebf3dbf657f00e3dee4ef221e1087ef8b9a2233 Mon Sep 17 00:00:00 2001 From: Palash Date: Thu, 23 Jun 2022 19:11:19 +0530 Subject: [PATCH] feat: select tags key and value are updated to autocomplete filtering (#1267) * feat: select tags key and value are updated to autocomplete filtering Co-authored-by: Palash gupta --- .../Trace/Search/AllTags/Tag/TagKey.tsx | 23 ++++++++++---- .../Trace/Search/AllTags/Tag/TagValue.tsx | 31 ++++++++++++++----- .../Trace/Search/AllTags/Tag/styles.ts | 21 ++++++++++--- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/frontend/src/container/Trace/Search/AllTags/Tag/TagKey.tsx b/frontend/src/container/Trace/Search/AllTags/Tag/TagKey.tsx index b57b4fc361..bb9794d8e7 100644 --- a/frontend/src/container/Trace/Search/AllTags/Tag/TagKey.tsx +++ b/frontend/src/container/Trace/Search/AllTags/Tag/TagKey.tsx @@ -73,11 +73,24 @@ function TagsKey(props: TagsKeysProps): JSX.Element { { - if (options && options.find((option) => option.value === value)) { + allowClear + showSearch + options={options?.map((e) => ({ + label: e.label?.toString(), + value: e.value, + }))} + filterOption={(inputValue, option): boolean => + option?.label?.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1 + } + onChange={(e): void => setSelectedKey(e)} + onSelect={(value: unknown): void => { + if ( + typeof value === 'string' && + options && + options.find((option) => option.value === value) + ) { setSelectedKey(value); setLocalSelectedTags((tags) => [ @@ -89,8 +102,6 @@ function TagsKey(props: TagsKeysProps): JSX.Element { }, ...tags.slice(index + 1, tags.length), ]); - } else { - setSelectedKey(''); } }} > diff --git a/frontend/src/container/Trace/Search/AllTags/Tag/TagValue.tsx b/frontend/src/container/Trace/Search/AllTags/Tag/TagValue.tsx index 756bb54225..60b2d4118b 100644 --- a/frontend/src/container/Trace/Search/AllTags/Tag/TagValue.tsx +++ b/frontend/src/container/Trace/Search/AllTags/Tag/TagValue.tsx @@ -1,13 +1,13 @@ import { Select } from 'antd'; import getTagValue from 'api/trace/getTagValue'; -import React from 'react'; +import React, { useState } from 'react'; import { useQuery } from 'react-query'; import { useSelector } from 'react-redux'; import { AppState } from 'store/reducers'; import { GlobalReducer } from 'types/reducer/globalTime'; import { TraceReducer } from 'types/reducer/trace'; -import { SelectComponent } from './styles'; +import { AutoCompleteComponent } from './styles'; function TagValue(props: TagValueProps): JSX.Element { const { tag, setLocalSelectedTags, index, tagKey } = props; @@ -16,6 +16,7 @@ function TagValue(props: TagValueProps): JSX.Element { Operator: selectedOperator, Values: selectedValues, } = tag; + const [localValue, setLocalValue] = useState(selectedValues[0]); const globalReducer = useSelector( (state) => state.globalTime, @@ -34,22 +35,38 @@ function TagValue(props: TagValueProps): JSX.Element { ); return ( - ({ + label: e.tagValues, + value: e.tagValues, + }))} + allowClear + defaultOpen + showSearch + filterOption={(inputValue, option): boolean => + option?.label.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1 + } + disabled={isLoading} + value={localValue} + onChange={(values): void => { + if (typeof values === 'string') { + setLocalValue(values); + } + }} onSelect={(value: unknown): void => { if (typeof value === 'string') { + setLocalValue(value); setLocalSelectedTags((tags) => [ ...tags.slice(0, index), { Key: selectedKey, Operator: selectedOperator, - Values: [...selectedValues, value], + Values: [value], }, ...tags.slice(index + 1, tags.length), ]); } }} - loading={isLoading || false} > {data && data.payload && @@ -58,7 +75,7 @@ function TagValue(props: TagValueProps): JSX.Element { {suggestion.tagValues} ))} - + ); } diff --git a/frontend/src/container/Trace/Search/AllTags/Tag/styles.ts b/frontend/src/container/Trace/Search/AllTags/Tag/styles.ts index 347bc287f2..e604a444d7 100644 --- a/frontend/src/container/Trace/Search/AllTags/Tag/styles.ts +++ b/frontend/src/container/Trace/Search/AllTags/Tag/styles.ts @@ -1,4 +1,4 @@ -import { Select, Space } from 'antd'; +import { AutoComplete, Select, Space } from 'antd'; import styled from 'styled-components'; export const SpaceComponent = styled(Space)` @@ -9,18 +9,23 @@ export const SpaceComponent = styled(Space)` export const SelectComponent = styled(Select)` &&& { - min-width: 170px; - margin-right: 21.91px; - margin-left: 21.92px; + width: 100%; } `; -export const Container = styled.div` +export const Container = styled(Space)` &&& { display: flex; margin-top: 1rem; margin-bottom: 1rem; } + + .ant-space-item:not(:last-child, :nth-child(2)) { + width: 100%; + } + .ant-space-item:nth-child(2) { + width: 50%; + } `; export const IconContainer = styled.div` @@ -31,3 +36,9 @@ export const IconContainer = styled.div` margin-left: 1.125rem; `; + +export const AutoCompleteComponent = styled(AutoComplete)` + &&& { + width: 100%; + } +`;