diff --git a/src/plugins/discover/public/application/context/context_app_content.tsx b/src/plugins/discover/public/application/context/context_app_content.tsx index 3ba518c4a3df8..7471f15092c3b 100644 --- a/src/plugins/discover/public/application/context/context_app_content.tsx +++ b/src/plugins/discover/public/application/context/context_app_content.tsx @@ -11,6 +11,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { EuiHorizontalRule, EuiText } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import { SortDirection } from '@kbn/data-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { CONTEXT_STEP_SETTING, DOC_HIDE_TIME_COLUMN_SETTING } from '../../../common'; import { LoadingStatus } from './services/context_query_state'; import { ActionBar } from './components/action_bar/action_bar'; @@ -20,7 +21,6 @@ import { AppState } from './services/context_state'; import { SurrDocType } from './services/context'; import { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE } from './services/constants'; import { DocTableContext } from '../../components/doc_table/doc_table_context'; -import type { SortPairArr } from '../../components/doc_table/utils/get_sort'; import { useDiscoverServices } from '../../hooks/use_discover_services'; import type { DataTableRecord } from '../../types'; @@ -151,7 +151,7 @@ export function ContextAppContent({ expandedDoc={expandedDoc} isLoading={isAnchorLoading} sampleSize={0} - sort={sort as SortPairArr[]} + sort={sort as SortOrder[]} isSortEnabled={false} showTimeCol={showTimeCol} useNewFieldsApi={useNewFieldsApi} diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index 92443cea9f1ae..dfff574659744 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -15,7 +15,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { DataView } from '@kbn/data-views-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { DocViewFilterFn } from '../../../../services/doc_views/doc_views_types'; import { DiscoverGrid } from '../../../../components/discover_grid/discover_grid'; @@ -32,7 +32,6 @@ import { DataDocuments$, DataDocumentsMsg, RecordRawType } from '../../hooks/use import { AppState, GetStateReturn } from '../../services/discover_state'; import { useDataState } from '../../hooks/use_data_state'; import { DocTableInfinite } from '../../../../components/doc_table/doc_table_infinite'; -import { SortPairArr } from '../../../../components/doc_table/utils/get_sort'; import { DocumentExplorerCallout } from '../document_explorer_callout'; import { DocumentExplorerUpdateCallout } from '../document_explorer_callout/document_explorer_update_callout'; import { DiscoverTourProvider } from '../../../../components/discover_tour'; @@ -195,7 +194,7 @@ function DiscoverDocumentsComponent({ dataView={dataView} isLoading={isLoading} rows={rows} - sort={(state.sort as SortPairArr[]) || []} + sort={(state.sort as SortOrder[]) || []} sampleSize={sampleSize} searchDescription={savedSearch.description} searchTitle={savedSearch.title} diff --git a/src/plugins/discover/public/application/main/hooks/use_discover_state.ts b/src/plugins/discover/public/application/main/hooks/use_discover_state.ts index e74454247d5d1..b3aaed0d880db 100644 --- a/src/plugins/discover/public/application/main/hooks/use_discover_state.ts +++ b/src/plugins/discover/public/application/main/hooks/use_discover_state.ts @@ -17,6 +17,7 @@ import { Query, } from '@kbn/es-query'; import { SavedSearch, getSavedSearch } from '@kbn/saved-search-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { getState } from '../services/discover_state'; import { getStateDefaults } from '../utils/get_state_defaults'; import { DiscoverServices } from '../../../build_services'; @@ -32,7 +33,6 @@ import { useSearchSession } from './use_search_session'; import { useDataState } from './use_data_state'; import { FetchStatus } from '../../types'; import { getDataViewAppState } from '../utils/get_switch_data_view_app_state'; -import { SortPairArr } from '../../../components/doc_table/utils/get_sort'; import { DataTableRecord } from '../../../types'; import { restoreStateFromSavedSearch } from '../../../services/saved_searches/restore_from_saved_search'; @@ -217,7 +217,7 @@ export function useDiscoverState({ dataView, nextDataView, state.columns || [], - (state.sort || []) as SortPairArr[], + (state.sort || []) as SortOrder[], config.get(MODIFY_COLUMNS_ON_SWITCH), config.get(SORT_DEFAULT_ORDER_SETTING), state.query diff --git a/src/plugins/discover/public/application/main/utils/get_state_defaults.ts b/src/plugins/discover/public/application/main/utils/get_state_defaults.ts index 5eb863372d90c..f058c473127d4 100644 --- a/src/plugins/discover/public/application/main/utils/get_state_defaults.ts +++ b/src/plugins/discover/public/application/main/utils/get_state_defaults.ts @@ -11,6 +11,7 @@ import { IUiSettingsClient } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { getDefaultSort, getSortArray } from '../../../utils/sorting'; import { DEFAULT_COLUMNS_SETTING, DOC_HIDE_TIME_COLUMN_SETTING, @@ -19,7 +20,6 @@ import { } from '../../../../common'; import { AppState } from '../services/discover_state'; -import { getDefaultSort, getSortArray } from '../../../components/doc_table'; import { CHART_HIDDEN_KEY } from '../components/chart/discover_chart'; function getDefaultColumns(savedSearch: SavedSearch, config: IUiSettingsClient) { diff --git a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts index 6ed489e504231..064fe36d974ec 100644 --- a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts +++ b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts @@ -7,7 +7,8 @@ */ import { isOfAggregateQueryType, Query, AggregateQuery } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; -import { getSortArray, SortPairArr } from '../../../components/doc_table/utils/get_sort'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; +import { getSortArray } from '../../../utils/sorting'; /** * Helper function to remove or adapt the currently selected columns/sort to be valid with the next @@ -17,7 +18,7 @@ export function getDataViewAppState( currentDataView: DataView, nextDataView: DataView, currentColumns: string[], - currentSort: SortPairArr[], + currentSort: SortOrder[], modifyColumns: boolean = true, sortDirection: string = 'desc', query?: Query | AggregateQuery diff --git a/src/plugins/discover/public/application/main/utils/persist_saved_search.ts b/src/plugins/discover/public/application/main/utils/persist_saved_search.ts index 434514721faab..488f9598aaae7 100644 --- a/src/plugins/discover/public/application/main/utils/persist_saved_search.ts +++ b/src/plugins/discover/public/application/main/utils/persist_saved_search.ts @@ -8,9 +8,7 @@ import { isOfAggregateQueryType } from '@kbn/es-query'; import { DataView } from '@kbn/data-views-plugin/public'; import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; -import type { SortOrder } from '@kbn/saved-search-plugin/public'; -import { saveSavedSearch } from '@kbn/saved-search-plugin/public'; +import { SavedSearch, SortOrder, saveSavedSearch } from '@kbn/saved-search-plugin/public'; import { updateSearchSource } from './update_search_source'; import { AppState } from '../services/discover_state'; import { DiscoverServices } from '../../../build_services'; diff --git a/src/plugins/discover/public/application/main/utils/update_search_source.ts b/src/plugins/discover/public/application/main/utils/update_search_source.ts index aea864af91d81..4966a66cf9687 100644 --- a/src/plugins/discover/public/application/main/utils/update_search_source.ts +++ b/src/plugins/discover/public/application/main/utils/update_search_source.ts @@ -11,7 +11,7 @@ import { DataViewType, DataView } from '@kbn/data-views-plugin/public'; import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { SORT_DEFAULT_ORDER_SETTING } from '../../../../common'; import { DiscoverServices } from '../../../build_services'; -import { getSortForSearchSource } from '../../../components/doc_table'; +import { getSortForSearchSource } from '../../../utils/sorting'; /** * Helper function to update the given searchSource before fetching/sharing/persisting diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index d02529d924e3f..1987542931676 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -23,6 +23,7 @@ import { EuiLink, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { getSchemaDetectors } from './discover_grid_schema'; import { DiscoverGridFlyout } from './discover_grid_flyout'; @@ -43,7 +44,6 @@ import { SHOW_MULTIFIELDS, } from '../../../common'; import { DiscoverGridDocumentToolbarBtn } from './discover_grid_document_selection'; -import { SortPairArr } from '../doc_table/utils/get_sort'; import { getFieldsToShow } from '../../utils/get_fields_to_show'; import type { DataTableRecord, ValueToStringConverter } from '../../types'; import { useRowHeightsOptions } from '../../hooks/use_row_heights_options'; @@ -141,7 +141,7 @@ export interface DiscoverGridProps { /** * Current sort setting */ - sort: SortPairArr[]; + sort: SortOrder[]; /** * How the data is fetched */ diff --git a/src/plugins/discover/public/components/doc_table/components/table_header/helpers.tsx b/src/plugins/discover/public/components/doc_table/components/table_header/helpers.tsx index 47b96d266067b..57cdc35bad016 100644 --- a/src/plugins/discover/public/components/doc_table/components/table_header/helpers.tsx +++ b/src/plugins/discover/public/components/doc_table/components/table_header/helpers.tsx @@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n'; import type { DataView } from '@kbn/data-views-plugin/public'; -export type SortOrder = [string, string]; export interface ColumnProps { name: string; displayName: string; diff --git a/src/plugins/discover/public/components/doc_table/components/table_header/table_header.test.tsx b/src/plugins/discover/public/components/doc_table/components/table_header/table_header.test.tsx index 2b1937c177e15..78d15870e6353 100644 --- a/src/plugins/discover/public/components/doc_table/components/table_header/table_header.test.tsx +++ b/src/plugins/discover/public/components/doc_table/components/table_header/table_header.test.tsx @@ -9,9 +9,9 @@ import React from 'react'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { TableHeader } from './table_header'; import { findTestSubject } from '@elastic/eui/lib/test'; -import { SortOrder } from './helpers'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { DOC_HIDE_TIME_COLUMN_SETTING } from '../../../../../common'; import { FORMATS_UI_SETTINGS } from '@kbn/field-formats-plugin/common'; diff --git a/src/plugins/discover/public/components/doc_table/components/table_header/table_header.tsx b/src/plugins/discover/public/components/doc_table/components/table_header/table_header.tsx index ac9dc4c8e204f..ef5ca408d2bd8 100644 --- a/src/plugins/discover/public/components/doc_table/components/table_header/table_header.tsx +++ b/src/plugins/discover/public/components/doc_table/components/table_header/table_header.tsx @@ -9,9 +9,10 @@ import React, { useMemo } from 'react'; import type { DataView } from '@kbn/data-views-plugin/public'; import { FORMATS_UI_SETTINGS } from '@kbn/field-formats-plugin/common'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { TableHeaderColumn } from './table_header_column'; -import { SortOrder, getDisplayedColumns } from './helpers'; -import { getDefaultSort } from '../../utils/get_default_sort'; +import { getDisplayedColumns } from './helpers'; +import { getDefaultSort } from '../../../../utils/sorting'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { DOC_HIDE_TIME_COLUMN_SETTING, SORT_DEFAULT_ORDER_SETTING } from '../../../../../common'; diff --git a/src/plugins/discover/public/components/doc_table/components/table_header/table_header_column.tsx b/src/plugins/discover/public/components/doc_table/components/table_header/table_header_column.tsx index 80a1aee5e920f..f7322b778a558 100644 --- a/src/plugins/discover/public/components/doc_table/components/table_header/table_header_column.tsx +++ b/src/plugins/discover/public/components/doc_table/components/table_header/table_header_column.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonIcon, EuiToolTip, EuiIconTip } from '@elastic/eui'; -import { SortOrder } from './helpers'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { DocViewTableScoreSortWarning } from './score_sort_warning'; interface Props { diff --git a/src/plugins/discover/public/components/doc_table/doc_table_wrapper.tsx b/src/plugins/discover/public/components/doc_table/doc_table_wrapper.tsx index c7036deaff50b..23f8b3e2e888b 100644 --- a/src/plugins/discover/public/components/doc_table/doc_table_wrapper.tsx +++ b/src/plugins/discover/public/components/doc_table/doc_table_wrapper.tsx @@ -9,10 +9,10 @@ import React, { forwardRef, useCallback, useMemo } from 'react'; import { EuiIcon, EuiSpacer, EuiText } from '@elastic/eui'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; import { TableHeader } from './components/table_header/table_header'; import { SHOW_MULTIFIELDS } from '../../../common'; -import { SortOrder } from './components/table_header/helpers'; import { TableRow } from './components/table_row'; import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { getFieldsToShow } from '../../utils/get_fields_to_show'; diff --git a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx index b4c3f41e4ba36..fc9afe946fae0 100644 --- a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx @@ -22,6 +22,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import type { KibanaExecutionContext } from '@kbn/core/public'; import { Container, Embeddable, FilterableEmbeddable } from '@kbn/embeddable-plugin/public'; import { Adapters, RequestAdapter } from '@kbn/inspector-plugin/common'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { APPLY_FILTER_TRIGGER, FilterManager, @@ -33,6 +34,7 @@ import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { getSortForEmbeddable, SortPair } from '../utils/sorting'; import { RecordRawType } from '../application/main/hooks/use_saved_search'; import { buildDataTableRecord } from '../utils/build_data_record'; import { DataTableRecord, EsHitRecord } from '../types'; @@ -53,8 +55,6 @@ import { handleSourceColumnState } from '../utils/state_helpers'; import { DiscoverGridProps } from '../components/discover_grid/discover_grid'; import { DiscoverGridSettings } from '../components/discover_grid/types'; import { DocTableProps } from '../components/doc_table/doc_table_wrapper'; -import { getDefaultSort } from '../components/doc_table'; -import { SortOrder } from '../components/doc_table/components/table_header/helpers'; import { VIEW_MODE } from '../components/view_mode_toggle'; import { updateSearchSource } from './utils/update_search_source'; import { FieldStatisticsTable } from '../application/main/components/field_stats_table'; @@ -103,6 +103,7 @@ export class SavedSearchEmbeddable private prevTimeRange?: TimeRange; private prevFilters?: Filter[]; private prevQuery?: Query; + private prevSort?: SortOrder[]; private prevSearchSessionId?: string; private searchProps?: SearchProps; @@ -285,10 +286,8 @@ export class SavedSearchEmbeddable } }; - private getDefaultSort(dataView?: DataView) { - const defaultSortOrder = this.services.uiSettings.get(SORT_DEFAULT_ORDER_SETTING, 'desc'); - const hidingTimeColumn = this.services.uiSettings.get(DOC_HIDE_TIME_COLUMN_SETTING, false); - return getDefaultSort(dataView, defaultSortOrder, hidingTimeColumn); + private getSort(sort: SortPair[] | undefined, dataView?: DataView) { + return getSortForEmbeddable(sort, dataView, this.services.uiSettings); } private initializeSearchEmbeddableProps() { @@ -299,16 +298,13 @@ export class SavedSearchEmbeddable if (!dataView) { return; } - - if (!this.savedSearch.sort || !this.savedSearch.sort.length) { - this.savedSearch.sort = this.getDefaultSort(dataView); - } + const sort = this.getSort(this.savedSearch.sort, dataView); const props: SearchProps = { columns: this.savedSearch.columns, dataView, isLoading: false, - sort: this.getDefaultSort(dataView), + sort, rows: [], searchDescription: this.savedSearch.description, description: this.savedSearch.description, @@ -339,9 +335,9 @@ export class SavedSearchEmbeddable onSetColumns: (columns: string[]) => { this.updateInput({ columns }); }, - onSort: (sort: string[][]) => { + onSort: (nextSort: string[][]) => { const sortOrderArr: SortOrder[] = []; - sort.forEach((arr) => { + nextSort.forEach((arr) => { sortOrderArr.push(arr as SortOrder); }); this.updateInput({ sort: sortOrderArr }); @@ -400,14 +396,15 @@ export class SavedSearchEmbeddable } private isFetchRequired(searchProps?: SearchProps) { - if (!searchProps) { + if (!searchProps || !searchProps.dataView) { return false; } + return ( !onlyDisabledFiltersChanged(this.input.filters, this.prevFilters) || !isEqual(this.prevQuery, this.input.query) || !isEqual(this.prevTimeRange, this.input.timeRange) || - !isEqual(searchProps.sort, this.input.sort || this.savedSearch.sort) || + !isEqual(this.prevSort, this.input.sort) || this.prevSearchSessionId !== this.input.searchSessionId ); } @@ -431,12 +428,11 @@ export class SavedSearchEmbeddable { columns: this.input.columns || this.savedSearch.columns }, this.services.core.uiSettings ).columns; + searchProps.sort = this.getSort( + this.input.sort || this.savedSearch.sort, + searchProps?.dataView + ); - const savedSearchSort = - this.savedSearch.sort && this.savedSearch.sort.length - ? this.savedSearch.sort - : this.getDefaultSort(this.searchProps?.dataView); - searchProps.sort = this.input.sort || savedSearchSort; searchProps.sharedItemTitle = this.panelTitle; searchProps.rowHeightState = this.input.rowHeight || this.savedSearch.rowHeight; searchProps.rowsPerPageState = this.input.rowsPerPage || this.savedSearch.rowsPerPage; @@ -453,6 +449,7 @@ export class SavedSearchEmbeddable this.prevQuery = this.input.query; this.prevTimeRange = this.input.timeRange; this.prevSearchSessionId = this.input.searchSessionId; + this.prevSort = this.input.sort; this.searchProps = searchProps; await this.fetch(); } else if (this.searchProps && this.node) { diff --git a/src/plugins/discover/public/embeddable/types.ts b/src/plugins/discover/public/embeddable/types.ts index dacb9b7d81d43..6038aa5a0625c 100644 --- a/src/plugins/discover/public/embeddable/types.ts +++ b/src/plugins/discover/public/embeddable/types.ts @@ -15,7 +15,7 @@ import { import type { Filter, TimeRange, Query } from '@kbn/es-query'; import { DataView } from '@kbn/data-views-plugin/public'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; -import { SortOrder } from '../components/doc_table/components/table_header/helpers'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; export interface SearchInput extends EmbeddableInput { timeRange: TimeRange; diff --git a/src/plugins/discover/public/embeddable/utils/update_search_source.ts b/src/plugins/discover/public/embeddable/utils/update_search_source.ts index 0126ed4d021e6..87ee137aed796 100644 --- a/src/plugins/discover/public/embeddable/utils/update_search_source.ts +++ b/src/plugins/discover/public/embeddable/utils/update_search_source.ts @@ -6,14 +6,14 @@ * Side Public License, v 1. */ import type { DataView } from '@kbn/data-views-plugin/public'; -import { ISearchSource } from '@kbn/data-plugin/public'; -import { getSortForSearchSource } from '../../components/doc_table'; -import { SortPairArr } from '../../components/doc_table/utils/get_sort'; +import type { ISearchSource } from '@kbn/data-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; +import { getSortForSearchSource } from '../../utils/sorting'; export const updateSearchSource = ( searchSource: ISearchSource, dataView: DataView | undefined, - sort: (SortPairArr[] & string[][]) | undefined, + sort: (SortOrder[] & string[][]) | undefined, useNewFieldsApi: boolean, defaults: { sampleSize: number; diff --git a/src/plugins/discover/public/utils/get_sharing_data.ts b/src/plugins/discover/public/utils/get_sharing_data.ts index 6d99edd3d9fe1..ace169359e318 100644 --- a/src/plugins/discover/public/utils/get_sharing_data.ts +++ b/src/plugins/discover/public/utils/get_sharing_data.ts @@ -15,12 +15,12 @@ import type { } from '@kbn/data-plugin/public'; import type { Filter } from '@kbn/es-query'; import type { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; +import { getSortForSearchSource } from './sorting'; import { DOC_HIDE_TIME_COLUMN_SETTING, SEARCH_FIELDS_FROM_SOURCE, SORT_DEFAULT_ORDER_SETTING, } from '../../common'; -import { getSortForSearchSource } from '../components/doc_table'; import { AppState, isEqualFilters } from '../application/main/services/discover_state'; /** diff --git a/src/plugins/discover/public/components/doc_table/utils/get_default_sort.test.ts b/src/plugins/discover/public/utils/sorting/get_default_sort.test.ts similarity index 100% rename from src/plugins/discover/public/components/doc_table/utils/get_default_sort.test.ts rename to src/plugins/discover/public/utils/sorting/get_default_sort.test.ts diff --git a/src/plugins/discover/public/components/doc_table/utils/get_default_sort.ts b/src/plugins/discover/public/utils/sorting/get_default_sort.ts similarity index 93% rename from src/plugins/discover/public/components/doc_table/utils/get_default_sort.ts rename to src/plugins/discover/public/utils/sorting/get_default_sort.ts index 82055e94f5407..d5b72c4b13949 100644 --- a/src/plugins/discover/public/components/doc_table/utils/get_default_sort.ts +++ b/src/plugins/discover/public/utils/sorting/get_default_sort.ts @@ -7,8 +7,8 @@ */ import type { DataView } from '@kbn/data-views-plugin/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { isSortable } from './get_sort'; -import { SortOrder } from '../components/table_header/helpers'; /** * use in case the user didn't manually sort. diff --git a/src/plugins/discover/public/components/doc_table/utils/get_sort.test.ts b/src/plugins/discover/public/utils/sorting/get_sort.test.ts similarity index 66% rename from src/plugins/discover/public/components/doc_table/utils/get_sort.test.ts rename to src/plugins/discover/public/utils/sorting/get_sort.test.ts index f778bbd8fecaa..0656a2e36c4ca 100644 --- a/src/plugins/discover/public/components/doc_table/utils/get_sort.test.ts +++ b/src/plugins/discover/public/utils/sorting/get_sort.test.ts @@ -6,11 +6,12 @@ * Side Public License, v 1. */ -import { getSort, getSortArray } from './get_sort'; +import { getSort, getSortArray, getSortForEmbeddable } from './get_sort'; import { stubDataView, stubDataViewWithoutTimeField, } from '@kbn/data-views-plugin/common/data_view.stub'; +import { uiSettingsMock } from '../../__mocks__/ui_settings'; describe('docTable', function () { describe('getSort function', function () { @@ -47,7 +48,6 @@ describe('docTable', function () { expect(getSort(['foo', 'asc'], stubDataView)).toEqual([{ foo: 'asc' }]); }); }); - describe('getSortArray function', function () { test('should have an array method', function () { expect(getSortArray).toBeInstanceOf(Function); @@ -64,14 +64,42 @@ describe('docTable', function () { test('should sort by an empty array when an unsortable field is given', function () { expect(getSortArray([{ 'non-sortable': 'asc' }], stubDataView)).toEqual([]); expect(getSortArray([{ lol_nope: 'asc' }], stubDataView)).toEqual([]); - expect(getSortArray([{ 'non-sortable': 'asc' }], stubDataViewWithoutTimeField)).toEqual([]); }); test('should return an empty array when passed an empty sort array', () => { expect(getSortArray([], stubDataView)).toEqual([]); - expect(getSortArray([], stubDataViewWithoutTimeField)).toEqual([]); }); }); + describe('getSortForEmbeddable function', function () { + test('should return an array of arrays for sortable fields', function () { + expect(getSortForEmbeddable([['bytes', 'desc']], stubDataView)).toEqual([['bytes', 'desc']]); + }); + + test('should return an array of arrays from an array of elasticsearch sort objects', function () { + expect(getSortForEmbeddable([{ bytes: 'desc' }], stubDataView)).toEqual([['bytes', 'desc']]); + }); + + test('should sort by an empty array when an unsortable field is given', function () { + expect(getSortForEmbeddable([{ 'non-sortable': 'asc' }], stubDataView)).toEqual([]); + expect(getSortForEmbeddable([{ lol_nope: 'asc' }], stubDataView)).toEqual([]); + expect( + getSortForEmbeddable([{ 'non-sortable': 'asc' }], stubDataViewWithoutTimeField) + ).toEqual([]); + }); + + test('should return an empty array when passed an empty sort array', () => { + expect(getSortForEmbeddable([], stubDataView)).toEqual([]); + expect(getSortForEmbeddable([], stubDataViewWithoutTimeField)).toEqual([]); + }); + + test('should provide fallback results', () => { + expect(getSortForEmbeddable(undefined)).toEqual([]); + expect(getSortForEmbeddable(undefined, stubDataView)).toEqual([]); + expect(getSortForEmbeddable(undefined, stubDataView, uiSettingsMock)).toEqual([ + ['@timestamp', 'desc'], + ]); + }); + }); }); diff --git a/src/plugins/discover/public/components/doc_table/utils/get_sort.ts b/src/plugins/discover/public/utils/sorting/get_sort.ts similarity index 67% rename from src/plugins/discover/public/components/doc_table/utils/get_sort.ts rename to src/plugins/discover/public/utils/sorting/get_sort.ts index 31d4375a5f266..59d414d8e1eea 100644 --- a/src/plugins/discover/public/components/doc_table/utils/get_sort.ts +++ b/src/plugins/discover/public/utils/sorting/get_sort.ts @@ -8,10 +8,13 @@ import { isPlainObject } from 'lodash'; import { DataView } from '@kbn/data-views-plugin/public'; +import { IUiSettingsClient } from '@kbn/core/public'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; +import { DOC_HIDE_TIME_COLUMN_SETTING, SORT_DEFAULT_ORDER_SETTING } from '../../../common'; +import { getDefaultSort } from './get_default_sort'; export type SortPairObj = Record; -export type SortPairArr = [string, string]; -export type SortPair = SortPairArr | SortPairObj; +export type SortPair = SortOrder | SortPairObj; export type SortInput = SortPair | SortPair[]; export function isSortable(fieldName: string, dataView: DataView): boolean { @@ -25,7 +28,7 @@ function createSortObject(sortPair: SortInput, dataView: DataView): SortPairObj sortPair.length === 2 && isSortable(String(sortPair[0]), dataView) ) { - const [field, direction] = sortPair as SortPairArr; + const [field, direction] = sortPair as SortOrder; return { [field]: direction }; } else if (isPlainObject(sortPair) && isSortable(Object.keys(sortPair)[0], dataView)) { return sortPair as SortPairObj; @@ -62,8 +65,8 @@ export function getSort(sort: SortPair[] | SortPair, dataView: DataView): SortPa * compared to getSort it doesn't return an array of objects, it returns an array of arrays * [[fieldToSort: directionToSort]] */ -export function getSortArray(sort: SortPair[], dataView: DataView): SortPairArr[] { - return getSort(sort, dataView).reduce((acc: SortPairArr[], sortPair) => { +export function getSortArray(sort: SortInput, dataView: DataView): SortOrder[] { + return getSort(sort, dataView).reduce((acc: SortOrder[], sortPair) => { const entries = Object.entries(sortPair); if (entries && entries[0]) { acc.push(entries[0]); @@ -71,3 +74,22 @@ export function getSortArray(sort: SortPair[], dataView: DataView): SortPairArr[ return acc; }, []); } + +/** + * sorting for embeddable, like getSortArray,but returning a default in the case the given sort or dataView is not valid + */ +export function getSortForEmbeddable( + sort?: SortInput, + dataView?: DataView, + uiSettings?: IUiSettingsClient +): SortOrder[] { + if (!sort || !sort.length || !dataView) { + if (!uiSettings) { + return []; + } + const defaultSortOrder = uiSettings.get(SORT_DEFAULT_ORDER_SETTING, 'desc'); + const hidingTimeColumn = uiSettings.get(DOC_HIDE_TIME_COLUMN_SETTING, false); + return getDefaultSort(dataView, defaultSortOrder, hidingTimeColumn); + } + return getSortArray(sort, dataView); +} diff --git a/src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.test.ts b/src/plugins/discover/public/utils/sorting/get_sort_for_search_source.test.ts similarity index 96% rename from src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.test.ts rename to src/plugins/discover/public/utils/sorting/get_sort_for_search_source.test.ts index 729d74cb710fa..dd54b5d2a70a2 100644 --- a/src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.test.ts +++ b/src/plugins/discover/public/utils/sorting/get_sort_for_search_source.test.ts @@ -5,9 +5,8 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { getSortForSearchSource } from './get_sort_for_search_source'; -import { SortOrder } from '../components/table_header/helpers'; import { stubDataView, stubDataViewWithoutTimeField } from '@kbn/data-plugin/common/stubs'; describe('getSortForSearchSource function', function () { diff --git a/src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.ts b/src/plugins/discover/public/utils/sorting/get_sort_for_search_source.ts similarity index 96% rename from src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.ts rename to src/plugins/discover/public/utils/sorting/get_sort_for_search_source.ts index c3f8badc0a536..bcf0ccf4d0e30 100644 --- a/src/plugins/discover/public/components/doc_table/utils/get_sort_for_search_source.ts +++ b/src/plugins/discover/public/utils/sorting/get_sort_for_search_source.ts @@ -8,7 +8,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { EsQuerySortValue } from '@kbn/data-plugin/public'; -import { SortOrder } from '../components/table_header/helpers'; +import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { getSort } from './get_sort'; /** diff --git a/src/plugins/discover/public/components/doc_table/index.ts b/src/plugins/discover/public/utils/sorting/index.ts similarity index 59% rename from src/plugins/discover/public/components/doc_table/index.ts rename to src/plugins/discover/public/utils/sorting/index.ts index e79276b0c9687..1d7f3ce6d671a 100644 --- a/src/plugins/discover/public/components/doc_table/index.ts +++ b/src/plugins/discover/public/utils/sorting/index.ts @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - -export { getSort, getSortArray } from './utils/get_sort'; -export { getSortForSearchSource } from './utils/get_sort_for_search_source'; -export { getDefaultSort } from './utils/get_default_sort'; +export { getSort, getSortArray, getSortForEmbeddable } from './get_sort'; +export { getSortForSearchSource } from './get_sort_for_search_source'; +export { getDefaultSort } from './get_default_sort'; +export type { SortPair } from './get_sort'; diff --git a/test/functional/apps/discover/group2/_data_grid_context.ts b/test/functional/apps/discover/group2/_data_grid_context.ts index 549e02f60137f..4903cd446dfc9 100644 --- a/test/functional/apps/discover/group2/_data_grid_context.ts +++ b/test/functional/apps/discover/group2/_data_grid_context.ts @@ -16,6 +16,7 @@ const TEST_FILTER_COLUMN_NAMES = [ ]; export default function ({ getService, getPageObjects }: FtrProviderContext) { + const log = getService('log'); const retry = getService('retry'); const filterBar = getService('filterBar'); const dataGrid = getService('dataGrid'); @@ -114,6 +115,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await retry.waitFor('document table has a length of 6', async () => { const nrOfDocs = (await dataGrid.getBodyRows()).length; + log.debug('document table length', nrOfDocs); return nrOfDocs === 6; }); });