Skip to content

Commit e2bb1e4

Browse files
opensearch-trigger-bot[bot]github-actions[bot]opensearch-changeset-bot[bot]
authored
[Discover-next] add datasource container (#7157) (#7164)
* [Discover-next] add datasource container Enables the editor to let plugins to mount their own data source component to the data source container. Issue partially resolved: #7129 * Changeset file for PR #7157 created/updated --------- (cherry picked from commit e1c5cfd) Signed-off-by: Kawika Avilla <kavilla414@gmail.com> Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com>
1 parent a0eea7d commit e2bb1e4

File tree

8 files changed

+68
-7
lines changed

8 files changed

+68
-7
lines changed

changelogs/fragments/7157.yml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
feat:
2+
- Query editor and dataframes datasources container ([#7157](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7157))

src/plugins/data/public/ui/query_editor/_query_editor.scss

+16
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,22 @@
2424
}
2525

2626
.osdQueryEditor__dataSourceWrapper {
27+
.dataSourceSelect {
28+
border-bottom: $euiBorderThin !important;
29+
30+
:first-child {
31+
box-shadow: none !important;
32+
height: 100%;
33+
border-radius: 0;
34+
}
35+
36+
div:is([class$="--group"]) {
37+
padding: 0 !important;
38+
}
39+
}
40+
}
41+
42+
.osdQueryEditor__dataSetWrapper {
2743
.dataExplorerDSSelect {
2844
border-bottom: $euiBorderThin !important;
2945

src/plugins/data/public/ui/query_editor/query_editor.tsx

+26-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface QueryEditorProps {
2525
indexPatterns: Array<IIndexPattern | string>;
2626
dataSource?: DataSource;
2727
query: Query;
28+
dataSourceContainerRef?: React.RefCallback<HTMLDivElement>;
2829
containerRef?: React.RefCallback<HTMLDivElement>;
2930
settings: Settings;
3031
disableAutoFocus?: boolean;
@@ -54,6 +55,7 @@ interface Props extends QueryEditorProps {
5455

5556
interface State {
5657
isDataSourcesVisible: boolean;
58+
isDataSetsVisible: boolean;
5759
isSuggestionsVisible: boolean;
5860
index: number | null;
5961
suggestions: QuerySuggestion[];
@@ -77,7 +79,8 @@ const KEY_CODES = {
7779
// eslint-disable-next-line import/no-default-export
7880
export default class QueryEditorUI extends Component<Props, State> {
7981
public state: State = {
80-
isDataSourcesVisible: true,
82+
isDataSourcesVisible: false,
83+
isDataSetsVisible: true,
8184
isSuggestionsVisible: false,
8285
index: null,
8386
suggestions: [],
@@ -212,7 +215,10 @@ export default class QueryEditorUI extends Component<Props, State> {
212215
: undefined;
213216
this.onChange(newQuery, dateRange);
214217
this.onSubmit(newQuery, dateRange);
215-
this.setState({ isDataSourcesVisible: enhancement?.searchBar?.showDataSourceSelector ?? true });
218+
this.setState({ isDataSetsVisible: enhancement?.searchBar?.showDataSetsSelector ?? true });
219+
this.setState({
220+
isDataSourcesVisible: enhancement?.searchBar?.showDataSourcesSelector ?? true,
221+
});
216222
};
217223

218224
private initPersistedLog = () => {
@@ -227,10 +233,19 @@ export default class QueryEditorUI extends Component<Props, State> {
227233

228234
const isDataSourcesVisible =
229235
this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
230-
?.showDataSourceSelector ?? true;
236+
?.showDataSourcesSelector ?? true;
231237
this.setState({ isDataSourcesVisible });
232238
};
233239

240+
private initDataSetsVisibility = () => {
241+
if (this.componentIsUnmounting) return;
242+
243+
const isDataSetsVisible =
244+
this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
245+
?.showDataSetsSelector ?? true;
246+
this.setState({ isDataSetsVisible });
247+
};
248+
234249
public onMouseEnterSuggestion = (index: number) => {
235250
this.setState({ index });
236251
};
@@ -246,6 +261,7 @@ export default class QueryEditorUI extends Component<Props, State> {
246261
this.initPersistedLog();
247262
// this.fetchIndexPatterns().then(this.updateSuggestions);
248263
this.initDataSourcesVisibility();
264+
this.initDataSetsVisibility();
249265
}
250266

251267
public componentDidUpdate(prevProps: Props) {
@@ -280,6 +296,11 @@ export default class QueryEditorUI extends Component<Props, State> {
280296
<EuiFlexItem grow={false}>
281297
<EuiFlexGroup gutterSize="xs" alignItems="center" className={`${className}__wrapper`}>
282298
<EuiFlexItem grow={false}>{this.props.prepend}</EuiFlexItem>
299+
{this.state.isDataSourcesVisible && (
300+
<EuiFlexItem grow={false} className={`${className}__dataSourceWrapper`}>
301+
<div ref={this.props.dataSourceContainerRef} />
302+
</EuiFlexItem>
303+
)}
283304
<EuiFlexItem grow={false} className={`${className}__languageWrapper`}>
284305
<QueryLanguageSelector
285306
language={this.props.query.language}
@@ -288,8 +309,8 @@ export default class QueryEditorUI extends Component<Props, State> {
288309
appName={this.services.appName}
289310
/>
290311
</EuiFlexItem>
291-
{this.state.isDataSourcesVisible && (
292-
<EuiFlexItem grow={false} className={`${className}__dataSourceWrapper`}>
312+
{this.state.isDataSetsVisible && (
313+
<EuiFlexItem grow={false} className={`${className}__dataSetWrapper`}>
293314
<div ref={this.props.containerRef} />
294315
</EuiFlexItem>
295316
)}

src/plugins/data/public/ui/query_editor/query_editor_top_row.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
} from '@elastic/eui';
1515
import classNames from 'classnames';
1616
import { compact, isEqual } from 'lodash';
17-
import React, { useRef, useState } from 'react';
17+
import React, { useState } from 'react';
1818
import {
1919
DataSource,
2020
IDataPluginServices,
@@ -38,6 +38,7 @@ const QueryEditor = withOpenSearchDashboards(QueryEditorUI);
3838
// @internal
3939
export interface QueryEditorTopRowProps {
4040
query?: Query;
41+
dataSourceContainerRef?: React.RefCallback<HTMLDivElement>;
4142
containerRef?: React.RefCallback<HTMLDivElement>;
4243
settings?: Settings;
4344
onSubmit: (payload: { dateRange: TimeRange; query?: Query }) => void;
@@ -234,6 +235,7 @@ export default function QueryEditorTopRow(props: QueryEditorTopRowProps) {
234235
dataSource={props.dataSource}
235236
prepend={props.prepend}
236237
query={parsedQuery}
238+
dataSourceContainerRef={props.dataSourceContainerRef}
237239
containerRef={props.containerRef}
238240
settings={props.settings!}
239241
screenTitle={props.screenTitle}

src/plugins/data/public/ui/search_bar/create_search_bar.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ interface StatefulSearchBarDeps {
4848
data: Omit<DataPublicPluginStart, 'ui'>;
4949
storage: IStorageWrapper;
5050
settings: Settings;
51+
setDataSourceContainerRef: (ref: HTMLDivElement | null) => void;
5152
setContainerRef: (ref: HTMLDivElement | null) => void;
5253
}
5354

@@ -138,6 +139,7 @@ export function createSearchBar({
138139
storage,
139140
data,
140141
settings,
142+
setDataSourceContainerRef,
141143
setContainerRef,
142144
}: StatefulSearchBarDeps) {
143145
// App name should come from the core application service.
@@ -174,6 +176,12 @@ export function createSearchBar({
174176
notifications: core.notifications,
175177
});
176178

179+
const dataSourceContainerRef = useCallback((node) => {
180+
if (node) {
181+
setDataSourceContainerRef(node);
182+
}
183+
}, []);
184+
177185
const containerRef = useCallback((node) => {
178186
if (node) {
179187
setContainerRef(node);
@@ -220,6 +228,7 @@ export function createSearchBar({
220228
filters={filters}
221229
query={query}
222230
settings={settings}
231+
dataSourceContainerRef={dataSourceContainerRef}
223232
containerRef={containerRef}
224233
onFiltersUpdated={defaultFiltersUpdated(data.query)}
225234
onRefreshChange={defaultOnRefreshChange(data.query)}

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

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export interface SearchBarOwnProps {
8080
// Query bar - should be in SearchBarInjectedDeps
8181
query?: Query;
8282
settings?: Settings;
83+
dataSourceContainerRef?: React.RefCallback<HTMLDivElement>;
8384
containerRef?: React.RefCallback<HTMLDivElement>;
8485
// Show when user has privileges to save
8586
showSaveQuery?: boolean;
@@ -490,6 +491,7 @@ class SearchBarUI extends Component<SearchBarProps, State> {
490491
queryEditor = (
491492
<QueryEditorTopRow
492493
timeHistory={this.props.timeHistory}
494+
dataSourceContainerRef={this.props.dataSourceContainerRef}
493495
containerRef={this.props.containerRef}
494496
settings={this.props.settings}
495497
query={this.state.query}

src/plugins/data/public/ui/types.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ export interface QueryEnhancement {
2121
// Leave blank to support all data sources
2222
// supportedDataSourceTypes?: Record<string, GenericDataSource>;
2323
searchBar?: {
24-
showDataSourceSelector?: boolean;
24+
showDataSetsSelector?: boolean;
25+
showDataSourcesSelector?: boolean;
2526
showQueryInput?: boolean;
2627
showFilterBar?: boolean;
2728
showDatePicker?: boolean;
@@ -66,5 +67,6 @@ export interface IUiStart {
6667
SearchBar: React.ComponentType<StatefulSearchBarProps>;
6768
SuggestionsComponent: React.ComponentType<SuggestionsComponentProps>;
6869
Settings: Settings;
70+
dataSourceContainer$: Observable<HTMLDivElement | null>;
6971
container$: Observable<HTMLDivElement | null>;
7072
}

src/plugins/data/public/ui/ui_service.ts

+7
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class UiService implements Plugin<IUiSetup, IUiStart> {
2929
enhancementsConfig: ConfigSchema['enhancements'];
3030
private queryEnhancements: Map<string, QueryEnhancement> = new Map();
3131
private queryEditorExtensionMap: Record<string, QueryEditorExtensionConfig> = {};
32+
private dataSourceContainer$ = new BehaviorSubject<HTMLDivElement | null>(null);
3233
private container$ = new BehaviorSubject<HTMLDivElement | null>(null);
3334

3435
constructor(initializerContext: PluginInitializerContext<ConfigSchema>) {
@@ -62,6 +63,10 @@ export class UiService implements Plugin<IUiSetup, IUiStart> {
6263
queryEditorExtensionMap: this.queryEditorExtensionMap,
6364
});
6465

66+
const setDataSourceContainerRef = (ref: HTMLDivElement | null) => {
67+
this.dataSourceContainer$.next(ref);
68+
};
69+
6570
const setContainerRef = (ref: HTMLDivElement | null) => {
6671
this.container$.next(ref);
6772
};
@@ -71,6 +76,7 @@ export class UiService implements Plugin<IUiSetup, IUiStart> {
7176
data: dataServices,
7277
storage,
7378
settings: Settings,
79+
setDataSourceContainerRef,
7480
setContainerRef,
7581
});
7682

@@ -79,6 +85,7 @@ export class UiService implements Plugin<IUiSetup, IUiStart> {
7985
SearchBar,
8086
SuggestionsComponent,
8187
Settings,
88+
dataSourceContainer$: this.dataSourceContainer$,
8289
container$: this.container$,
8390
};
8491
}

0 commit comments

Comments
 (0)