diff --git a/lib/api/resources.ts b/lib/api/resources.ts index ff81e0758a..7cd11f57e3 100644 --- a/lib/api/resources.ts +++ b/lib/api/resources.ts @@ -903,6 +903,9 @@ export const RESOURCES = { path: '/api/v2/advanced-filters/methods', filterFields: [ 'q' as const ], }, + advanced_filter_csv: { + path: '/api/v2/advanced-filters/csv', + }, // CONFIGS config_backend_version: { diff --git a/theme/components/Tag/Tag.ts b/theme/components/Tag/Tag.ts index 6ea4c41d10..7b9d4d683a 100644 --- a/theme/components/Tag/Tag.ts +++ b/theme/components/Tag/Tag.ts @@ -21,6 +21,7 @@ const variants = { container: { bg: mode('gray.100', 'gray.800')(props), color: mode('gray.500', 'whiteAlpha.800')(props), + cursor: 'pointer', _hover: { color: 'blue.400', opacity: 0.76, diff --git a/types/api/advancedFilter.ts b/types/api/advancedFilter.ts index d6ace508c9..7a135914c4 100644 --- a/types/api/advancedFilter.ts +++ b/types/api/advancedFilter.ts @@ -7,7 +7,7 @@ export type AdvancedFilterParams = { methods_names?: Array; /* frontend only */ age_from?: string; age_to?: string; - age?: AdvancedFilterAge; /* frontend only */ + age?: AdvancedFilterAge | ''; /* frontend only */ from_address_hashes_to_include?: Array; from_address_hashes_to_exclude?: Array; to_address_hashes_to_include?: Array; diff --git a/ui/advancedFilter/ColumnFilter.tsx b/ui/advancedFilter/ColumnFilter.tsx index eba49e0774..25671ce264 100644 --- a/ui/advancedFilter/ColumnFilter.tsx +++ b/ui/advancedFilter/ColumnFilter.tsx @@ -53,8 +53,7 @@ const ColumnFilterContent = ({ title, isFilled, onFilter, onReset, onClose, chil { children } - + { TABLE_COLUMNS.map(col => ( { col.name } diff --git a/ui/advancedFilter/FilterByColumn.tsx b/ui/advancedFilter/FilterByColumn.tsx index 9d45eeed65..03adf2d88b 100644 --- a/ui/advancedFilter/FilterByColumn.tsx +++ b/ui/advancedFilter/FilterByColumn.tsx @@ -54,7 +54,7 @@ const FilterByColumn = ({ column, filters, columnName, handleFilterChange, searc ); } case 'age': { - const value = { age: filters.age, from: filters.age_from, to: filters.age_to }; + const value = { age: filters.age || '' as const, from: filters.age_from || '', to: filters.age_to || '' }; return ( diff --git a/ui/advancedFilter/ItemByColumn.tsx b/ui/advancedFilter/ItemByColumn.tsx index 10b5445c69..a22da06ddc 100644 --- a/ui/advancedFilter/ItemByColumn.tsx +++ b/ui/advancedFilter/ItemByColumn.tsx @@ -39,14 +39,17 @@ const ItemByColumn = ({ item, column, isLoading }: Props) => { return ( - ); case 'to': return ; + case 'or_and': + return ( + + ); case 'amount': { if (item.token?.type === 'ERC-721') { return 1; diff --git a/ui/advancedFilter/filters/AddressFilter.tsx b/ui/advancedFilter/filters/AddressFilter.tsx index ad5ab0367b..5cc6d04754 100644 --- a/ui/advancedFilter/filters/AddressFilter.tsx +++ b/ui/advancedFilter/filters/AddressFilter.tsx @@ -1,4 +1,5 @@ import { Flex, Select, Input, InputGroup, InputRightElement, VStack, IconButton } from '@chakra-ui/react'; +import isEqual from 'lodash/isEqual'; import type { ChangeEvent } from 'react'; import React from 'react'; @@ -75,14 +76,14 @@ const AddressFilterInput = ({ address, mode, onModeChange, onChange, onClear, is const emptyItem = { address: '', mode: 'include' as AddressFilterMode }; -const AddressFilter = ({ type, value, handleFilterChange, onClose }: Props) => { +const AddressFilter = ({ type, value = [], handleFilterChange, onClose }: Props) => { const [ currentValue, setCurrentValue ] = - React.useState>([ ...value, emptyItem ] || [ emptyItem ]); + React.useState>([ ...value, emptyItem ]); const handleModeSelectChange = React.useCallback((index: number) => (event: React.ChangeEvent) => { const value = event.target.value as AddressFilterMode; setCurrentValue(prev => { - prev[index].mode = value; + prev[index] = { ...prev[index], mode: value }; return [ ...prev ]; }); }, []); @@ -114,8 +115,8 @@ const AddressFilter = ({ type, value, handleFilterChange, onClose }: Props) => { const onFilter = React.useCallback(() => { const includeFilterParam = type === 'from' ? FILTER_PARAM_FROM_INCLUDE : FILTER_PARAM_TO_INCLUDE; const excludeFilterParam = type === 'from' ? FILTER_PARAM_FROM_EXCLUDE : FILTER_PARAM_TO_EXCLUDE; - const includeValue = currentValue.filter(i => i.mode === 'include').map(i => i.address); - const excludeValue = currentValue.filter(i => i.mode === 'exclude').map(i => i.address); + const includeValue = currentValue.filter(i => i.mode === 'include').map(i => i.address).filter(Boolean); + const excludeValue = currentValue.filter(i => i.mode === 'exclude').map(i => i.address).filter(Boolean); handleFilterChange(includeFilterParam, includeValue.length ? includeValue : undefined); handleFilterChange(excludeFilterParam, excludeValue.length ? excludeValue : undefined); @@ -125,6 +126,7 @@ const AddressFilter = ({ type, value, handleFilterChange, onClose }: Props) => { i.address).map(i => JSON.stringify(i)).sort(), value.map(i => JSON.stringify(i)).sort()) } onFilter={ onFilter } onReset={ onReset } onClose={ onClose } diff --git a/ui/advancedFilter/filters/AgeFilter.tsx b/ui/advancedFilter/filters/AgeFilter.tsx index e35b03d8a3..c9f9abae20 100644 --- a/ui/advancedFilter/filters/AgeFilter.tsx +++ b/ui/advancedFilter/filters/AgeFilter.tsx @@ -1,4 +1,5 @@ import { Flex, Input, Tag, Text } from '@chakra-ui/react'; +import isEqual from 'lodash/isEqual'; import type { ChangeEvent } from 'react'; import React from 'react'; @@ -14,8 +15,8 @@ const FILTER_PARAM_FROM = 'age_from'; const FILTER_PARAM_TO = 'age_to'; const FILTER_PARAM_AGE = 'age'; -const defaultValue = { age: undefined, from: '', to: '' }; -type AgeFromToValue = { age?: AdvancedFilterAge; from?: string; to?: string } +const defaultValue = { age: '', from: '', to: '' } as const; +type AgeFromToValue = { age: AdvancedFilterAge | ''; from: string; to: string } type Props = { value?: AgeFromToValue; @@ -25,25 +26,36 @@ type Props = { onClose?: () => void; } -const AgeFilter = ({ value = {}, handleFilterChange, onClose }: Props) => { - const [ currentValue, setCurrentValue ] = React.useState(value || defaultValue); +const AgeFilter = ({ value = defaultValue, handleFilterChange, onClose }: Props) => { + const [ currentValue, setCurrentValue ] = React.useState(value); const handleFromChange = React.useCallback((event: ChangeEvent) => { - setCurrentValue(prev => ({ to: prev.to, from: event.target.value })); + setCurrentValue(prev => ({ age: '', to: prev.to, from: event.target.value })); }, []); const handleToChange = React.useCallback((event: ChangeEvent) => { - setCurrentValue(prev => ({ from: prev.from, to: event.target.value })); + setCurrentValue(prev => ({ age: '', from: prev.from, to: event.target.value })); }, []); const onPresetClick = React.useCallback((event: React.SyntheticEvent) => { const age = (event.currentTarget as HTMLDivElement).getAttribute('data-id') as AdvancedFilterAge; - setCurrentValue({ age }); - }, []); + const from = dayjs((dayjs().valueOf() - getDurationFromAge(age))).toISOString(); + handleFilterChange(FILTER_PARAM_FROM, from); + const to = dayjs().toISOString(); + handleFilterChange(FILTER_PARAM_TO, to); + handleFilterChange(FILTER_PARAM_AGE, age); + onClose && onClose(); + }, [ onClose, handleFilterChange ]); const onReset = React.useCallback(() => setCurrentValue(defaultValue), []); const onFilter = React.useCallback(() => { + if (!currentValue.age && !currentValue.to && !currentValue.from) { + handleFilterChange(FILTER_PARAM_FROM, undefined); + handleFilterChange(FILTER_PARAM_TO, undefined); + handleFilterChange(FILTER_PARAM_AGE, undefined); + return; + } const from = currentValue.age ? dayjs((dayjs().valueOf() - getDurationFromAge(currentValue.age))).toISOString() : dayjs(currentValue.from).startOf('day').toISOString(); @@ -57,6 +69,7 @@ const AgeFilter = ({ value = {}, handleFilterChange, onClose }: Props) => { { key={ val } data-id={ val } onClick={ onPresetClick } - colorScheme={ currentValue.age === val ? 'blue' : 'gray-blue' } - _hover={{ opacity: 0.76 }} - cursor="pointer" + variant="select" > { val } )) } - + { ndash } - + ); diff --git a/ui/advancedFilter/filters/AmountFilter.tsx b/ui/advancedFilter/filters/AmountFilter.tsx index bc4ca96e12..7f79a0ee05 100644 --- a/ui/advancedFilter/filters/AmountFilter.tsx +++ b/ui/advancedFilter/filters/AmountFilter.tsx @@ -1,4 +1,5 @@ import { Flex, Input, Tag, Text } from '@chakra-ui/react'; +import isEqual from 'lodash/isEqual'; import type { ChangeEvent } from 'react'; import React from 'react'; @@ -66,13 +67,16 @@ const AmountFilter = ({ value = {}, handleFilterChange, onClose }: Props) => { const onPresetClick = React.useCallback((event: React.SyntheticEvent) => { const to = (event.currentTarget as HTMLDivElement).getAttribute('data-id') as string; - setCurrentValue({ from: '', to }); - }, []); + handleFilterChange(FILTER_PARAM_FROM, ''); + handleFilterChange(FILTER_PARAM_TO, to); + onClose && onClose(); + }, [ handleFilterChange, onClose ]); return ( { key={ preset.value } data-id={ preset.value } onClick={ onPresetClick } - // color="link" - // colorScheme="gray-blue" - colorScheme={ (!currentValue.from || currentValue.from === '0') && currentValue.to === preset.value ? 'blue' : 'gray-blue' } - // isActive={ (!currentValue.from || currentValue.from === '0') && currentValue.to === preset.value } - _hover={{ opacity: 0.76 }} - cursor="pointer" + variant="select" > { preset.name } diff --git a/ui/advancedFilter/filters/AssetFilter.tsx b/ui/advancedFilter/filters/AssetFilter.tsx index 1ef255c4bd..ab0b875317 100644 --- a/ui/advancedFilter/filters/AssetFilter.tsx +++ b/ui/advancedFilter/filters/AssetFilter.tsx @@ -1,4 +1,5 @@ import { Flex, Checkbox, CheckboxGroup, Text, Spinner, Select } from '@chakra-ui/react'; +import isEqual from 'lodash/isEqual'; import React from 'react'; import type { AdvancedFilterParams } from 'types/api/advancedFilter'; @@ -7,7 +8,7 @@ import type { TokenInfo } from 'types/api/token'; import useApiQuery from 'lib/api/useApiQuery'; import Tag from 'ui/shared/chakra/Tag'; import ClearButton from 'ui/shared/ClearButton'; -import TokenEntity from 'ui/shared/entities/token/TokenEntity'; +import * as TokenEntity from 'ui/shared/entities/token/TokenEntity'; import FilterInput from 'ui/shared/filters/FilterInput'; import TableColumnFilter from 'ui/shared/filters/TableColumnFilter'; @@ -31,8 +32,8 @@ type Props = { onClose?: () => void; } -const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { - const [ currentValue, setCurrentValue ] = React.useState(value || []); +const AssetFilter = ({ value = [], handleFilterChange, onClose }: Props) => { + const [ currentValue, setCurrentValue ] = React.useState([ ...value ]); const [ searchTerm, setSearchTerm ] = React.useState(''); const onSearchChange = React.useCallback((value: string) => { @@ -42,7 +43,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { const handleModeSelectChange = React.useCallback((index: number) => (event: React.ChangeEvent) => { const value = event.target.value as AssetFilterMode; setCurrentValue(prev => { - prev[index].mode = value; + prev[index] = { ...prev[index], mode: value }; return [ ...prev ]; }); }, []); @@ -80,6 +81,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { JSON.stringify(i)).sort(), value.map(i => JSON.stringify(i)).sort()) } onFilter={ onFilter } onReset={ onReset } onClose={ onClose } @@ -92,7 +94,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { initialValue={ searchTerm } /> { !searchTerm && currentValue.map((item, index) => ( - + - + )) } @@ -113,17 +115,18 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { { tokensQuery.data && !searchTerm && ( <> Popular - + { [ NATIVE_TOKEN, ...tokensQuery.data.items ].map(token => ( - { token.symbol || token.name || token.address } + + + { token.symbol || token.name || token.address } + )) } @@ -131,7 +134,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { ) } { searchTerm && tokensQuery.data && !tokensQuery.data?.items.length && No tokens found } { searchTerm && tokensQuery.data && Boolean(tokensQuery.data?.items.length) && ( - + i.token.address) }> { tokensQuery.data.items.map(token => ( @@ -141,6 +144,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { onChange={ onTokenClick(token) } overflow="hidden" w="100%" + pl={ 1 } sx={{ '.chakra-checkbox__label': { overflow: 'hidden', @@ -150,7 +154,7 @@ const AssetFilter = ({ value, handleFilterChange, onClose }: Props) => { }, }} > - + )) } diff --git a/ui/advancedFilter/filters/MethodFilter.tsx b/ui/advancedFilter/filters/MethodFilter.tsx index c6bc4f066f..871365b02b 100644 --- a/ui/advancedFilter/filters/MethodFilter.tsx +++ b/ui/advancedFilter/filters/MethodFilter.tsx @@ -1,6 +1,6 @@ import { Flex, Checkbox, CheckboxGroup, Spinner, chakra } from '@chakra-ui/react'; import differenceBy from 'lodash/differenceBy'; -import without from 'lodash/without'; +import isEqual from 'lodash/isEqual'; import type { ChangeEvent } from 'react'; import React from 'react'; @@ -23,7 +23,7 @@ type Props = { } const MethodFilter = ({ value = [], handleFilterChange, onClose }: Props) => { - const [ currentValue, setCurrentValue ] = React.useState>(value); + const [ currentValue, setCurrentValue ] = React.useState>([ ...value ]); const [ searchTerm, setSearchTerm ] = React.useState(''); const [ methodsList, setMethodsList ] = React.useState>([]); @@ -35,9 +35,10 @@ const MethodFilter = ({ value = [], handleFilterChange, onClose }: Props) => { queryParams: { q: searchTerm }, queryOptions: { refetchOnMount: false }, }); + React.useEffect(() => { if (!methodsList.length && methodsQuery.data) { - setMethodsList([ ...differenceBy(value, methodsQuery.data, i => i.method_id), ...methodsQuery.data ]); + setMethodsList([ ...value, ...differenceBy(methodsQuery.data, value, i => i.method_id) ]); } }, [ methodsQuery.data, value, methodsList ]); @@ -51,9 +52,10 @@ const MethodFilter = ({ value = [], handleFilterChange, onClose }: Props) => { const methodInfo = methodsQuery.data?.find(m => m.method_id === id); if (methodInfo) { setCurrentValue(prev => { - return checked ? [ ...prev, methodInfo ] : without(prev, methodInfo); + return checked ? [ ...prev, methodInfo ] : prev.filter(i => i.method_id !== id); }); - searchTerm && checked && setMethodsList(prev => [ methodInfo, ...(prev || []) ]); + searchTerm && checked && + setMethodsList(prev => [ methodInfo, ...(prev.filter(m => m.method_id !== id) || []) ]); } } }, [ methodsQuery.data, searchTerm ]); @@ -69,6 +71,7 @@ const MethodFilter = ({ value = [], handleFilterChange, onClose }: Props) => { JSON.stringify(i)).sort(), value.map(i => JSON.stringify(i)).sort()) } onFilter={ onFilter } onReset={ onReset } onClose={ onClose } @@ -84,29 +87,32 @@ const MethodFilter = ({ value = [], handleFilterChange, onClose }: Props) => { { methodsQuery.isError && Something went wrong. Please try again. } { Boolean(searchTerm) && methodsQuery.data?.length === 0 && No results found. } { methodsQuery.data && ( - + // added negative margin because of checkbox focus styles & overflow hidden + i.method_id) : [ 'all' ] }> { (searchTerm ? methodsQuery.data : (methodsList || [])).map(method => ( - - + + { method.name || method.method_id } - - - { method.method_id } - - + + { method.method_id } + + + )) } diff --git a/ui/advancedFilter/filters/TypeFilter.tsx b/ui/advancedFilter/filters/TypeFilter.tsx index 84461d1e9e..0ff5f6722a 100644 --- a/ui/advancedFilter/filters/TypeFilter.tsx +++ b/ui/advancedFilter/filters/TypeFilter.tsx @@ -1,4 +1,5 @@ import { Flex, Checkbox, CheckboxGroup } from '@chakra-ui/react'; +import isEqual from 'lodash/isEqual'; import without from 'lodash/without'; import type { ChangeEvent } from 'react'; import React from 'react'; @@ -20,7 +21,7 @@ type Props = { } const TypeFilter = ({ value = [], handleFilterChange, onClose }: Props) => { - const [ currentValue, setCurrentValue ] = React.useState>(value); + const [ currentValue, setCurrentValue ] = React.useState>([ ...value ]); const handleChange = React.useCallback((event: ChangeEvent) => { const checked = event.target.checked; @@ -41,7 +42,8 @@ const TypeFilter = ({ value = [], handleFilterChange, onClose }: Props) => { return ( 0 } + isTouched={ !isEqual(currentValue.sort(), value.sort()) } onFilter={ onFilter } onReset={ onReset } onClose={ onClose } diff --git a/ui/pages/AdvancedFilter.tsx b/ui/pages/AdvancedFilter.tsx index 4e689062f5..d5769a0561 100644 --- a/ui/pages/AdvancedFilter.tsx +++ b/ui/pages/AdvancedFilter.tsx @@ -1,17 +1,38 @@ -import { Table, Tbody, Tr, Th, Td, Thead, Box, Text, Tag, TagCloseButton, chakra, Flex, TagLabel, HStack, Link } from '@chakra-ui/react'; +import { + Table, + Tbody, + Tr, + Th, + Td, + Thead, + Box, + Text, + Tag, + TagCloseButton, + chakra, + Flex, + TagLabel, + HStack, + Link, + // Alert, + // Spinner +} from '@chakra-ui/react'; import omit from 'lodash/omit'; import { useRouter } from 'next/router'; import React from 'react'; +// import ReCaptcha from 'react-google-recaptcha'; import type { AdvancedFilterParams } from 'types/api/advancedFilter'; import { ADVANCED_FILTER_TYPES, ADVANCED_FILTER_AGES } from 'types/api/advancedFilter'; +// import useApiFetch from 'lib/api/useApiFetch'; import useApiQuery from 'lib/api/useApiQuery'; import { AddressHighlightProvider } from 'lib/contexts/addressHighlight'; import dayjs from 'lib/date/dayjs'; import getFilterValueFromQuery from 'lib/getFilterValueFromQuery'; import getFilterValuesFromQuery from 'lib/getFilterValuesFromQuery'; import getValuesArrayFromQuery from 'lib/getValuesArrayFromQuery'; +// import useToast from 'lib/hooks/useToast'; import getQueryParamString from 'lib/router/getQueryParamString'; import { ADVANCED_FILTER_ITEM } from 'stubs/advancedFilter'; import { generateListStub } from 'stubs/utils'; @@ -25,6 +46,7 @@ import IconSvg from 'ui/shared/IconSvg'; import PageTitle from 'ui/shared/Page/PageTitle'; import Pagination from 'ui/shared/pagination/Pagination'; import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages'; +// import config from 'configs/app'; export type ColumnsIds = 'tx_hash' | 'type' | 'method' | 'age' | 'from' | 'or_and' | 'to' | 'amount' | 'asset' | 'fee'; @@ -58,7 +80,12 @@ export const TABLE_COLUMNS: Array = [ { id: 'from', name: 'From', - width: '190px', + width: '160px', + }, + { + id: 'or_and', + name: '', + width: '60px', }, { id: 'to', @@ -88,6 +115,9 @@ TABLE_COLUMNS.forEach(c => COLUMNS_CHECKED[c.id] = true); const AdvancedFilter = () => { const router = useRouter(); + // const apiFetch = useApiFetch(); + // const toast = useToast(); + const [ filters, setFilters ] = React.useState(() => { const age = getFilterValueFromQuery(ADVANCED_FILTER_AGES, router.query.age); return { @@ -139,6 +169,32 @@ const AdvancedFilter = () => { useApiQuery('tokens', { queryParams: { limit: '7', q: '' }, queryOptions: { refetchOnMount: false } }); useApiQuery('advanced_filter_methods', { queryParams: { q: '' }, queryOptions: { refetchOnMount: false } }); + // const downloadCSV = React.useCallback((reCaptchaToken: string) => { + // apiFetch<'advanced_filter_csv', unknown, unknown>('advanced_filter_csv', { + // queryParams: { recaptcha_response: reCaptchaToken }, + // }) + // .then(() => { + // toast({ + // title: 'Please wait', + // description: 'Download will start when data is ready', + // status: 'warning', + // }); + // }) + // .catch(() => { + // toast({ + // title: 'Error', + // description: 'Unable to download CSV', + // status: 'warning', + // }); + // }); + // }, [ apiFetch, toast ]); + + // const handleReCaptchaChange = React.useCallback((token: string | null) => { + // if (token) { + // downloadCSV(token); + // } + // }, [ downloadCSV ]); + const handleFilterChange = React.useCallback((field: keyof AdvancedFilterParams, val: unknown) => { setFilters(prevState => { const newState = { ...prevState }; @@ -199,7 +255,7 @@ const AdvancedFilter = () => { wordBreak="break-word" whiteSpace="normal" > - { column.name } + { Boolean(column.name) && { column.name } } { searchParams={ data?.search_params } isLoading={ isPlaceholderData } /> - { column.id === 'from' && ( - <> - OR/AND - - - ) } ); }) } @@ -239,6 +282,7 @@ const AdvancedFilter = () => { wordBreak="break-word" whiteSpace="nowrap" overflow="hidden" + textAlign={ column.id === 'or_and' ? 'center' : 'start' } > @@ -254,6 +298,13 @@ const AdvancedFilter = () => { const actionBar = ( + { /* { config.services.reCaptcha.siteKey && ( + + ) } */ } ); @@ -267,7 +318,7 @@ const AdvancedFilter = () => { Filtered by: { filterTags.length !== 0 && ( - + Reset filters diff --git a/ui/shared/filters/TableColumnFilter.tsx b/ui/shared/filters/TableColumnFilter.tsx index 5b56fec7fd..3a98b2f667 100644 --- a/ui/shared/filters/TableColumnFilter.tsx +++ b/ui/shared/filters/TableColumnFilter.tsx @@ -10,6 +10,7 @@ import React from 'react'; type Props = { title: string; isFilled?: boolean; + isTouched?: boolean; hasReset?: boolean; onFilter: () => void; onReset?: () => void; @@ -17,7 +18,7 @@ type Props = { children: React.ReactNode; } -const TableColumnFilter = ({ title, isFilled, hasReset, onFilter, onReset, onClose, children }: Props) => { +const TableColumnFilter = ({ title, isFilled, isTouched, hasReset, onFilter, onReset, onClose, children }: Props) => { const onFilterClick = React.useCallback(() => { onClose && onClose(); onFilter(); @@ -41,7 +42,7 @@ const TableColumnFilter = ({ title, isFilled, hasReset, onFilter, onReset, onClo { children } diff --git a/ui/shared/tagGroupSelect/TagGroupSelect.tsx b/ui/shared/tagGroupSelect/TagGroupSelect.tsx index 4bf53b2ce1..d012abf185 100644 --- a/ui/shared/tagGroupSelect/TagGroupSelect.tsx +++ b/ui/shared/tagGroupSelect/TagGroupSelect.tsx @@ -42,7 +42,6 @@ const TagGroupSelect = ({ items, value, isMulti, onChange }: P data-id={ item.id } data-selected={ isSelected } fontWeight={ 500 } - cursor="pointer" onClick={ onItemClick } > { item.title }