From a8d383bc63adc477937acebd5664d748d671e8b9 Mon Sep 17 00:00:00 2001 From: Amardeepsingh Siglani Date: Tue, 19 Nov 2024 12:22:35 -0800 Subject: [PATCH] Use currently selected data source when no source attached to saved query (#8883) Opening a saved query that has no dataset stored with it, resets the currently selected dataset in the picker which breaks the query experience since the user will need to reselect the dataset which will then reset the query. * use currently selected data source when no source attached to saved query Signed-off-by: Amardeepsingh Siglani * Changeset file for PR #8883 created/updated * refactored fix Signed-off-by: Amardeepsingh Siglani * revert license change Signed-off-by: Amardeepsingh Siglani --------- Signed-off-by: Amardeepsingh Siglani Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> --- changelogs/fragments/8883.yml | 2 ++ .../open_saved_query_flyout.tsx | 24 +++++++-------- .../saved_query_flyouts/save_query_flyout.tsx | 1 - .../public/ui/saved_query_form/helpers.tsx | 30 +------------------ .../ui/saved_query_form/save_query_form.tsx | 4 --- .../populate_state_from_saved_query.test.ts | 12 ++++++-- .../lib/populate_state_from_saved_query.ts | 6 +++- .../data/public/ui/search_bar/search_bar.tsx | 6 +--- 8 files changed, 29 insertions(+), 56 deletions(-) create mode 100644 changelogs/fragments/8883.yml diff --git a/changelogs/fragments/8883.yml b/changelogs/fragments/8883.yml new file mode 100644 index 000000000000..d9254d81c3cf --- /dev/null +++ b/changelogs/fragments/8883.yml @@ -0,0 +1,2 @@ +fix: +- Retain currently selected dataset when opening saved query without dataset info ([#8883](/~https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8883)) \ No newline at end of file diff --git a/src/plugins/data/public/ui/saved_query_flyouts/open_saved_query_flyout.tsx b/src/plugins/data/public/ui/saved_query_flyouts/open_saved_query_flyout.tsx index 212e0228e626..099f3e1f0420 100644 --- a/src/plugins/data/public/ui/saved_query_flyouts/open_saved_query_flyout.tsx +++ b/src/plugins/data/public/ui/saved_query_flyouts/open_saved_query_flyout.tsx @@ -26,7 +26,6 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { i18n } from '@osd/i18n'; import { SavedQuery, SavedQueryService } from '../../query'; import { SavedQueryCard } from './saved_query_card'; -import { Query } from '../../../common'; import { getQueryService } from '../../services'; export interface OpenSavedQueryFlyoutProps { @@ -306,19 +305,16 @@ export function OpenSavedQueryFlyout({ fill onClick={() => { if (selectedQuery) { - if ( - // Template queries are not associated with data sources. Apply data source from current query - selectedQuery.attributes.isTemplate - ) { - const updatedQuery: Query = { - ...queryStringManager?.getQuery(), - query: selectedQuery.attributes.query.query, - language: selectedQuery.attributes.query.language, - }; - queryStringManager.setQuery(updatedQuery); - } else { - onQueryOpen(selectedQuery); - } + onQueryOpen({ + ...selectedQuery, + attributes: { + ...selectedQuery.attributes, + query: { + ...selectedQuery.attributes.query, + dataset: queryStringManager.getQuery().dataset, + }, + }, + }); onClose(); } }} diff --git a/src/plugins/data/public/ui/saved_query_flyouts/save_query_flyout.tsx b/src/plugins/data/public/ui/saved_query_flyouts/save_query_flyout.tsx index c0356b864485..f62a60f7e9c7 100644 --- a/src/plugins/data/public/ui/saved_query_flyouts/save_query_flyout.tsx +++ b/src/plugins/data/public/ui/saved_query_flyouts/save_query_flyout.tsx @@ -43,7 +43,6 @@ export function SaveQueryFlyout({ savedQueryService={savedQueryService} showFilterOption={showFilterOption} showTimeFilterOption={showTimeFilterOption} - showDataSourceOption={true} setSaveAsNew={(shouldSaveAsNew) => setSaveAsNew(shouldSaveAsNew)} savedQuery={saveAsNew ? undefined : savedQuery} saveAsNew={saveAsNew} diff --git a/src/plugins/data/public/ui/saved_query_form/helpers.tsx b/src/plugins/data/public/ui/saved_query_form/helpers.tsx index 467eac2de475..ad3de3acde3f 100644 --- a/src/plugins/data/public/ui/saved_query_form/helpers.tsx +++ b/src/plugins/data/public/ui/saved_query_form/helpers.tsx @@ -57,7 +57,6 @@ interface Props { formUiType: 'Modal' | 'Flyout'; showFilterOption?: boolean; showTimeFilterOption?: boolean; - showDataSourceOption?: boolean; saveAsNew?: boolean; setSaveAsNew?: (shouldSaveAsNew: boolean) => void; cannotBeOverwritten?: boolean; @@ -70,7 +69,6 @@ export function useSaveQueryFormContent({ onClose, showFilterOption = true, showTimeFilterOption = true, - showDataSourceOption = false, formUiType, saveAsNew, setSaveAsNew, @@ -81,7 +79,6 @@ export function useSaveQueryFormContent({ const [description, setDescription] = useState(''); const [savedQueries, setSavedQueries] = useState([]); const [shouldIncludeFilters, setShouldIncludeFilters] = useState(true); - const [shouldIncludeDataSource, setShouldIncludeDataSource] = useState(true); // Defaults to false because saved queries are meant to be as portable as possible and loading // a saved query with a time filter will override whatever the current value of the global timepicker // is. We expect this option to be used rarely and only when the user knows they want this behavior. @@ -96,7 +93,6 @@ export function useSaveQueryFormContent({ setDescription(savedQuery?.description || ''); setShouldIncludeFilters(savedQuery ? !!savedQuery.filters : true); setIncludeTimefilter(!!savedQuery?.timefilter); - setShouldIncludeDataSource(savedQuery ? !!savedQuery.query.dataset : true); setFormErrors([]); }, [savedQuery]); @@ -147,18 +143,9 @@ export function useSaveQueryFormContent({ description, shouldIncludeFilters, shouldIncludeTimeFilter, - shouldIncludeDataSource, }); } - }, [ - validate, - onSave, - title, - description, - shouldIncludeFilters, - shouldIncludeTimeFilter, - shouldIncludeDataSource, - ]); + }, [validate, onSave, title, description, shouldIncludeFilters, shouldIncludeTimeFilter]); const onInputChange = useCallback((event) => { setEnabledSaveButton(Boolean(event.target.value)); @@ -229,21 +216,6 @@ export function useSaveQueryFormContent({ data-test-subj="saveQueryFormDescription" /> - {showDataSourceOption && ( - - { - setShouldIncludeDataSource(!shouldIncludeDataSource); - }} - data-test-subj="saveQueryFormIncludeDataSourceOption" - /> - - )} {showFilterOption && ( void; showFilterOption?: boolean; showTimeFilterOption?: boolean; - showDataSourceOption?: boolean; saveAsNew?: boolean; cannotBeOverwritten?: boolean; } @@ -63,7 +62,6 @@ export interface SavedQueryMeta { description: string; shouldIncludeFilters: boolean; shouldIncludeTimeFilter: boolean; - shouldIncludeDataSource: boolean; } export function SaveQueryForm({ @@ -74,7 +72,6 @@ export function SaveQueryForm({ onClose, showFilterOption = true, showTimeFilterOption = true, - showDataSourceOption = false, saveAsNew, setSaveAsNew, cannotBeOverwritten, @@ -87,7 +84,6 @@ export function SaveQueryForm({ onClose, showFilterOption, showTimeFilterOption, - showDataSourceOption, saveAsNew, setSaveAsNew, cannotBeOverwritten, diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts index 52c3f981296b..b172d8c42a76 100644 --- a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts @@ -47,6 +47,11 @@ describe('populateStateFromSavedQuery', () => { query: { query: 'test', language: 'kuery', + dataset: { + id: 'saved-query-dataset', + title: 'saved-query-dataset', + type: 'INDEX', + }, }, }, }; @@ -57,12 +62,15 @@ describe('populateStateFromSavedQuery', () => { dataMock.query.filterManager.getGlobalFilters = jest.fn().mockReturnValue([]); }); - it('should set query', async () => { + it('should set query with current dataset', async () => { const savedQuery: SavedQuery = { ...baseSavedQuery, }; populateStateFromSavedQuery(dataMock.query, savedQuery); - expect(dataMock.query.queryString.setQuery).toHaveBeenCalled(); + expect(dataMock.query.queryString.setQuery).toHaveBeenCalledWith({ + ...savedQuery.attributes.query, + dataset: dataMock.query.queryString.getQuery().dataset, + }); }); it('should set filters', async () => { diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts index 382fd382ac01..abab61dfe82e 100644 --- a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts @@ -48,7 +48,11 @@ export const populateStateFromSavedQuery = (queryService: QueryStart, savedQuery } // query string - queryString.setQuery(savedQuery.attributes.query); + queryString.setQuery({ + ...savedQuery.attributes.query, + // We should keep the currently selected dataset intact + dataset: queryString.getQuery().dataset, + }); // filters const savedQueryFilters = savedQuery.attributes.filters || []; diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index 1f1b20b8c952..251a0dc86fa0 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -45,7 +45,6 @@ import { QueryEditorTopRow } from '../query_editor'; import QueryBarTopRow from '../query_string_input/query_bar_top_row'; import { SavedQueryMeta, SaveQueryForm } from '../saved_query_form'; import { FilterOptions } from '../filter_bar/filter_options'; -import { getUseNewSavedQueriesUI } from '../../services'; interface SearchBarInjectedDeps { opensearchDashboards: OpenSearchDashboardsReactContextValue; @@ -285,11 +284,8 @@ class SearchBarUI extends Component { public onSave = async (savedQueryMeta: SavedQueryMeta, saveAsNew = false) => { if (!this.state.query) return; - const query = cloneDeep(this.state.query); - if (getUseNewSavedQueriesUI() && !savedQueryMeta.shouldIncludeDataSource) { - delete query.dataset; - } + delete query.dataset; const savedQueryAttributes: SavedQueryAttributes = { title: savedQueryMeta.title,