/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { i18n } from '@osd/i18n'; import { EuiIcon } from '@elastic/eui'; import { SearchableDropdown, SearchableDropdownOption } from './searchable_dropdown'; import { useIndexPatterns } from '../utils/use'; import { useTypedDispatch } from '../utils/state_management'; import { setIndexPattern } from '../utils/state_management/visualization_slice'; import { IndexPattern } from '../../../../data/public'; function indexPatternEquality(A?: SearchableDropdownOption, B?: SearchableDropdownOption): boolean { return !A || !B ? false : A.id === B.id; } function toSearchableDropdownOption(indexPattern: IndexPattern): SearchableDropdownOption { return { id: indexPattern.id || '', label: indexPattern.title, searchableLabel: indexPattern.title, prepend: , }; } export const DataSourceSelect = () => { const { indexPatterns, loading, error, selected } = useIndexPatterns(); const dispatch = useTypedDispatch(); // TODO: Should be a standard EUI component return ( { const foundOption = indexPatterns.filter((s) => s.id === option.id)[0]; if (foundOption !== undefined && typeof foundOption.id === 'string') { dispatch(setIndexPattern(foundOption.id)); } }} prepend={i18n.translate('visBuilder.nav.dataSource.selector.title', { defaultMessage: 'Data Source', })} error={error} loading={loading} options={indexPatterns.map(toSearchableDropdownOption)} equality={indexPatternEquality} /> ); };