Skip to content

Commit fcc2fa7

Browse files
opensearch-trigger-bot[bot]github-actions[bot]opensearch-changeset-bot[bot]
authored andcommitted
[Discover-next] add datasource container (opensearch-project#7157) (opensearch-project#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: opensearch-project#7129 * Changeset file for PR opensearch-project#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 812a9e9 commit fcc2fa7

File tree

8 files changed

+64
-14
lines changed

8 files changed

+64
-14
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

+22-12
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,9 +215,9 @@ export default class QueryEditorUI extends Component<Props, State> {
212215
: undefined;
213216
this.onChange(newQuery, dateRange);
214217
this.onSubmit(newQuery, dateRange);
218+
this.setState({ isDataSetsVisible: enhancement?.searchBar?.showDataSetsSelector ?? true });
215219
this.setState({
216220
isDataSourcesVisible: enhancement?.searchBar?.showDataSourcesSelector ?? true,
217-
isDataSetsVisible: enhancement?.searchBar?.showDataSetsSelector ?? true,
218221
});
219222
};
220223

@@ -228,15 +231,19 @@ export default class QueryEditorUI extends Component<Props, State> {
228231
private initDataSourcesVisibility = () => {
229232
if (this.componentIsUnmounting) return;
230233

231-
return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
232-
?.showDataSourcesSelector;
234+
const isDataSourcesVisible =
235+
this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
236+
?.showDataSourcesSelector ?? true;
237+
this.setState({ isDataSourcesVisible });
233238
};
234239

235240
private initDataSetsVisibility = () => {
236241
if (this.componentIsUnmounting) return;
237242

238-
return this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
239-
?.showDataSetsSelector;
243+
const isDataSetsVisible =
244+
this.props.settings.getQueryEnhancements(this.props.query.language)?.searchBar
245+
?.showDataSetsSelector ?? true;
246+
this.setState({ isDataSetsVisible });
240247
};
241248

242249
public onMouseEnterSuggestion = (index: number) => {
@@ -253,10 +260,8 @@ export default class QueryEditorUI extends Component<Props, State> {
253260

254261
this.initPersistedLog();
255262
// this.fetchIndexPatterns().then(this.updateSuggestions);
256-
this.setState({
257-
isDataSourcesVisible: this.initDataSourcesVisibility() || true,
258-
isDataSetsVisible: this.initDataSetsVisibility() || true,
259-
});
263+
this.initDataSourcesVisibility();
264+
this.initDataSetsVisibility();
260265
}
261266

262267
public componentDidUpdate(prevProps: Props) {
@@ -291,6 +296,11 @@ export default class QueryEditorUI extends Component<Props, State> {
291296
<EuiFlexItem grow={false}>
292297
<EuiFlexGroup gutterSize="xs" alignItems="center" className={`${className}__wrapper`}>
293298
<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+
)}
294304
<EuiFlexItem grow={false} className={`${className}__languageWrapper`}>
295305
<QueryLanguageSelector
296306
language={this.props.query.language}
@@ -299,8 +309,8 @@ export default class QueryEditorUI extends Component<Props, State> {
299309
appName={this.services.appName}
300310
/>
301311
</EuiFlexItem>
302-
{this.state.isDataSourcesVisible && (
303-
<EuiFlexItem grow={false} className={`${className}__dataSourceWrapper`}>
312+
{this.state.isDataSetsVisible && (
313+
<EuiFlexItem grow={false} className={`${className}__dataSetWrapper`}>
304314
<div ref={this.props.containerRef} />
305315
</EuiFlexItem>
306316
)}

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)