Skip to content

Commit 6c33d0d

Browse files
Mikiananzh
andauthored
[Mnaual backport 2.x] Combined #8598, #8651, #8613, #8616, #8659, #8665, #8650, #8668 (#8670)
* Fix No data selected appearance (#8668) Also: * Fix some React errors Signed-off-by: Miki <[email protected]> --------- Fix random big number during loading in query editor result (#8650) * Fix random big number during loading in query editor result Signed-off-by: abbyhu2000 <[email protected]> * Changeset file for PR #8650 created/updated * Fix initial loading number Signed-off-by: abbyhu2000 <[email protected]> (cherry picked from commit a7414f0) --------- [bug] address different issues with dataset selector (#8665) * [bug] address some issues with dataset selector Moved the dataset selector back to the search bar and access it by ref in the sidebar. Avoid out of sync issue. * update the logic for ensuring index pattern * dont add ability to open button * empty state but missing data set selector button * fix tests * add back styling Signed-off-by: Kawika Avilla <[email protected]> (cherry picked from commit e23f332) --------- [bug] Discover UI stuck on searching after deleting index pattern (#8659) * [bug] Discover UI stuck on searching after deleting index pattern When using Discover with query enhancement enabled, deleting an index pattern from Index Management does not properly update the "Recently selected data" list in Discover. This causes the UI to become stuck in a "Searching" state when attempting to use Discover after deleting an index pattern. Handle the error case where the use index patterns hook caught error when enhancements was enabled. issue resolved: #8612 (cherry picked from commit 4808094) --------- [Discover]Sample Queries and Saved Queries in No Results Page (#8616) * Sample Queries and Saved Queries in No Results Page Signed-off-by: Sean Li <[email protected]> Signed-off-by: Miki <[email protected]> * Changeset file for PR #8616 created/updated * Update styling Signed-off-by: Miki <[email protected]> (cherry picked from commit 9da1b77) --------- Improve Empty State Handling: Add No Index Patterns Panel with Data Selection in Discover View (#8613) * Improve Empty State Handling: Add No Index Patterns Panel with Data Selection in Discover View This PR primarily addresses the scenario when no index patterns (general) is available in the Discover view. Instead of redirecting users to the index management page, it introduces a new "No Index Patterns" panel. This panel provides users with the option to open a data selector and add index patterns directly from the Discover view, improving the user experience for new or empty deployments. To achieve, we move the selectedDataset state from ConnectedDatasetSelector to the app container's state management. This allows the AdvancedSelector, opened from the AppContainer, to update the dataset state effectively. Key changes include: * Implementing NoIndexPatternsPanel and AdvancedSelector components. * Refactoring dataset state management in AppContainer and Sidebar. * Modifying DiscoverCanvas to conditionally render NoIndexPatternsPanel. * Updating ConnectedDatasetSelector to use shared state and dataset change handling. * Update design of no data selected * use i18n * fix comments * Update design of no data selected * fix lint error Signed-off-by: Anan Zhuang <[email protected]> (cherry picked from commit 6659139) --------- Update Discover appearance (#8651) * Update Discover appearance Signed-off-by: Miki <[email protected]> (cherry picked from commit 17103ba) --------- Move DatasetSelector from data plugin queryString comp to DataExplorer (#8598) * Move DatasetSelector to DataExplorer * Style Disover after moving DatasetSelector to DataExplorer * fix the test by adding the getUpdates$ method to the mock queryString object Signed-off-by: Anan Zhuang <[email protected]> (cherry picked from commit 923cce8) * Resolve merge errors from manual backports Signed-off-by: Miki <[email protected]> --------- Signed-off-by: Miki <[email protected]> Co-authored-by: Anan Zhuang <[email protected]>
1 parent bde23d9 commit 6c33d0d

File tree

38 files changed

+317
-590
lines changed

38 files changed

+317
-590
lines changed

changelogs/fragments/8650.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
fix:
2+
- Fix random big number when loading in query result ([#8650](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8650))

src/plugins/data/common/index_patterns/index_patterns/ensure_default_index_pattern.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ import { includes } from 'lodash';
3232
import { IndexPatternsContract } from './index_patterns';
3333
import { UiSettingsCommon } from '../types';
3434

35-
export type EnsureDefaultIndexPattern = (
36-
shouldRedirect?: boolean
37-
) => Promise<unknown | void> | undefined;
35+
export type EnsureDefaultIndexPattern = () => Promise<unknown | void> | undefined;
3836

3937
export const createEnsureDefaultIndexPattern = (
4038
uiSettings: UiSettingsCommon,
@@ -44,10 +42,7 @@ export const createEnsureDefaultIndexPattern = (
4442
* Checks whether a default index pattern is set and exists and defines
4543
* one otherwise.
4644
*/
47-
return async function ensureDefaultIndexPattern(
48-
this: IndexPatternsContract,
49-
shouldRedirect: boolean = true
50-
) {
45+
return async function ensureDefaultIndexPattern(this: IndexPatternsContract) {
5146
const patterns = await this.getIds();
5247
let defaultId = await uiSettings.get('defaultIndex');
5348
let defined = !!defaultId;
@@ -67,6 +62,8 @@ export const createEnsureDefaultIndexPattern = (
6762
defaultId = patterns[0];
6863
await uiSettings.set('defaultIndex', defaultId);
6964
} else {
65+
const isEnhancementsEnabled = await uiSettings.get('query:enhancements:enabled');
66+
const shouldRedirect = !isEnhancementsEnabled;
7067
if (shouldRedirect) return onRedirectNoIndexPattern();
7168
else return;
7269
}

src/plugins/data/public/query/query_string/language_service/lib/dql_language.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ export const getDQLLanguageConfig = (
2424
visualizable: true,
2525
},
2626
showDocLinks: true,
27+
docLink: {
28+
title: i18n.translate('data.dqlLanguage.docLink', {
29+
defaultMessage: 'DQL documentation',
30+
}),
31+
url: 'https://opensearch.org/docs/latest/query-dsl/full-text/query-string/',
32+
},
2733
editorSupportedAppNames: ['discover'],
2834
supportedAppNames: ['discover', 'dashboards', 'visualize', 'data-explorer', 'vis-builder', '*'],
2935
sampleQueries: [

src/plugins/data/public/query/query_string/language_service/lib/lucene_language.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ export const getLuceneLanguageConfig = (
2424
visualizable: true,
2525
},
2626
showDocLinks: true,
27+
docLink: {
28+
title: i18n.translate('data.luceneLanguage.docLink', {
29+
defaultMessage: 'Lucene documentation',
30+
}),
31+
url: 'https://opensearch.org/docs/latest/query-dsl/full-text/query-string/',
32+
},
2733
editorSupportedAppNames: ['discover'],
2834
supportedAppNames: ['discover', 'dashboards', 'visualize', 'data-explorer', 'vis-builder', '*'],
2935
sampleQueries: [

src/plugins/data/public/query/query_string/language_service/lib/query_result.tsx

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,40 +41,42 @@ export function QueryResult(props: { queryStatus: QueryStatus }) {
4141
setPopover(!isPopoverOpen);
4242
};
4343

44-
const updateElapsedTime = () => {
45-
const time = Date.now() - (props.queryStatus.startTime || 0);
46-
if (time > BUFFER_TIME) {
47-
setElapsedTime(time);
48-
} else {
49-
setElapsedTime(0);
50-
}
51-
};
52-
5344
useEffect(() => {
45+
const updateElapsedTime = () => {
46+
const currentTime = Date.now();
47+
if (!props.queryStatus.startTime) {
48+
return;
49+
}
50+
const elapsed = currentTime - props.queryStatus.startTime;
51+
setElapsedTime(elapsed);
52+
};
53+
5454
const interval = setInterval(updateElapsedTime, 1000);
5555

56-
return () => clearInterval(interval);
57-
});
56+
return () => {
57+
clearInterval(interval);
58+
setElapsedTime(0);
59+
};
60+
}, [props.queryStatus.startTime]);
5861

59-
if (props.queryStatus.status === ResultStatus.LOADING) {
60-
if (elapsedTime < BUFFER_TIME) {
61-
return null;
62+
if (elapsedTime > BUFFER_TIME) {
63+
if (props.queryStatus.status === ResultStatus.LOADING) {
64+
const time = Math.floor(elapsedTime / 1000);
65+
return (
66+
<EuiButtonEmpty
67+
color="text"
68+
size="xs"
69+
onClick={() => {}}
70+
isLoading
71+
data-test-subj="queryResultLoading"
72+
>
73+
{i18n.translate('data.query.languageService.queryResults.loadTime', {
74+
defaultMessage: 'Loading {time} s',
75+
values: { time },
76+
})}
77+
</EuiButtonEmpty>
78+
);
6279
}
63-
const time = Math.floor(elapsedTime / 1000);
64-
return (
65-
<EuiButtonEmpty
66-
color="text"
67-
size="xs"
68-
onClick={() => {}}
69-
isLoading
70-
data-test-subj="queryResultLoading"
71-
>
72-
{i18n.translate('data.query.languageService.queryResults.loadTime', {
73-
defaultMessage: 'Loading {time} s',
74-
values: { time },
75-
})}
76-
</EuiButtonEmpty>
77-
);
7880
}
7981

8082
if (props.queryStatus.status === ResultStatus.READY) {
@@ -85,7 +87,7 @@ export function QueryResult(props: { queryStatus: QueryStatus }) {
8587
});
8688
} else if (props.queryStatus.elapsedMs < 1000) {
8789
message = i18n.translate(
88-
'data.query.languageService.queryResults.completeTimeInMiliseconds',
90+
'data.query.languageService.queryResults.completeTimeInMilliseconds',
8991
{
9092
defaultMessage: 'Completed in {timeMS} ms',
9193
values: { timeMS: props.queryStatus.elapsedMs },

src/plugins/data/public/query/query_string/language_service/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ export interface LanguageConfig {
5555
visualizable?: boolean;
5656
};
5757
showDocLinks?: boolean;
58+
docLink?: {
59+
title: string;
60+
url: string;
61+
};
5862
editorSupportedAppNames?: string[];
5963
supportedAppNames?: string[];
6064
hideDatePicker?: boolean;

src/plugins/data/public/ui/_index.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
@import "./common";
21
@import "./filter_bar/index";
32
@import "./typeahead/index";
43
@import "./saved_query_management/index";

src/plugins/data/public/ui/dataset_selector/advanced_selector.tsx

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,19 @@ import {
1313
} from '../../../common';
1414
import { DatasetExplorer } from './dataset_explorer';
1515
import { Configurator } from './configurator';
16+
import { getQueryService } from '../../services';
1617
import { IDataPluginServices } from '../../types';
1718

1819
export const AdvancedSelector = ({
1920
services,
2021
onSelect,
2122
onCancel,
22-
selectedDataset,
23-
setSelectedDataset,
24-
setIndexPattern,
25-
direct = false,
2623
}: {
2724
services: IDataPluginServices;
2825
onSelect: (dataset: Dataset) => void;
2926
onCancel: () => void;
30-
selectedDataset?: Dataset;
31-
setSelectedDataset: (data: Dataset | undefined) => void;
32-
setIndexPattern: (id: string | undefined) => void;
33-
direct?: boolean;
3427
}) => {
35-
const queryService = services.data.query;
36-
const queryString = queryService.queryString;
28+
const queryString = getQueryService().queryString;
3729

3830
const [path, setPath] = useState<DataStructure[]>([
3931
{
@@ -56,38 +48,22 @@ export const AdvancedSelector = ({
5648
}),
5749
},
5850
]);
51+
const [selectedDataset, setSelectedDataset] = useState<BaseDataset | undefined>();
5952

60-
const [currentSelectedDataset, setCurrentSelectedDataset] = useState<BaseDataset | undefined>(
61-
selectedDataset
62-
);
63-
64-
return currentSelectedDataset ? (
53+
return selectedDataset ? (
6554
<Configurator
66-
baseDataset={currentSelectedDataset}
55+
baseDataset={selectedDataset}
6756
onConfirm={onSelect}
6857
onCancel={onCancel}
69-
onPrevious={() => {
70-
setSelectedDataset(undefined);
71-
setCurrentSelectedDataset(undefined);
72-
}}
73-
queryService={queryService}
58+
onPrevious={() => setSelectedDataset(undefined)}
7459
/>
7560
) : (
7661
<DatasetExplorer
7762
services={services}
7863
queryString={queryString}
7964
path={path}
8065
setPath={setPath}
81-
onNext={(dataset) => {
82-
setSelectedDataset(dataset);
83-
setIndexPattern(dataset.id);
84-
setCurrentSelectedDataset(dataset);
85-
if (direct) {
86-
const query = queryString.getInitialQueryByDataset(dataset);
87-
queryString.setQuery(query);
88-
queryString.getDatasetService().addRecentDataset(dataset);
89-
}
90-
}}
66+
onNext={(dataset) => setSelectedDataset(dataset)}
9167
onCancel={onCancel}
9268
/>
9369
);

src/plugins/data/public/ui/dataset_selector/configurator.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,20 @@ import { i18n } from '@osd/i18n';
2020
import { FormattedMessage } from '@osd/i18n/react';
2121
import React, { useEffect, useMemo, useState } from 'react';
2222
import { BaseDataset, DEFAULT_DATA, Dataset, DatasetField } from '../../../common';
23-
import { getIndexPatterns } from '../../services';
23+
import { getIndexPatterns, getQueryService } from '../../services';
2424

2525
export const Configurator = ({
2626
baseDataset,
2727
onConfirm,
2828
onCancel,
2929
onPrevious,
30-
queryService,
3130
}: {
3231
baseDataset: BaseDataset;
3332
onConfirm: (dataset: Dataset) => void;
3433
onCancel: () => void;
3534
onPrevious: () => void;
36-
queryService: any;
3735
}) => {
36+
const queryService = getQueryService();
3837
const queryString = queryService.queryString;
3938
const languageService = queryService.queryString.getLanguageService();
4039
const indexPatternsService = getIndexPatterns();

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ type EuiSmallButtonEmptyProps = React.ComponentProps<typeof EuiSmallButtonEmpty>
3333

3434
interface DatasetSelectorProps {
3535
selectedDataset?: Dataset;
36-
setSelectedDataset: (data: Dataset | undefined) => void;
37-
setIndexPattern: (id: string | undefined) => void;
38-
handleDatasetChange: (dataset: Dataset) => void;
36+
setSelectedDataset: (dataset: Dataset) => void;
3937
services: IDataPluginServices;
4038
}
4139

@@ -73,8 +71,6 @@ const RootComponent: React.FC<
7371
export const DatasetSelector = ({
7472
selectedDataset,
7573
setSelectedDataset,
76-
setIndexPattern,
77-
handleDatasetChange,
7874
services,
7975
appearance,
8076
buttonProps,
@@ -106,7 +102,7 @@ export const DatasetSelector = ({
106102

107103
// If no dataset is selected, select the first one
108104
if (!selectedDataset && fetchedDatasets.length > 0) {
109-
handleDatasetChange(fetchedDatasets[0]);
105+
setSelectedDataset(fetchedDatasets[0]);
110106
}
111107
};
112108

@@ -183,11 +179,11 @@ export const DatasetSelector = ({
183179
indexPatterns.find((dataset) => dataset.id === selectedOption.key);
184180
if (foundDataset) {
185181
closePopover();
186-
handleDatasetChange(foundDataset);
182+
setSelectedDataset(foundDataset);
187183
}
188184
}
189185
},
190-
[recentDatasets, indexPatterns, handleDatasetChange, closePopover]
186+
[recentDatasets, indexPatterns, setSelectedDataset, closePopover]
191187
);
192188

193189
const datasetTitle = useMemo(() => {
@@ -270,14 +266,10 @@ export const DatasetSelector = ({
270266
onSelect={(dataset?: Dataset) => {
271267
overlay?.close();
272268
if (dataset) {
273-
handleDatasetChange(dataset);
269+
setSelectedDataset(dataset);
274270
}
275271
}}
276272
onCancel={() => overlay?.close()}
277-
selectedDataset={undefined}
278-
setSelectedDataset={setSelectedDataset}
279-
setIndexPattern={setIndexPattern}
280-
direct={true}
281273
/>
282274
),
283275
{

0 commit comments

Comments
 (0)