diff --git a/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx b/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx index c7a8949107..1e6ce5722c 100644 --- a/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx +++ b/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx @@ -13,6 +13,8 @@ import throttle from 'lodash/throttle'; import { useRecoilValue } from 'recoil'; import { extractSchemaProperties, groupTriggersByPropertyReference, NoGroupingTriggerGroupName } from '@bfc/indexers'; import isEqual from 'lodash/isEqual'; +import { Announced } from 'office-ui-fabric-react/lib/Announced'; +import { useId } from '@uifabric/react-hooks'; import { dispatcherState, @@ -175,6 +177,8 @@ export const ProjectTree: React.FC = ({ const projectCollection: TreeDataPerProject[] = useRecoilValue(projectTreeSelectorFamily); const jsonSchemaFilesByProjectId = useRecoilValue(jsonSchemaFilesByProjectIdSelector); + const projectTreeNavLabelId = useId('project-tree-nav-label'); + // TODO Refactor to make sure tree is not generated until a new trigger/dialog is added. #5462 const createSubtree = useCallback(() => { return projectCollection.map(createBotSubtree); @@ -773,24 +777,30 @@ export const ProjectTree: React.FC = ({ return (
-
= ({ 0 {} other {Press down arrow key to navigate the search results} }`, - { dialogNum: projectCollection.length } + { dialogNum: projectCollection.length, filter: filter, hasFilter: !!filter } )} - aria-live={'polite'} />
{projectTree}
diff --git a/Composer/packages/client/src/components/ProjectTree/ProjectTreeHeader.tsx b/Composer/packages/client/src/components/ProjectTree/ProjectTreeHeader.tsx index 05785b0767..70ac44ec9d 100644 --- a/Composer/packages/client/src/components/ProjectTree/ProjectTreeHeader.tsx +++ b/Composer/packages/client/src/components/ProjectTree/ProjectTreeHeader.tsx @@ -60,10 +60,12 @@ export interface ProjectTreeHeaderProps { placeholder?: string; ariaLabel?: string; onFilter?: (newValue?: string) => void; + filterValue: string; } export const ProjectTreeHeader: React.FC = ({ menu, + filterValue, onFilter = () => {}, placeholder = '', ariaLabel = '', @@ -94,8 +96,10 @@ export const ProjectTreeHeader: React.FC = ({ }) as IOverflowSetItemProps[]; const handleSearchBoxBlur = () => { - onFilter(''); - setShowFilter(false); + if (!filterValue) { + onFilter(''); + setShowFilter(false); + } }; // Move focus back to the filter button after the filter search box gets closed @@ -141,11 +145,7 @@ export const ProjectTreeHeader: React.FC = ({ styles={searchBox} onBlur={handleSearchBoxBlur} onChange={(_e, value) => onFilter(value)} - onClear={(ev) => { - if (!ev.target.value) { - handleSearchBoxBlur(); - } - }} + onClear={handleSearchBoxBlur} /> ) : (