Skip to content

Commit

Permalink
add search bar extensions
Browse files Browse the repository at this point in the history
Signed-off-by: Joshua Li <joshuali925@gmail.com>
  • Loading branch information
joshuali925 committed Jun 3, 2024
1 parent dba3cb0 commit 50f69ae
Show file tree
Hide file tree
Showing 8 changed files with 172 additions and 28 deletions.
3 changes: 3 additions & 0 deletions src/plugins/data/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -527,3 +527,6 @@ export {
DataSourceGroup,
DataSourceOption,
} from './data_sources/datasource_selector';

export { SuggestionsComponent } from './ui';
export { PersistedLog } from './query';
2 changes: 1 addition & 1 deletion src/plugins/data/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ export class DataPublicPlugin
},
]);

const dataServices = {
const dataServices: Omit<DataPublicPluginStart, 'ui'> = {

Check warning on line 237 in src/plugins/data/public/plugin.ts

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/plugin.ts#L237

Added line #L237 was not covered by tests
actions: {
createFiltersFromValueClickAction,
createFiltersFromRangeSelectAction,
Expand Down
39 changes: 21 additions & 18 deletions src/plugins/data/public/ui/query_editor/query_editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export interface QueryEditorProps {
size?: SuggestionsListSize;
className?: string;
isInvalid?: boolean;
queryEditorRef: React.RefObject<HTMLDivElement>;
}

interface Props extends QueryEditorProps {
Expand Down Expand Up @@ -514,24 +515,26 @@ export default class QueryEditorUI extends Component<Props, State> {
</EuiFlexGroup>
</EuiFlexItem>
<EuiFlexItem grow={true}>
<CodeEditor
height={70}
languageId="markdown"
value={this.getQueryString()}
onChange={() => {}}
options={{
lineNumbers: 'on',
lineHeight: 20,
fontSize: 12,
fontFamily: 'Roboto Mono',
minimap: {
enabled: false,
},
scrollBeyondLastLine: false,
wordWrap: 'on',
wrappingIndent: 'indent',
}}
/>
<div ref={this.props.queryEditorRef}>
<CodeEditor
height={70}
languageId="markdown"
value={this.getQueryString()}
onChange={() => {}}
options={{
lineNumbers: 'on',
lineHeight: 20,
fontSize: 12,
fontFamily: 'Roboto Mono',
minimap: {
enabled: false,
},
scrollBeyondLastLine: false,
wordWrap: 'on',
wrappingIndent: 'indent',
}}
/>
</div>
</EuiFlexItem>
</EuiFlexGroup>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export interface QueryEditorTopRowProps {
isDirty: boolean;
timeHistory?: TimeHistoryContract;
indicateNoData?: boolean;
queryEditorRef: React.RefObject<HTMLDivElement>;
}

// Needed for React.lazy
Expand Down Expand Up @@ -238,6 +239,7 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) {
getQueryStringInitialValue={getQueryStringInitialValue}
persistedLog={persistedLog}
dataTestSubj={props.dataTestSubj}
queryEditorRef={props.queryEditorRef}
/>
</EuiFlexItem>
);
Expand Down
42 changes: 33 additions & 9 deletions src/plugins/data/public/ui/search_bar/search_bar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,24 @@
* under the License.
*/

import { compact } from 'lodash';
import { InjectedIntl, injectI18n } from '@osd/i18n/react';
import classNames from 'classnames';
import { compact, get, isEqual } from 'lodash';
import React, { Component } from 'react';
import ResizeObserver from 'resize-observer-polyfill';
import { get, isEqual } from 'lodash';

import {
withOpenSearchDashboards,
OpenSearchDashboardsReactContextValue,
withOpenSearchDashboards,
} from '../../../../opensearch_dashboards_react/public';

import QueryBarTopRow from '../query_string_input/query_bar_top_row';
import QueryEditorTopRow from '../query_editor/query_editor_top_row';
import { SavedQueryAttributes, TimeHistoryContract, SavedQuery } from '../../query';
import { Filter, IIndexPattern, Query, TimeRange } from '../../../common';
import { SavedQuery, SavedQueryAttributes, TimeHistoryContract } from '../../query';
import { IDataPluginServices } from '../../types';
import { TimeRange, Query, Filter, IIndexPattern } from '../../../common';
import { FilterBar } from '../filter_bar/filter_bar';
import QueryEditorTopRow from '../query_editor/query_editor_top_row';
import QueryBarTopRow from '../query_string_input/query_bar_top_row';
import { SavedQueryMeta, SaveQueryForm } from '../saved_query_form';
import { SavedQueryManagementComponent } from '../saved_query_management';
import { SearchBarExtensions } from '../search_bar_extensions/search_bar_extensions';
import { QueryEnhancement, Settings } from '../types';

interface SearchBarInjectedDeps {
Expand Down Expand Up @@ -125,6 +123,7 @@ class SearchBarUI extends Component<SearchBarProps, State> {

private services = this.props.opensearchDashboards.services;
private savedQueryService = this.services.data.query.savedQueries;
public queryEditorRef = React.createRef<HTMLDivElement>();
public filterBarRef: Element | null = null;
public filterBarWrapperRef: Element | null = null;

Expand Down Expand Up @@ -239,6 +238,15 @@ class SearchBarUI extends Component<SearchBarProps, State> {
);
}

private shouldRenderExtensions() {
return (
this.props.isEnhancementsEnabled &&
(!!this.props.queryEnhancements?.get(this.state.query?.language?.toUpperCase()!)?.searchBar
?.extensions?.length ??
false)
);
}

/*
* This Function is here to show the toggle in saved query form
* in case you the date range (from/to)
Expand Down Expand Up @@ -511,13 +519,29 @@ class SearchBarUI extends Component<SearchBarProps, State> {
filterBar={filterBar}
dataTestSubj={this.props.dataTestSubj}
indicateNoData={this.props.indicateNoData}
queryEditorRef={this.queryEditorRef}
/>
);
}

let searchBarExtensions;
if (this.shouldRenderExtensions() && this.queryEditorRef.current) {
searchBarExtensions = (

Check warning on line 529 in src/plugins/data/public/ui/search_bar/search_bar.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar/search_bar.tsx#L529

Added line #L529 was not covered by tests
<SearchBarExtensions
configs={
this.props.queryEnhancements?.get(this.state.query?.language?.toUpperCase()!)?.searchBar
?.extensions
}
dependencies={{ indexPatterns: this.props.indexPatterns }}
portalInsert={{ sibling: this.queryEditorRef.current, position: 'before' }}
/>
);
}

return (
<div className="globalQueryBar" data-test-subj="globalQueryBar">
{queryBar}
{searchBarExtensions}
{queryEditor}
{!!!this.props.isEnhancementsEnabled && filterBar}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { EuiErrorBoundary, EuiPortal } from '@elastic/eui';
import { EuiPortalProps } from '@opensearch-project/oui';
import React, { useEffect, useMemo, useState } from 'react';
import { IIndexPattern } from '../../../common';

interface SearchBarExtensionProps {
config: SearchBarExtensionConfig;
dependencies: SearchBarExtensionDependencies;
portalInsert: EuiPortalProps['insert'];
}

export interface SearchBarExtensionDependencies {
/**
* Currently selected index patterns.
*/
indexPatterns?: IIndexPattern[];
}

export interface SearchBarExtensionConfig {
/**
* The id for the search bar extension.
*/
id: string;
/**
* Lower order indicates higher position on UI.
*/
order: number;
/**
* A function that determines if the search bar extension is enabled and should be rendered on UI.
* @returns whether the extension is enabled.
*/
isEnabled: () => Promise<boolean>;
/**
* A function that returns the mount point for the search bar extension.
* @param dependencies - The dependencies required for the extension.
* @returns The mount point for the search bar extension.
*/
getComponent: (dependencies: SearchBarExtensionDependencies) => React.ReactElement;
}

export const SearchBarExtension: React.FC<SearchBarExtensionProps> = (props) => {
const [isEnabled, setIsEnabled] = useState(false);

Check warning on line 47 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx#L47

Added line #L47 was not covered by tests

const component = useMemo(() => props.config.getComponent(props.dependencies), [

Check warning on line 49 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx#L49

Added line #L49 was not covered by tests
props.config,
props.dependencies,
]);

useEffect(() => {
props.config.isEnabled().then(setIsEnabled);

Check warning on line 55 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx#L54-L55

Added lines #L54 - L55 were not covered by tests
}, [props.dependencies, props.config]);

if (!isEnabled) return null;

return (

Check warning on line 60 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extension.tsx#L60

Added line #L60 was not covered by tests
<EuiPortal insert={props.portalInsert}>
<EuiErrorBoundary>{component}</EuiErrorBoundary>
</EuiPortal>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { EuiPortalProps } from '@elastic/eui';
import React from 'react';
import {
SearchBarExtension,
SearchBarExtensionConfig,
SearchBarExtensionDependencies,
} from './search_bar_extension';

interface SearchBarExtensionsProps {
configs?: SearchBarExtensionConfig[];
dependencies: SearchBarExtensionDependencies;
portalInsert: EuiPortalProps['insert'];
}

export const SearchBarExtensions: React.FC<SearchBarExtensionsProps> = (props) => {
if (!props.configs) return null;

const configs = props.configs
.sort((a, b) => a.order - b.order)

Check warning on line 24 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx#L23-L24

Added lines #L23 - L24 were not covered by tests
.reduce((acc, config) => {
if (!acc.some((item) => item.id === config.id)) {
acc.push(config);

Check warning on line 27 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx#L27

Added line #L27 was not covered by tests
}
// TODO inform user of duplicates?
return acc;

Check warning on line 30 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx#L30

Added line #L30 was not covered by tests
}, [] as SearchBarExtensionConfig[]);

return (

Check warning on line 33 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx#L33

Added line #L33 was not covered by tests
<>
{configs.map((config) => (
<SearchBarExtension

Check warning on line 36 in src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx

View check run for this annotation

Codecov / codecov/patch

src/plugins/data/public/ui/search_bar_extensions/search_bar_extensions.tsx#L36

Added line #L36 was not covered by tests
key={config.id}
config={config}
dependencies={props.dependencies}
portalInsert={props.portalInsert}
/>
))}
</>
);
};
2 changes: 2 additions & 0 deletions src/plugins/data/public/ui/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { SearchInterceptor } from '../search';
import { IndexPatternSelectProps } from './index_pattern_select';
import { StatefulSearchBarProps } from './search_bar';
import { Settings } from './settings';
import { SearchBarExtensionConfig } from './search_bar_extensions/search_bar_extension';

export * from './settings';

Expand All @@ -30,6 +31,7 @@ export interface QueryEnhancement {
initialFrom?: string;
initialTo?: string;
};
extensions?: SearchBarExtensionConfig[];
};
fields?: {
filterable?: boolean;
Expand Down

0 comments on commit 50f69ae

Please sign in to comment.