diff --git a/changelogs/fragments/8616.yml b/changelogs/fragments/8616.yml deleted file mode 100644 index aa41137d4968..000000000000 --- a/changelogs/fragments/8616.yml +++ /dev/null @@ -1,2 +0,0 @@ -feat: -- Adds sample queries and saved queries to Discover no results page ([#8616](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8616)) \ No newline at end of file diff --git a/changelogs/fragments/8651.yml b/changelogs/fragments/8651.yml deleted file mode 100644 index 0baf8f35105c..000000000000 --- a/changelogs/fragments/8651.yml +++ /dev/null @@ -1,2 +0,0 @@ -feat: -- Update the appearance of Discover ([#8651](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8651)) \ No newline at end of file diff --git a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.scss b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.scss index 1310585eefea..de3a6021b47d 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.scss +++ b/src/core/public/chrome/ui/header/collapsible_nav_group_enabled.scss @@ -1,9 +1,9 @@ .context-nav-wrapper { border: none !important; border-top-right-radius: $euiSizeL; + border-bottom-right-radius: $euiSizeL; background-color: $euiSideNavBackgroundColor; overflow: hidden; - box-shadow: 1px 0 0 $euiBorderColor !important; .nav-link-item { padding: $euiSizeS; diff --git a/src/plugins/data/common/index_patterns/index_patterns/ensure_default_index_pattern.ts b/src/plugins/data/common/index_patterns/index_patterns/ensure_default_index_pattern.ts index 9fed0e1d0519..e64b0bf33f63 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/ensure_default_index_pattern.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/ensure_default_index_pattern.ts @@ -32,9 +32,7 @@ import { includes } from 'lodash'; import { IndexPatternsContract } from './index_patterns'; import { UiSettingsCommon } from '../types'; -export type EnsureDefaultIndexPattern = ( - shouldRedirect?: boolean -) => Promise | undefined; +export type EnsureDefaultIndexPattern = () => Promise | undefined; export const createEnsureDefaultIndexPattern = ( uiSettings: UiSettingsCommon, @@ -44,10 +42,7 @@ export const createEnsureDefaultIndexPattern = ( * Checks whether a default index pattern is set and exists and defines * one otherwise. */ - return async function ensureDefaultIndexPattern( - this: IndexPatternsContract, - shouldRedirect: boolean = true - ) { + return async function ensureDefaultIndexPattern(this: IndexPatternsContract) { const patterns = await this.getIds(); let defaultId = await uiSettings.get('defaultIndex'); let defined = !!defaultId; @@ -67,8 +62,7 @@ export const createEnsureDefaultIndexPattern = ( defaultId = patterns[0]; await uiSettings.set('defaultIndex', defaultId); } else { - if (shouldRedirect) return onRedirectNoIndexPattern(); - else return; + return onRedirectNoIndexPattern(); } }; }; diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 773f24118907..fb0e36fa1f1d 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -62,16 +62,7 @@ import { } from '../common'; import { FilterLabel } from './ui'; -export { - createEditor, - DefaultInput, - DQLBody, - SingleLineInput, - DatasetSelector, - AdvancedSelector, - NoIndexPatternsPanel, - DatasetSelectorAppearance, -} from './ui'; +export { createEditor, DefaultInput, DQLBody, SingleLineInput } from './ui'; import { generateFilters, diff --git a/src/plugins/data/public/query/query_string/dataset_service/dataset_service.ts b/src/plugins/data/public/query/query_string/dataset_service/dataset_service.ts index d8414a33779e..41d1547e8eeb 100644 --- a/src/plugins/data/public/query/query_string/dataset_service/dataset_service.ts +++ b/src/plugins/data/public/query/query_string/dataset_service/dataset_service.ts @@ -207,11 +207,6 @@ export class DatasetService { return Number(this.sessionStorage.get('lastCacheTime')) || undefined; } - public removeFromRecentDatasets(datasetId: string): void { - this.recentDatasets.del(datasetId); - this.serializeRecentDatasets(); - } - private setLastCacheTime(time: number): void { this.sessionStorage.set('lastCacheTime', time); } diff --git a/src/plugins/data/public/query/query_string/dataset_service/lib/index_pattern_type.ts b/src/plugins/data/public/query/query_string/dataset_service/lib/index_pattern_type.ts index 5d230e0396bf..0764b061e699 100644 --- a/src/plugins/data/public/query/query_string/dataset_service/lib/index_pattern_type.ts +++ b/src/plugins/data/public/query/query_string/dataset_service/lib/index_pattern_type.ts @@ -4,7 +4,6 @@ */ import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; -import { i18n } from '@osd/i18n'; import { DataSourceAttributes } from '../../../../../../data_source/common/data_sources'; import { DEFAULT_DATA, @@ -71,29 +70,6 @@ export const indexPatternTypeConfig: DatasetTypeConfig = { } return ['kuery', 'lucene', 'PPL', 'SQL']; }, - - getSampleQueries: (dataset: Dataset, language: string) => { - switch (language) { - case 'PPL': - return [ - { - title: i18n.translate('data.indexPatternType.sampleQuery.basicPPLQuery', { - defaultMessage: 'Sample query for PPL', - }), - query: `source = ${dataset.title}`, - }, - ]; - case 'SQL': - return [ - { - title: i18n.translate('data.indexPatternType.sampleQuery.basicSQLQuery', { - defaultMessage: 'Sample query for SQL', - }), - query: `SELECT * FROM ${dataset.title} LIMIT 10`, - }, - ]; - } - }, }; const fetchIndexPatterns = async (client: SavedObjectsClientContract): Promise => { diff --git a/src/plugins/data/public/query/query_string/dataset_service/lib/index_type.ts b/src/plugins/data/public/query/query_string/dataset_service/lib/index_type.ts index 655d3720dab2..018fa90df397 100644 --- a/src/plugins/data/public/query/query_string/dataset_service/lib/index_type.ts +++ b/src/plugins/data/public/query/query_string/dataset_service/lib/index_type.ts @@ -5,7 +5,6 @@ import { SavedObjectsClientContract } from 'opensearch-dashboards/public'; import { map } from 'rxjs/operators'; -import { i18n } from '@osd/i18n'; import { DEFAULT_DATA, DataStructure, @@ -89,29 +88,6 @@ export const indexTypeConfig: DatasetTypeConfig = { supportedLanguages: (dataset: Dataset): string[] => { return ['SQL', 'PPL']; }, - - getSampleQueries: (dataset: Dataset, language: string) => { - switch (language) { - case 'PPL': - return [ - { - title: i18n.translate('data.indexType.sampleQuery.basicPPLQuery', { - defaultMessage: 'Sample query for PPL', - }), - query: `source = ${dataset.title}`, - }, - ]; - case 'SQL': - return [ - { - title: i18n.translate('data.indexType.sampleQuery.basicSQLQuery', { - defaultMessage: 'Sample query for SQL', - }), - query: `SELECT * FROM ${dataset.title} LIMIT 10`, - }, - ]; - } - }, }; const fetchDataSources = async (client: SavedObjectsClientContract) => { diff --git a/src/plugins/data/public/query/query_string/dataset_service/types.ts b/src/plugins/data/public/query/query_string/dataset_service/types.ts index 43607fe49feb..46b9bdabb5f4 100644 --- a/src/plugins/data/public/query/query_string/dataset_service/types.ts +++ b/src/plugins/data/public/query/query_string/dataset_service/types.ts @@ -71,8 +71,4 @@ export interface DatasetTypeConfig { * @see https://github.com/opensearch-project/OpenSearch-Dashboards/issues/8362. */ combineDataStructures?: (dataStructures: DataStructure[]) => DataStructure | undefined; - /** - * Returns a list of sample queries for this dataset type - */ - getSampleQueries?: (dataset: Dataset, language: string) => any; } diff --git a/src/plugins/data/public/query/query_string/language_service/lib/dql_language.ts b/src/plugins/data/public/query/query_string/language_service/lib/dql_language.ts index 6816bf0d7121..dfa3e2386da7 100644 --- a/src/plugins/data/public/query/query_string/language_service/lib/dql_language.ts +++ b/src/plugins/data/public/query/query_string/language_service/lib/dql_language.ts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { i18n } from '@osd/i18n'; import { LanguageConfig } from '../types'; import { ISearchInterceptor } from '../../../../search'; @@ -26,51 +25,5 @@ export const getDQLLanguageConfig = ( showDocLinks: true, editorSupportedAppNames: ['discover'], supportedAppNames: ['discover', 'dashboards', 'visualize', 'data-explorer', 'vis-builder', '*'], - sampleQueries: [ - { - title: i18n.translate('data.dqlLanguage.sampleQuery.titleContainsWind', { - defaultMessage: 'The title field contains the word wind.', - }), - query: 'title: wind', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.titleContainsWindOrWindy', { - defaultMessage: 'The title field contains the word wind or the word windy.', - }), - query: 'title: (wind OR windy)', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.titleContainsPhraseWindRises', { - defaultMessage: 'The title field contains the phrase wind rises.', - }), - query: 'title: "wind rises"', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.titleKeywordExactMatch', { - defaultMessage: 'The title.keyword field exactly matches The wind rises.', - }), - query: 'title.keyword: The wind rises', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.titleFieldsContainWind', { - defaultMessage: - 'Any field that starts with title (for example, title and title.keyword) contains the word wind', - }), - query: 'title*: wind', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.articleTitleContainsWind', { - defaultMessage: - 'The field that starts with article and ends with title contains the word wind. Matches the field article title.', - }), - query: 'article*title: wind', - }, - { - title: i18n.translate('data.dqlLanguage.sampleQuery.descriptionFieldExists', { - defaultMessage: 'Documents in which the field description exists.', - }), - query: 'description:*', - }, - ], }; }; diff --git a/src/plugins/data/public/query/query_string/language_service/lib/lucene_language.ts b/src/plugins/data/public/query/query_string/language_service/lib/lucene_language.ts index c42b14543633..b5d04f9e4a29 100644 --- a/src/plugins/data/public/query/query_string/language_service/lib/lucene_language.ts +++ b/src/plugins/data/public/query/query_string/language_service/lib/lucene_language.ts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { i18n } from '@osd/i18n'; import { LanguageConfig } from '../types'; import { ISearchInterceptor } from '../../../../search'; @@ -26,51 +25,5 @@ export const getLuceneLanguageConfig = ( showDocLinks: true, editorSupportedAppNames: ['discover'], supportedAppNames: ['discover', 'dashboards', 'visualize', 'data-explorer', 'vis-builder', '*'], - sampleQueries: [ - { - title: i18n.translate('data.luceneLanguage.sampleQuery.titleContainsWind', { - defaultMessage: 'The title field contains the word wind.', - }), - query: 'title: wind', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.titleContainsWindOrWindy', { - defaultMessage: 'The title field contains the word wind or the word windy.', - }), - query: 'title: (wind OR windy)', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.titleContainsPhraseWindRises', { - defaultMessage: 'The title field contains the phrase wind rises.', - }), - query: 'title: "wind rises"', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.titleKeywordExactMatch', { - defaultMessage: 'The title.keyword field exactly matches The wind rises.', - }), - query: 'title.keyword: The wind rises', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.titleFieldsContainWind', { - defaultMessage: - 'Any field that starts with title (for example, title and title.keyword) contains the word wind', - }), - query: 'title*: wind', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.articleTitleContainsWind', { - defaultMessage: - 'The field that starts with article and ends with title contains the word wind. Matches the field article title.', - }), - query: 'article*title: wind', - }, - { - title: i18n.translate('data.luceneLanguage.sampleQuery.descriptionFieldExists', { - defaultMessage: 'Documents in which the field description exists.', - }), - query: 'description:*', - }, - ], }; }; diff --git a/src/plugins/data/public/query/query_string/language_service/types.ts b/src/plugins/data/public/query/query_string/language_service/types.ts index 0889f7e63950..6fe7119789d4 100644 --- a/src/plugins/data/public/query/query_string/language_service/types.ts +++ b/src/plugins/data/public/query/query_string/language_service/types.ts @@ -35,11 +35,6 @@ export interface EditorEnhancements { queryEditorExtension?: QueryEditorExtensionConfig; } -export interface SampleQuery { - title: string; - query: string; -} - export interface LanguageConfig { id: string; title: string; @@ -58,5 +53,4 @@ export interface LanguageConfig { editorSupportedAppNames?: string[]; supportedAppNames?: string[]; hideDatePicker?: boolean; - sampleQueries?: SampleQuery[]; } diff --git a/src/plugins/data/public/ui/_common.scss b/src/plugins/data/public/ui/_common.scss deleted file mode 100644 index fcd98b9c7b31..000000000000 --- a/src/plugins/data/public/ui/_common.scss +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -.dataUI-centerPanel { - height: 100%; - width: 100%; - - // Push the centralized child up, just like ouiOverlayMask - padding-bottom: 10vh; - - & > * { - @include euiLegibilityMaxWidth(100%); - } -} diff --git a/src/plugins/data/public/ui/_index.scss b/src/plugins/data/public/ui/_index.scss index cdbe539a2e19..9ab4ca672b38 100644 --- a/src/plugins/data/public/ui/_index.scss +++ b/src/plugins/data/public/ui/_index.scss @@ -1,4 +1,3 @@ -@import "./common"; @import "./filter_bar/index"; @import "./typeahead/index"; @import "./saved_query_management/index"; diff --git a/src/plugins/data/public/ui/dataset_selector/_dataset_selector.scss b/src/plugins/data/public/ui/dataset_selector/_dataset_selector.scss index 2f92480a4413..0fd82fc1b9ca 100644 --- a/src/plugins/data/public/ui/dataset_selector/_dataset_selector.scss +++ b/src/plugins/data/public/ui/dataset_selector/_dataset_selector.scss @@ -19,9 +19,7 @@ &__advancedModal { width: 1200px; height: 800px; - - // euiOverlayMask pushes the modal up due to having padding-bottom: 10vh - max-height: calc(90vh - $euiSizeL); + max-height: calc(100vh - $euiSizeS); .euiModal__flex { max-height: none; diff --git a/src/plugins/data/public/ui/dataset_selector/advanced_selector.tsx b/src/plugins/data/public/ui/dataset_selector/advanced_selector.tsx index 25434062de8e..734153452eea 100644 --- a/src/plugins/data/public/ui/dataset_selector/advanced_selector.tsx +++ b/src/plugins/data/public/ui/dataset_selector/advanced_selector.tsx @@ -13,27 +13,19 @@ import { } from '../../../common'; import { DatasetExplorer } from './dataset_explorer'; import { Configurator } from './configurator'; +import { getQueryService } from '../../services'; import { IDataPluginServices } from '../../types'; export const AdvancedSelector = ({ services, onSelect, onCancel, - selectedDataset, - setSelectedDataset, - setIndexPattern, - direct = false, }: { services: IDataPluginServices; onSelect: (dataset: Dataset) => void; onCancel: () => void; - selectedDataset?: Dataset; - setSelectedDataset: (data: Dataset | undefined) => void; - setIndexPattern: (id: string | undefined) => void; - direct?: boolean; }) => { - const queryService = services.data.query; - const queryString = queryService.queryString; + const queryString = getQueryService().queryString; const [path, setPath] = useState([ { @@ -56,21 +48,14 @@ export const AdvancedSelector = ({ }), }, ]); + const [selectedDataset, setSelectedDataset] = useState(); - const [currentSelectedDataset, setCurrentSelectedDataset] = useState( - selectedDataset - ); - - return currentSelectedDataset ? ( + return selectedDataset ? ( { - setSelectedDataset(undefined); - setCurrentSelectedDataset(undefined); - }} - queryService={queryService} + onPrevious={() => setSelectedDataset(undefined)} /> ) : ( { - setSelectedDataset(dataset); - setIndexPattern(dataset.id); - setCurrentSelectedDataset(dataset); - if (direct) { - const query = queryString.getInitialQueryByDataset(dataset); - queryString.setQuery(query); - queryString.getDatasetService().addRecentDataset(dataset); - } - }} + onNext={(dataset) => setSelectedDataset(dataset)} onCancel={onCancel} /> ); diff --git a/src/plugins/data/public/ui/dataset_selector/configurator.tsx b/src/plugins/data/public/ui/dataset_selector/configurator.tsx index b8a74a9353e0..db1cb80dd6e3 100644 --- a/src/plugins/data/public/ui/dataset_selector/configurator.tsx +++ b/src/plugins/data/public/ui/dataset_selector/configurator.tsx @@ -20,21 +20,20 @@ import { i18n } from '@osd/i18n'; import { FormattedMessage } from '@osd/i18n/react'; import React, { useEffect, useMemo, useState } from 'react'; import { BaseDataset, DEFAULT_DATA, Dataset, DatasetField } from '../../../common'; -import { getIndexPatterns } from '../../services'; +import { getIndexPatterns, getQueryService } from '../../services'; export const Configurator = ({ baseDataset, onConfirm, onCancel, onPrevious, - queryService, }: { baseDataset: BaseDataset; onConfirm: (dataset: Dataset) => void; onCancel: () => void; onPrevious: () => void; - queryService: any; }) => { + const queryService = getQueryService(); const queryString = queryService.queryString; const languageService = queryService.queryString.getLanguageService(); const indexPatternsService = getIndexPatterns(); diff --git a/src/plugins/data/public/ui/dataset_selector/dataset_selector.tsx b/src/plugins/data/public/ui/dataset_selector/dataset_selector.tsx index 6755645020d1..76c9fbe74546 100644 --- a/src/plugins/data/public/ui/dataset_selector/dataset_selector.tsx +++ b/src/plugins/data/public/ui/dataset_selector/dataset_selector.tsx @@ -11,7 +11,6 @@ import { EuiSelectable, EuiSelectableOption, EuiSmallButtonEmpty, - EuiSmallButton, EuiToolTip, } from '@elastic/eui'; import { FormattedMessage } from '@osd/i18n/react'; @@ -23,43 +22,12 @@ import { getQueryService } from '../../services'; import { IDataPluginServices } from '../../types'; import { AdvancedSelector } from './advanced_selector'; -export enum DatasetSelectorAppearance { - Button = 'button', - None = 'none', -} - -type EuiSmallButtonProps = React.ComponentProps; -type EuiSmallButtonEmptyProps = React.ComponentProps; - interface DatasetSelectorProps { selectedDataset?: Dataset; - setSelectedDataset: (data: Dataset | undefined) => void; - setIndexPattern: (id: string | undefined) => void; - handleDatasetChange: (dataset: Dataset) => void; + setSelectedDataset: (dataset: Dataset) => void; services: IDataPluginServices; } -export interface DatasetSelectorUsingButtonProps { - appearance: DatasetSelectorAppearance.Button; - buttonProps?: EuiSmallButtonProps; -} - -export interface DatasetSelectorUsingButtonEmptyProps { - appearance?: DatasetSelectorAppearance.None; - buttonProps?: EuiSmallButtonEmptyProps; -} - -const RootComponent: React.FC< - (EuiSmallButtonEmptyProps | EuiSmallButtonProps) & { appearance?: DatasetSelectorAppearance } -> = (props) => { - const { appearance, ...rest } = props; - if (appearance === DatasetSelectorAppearance.Button) { - return ; - } else { - return ; - } -}; - /** * This component provides a dropdown selector for datasets and an advanced selector modal. * It fetches datasets once on mount to populate the selector options. @@ -73,13 +41,8 @@ const RootComponent: React.FC< export const DatasetSelector = ({ selectedDataset, setSelectedDataset, - setIndexPattern, - handleDatasetChange, services, - appearance, - buttonProps, -}: DatasetSelectorProps & - (DatasetSelectorUsingButtonProps | DatasetSelectorUsingButtonEmptyProps)) => { +}: DatasetSelectorProps) => { const isMounted = useRef(false); const [isOpen, setIsOpen] = useState(false); const [indexPatterns, setIndexPatterns] = useState([]); @@ -106,7 +69,7 @@ export const DatasetSelector = ({ // If no dataset is selected, select the first one if (!selectedDataset && fetchedDatasets.length > 0) { - handleDatasetChange(fetchedDatasets[0]); + setSelectedDataset(fetchedDatasets[0]); } }; @@ -183,11 +146,11 @@ export const DatasetSelector = ({ indexPatterns.find((dataset) => dataset.id === selectedOption.key); if (foundDataset) { closePopover(); - handleDatasetChange(foundDataset); + setSelectedDataset(foundDataset); } } }, - [recentDatasets, indexPatterns, handleDatasetChange, closePopover] + [recentDatasets, indexPatterns, setSelectedDataset, closePopover] ); const datasetTitle = useMemo(() => { @@ -205,18 +168,8 @@ export const DatasetSelector = ({ return ( - + {datasetTitle} - + } isOpen={isOpen} @@ -270,14 +223,10 @@ export const DatasetSelector = ({ onSelect={(dataset?: Dataset) => { overlay?.close(); if (dataset) { - handleDatasetChange(dataset); + setSelectedDataset(dataset); } }} onCancel={() => overlay?.close()} - selectedDataset={undefined} - setSelectedDataset={setSelectedDataset} - setIndexPattern={setIndexPattern} - direct={true} /> ), { diff --git a/src/plugins/data/public/ui/dataset_selector/index.test.tsx b/src/plugins/data/public/ui/dataset_selector/index.test.tsx index 9e486beb5310..0dd456711c37 100644 --- a/src/plugins/data/public/ui/dataset_selector/index.test.tsx +++ b/src/plugins/data/public/ui/dataset_selector/index.test.tsx @@ -5,7 +5,6 @@ import React from 'react'; import { mount } from 'enzyme'; -import { act } from 'react-dom/test-utils'; import { DatasetSelector as ConnectedDatasetSelector } from './index'; import { DatasetSelector } from './dataset_selector'; import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public'; @@ -20,8 +19,6 @@ jest.mock('./dataset_selector', () => ({ })); describe('ConnectedDatasetSelector', () => { - const mockSubscribe = jest.fn(); - const mockUnsubscribe = jest.fn(); const mockQueryString = { getQuery: jest.fn().mockReturnValue({}), getDefaultQuery: jest.fn().mockReturnValue({}), @@ -30,14 +27,12 @@ describe('ConnectedDatasetSelector', () => { getDatasetService: jest.fn().mockReturnValue({ addRecentDataset: jest.fn(), }), - getUpdates$: jest.fn().mockReturnValue({ - subscribe: mockSubscribe.mockReturnValue({ unsubscribe: mockUnsubscribe }), - }), }; const mockOnSubmit = jest.fn(); const mockServices = { data: { query: { + // @ts-ignore queryString: mockQueryString, }, }, @@ -45,87 +40,36 @@ describe('ConnectedDatasetSelector', () => { beforeEach(() => { (useOpenSearchDashboards as jest.Mock).mockReturnValue({ services: mockServices }); - jest.clearAllMocks(); }); it('should render DatasetSelector with correct props', () => { - const wrapper = mount( - - ); + const wrapper = mount(); expect(wrapper.find(DatasetSelector).props()).toEqual({ selectedDataset: undefined, setSelectedDataset: expect.any(Function), - setIndexPattern: expect.any(Function), - handleDatasetChange: expect.any(Function), services: mockServices, }); }); it('should initialize selectedDataset correctly', () => { const mockDataset: Dataset = { id: 'initial', title: 'Initial Dataset', type: 'test' }; + mockQueryString.getQuery.mockReturnValueOnce({ dataset: mockDataset }); - const wrapper = mount( - - ); + const wrapper = mount(); expect(wrapper.find(DatasetSelector).prop('selectedDataset')).toEqual(mockDataset); }); it('should call handleDatasetChange only once when dataset changes', () => { - const setSelectedDataset = jest.fn(); - const setIndexPattern = jest.fn(); - const wrapper = mount( - - ); - const handleDatasetChange = wrapper.find(DatasetSelector).prop('handleDatasetChange') as ( + const wrapper = mount(); + const setSelectedDataset = wrapper.find(DatasetSelector).prop('setSelectedDataset') as ( dataset?: Dataset ) => void; const newDataset: Dataset = { id: 'test', title: 'Test Dataset', type: 'test' }; - act(() => { - handleDatasetChange(newDataset); - }); + setSelectedDataset(newDataset); expect(mockQueryString.getInitialQueryByDataset).toHaveBeenCalledTimes(1); expect(mockQueryString.setQuery).toHaveBeenCalledTimes(1); expect(mockOnSubmit).toHaveBeenCalledTimes(1); - expect(setSelectedDataset).toHaveBeenCalledWith(newDataset); - expect(setIndexPattern).toHaveBeenCalledWith(newDataset.id); - }); - - it('should subscribe to queryString.getUpdates$ and unsubscribe on unmount', () => { - const wrapper = mount( - - ); - - expect(mockQueryString.getUpdates$).toHaveBeenCalledTimes(1); - expect(mockSubscribe).toHaveBeenCalledTimes(1); - - wrapper.unmount(); - - expect(mockUnsubscribe).toHaveBeenCalledTimes(1); }); }); diff --git a/src/plugins/data/public/ui/dataset_selector/index.tsx b/src/plugins/data/public/ui/dataset_selector/index.tsx index 48cd2926de22..d89f92bc3ad7 100644 --- a/src/plugins/data/public/ui/dataset_selector/index.tsx +++ b/src/plugins/data/public/ui/dataset_selector/index.tsx @@ -3,51 +3,27 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { useCallback, useEffect } from 'react'; +import { useCallback, useState } from 'react'; import React from 'react'; import { Dataset, Query, TimeRange } from '../../../common'; -import { - DatasetSelector, - DatasetSelectorUsingButtonEmptyProps, - DatasetSelectorUsingButtonProps, - DatasetSelectorAppearance, -} from './dataset_selector'; -import { AdvancedSelector } from './advanced_selector'; +import { DatasetSelector } from './dataset_selector'; +import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public'; +import { IDataPluginServices } from '../../types'; interface ConnectedDatasetSelectorProps { onSubmit: ((query: Query, dateRange?: TimeRange | undefined) => void) | undefined; - selectedDataset?: Dataset; - setSelectedDataset: (data: Dataset | undefined) => void; - setIndexPattern: (id: string | undefined) => void; - services?: any; } -const ConnectedDatasetSelector = ({ - onSubmit, - selectedDataset, - setSelectedDataset, - setIndexPattern, - services, - ...datasetSelectorProps -}: ConnectedDatasetSelectorProps & - (DatasetSelectorUsingButtonProps | DatasetSelectorUsingButtonEmptyProps)) => { +const ConnectedDatasetSelector = ({ onSubmit }: ConnectedDatasetSelectorProps) => { + const { services } = useOpenSearchDashboards(); const queryString = services.data.query.queryString; - - useEffect(() => { - const subscription = queryString.getUpdates$().subscribe((query) => { - setSelectedDataset(query.dataset); - setIndexPattern(query.dataset?.id); - }); - - return () => { - subscription.unsubscribe(); - }; - }, [queryString, setSelectedDataset, setIndexPattern]); + const [selectedDataset, setSelectedDataset] = useState( + () => queryString.getQuery().dataset || queryString.getDefaultQuery().dataset + ); const handleDatasetChange = useCallback( (dataset?: Dataset) => { setSelectedDataset(dataset); - setIndexPattern(dataset?.id); if (dataset) { const query = queryString.getInitialQueryByDataset(dataset); queryString.setQuery(query); @@ -55,19 +31,16 @@ const ConnectedDatasetSelector = ({ queryString.getDatasetService().addRecentDataset(dataset); } }, - [onSubmit, queryString, setSelectedDataset, setIndexPattern] + [onSubmit, queryString] ); return ( ); }; -export { ConnectedDatasetSelector as DatasetSelector, AdvancedSelector, DatasetSelectorAppearance }; +export { ConnectedDatasetSelector as DatasetSelector }; diff --git a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss index 9cab10db15f7..2f347b6e2996 100644 --- a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss +++ b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss @@ -81,8 +81,4 @@ &--compressed { margin-top: -$euiSizeS; } - - &__allFiltersPopover { - background-color: $euiFormInputGroupLabelBackground; - } } diff --git a/src/plugins/data/public/ui/filter_bar/filter_options.tsx b/src/plugins/data/public/ui/filter_bar/filter_options.tsx index 26fcc9714212..131d317ecbc5 100644 --- a/src/plugins/data/public/ui/filter_bar/filter_options.tsx +++ b/src/plugins/data/public/ui/filter_bar/filter_options.tsx @@ -407,6 +407,7 @@ const FilterOptionsUI = (props: Props) => { return ( { return ( void; -} - -export const NoIndexPatternsPanel: React.FC = ({ - onOpenDataSelector, -}) => ( - - - - - - - - - -

- {i18n.translate('data.noIndexPatterns.selectDataTitle', { - defaultMessage: 'Select data', - })} -

-
-
- - - {i18n.translate('data.noIndexPatterns.selectDataDescription', { - defaultMessage: - 'Select an available data source and choose a query language to use for running queries. You can use the data dropdown or use the enhanced data selector to select data.', - })} - - - - - {i18n.translate('data.noIndexPatterns.openDataSelectorButton', { - defaultMessage: 'Open data selector', - })} - - - - - -

- {i18n.translate('data.noIndexPatterns.learnMoreAboutQueryLanguages', { - defaultMessage: 'Learn more about query languages', - })} -

-
-
- - - - - - {i18n.translate('data.noIndexPatterns.pplDocumentation', { - defaultMessage: 'PPL documentation', - })} - - - - - - - {i18n.translate('data.noIndexPatterns.sqlDocumentation', { - defaultMessage: 'SQL documentation', - })} - - - - - - - {i18n.translate('data.noIndexPatterns.luceneDocumentation', { - defaultMessage: 'Lucene documentation', - })} - - - - - - - {i18n.translate('data.noIndexPatterns.dqlDocumentation', { - defaultMessage: 'DQL documentation', - })} - - - - - -
-
-
-
-); diff --git a/src/plugins/data/public/ui/query_editor/_query_editor.scss b/src/plugins/data/public/ui/query_editor/_query_editor.scss index 719cc65785c2..a970a970853b 100644 --- a/src/plugins/data/public/ui/query_editor/_query_editor.scss +++ b/src/plugins/data/public/ui/query_editor/_query_editor.scss @@ -137,7 +137,7 @@ .osdQueryEditor__header { display: flex; align-items: center; - padding: 0 $euiSizeXS $euiSizeS; + padding: 0 $euiSizeXS $euiSizeXS; } .osdQueryEditor__topBar { @@ -187,19 +187,13 @@ .osdQuerEditor__singleLine { padding: calc($euiSizeXS + 1px); + background-color: $euiColorEmptyShade; overflow: initial !important; // needed for suggestion window, otherwise will be hidden in child min-width: 0; .monaco-editor .view-overlays .current-line { border: none; } - - &, - & .monaco-editor, - & .monaco-editor .inputarea.ime-input, - & .monaco-editor-background { - background-color: $euiFormBackgroundColor; - } } .suggest-widget { diff --git a/src/plugins/data/public/ui/query_editor/editors/default_editor/_default_editor.scss b/src/plugins/data/public/ui/query_editor/editors/default_editor/_default_editor.scss index 2516c32ec27c..ccebd35c4ead 100644 --- a/src/plugins/data/public/ui/query_editor/editors/default_editor/_default_editor.scss +++ b/src/plugins/data/public/ui/query_editor/editors/default_editor/_default_editor.scss @@ -1,38 +1,9 @@ .defaultEditor { border: $euiBorderThin; border-radius: $euiSizeXS; + margin: 0 $euiSizeXS $euiSizeXS; &__footer { - padding-left: $euiSizeXS; - background-color: $euiColorLightestShade; + margin-left: $euiSizeXS; } - - .monaco-editor { - border-radius: $euiSizeXS $euiSizeXS 0 0; - - .margin { - border-radius: $euiSizeXS 0 0 0; - background-color: $euiFormBackgroundColor; - padding: 0 $euiSizeXS; - } - - .view-lines { - padding: 0 $euiSizeXS; - } - - .monaco-scrollable-element { - border-radius: 0 $euiSizeXS 0 0; - } - } - - .monaco-editor, - .monaco-editor-background, - .monaco-editor .inputarea.ime-input, - .monaco-editor .decorationsOverviewRuler { - background-color: $euiColorEmptyShade; - } -} - -.defaultEditor__footerRow { - gap: $euiSizeM; } diff --git a/src/plugins/data/public/ui/query_editor/editors/default_editor/index.tsx b/src/plugins/data/public/ui/query_editor/editors/default_editor/index.tsx index 1134d104befd..764b25d4b9ac 100644 --- a/src/plugins/data/public/ui/query_editor/editors/default_editor/index.tsx +++ b/src/plugins/data/public/ui/query_editor/editors/default_editor/index.tsx @@ -43,15 +43,14 @@ export const DefaultInput: React.FC = ({ options={{ minimap: { enabled: false }, scrollBeyondLastLine: false, - fontSize: 12, - lineHeight: 20, - fontFamily: 'var(--font-code)', + fontSize: 14, + fontFamily: 'Roboto Mono', lineNumbers: 'on', folding: true, wordWrap: 'on', wrappingIndent: 'same', lineDecorationsWidth: 0, - lineNumbersMinChars: 1, + lineNumbersMinChars: 2, wordBasedSuggestions: false, }} suggestionProvider={{ @@ -71,12 +70,7 @@ export const DefaultInput: React.FC = ({ />
{footerItems && ( - + {footerItems.start?.map((item) => ( {item} diff --git a/src/plugins/data/public/ui/query_string_input/_query_bar.scss b/src/plugins/data/public/ui/query_string_input/_query_bar.scss index e240d89281bf..3976a12d594d 100644 --- a/src/plugins/data/public/ui/query_string_input/_query_bar.scss +++ b/src/plugins/data/public/ui/query_string_input/_query_bar.scss @@ -91,7 +91,3 @@ } } } - -.osdQueryBar--hideEmpty:empty { - display: none; -} diff --git a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx index 45e718fd52ba..14b9ef6d8fd9 100644 --- a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx @@ -402,7 +402,7 @@ export default function QueryBarTopRow(props: QueryBarTopRowProps) { > {renderQueryInput()} {renderSharingMetaFields()} - + {shouldUseDatePickerRef ? createPortal(renderUpdateButton(), props.datePickerRef!.current!) : renderUpdateButton()} diff --git a/src/plugins/data_explorer/public/components/app_container.scss b/src/plugins/data_explorer/public/components/app_container.scss index 0d9b66b8e471..f0320d5d9b8e 100644 --- a/src/plugins/data_explorer/public/components/app_container.scss +++ b/src/plugins/data_explorer/public/components/app_container.scss @@ -11,7 +11,6 @@ $osdHeaderOffset: $euiHeaderHeightCompensation; .deLayout { height: calc(100vh - #{$osdHeaderOffset * 1}); - padding: $euiSizeS; &.dsc--next { height: calc(100vh - #{$osdHeaderOffset * 2}); @@ -20,15 +19,6 @@ $osdHeaderOffset: $euiHeaderHeightCompensation; &__canvas { height: 100%; } - - // stylelint-disable-next-line @osd/stylelint/no_modifying_global_selectors - & > .euiResizableContainer { - gap: $euiSizeXS; - } - - .globalQueryBar { - padding: 0; - } } .headerIsExpanded .deLayout { diff --git a/src/plugins/data_explorer/public/components/sidebar/index.scss b/src/plugins/data_explorer/public/components/sidebar/index.scss index bdabfcdb5943..1828568bc361 100644 --- a/src/plugins/data_explorer/public/components/sidebar/index.scss +++ b/src/plugins/data_explorer/public/components/sidebar/index.scss @@ -2,6 +2,10 @@ &_panel { border-top: 0; } + + &_dataSource { + border-bottom: $euiBorderThin !important; + } } .dataPanelTypeFilterPopover { diff --git a/src/plugins/data_explorer/public/components/sidebar/index.tsx b/src/plugins/data_explorer/public/components/sidebar/index.tsx index 3c5975d9452e..430d70fa9180 100644 --- a/src/plugins/data_explorer/public/components/sidebar/index.tsx +++ b/src/plugins/data_explorer/public/components/sidebar/index.tsx @@ -12,50 +12,27 @@ import { DataSourceSelectable, UI_SETTINGS, } from '../../../../data/public'; -import { - DataSourceOption, - DatasetSelector, - DatasetSelectorAppearance, -} from '../../../../data/public/'; -import { Dataset } from '../../../../data/common'; +import { DataSourceOption } from '../../../../data/public/'; import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public'; import { DataExplorerServices } from '../../types'; -import { - setIndexPattern, - useTypedDispatch, - useTypedSelector, - setSelectedDataset, -} from '../../utils/state_management'; +import { setIndexPattern, useTypedDispatch, useTypedSelector } from '../../utils/state_management'; import './index.scss'; -type HandleSetIndexPattern = (id: string | undefined) => void; -type HandleSelectedDataset = (data: Dataset | undefined) => void; - export const Sidebar: FC = ({ children }) => { - const { indexPattern: indexPatternId, selectedDataset } = useTypedSelector( - (state) => state.metadata - ); + const { indexPattern: indexPatternId } = useTypedSelector((state) => state.metadata); const dispatch = useTypedDispatch(); const [selectedSources, setSelectedSources] = useState([]); const [dataSourceOptionList, setDataSourceOptionList] = useState([]); const [activeDataSources, setActiveDataSources] = useState([]); - const { services } = useOpenSearchDashboards(); - const { - data: { indexPatterns, dataSources }, - notifications: { toasts }, - application, - uiSettings, - } = services; - const handleDatasetSubmit = useCallback( - (query: any) => { - // Update the index pattern - if (query.dataset) { - dispatch(setIndexPattern(query.dataset.id)); - } + const { + services: { + data: { indexPatterns, dataSources }, + notifications: { toasts }, + application, + uiSettings, }, - [dispatch] - ); + } = useOpenSearchDashboards(); const [isEnhancementEnabled, setIsEnhancementEnabled] = useState(false); @@ -137,41 +114,21 @@ export const Sidebar: FC = ({ children }) => { dataSources.dataSourceService.reload(); }, [dataSources.dataSourceService]); - const handleSetIndexPattern: HandleSetIndexPattern = (id: string | undefined) => { - dispatch(setIndexPattern(id)); - }; - - const handleSelectedDataset: HandleSelectedDataset = (data: Dataset | undefined) => { - dispatch(setSelectedDataset(data)); - }; - return ( - - {isEnhancementEnabled ? ( - - ) : ( + {!isEnhancementEnabled && ( + { onRefresh={memorizedReload} fullWidth /> - )} - + + )} {children} diff --git a/src/plugins/data_explorer/public/index.ts b/src/plugins/data_explorer/public/index.ts index 9d9ae2f46d2b..6b0561261c16 100644 --- a/src/plugins/data_explorer/public/index.ts +++ b/src/plugins/data_explorer/public/index.ts @@ -18,6 +18,5 @@ export { useTypedSelector, useTypedDispatch, setIndexPattern, - setSelectedDataset, setDataSet, } from './utils/state_management'; diff --git a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts index c62e550b0073..1fca4a659244 100644 --- a/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts +++ b/src/plugins/data_explorer/public/utils/state_management/metadata_slice.ts @@ -6,13 +6,11 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { DataExplorerServices } from '../../types'; import { QUERY_ENHANCEMENT_ENABLED_SETTING } from '../../components/constants'; -import { Dataset } from '../../../../data/common'; export interface MetadataState { indexPattern?: string; originatingApp?: string; view?: string; - selectedDataset?: Dataset; } const initialState: MetadataState = {}; @@ -28,16 +26,13 @@ export const getPreloadedState = async ({ .getStateTransfer(scopedHistory) .getIncomingEditorState({ keysToRemoveAfterFetch: ['id', 'input'] }) || {}; const isQueryEnhancementEnabled = uiSettings.get(QUERY_ENHANCEMENT_ENABLED_SETTING); - const defaultIndexPattern = await data.indexPatterns.getDefault(); - const selectedDataset = - data.query.queryString.getQuery().dataset || - data.query.queryString.getDefaultQuery().dataset || - undefined; + const defaultIndexPattern = isQueryEnhancementEnabled + ? undefined + : await data.indexPatterns.getDefault(); const preloadedState: MetadataState = { ...initialState, originatingApp, indexPattern: defaultIndexPattern?.id, - selectedDataset, }; return preloadedState; @@ -56,9 +51,6 @@ export const slice = createSlice({ setView: (state, action: PayloadAction) => { state.view = action.payload; }, - setSelectedDataset: (state, action: PayloadAction) => { - state.selectedDataset = action.payload; - }, setState: (_state, action: PayloadAction) => { return action.payload; }, @@ -66,10 +58,4 @@ export const slice = createSlice({ }); export const { reducer } = slice; -export const { - setIndexPattern, - setOriginatingApp, - setView, - setState, - setSelectedDataset, -} = slice.actions; +export const { setIndexPattern, setOriginatingApp, setView, setState } = slice.actions; diff --git a/src/plugins/data_explorer/public/utils/state_management/redux_persistence.test.tsx b/src/plugins/data_explorer/public/utils/state_management/redux_persistence.test.tsx index 9af3bcf3d491..62159558a0c4 100644 --- a/src/plugins/data_explorer/public/utils/state_management/redux_persistence.test.tsx +++ b/src/plugins/data_explorer/public/utils/state_management/redux_persistence.test.tsx @@ -26,7 +26,6 @@ describe('test redux state persistence', () => { "metadata": Object { "indexPattern": "id", "originatingApp": undefined, - "selectedDataset": undefined, }, } `); diff --git a/src/plugins/data_explorer/public/utils/state_management/store.ts b/src/plugins/data_explorer/public/utils/state_management/store.ts index 1ac3564e34ce..daf0b3d7e369 100644 --- a/src/plugins/data_explorer/public/utils/state_management/store.ts +++ b/src/plugins/data_explorer/public/utils/state_management/store.ts @@ -116,9 +116,4 @@ export type RenderState = Omit; // Remaining state after export type Store = ReturnType; export type AppDispatch = Store['dispatch']; -export { - MetadataState, - setIndexPattern, - setOriginatingApp, - setSelectedDataset, -} from './metadata_slice'; +export { MetadataState, setIndexPattern, setOriginatingApp } from './metadata_slice'; diff --git a/src/plugins/discover/public/application/components/chart/_histogram.scss b/src/plugins/discover/public/application/components/chart/_histogram.scss index f30d24d0bb45..3b1c1799e0f6 100644 --- a/src/plugins/discover/public/application/components/chart/_histogram.scss +++ b/src/plugins/discover/public/application/components/chart/_histogram.scss @@ -11,6 +11,7 @@ } .dscChart__wrapper { + border-top: 1px solid $euiColorLightShade; border-bottom: 1px solid $euiColorLightShade; padding: 8px; gap: 8px; diff --git a/src/plugins/discover/public/application/components/chart/timechart_header/timechart_header.tsx b/src/plugins/discover/public/application/components/chart/timechart_header/timechart_header.tsx index a20f551d09fa..a79876ccb455 100644 --- a/src/plugins/discover/public/application/components/chart/timechart_header/timechart_header.tsx +++ b/src/plugins/discover/public/application/components/chart/timechart_header/timechart_header.tsx @@ -118,7 +118,7 @@ export function TimechartHeader({ return ( - + { +export const DiscoverNoResults = ({ timeFieldName, queryLanguage }: Props) => { // Commented out due to no usage in code // See: https://github.com/opensearch-project/OpenSearch-Dashboards/issues/8149 // @@ -183,118 +157,34 @@ export const DiscoverNoResults = ({ // ); // } - const [savedQueries, setSavedQueries] = useState([]); - - useEffect(() => { - const fetchSavedQueries = async () => { - const { queries: savedQueryItems } = await savedQuery.findSavedQueries('', 1000); - setSavedQueries( - savedQueryItems.filter((sq) => query?.language === sq.attributes.query.language) - ); - }; - - fetchSavedQueries(); - }, [setSavedQueries, query, savedQuery]); - - const tabs = useMemo(() => { - const buildSampleQueryBlock = (sampleTitle: string, sampleQuery: string) => { - return ( - <> - {sampleTitle} - - {sampleQuery} - - - ); - }; - - const sampleQueries = []; - - // Samples for the dataset type - if (query?.dataset?.type) { - const datasetSampleQueries = datasetService - .getType(query.dataset.type) - ?.getSampleQueries?.(query.dataset, query.language); - if (Array.isArray(datasetSampleQueries)) sampleQueries.push(...datasetSampleQueries); - } - - // Samples for the language - if (query?.language) { - const languageSampleQueries = languageService.getLanguage(query.language)?.sampleQueries; - if (Array.isArray(languageSampleQueries)) sampleQueries.push(...languageSampleQueries); - } - - return [ - ...(sampleQueries.length > 0 - ? [ - { - id: 'sample_queries', - name: i18n.translate('discover.emptyPrompt.sampleQueries.title', { - defaultMessage: 'Sample Queries', - }), - content: ( - - - {sampleQueries - .slice(0, 5) - .map((sampleQuery) => - buildSampleQueryBlock(sampleQuery.title, sampleQuery.query) - )} - - ), - }, - ] - : []), - ...(savedQueries.length > 0 - ? [ - { - id: 'saved_queries', - name: i18n.translate('discover.emptyPrompt.savedQueries.title', { - defaultMessage: 'Saved Queries', - }), - content: ( - - - {savedQueries.map((sq) => - buildSampleQueryBlock(sq.id, sq.attributes.query.query as string) - )} - - ), - }, - ] - : []), - ]; - }, [datasetService, languageService, query, savedQueries]); - return ( - -

- {i18n.translate('discover.emptyPrompt.title', { - defaultMessage: 'No Results', - })} -

- - } - body={ - -

- {i18n.translate('discover.emptyPrompt.body', { - defaultMessage: - 'Try selecting a different data source, expanding your time range or modifying the query & filters.', - })} -

-
- } - /> -
- -
+ + +

+ {i18n.translate('discover.emptyPrompt.title', { + defaultMessage: 'No Results', + })} +

+ + } + body={ + +

+ {i18n.translate('discover.emptyPrompt.body', { + defaultMessage: + 'Try selecting a different data source, expanding your time range or modifying the query & filters.', + })} +

+
+ } + /> +
); }; diff --git a/src/plugins/discover/public/application/components/sidebar/discover_field_search.tsx b/src/plugins/discover/public/application/components/sidebar/discover_field_search.tsx index c93352d43589..3469fd1d34dc 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_field_search.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_field_search.tsx @@ -275,7 +275,6 @@ export function DiscoverFieldSearch({ 0} aria-label={filterBtnAriaLabel} data-test-subj="toggleFieldFilterButton" diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss index 07f9e7e4ed06..aaba1c5a42aa 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss +++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss @@ -4,40 +4,19 @@ */ .deSidebar_panel { + border-left: 0; + .dscSideBar_searchContainer { + padding: $euiSizeXS; border-bottom: $euiBorderThin; .toggleFieldFilterButton { border: none; - background-color: $euiFormInputGroupLabelBackground; } .dscSideBar_searchInput { box-shadow: none; - border: $euiBorderThin; - background-color: $euiFormBackgroundColor; - } - } - - .dscSideBar_fieldListContainer { - padding-top: $euiSizeS; - } - - .deSidebar_dataSource { - padding-bottom: 0; - } - - .datasetSelector__button { - border-radius: $euiFormControlCompressedBorderRadius; - border-color: $euiFormBorderColor; - background-color: $euiFormBackgroundColor; - - & > .euiButtonContent { - justify-content: space-between; - - .euiIcon { - fill: $euiTextSubduedColor; - } + border-right: $euiBorderThin; } } } @@ -48,8 +27,7 @@ .euiButtonEmpty__content { font-size: $euiFontSizeXS; font-weight: $euiFontWeightSemiBold; - justify-content: flex-start; - padding-left: $euiSizeM + 2px; + justify-content: flex-end; } } diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx index 12ba460bb5a1..0b0162159a38 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx @@ -215,7 +215,11 @@ export function DiscoverSidebar(props: DiscoverSidebarProps) { color="transparent" hasBorder={false} > - + ) : null} - + {fields.length > 0 && ( <> setExpanded(!expanded)} @@ -318,7 +319,7 @@ const FieldList = ({ {expanded && ( diff --git a/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx b/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx index d87e1e47f702..647b989f42e4 100644 --- a/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx +++ b/src/plugins/discover/public/application/components/top_nav/get_top_nav_links.tsx @@ -277,8 +277,7 @@ export const getTopNavLinks = ( services: DiscoverViewServices, inspectorAdapters: Adapters, savedSearch: SavedSearch, - isEnhancementEnabled: boolean = false, - useNoIndexPatternsTopNav: boolean = false + isEnhancementEnabled: boolean = false ) => { const { history, @@ -504,18 +503,8 @@ export const getTopNavLinks = ( // Order their appearance return ['save', 'open', 'new', 'inspect', 'share'].reduce((acc, item) => { const itemDef = topNavLinksMap.get(item); - if (itemDef) { - if (useNoIndexPatternsTopNav && item !== 'open') { - // Disable all buttons except 'open' when in no index patterns mode - acc.push({ - ...itemDef, - disabled: true, - run: () => {}, // Empty function for disabled buttons - }); - } else { - acc.push(itemDef); - } - } + if (itemDef) acc.push(itemDef); + return acc; }, [] as TopNavMenuData[]); }; diff --git a/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss b/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss index beac224ec6ba..e0ab20a15296 100644 --- a/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss +++ b/src/plugins/discover/public/application/view_components/canvas/discover_canvas.scss @@ -1,5 +1,5 @@ .dscCanvas { - @include euiYScroll; + @include euiYScrollWithShadows; /* stylelint-disable-next-line */ container-type: inline-size; // containment context diff --git a/src/plugins/discover/public/application/view_components/canvas/index.tsx b/src/plugins/discover/public/application/view_components/canvas/index.tsx index af94e0e6f542..2e956d6908e9 100644 --- a/src/plugins/discover/public/application/view_components/canvas/index.tsx +++ b/src/plugins/discover/public/application/view_components/canvas/index.tsx @@ -27,31 +27,18 @@ import { OpenSearchSearchHit } from '../../../application/doc_views/doc_views_ty import { buildColumns } from '../../utils/columns'; import './discover_canvas.scss'; import { HeaderVariant } from '../../../../../../core/public'; -import { Query } from '../../../../../../../src/plugins/data/common/types'; -import { setIndexPattern, setSelectedDataset } from '../../../../../data_explorer/public'; -import { NoIndexPatternsPanel, AdvancedSelector } from '../../../../../data/public'; -import { Dataset } from '../../../../../data/common'; -import { toMountPoint } from '../../../../../opensearch_dashboards_react/public'; // eslint-disable-next-line import/no-default-export export default function DiscoverCanvas({ setHeaderActionMenu, history, optionalRef }: ViewProps) { - const { indexPattern: currentIndexPattern, selectedDataset } = useSelector( - (state) => state.metadata - ); - const [loadedIndexPattern, setLoadedIndexPattern] = useState(selectedDataset?.id); const panelRef = useRef(null); const { data$, refetch$, indexPattern } = useDiscoverContext(); - const { services } = useOpenSearchDashboards(); const { - uiSettings, - capabilities, - chrome: { setHeaderVariant }, - data, - overlays, - } = services; - const datasetService = data.query.queryString.getDatasetService(); - const savedQuery = data.query.savedQueries; - const languageService = data.query.queryString.getLanguageService(); + services: { + uiSettings, + capabilities, + chrome: { setHeaderVariant }, + }, + } = useOpenSearchDashboards(); const { columns } = useSelector((state) => { const stateColumns = state.discover.columns; @@ -69,7 +56,6 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history, optionalR ); const dispatch = useDispatch(); const prevIndexPattern = useRef(indexPattern); - const [query, setQuery] = useState(); const [fetchState, setFetchState] = useState({ status: data$.getValue().status, @@ -79,9 +65,6 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history, optionalR const onQuerySubmit = useCallback( (payload, isUpdate) => { - if (payload?.query) { - setQuery(payload?.query); - } if (isUpdate === false) { refetch$.next(); } @@ -139,52 +122,14 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history, optionalR }; const showSaveQuery = !!capabilities.discover?.saveQuery; - const handleDatasetChange = (dataset: Dataset) => { - dispatch(setSelectedDataset(dataset)); - - // Update query and other necessary state - const queryString = data.query.queryString; - const initialQuery = queryString.getInitialQueryByDataset(dataset); - queryString.setQuery(initialQuery); - queryString.getDatasetService().addRecentDataset(dataset); - }; - - const handleOpenDataSelector = () => { - const overlay = overlays?.openModal( - toMountPoint( - { - overlay?.close(); - if (dataset) { - handleDatasetChange(dataset); - } - }} - onCancel={() => overlay?.close()} - selectedDataset={undefined} - setSelectedDataset={setSelectedDataset} - setIndexPattern={setIndexPattern} - dispatch={dispatch} - /> - ), - { - maxWidth: false, - className: 'datasetSelector__advancedModal', - } - ); - }; - - const hasNoDataset = !currentIndexPattern && !loadedIndexPattern && isEnhancementsEnabled; - return ( - {hasNoDataset ? ( - - ) : ( + + {fetchState.status === ResultStatus.NO_RESULTS && ( + + )} + {fetchState.status === ResultStatus.ERROR && ( + + )} + {fetchState.status === ResultStatus.UNINITIALIZED && ( + refetch$.next()} /> + )} + {fetchState.status === ResultStatus.LOADING && } + {fetchState.status === ResultStatus.READY && isEnhancementsEnabled && ( <> - {fetchState.status === ResultStatus.NO_RESULTS && ( - - )} - {fetchState.status === ResultStatus.ERROR && ( - - )} - {fetchState.status === ResultStatus.UNINITIALIZED && ( - refetch$.next()} /> - )} - {fetchState.status === ResultStatus.LOADING && } - {fetchState.status === ResultStatus.READY && isEnhancementsEnabled && ( - <> - - - - )} - {fetchState.status === ResultStatus.READY && !isEnhancementsEnabled && ( - - - - - )} + + )} + {fetchState.status === ResultStatus.READY && !isEnhancementsEnabled && ( + + + + + )} ); } diff --git a/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx b/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx index 0b3f1275d7ff..2aa288b9bdf1 100644 --- a/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx +++ b/src/plugins/discover/public/application/view_components/canvas/top_nav.tsx @@ -35,15 +35,9 @@ export interface TopNavProps { }; showSaveQuery: boolean; isEnhancementsEnabled?: boolean; - useNoIndexPatternsTopNav?: boolean; } -export const TopNav = ({ - opts, - showSaveQuery, - isEnhancementsEnabled, - useNoIndexPatternsTopNav = false, -}: TopNavProps) => { +export const TopNav = ({ opts, showSaveQuery, isEnhancementsEnabled }: TopNavProps) => { const { services } = useOpenSearchDashboards(); const { data$, inspectorAdapters, savedSearch, indexPattern } = useDiscoverContext(); const [indexPatterns, setIndexPatterns] = useState(undefined); @@ -68,13 +62,7 @@ export const TopNav = ({ const showActionsInGroup = uiSettings.get('home:useNewHomePage'); const topNavLinks = savedSearch - ? getTopNavLinks( - services, - inspectorAdapters, - savedSearch, - isEnhancementsEnabled, - useNoIndexPatternsTopNav - ) + ? getTopNavLinks(services, inspectorAdapters, savedSearch, isEnhancementsEnabled) : []; connectStorageToQueryState( @@ -100,7 +88,7 @@ export const TopNav = ({ useEffect(() => { let isMounted = true; const initializeDataset = async () => { - await data.indexPatterns.ensureDefaultIndexPattern(isEnhancementsEnabled ? false : true); + await data.indexPatterns.ensureDefaultIndexPattern(); const defaultIndexPattern = await data.indexPatterns.getDefault(); // TODO: ROCKY do we need this? // const queryString = data.query.queryString; @@ -119,7 +107,7 @@ export const TopNav = ({ return () => { isMounted = false; }; - }, [data.indexPatterns, data.query, isEnhancementsEnabled]); + }, [data.indexPatterns, data.query]); useEffect(() => { const pageTitleSuffix = savedSearch?.id && savedSearch.title ? `: ${savedSearch.title}` : ''; @@ -176,30 +164,18 @@ export const TopNav = ({ {} : opts.onQuerySubmit} - savedQueryId={useNoIndexPatternsTopNav ? undefined : state.savedQuery} - onSavedQueryIdChange={useNoIndexPatternsTopNav ? () => {} : updateSavedQueryId} - datePickerRef={useNoIndexPatternsTopNav ? undefined : opts?.optionalRef?.datePickerRef} + indexPatterns={indexPattern ? [indexPattern] : indexPatterns} + onQuerySubmit={opts.onQuerySubmit} + savedQueryId={state.savedQuery} + onSavedQueryIdChange={updateSavedQueryId} + datePickerRef={opts?.optionalRef?.datePickerRef} groupActions={showActionsInGroup} - screenTitle={ - useNoIndexPatternsTopNav - ? i18n.translate('discover.noIndexPatterns.screenTitle', { - defaultMessage: 'Select data', - }) - : screenTitle - } + screenTitle={screenTitle} queryStatus={queryStatus} /> diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx index 4beafd982013..e5f87af2e974 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -162,8 +162,6 @@ export const EditIndexPattern = withRouter( } if (indexPattern.id) { Promise.resolve(data.indexPatterns.delete(indexPattern.id)).then(function () { - const datasetService = data.query.queryString.getDatasetService(); - datasetService.removeFromRecentDatasets(indexPattern.id); history.push(''); }); } diff --git a/src/plugins/navigation/public/top_nav_menu/_index.scss b/src/plugins/navigation/public/top_nav_menu/_index.scss index 68d2237a8522..da71d3047d06 100644 --- a/src/plugins/navigation/public/top_nav_menu/_index.scss +++ b/src/plugins/navigation/public/top_nav_menu/_index.scss @@ -9,7 +9,7 @@ } .osdTopNavMenuGroupedActions { - background-color: $euiPageBackgroundColor; + background-color: $euiColorEmptyShade; .newTopNavHeader & { margin: 0; diff --git a/src/plugins/query_enhancements/public/datasets/s3_type.ts b/src/plugins/query_enhancements/public/datasets/s3_type.ts index 2a26a7e5fcea..a550464c4e66 100644 --- a/src/plugins/query_enhancements/public/datasets/s3_type.ts +++ b/src/plugins/query_enhancements/public/datasets/s3_type.ts @@ -5,7 +5,6 @@ import { HttpSetup, SavedObjectsClientContract } from 'opensearch-dashboards/public'; import { trimEnd } from 'lodash'; -import { i18n } from '@osd/i18n'; import { DATA_STRUCTURE_META_TYPES, DEFAULT_DATA, @@ -103,29 +102,6 @@ export const s3TypeConfig: DatasetTypeConfig = { supportedLanguages: (dataset: Dataset): string[] => { return ['SQL']; }, - - getSampleQueries: (dataset: Dataset, language: string) => { - switch (language) { - case 'PPL': - return [ - { - title: i18n.translate('queryEnhancements.s3Type.sampleQuery.basicPPLQuery', { - defaultMessage: 'Sample query for PPL', - }), - query: `source = ${dataset.title}`, - }, - ]; - case 'SQL': - return [ - { - title: i18n.translate('queryEnhancements.s3Type.sampleQuery.basicSQLQuery', { - defaultMessage: 'Sample query for SQL', - }), - query: `SELECT * FROM ${dataset.title} LIMIT 10`, - }, - ]; - } - }, }; const fetch = async ( diff --git a/src/plugins/query_enhancements/public/plugin.tsx b/src/plugins/query_enhancements/public/plugin.tsx index ff3df7e9ce1c..073e333c3204 100644 --- a/src/plugins/query_enhancements/public/plugin.tsx +++ b/src/plugins/query_enhancements/public/plugin.tsx @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { i18n } from '@osd/i18n'; import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '../../../core/public'; import { ConfigSchema } from '../common/config'; import { setData, setStorage } from './services'; @@ -101,60 +100,6 @@ export class QueryEnhancementsPlugin editorSupportedAppNames: ['discover'], supportedAppNames: ['discover', 'data-explorer'], hideDatePicker: true, - sampleQueries: [ - { - title: i18n.translate('queryEnhancements.sqlLanguage.sampleQuery.titleContainsWind', { - defaultMessage: 'The title field contains the word wind.', - }), - query: `SELECT * FROM your_table WHERE title LIKE '%wind%'`, - }, - { - title: i18n.translate( - 'queryEnhancements.sqlLanguage.sampleQuery.titleContainsWindOrWindy', - { - defaultMessage: 'The title field contains the word wind or the word windy.', - } - ), - query: `SELECT * FROM your_table WHERE title LIKE '%wind%' OR title LIKE '%windy%';`, - }, - { - title: i18n.translate( - 'queryEnhancements.sqlLanguage.sampleQuery.titleContainsPhraseWindRises', - { - defaultMessage: 'The title field contains the phrase wind rises.', - } - ), - query: `SELECT * FROM your_table WHERE title LIKE '%wind rises%'`, - }, - { - title: i18n.translate( - 'queryEnhancements.sqlLanguage.sampleQuery.titleExactMatchWindRises', - { - defaultMessage: 'The title.keyword field exactly matches The wind rises.', - } - ), - query: `SELECT * FROM your_table WHERE title = 'The wind rises'`, - }, - { - title: i18n.translate( - 'queryEnhancements.sqlLanguage.sampleQuery.titleFieldsContainWind', - { - defaultMessage: - 'Any field that starts with title (for example, title and title.keyword) contains the word wind', - } - ), - query: `SELECT * FROM your_table WHERE title LIKE '%wind%' OR title = 'wind'`, - }, - { - title: i18n.translate( - 'queryEnhancements.sqlLanguage.sampleQuery.descriptionFieldExists', - { - defaultMessage: 'Documents in which the field description exists.', - } - ), - query: `SELECT * FROM your_table WHERE description IS NOT NULL AND description != '';`, - }, - ], }; queryString.getLanguageService().registerLanguage(sqlLanguageConfig);