import React from 'react';
import intl from 'react-intl-universal';
import classNames from 'classnames';
import { isUndefined } from 'lodash';
import {
Overlay,
InputGroup,
Tag,
MenuItem,
Spinner,
Intent,
} from '@blueprintjs/core';
import { QueryList } from '@blueprintjs/select';
import { CLASSES } from 'common/classes';
import { Icon, If, ListSelect, FormattedMessage as T } from 'components';
import {
UniversalSearchProvider,
useUniversalSearchContext,
} from './UniversalSearchProvider';
import { filterItemsByResourceType } from './utils';
import { RESOURCES_TYPES } from '../../common/resourcesTypes';
/**
* Universal search input action.
*/
function UniversalSearchInputRightElements({ onSearchTypeChange }) {
const { isLoading, searchType, defaultSearchResource, searchTypeOptions } =
useUniversalSearchContext();
// Handle search type option change.
const handleSearchTypeChange = (option) => {
onSearchTypeChange && onSearchTypeChange(option);
};
return (
);
}
/**
* Universal search query list.
*/
function UniversalSearchQueryList(props) {
const { isOpen, isLoading, onSearchTypeChange, searchType, ...restProps } =
props;
return (
(
)}
noResults={
!isLoading ? (
} />
) : (
}
/>
)
}
/>
);
}
/**
* Universal query search actions.
*/
function UniversalQuerySearchActions() {
return (
ENTER
{intl.get('universal_search.enter_text')}
ESC{' '}
{intl.get('universal_search.close_text')}
{intl.get('universal_seach.navigate_text')}
);
}
/**
* Universal search input bar with items list.
*/
function UniversalSearchBar({ isOpen, onSearchTypeChange, ...listProps }) {
const { handleKeyDown, handleKeyUp } = listProps;
const handlers = isOpen
? { onKeyDown: handleKeyDown, onKeyUp: handleKeyUp }
: {};
return (
}
placeholder={intl.get('universal_search.placeholder')}
onChange={listProps.handleQueryChange}
value={listProps.query}
rightElement={
}
/>
{listProps.itemList}
);
}
/**
* Universal search.
*/
export function UniversalSearch({
defaultSearchResource,
searchResource,
overlayProps,
isOpen,
isLoading,
onSearchTypeChange,
items,
searchTypeOptions,
...queryListProps
}) {
// Search type state.
const [searchType, setSearchType] = React.useState(
defaultSearchResource || RESOURCES_TYPES.CUSTOMER,
);
// Handle search resource type controlled mode.
React.useEffect(() => {
if (
!isUndefined(searchResource) &&
searchResource !== defaultSearchResource
) {
setSearchType(searchResource);
}
}, [searchResource, defaultSearchResource]);
// Handle search type change.
const handleSearchTypeChange = (searchTypeResource) => {
setSearchType(searchTypeResource.key);
onSearchTypeChange && onSearchTypeChange(searchTypeResource);
};
// Filters query list items based on the given search type.
const filteredItems = filterItemsByResourceType(items, searchType);
return (
);
}