diff --git a/packages/components/src/components/data-table/_data-table-action.scss b/packages/components/src/components/data-table/_data-table-action.scss index ac7fced063d3..0b71c9637a9c 100644 --- a/packages/components/src/components/data-table/_data-table-action.scss +++ b/packages/components/src/components/data-table/_data-table-action.scss @@ -230,6 +230,11 @@ .#{$prefix}--toolbar-action:focus:not([disabled]), .#{$prefix}--toolbar-action:active:not([disabled]) { @include focus-outline('outline'); + + &.#{$prefix}--toolbar-search-container-expandable { + // The focus style is handled by search input in it, need to avoid duplicate animation + outline: none; + } } .#{$prefix}--toolbar-action ~ .#{$prefix}--btn { diff --git a/packages/react/src/components/DataTable/TableToolbarSearch.js b/packages/react/src/components/DataTable/TableToolbarSearch.js index 8cc263c0f248..18d1c892262c 100644 --- a/packages/react/src/components/DataTable/TableToolbarSearch.js +++ b/packages/react/src/components/DataTable/TableToolbarSearch.js @@ -7,7 +7,7 @@ import cx from 'classnames'; import PropTypes from 'prop-types'; -import React, { useRef, useState, useEffect } from 'react'; +import React, { useMemo, useRef, useState, useEffect } from 'react'; import { settings } from 'carbon-components'; import Search from '../Search'; import setupGetInstanceId from './tools/instanceId'; @@ -34,7 +34,7 @@ const TableToolbarSearch = ({ onExpand, persistent, persistant, - id = `data-table-search-${getInstanceId()}`, + id, ...rest }) => { const { current: controlled } = useRef(expandedProp !== undefined); @@ -42,12 +42,13 @@ const TableToolbarSearch = ({ const expanded = controlled ? expandedProp : expandedState; const searchRef = useRef(null); const [value, setValue] = useState(''); + const uniqueId = useMemo(getInstanceId, []); useEffect(() => { - if (searchRef.current) { + if (!controlled && expandedState && searchRef.current) { searchRef.current.querySelector('input').focus(); } - }); + }, [controlled, expandedState]); const searchContainerClasses = cx({ [searchContainerClass]: searchContainerClass, @@ -77,7 +78,7 @@ const TableToolbarSearch = ({ return (
handleExpand(event, true)} @@ -89,7 +90,7 @@ const TableToolbarSearch = ({ small className={className} value={value} - id={id} + id={typeof id !== 'undefined' ? id : uniqueId} aria-hidden={!expanded} labelText={labelText || t('carbon.table.toolbar.search.label')} placeHolderText={