From 8e7d5ed2abc20123281cf160a07e292e992ddee5 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 16 Jul 2024 17:26:07 -0700 Subject: [PATCH 01/23] [UnifiedDataTable] Add density configuration --- packages/kbn-unified-data-table/README.md | 2 + .../src/components/data_table.tsx | 60 ++++++++++++------- .../kbn-unified-data-table/src/constants.ts | 3 +- .../src/hooks/use_density.test.tsx | 15 +++++ .../src/hooks/use_density.ts | 38 ++++++++++++ .../context/context_app_content.tsx | 1 + .../components/layout/discover_documents.tsx | 1 + .../public/embeddable/saved_search_grid.tsx | 1 + 8 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 packages/kbn-unified-data-table/src/hooks/use_density.test.tsx create mode 100644 packages/kbn-unified-data-table/src/hooks/use_density.ts diff --git a/packages/kbn-unified-data-table/README.md b/packages/kbn-unified-data-table/README.md index 576a676289d7a..d21dce18d5e89 100644 --- a/packages/kbn-unified-data-table/README.md +++ b/packages/kbn-unified-data-table/README.md @@ -52,6 +52,8 @@ Props description: | **externalCustomRenderers** | (optional)Record React.ReactNode>; | An optional settings for a specified fields rendering like links. Applied only for the listed fields rendering. | | **consumer** | (optional)string | Name of the UnifiedDataTable consumer component or application. | | **componentsTourSteps** | (optional)Record | Optional key/value pairs to set guided onboarding steps ids for a data table components included to guided tour. | +| **showDensitySelector** | (optional)boolean | Optional boolean to toggle whether or not to show the density selector. | +| **onUpdateDensity** | (optional)(EuiDataGridStyle) => void; | Optional callback when the density configuration is modified. | *Required **services** list: ``` diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index e52e8de117968..3cee7a6310ed5 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -31,6 +31,7 @@ import { EuiDataGridProps, EuiFlexGroup, EuiFlexItem, + EuiHorizontalRule, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import { @@ -75,7 +76,6 @@ import { import { useRowHeightsOptions } from '../hooks/use_row_heights_options'; import { DEFAULT_ROWS_PER_PAGE, - GRID_STYLE, ROWS_HEIGHT_OPTIONS, toolbarVisibility as toolbarVisibilityDefaults, } from '../constants'; @@ -90,6 +90,7 @@ import { getColorIndicatorControlColumn, type ColorIndicatorControlColumnParams, } from './custom_control_columns'; +import { useDensity } from '../hooks/use_density'; export type SortOrder = [string, string]; @@ -232,6 +233,14 @@ export interface UnifiedDataTableProps { * Update row height state */ onUpdateRowHeight?: (rowHeight: number) => void; + /** + * Whether or not to show the density selector + */ + showDensitySelector?: boolean; + /** + * Update row height state + */ + onUpdateDensity?: (density: EuiDataGridStyle) => void; /** * Is text base lang mode enabled */ @@ -467,6 +476,8 @@ export const UnifiedDataTable = ({ cellContext, renderCellPopover, getRowIndicator, + showDensitySelector = false, + onUpdateDensity, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; @@ -753,6 +764,8 @@ export const UnifiedDataTable = ({ onUpdateRowHeight, }); + const { density, onChangeDensity } = useDensity({ storage, consumer, onUpdateDensity }); + const euiGridColumns = useMemo( () => getEuiGridColumns({ @@ -940,29 +953,30 @@ export const UnifiedDataTable = ({ ); const showDisplaySelector = useMemo(() => { - const options: EuiDataGridToolBarVisibilityDisplaySelectorOptions = {}; - - if (onUpdateRowHeight) { - options.allowDensity = false; - } + const options: EuiDataGridToolBarVisibilityDisplaySelectorOptions = { + allowDensity: showDensitySelector, + }; if (onUpdateRowHeight || onUpdateHeaderRowHeight || onUpdateSampleSize) { options.allowRowHeight = false; options.allowResetButton = false; options.additionalDisplaySettings = ( - + <> + {showDensitySelector ? : ''} + + ); } @@ -1053,6 +1067,12 @@ export const UnifiedDataTable = ({ ); } + const gridStyle: EuiDataGridStyle = { + ...density, + onChange: onChangeDensity, + ...gridStyleOverride, + }; + return ( @@ -1106,7 +1126,7 @@ export const UnifiedDataTable = ({ toolbarVisibility={toolbarVisibility} rowHeightsOptions={rowHeightsOptions} inMemory={inMemory} - gridStyle={gridStyleOverride ?? GRID_STYLE} + gridStyle={gridStyle} renderCustomGridBody={renderCustomGridBody} renderCustomToolbar={renderCustomToolbarFn} trailingControlColumns={customTrailingControlColumn} diff --git a/packages/kbn-unified-data-table/src/constants.ts b/packages/kbn-unified-data-table/src/constants.ts index c2d5654c602c2..37bfa9dd6c12f 100644 --- a/packages/kbn-unified-data-table/src/constants.ts +++ b/packages/kbn-unified-data-table/src/constants.ts @@ -27,10 +27,11 @@ export const defaultMonacoEditorWidth = 370; export const defaultTimeColumnWidth = 212; export const kibanaJSON = 'kibana-json'; +// Matches the EuiDataGrid "compact" density options export const GRID_STYLE: EuiDataGridStyle = { border: 'horizontal', fontSize: 's', - cellPadding: 'l', + cellPadding: 's', rowHover: 'highlight', header: 'underline', stripes: true, diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx new file mode 100644 index 0000000000000..b661773c86de7 --- /dev/null +++ b/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +describe('useDensity', () => { + it('should apply density from local storage', () => {}); + + it('should apply density from configDensity', () => {}); + + it('should return onChangeDensity', () => {}); +}); diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.ts b/packages/kbn-unified-data-table/src/hooks/use_density.ts new file mode 100644 index 0000000000000..f2563e66186d4 --- /dev/null +++ b/packages/kbn-unified-data-table/src/hooks/use_density.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { useCallback, useState } from 'react'; +import { EuiDataGridStyle } from '@elastic/eui'; +import { GRID_STYLE } from '../constants'; + +interface UseDensityProps { + storage: Storage; + consumer: string; + onUpdateDensity?: (gridStyle: EuiDataGridStyle) => void; +} + +export const useDensity = ({ storage, consumer, onUpdateDensity }: UseDensityProps) => { + const [density, setDensity] = useState( + storage.get(`${consumer}:dataGridStyle`) ?? GRID_STYLE + ); + + const onChangeDensity = useCallback( + (newDensity: EuiDataGridStyle) => { + setDensity(newDensity); + storage.set(`${consumer}:dataGridStyle`, newDensity); + onUpdateDensity?.(newDensity); + }, + [consumer, storage, onUpdateDensity] + ); + + return { + density, + onChangeDensity, + }; +}; 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 6c82a9408d003..5562d5b9fb912 100644 --- a/src/plugins/discover/public/application/context/context_app_content.tsx +++ b/src/plugins/discover/public/application/context/context_app_content.tsx @@ -223,6 +223,7 @@ export function ContextAppContent({ configHeaderRowHeight={3} settings={gridSettings} onResize={onResize} + showDensitySelector={true} /> 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 9e061beffc4fc..70ecd9ef45b9c 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 @@ -436,6 +436,7 @@ function DiscoverDocumentsComponent({ customGridColumnsConfiguration={customGridColumnsConfiguration} customControlColumnsConfiguration={customControlColumnsConfiguration} additionalFieldGroups={additionalFieldGroups} + showDensitySelector={true} /> diff --git a/src/plugins/discover/public/embeddable/saved_search_grid.tsx b/src/plugins/discover/public/embeddable/saved_search_grid.tsx index 39a6dc1307c04..9069b003260db 100644 --- a/src/plugins/discover/public/embeddable/saved_search_grid.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_grid.tsx @@ -118,6 +118,7 @@ export function DiscoverGridEmbeddable(props: DiscoverGridEmbeddableProps) { configHeaderRowHeight={3} showFullScreenButton={false} className="unifiedDataTable" + showDensitySelector={true} /> ); From 61e9849b16f64e6390cd83144f73b5101322f51b Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Wed, 17 Jul 2024 16:29:20 -0700 Subject: [PATCH 02/23] Fill out unit tests --- .../src/hooks/use_density.test.tsx | 69 ++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx index b661773c86de7..cab5e33578b11 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx @@ -6,10 +6,73 @@ * Side Public License, v 1. */ +import type { EuiDataGridStyle } from '@elastic/eui'; +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { renderHook } from '@testing-library/react-hooks'; +import { useDensity } from './use_density'; + +const localStorageMock = { + get: jest.fn(), + set: jest.fn(), +}; + describe('useDensity', () => { - it('should apply density from local storage', () => {}); + beforeEach(() => { + localStorageMock.get.mockClear(); + localStorageMock.set.mockClear(); + }); + + it('should read from local storage', () => { + localStorageMock.get.mockReturnValue({ foo: 'bar' }); + const { result } = renderHook(() => + useDensity({ + storage: localStorageMock as unknown as Storage, + consumer: 'discover', + }) + ); + const { + current: { density }, + } = result; + expect(density).toMatchInlineSnapshot(` + Object { + "foo": "bar", + } + `); + }); + + it('should update local storage when onChangeDensity is called', () => { + const { result } = renderHook(() => + useDensity({ + storage: localStorageMock as unknown as Storage, + consumer: 'discover', + }) + ); + const { + current: { onChangeDensity }, + } = result; + + const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; + onChangeDensity(newValue); + + expect(localStorageMock.set).toBeCalledWith('discover:dataGridStyle', newValue); + }); + + it('should call provided onUpdateDensity with the updated value', () => { + const onUpdateDensity = jest.fn(); + const { result } = renderHook(() => + useDensity({ + storage: localStorageMock as unknown as Storage, + consumer: 'discover', + onUpdateDensity, + }) + ); + const { + current: { onChangeDensity }, + } = result; - it('should apply density from configDensity', () => {}); + const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; + onChangeDensity(newValue); - it('should return onChangeDensity', () => {}); + expect(onUpdateDensity).toBeCalledWith(newValue); + }); }); From 6457b74e67eda8870939feb2b240f14fcb3cb2dc Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Wed, 17 Jul 2024 16:30:41 -0700 Subject: [PATCH 03/23] Update comment text --- packages/kbn-unified-data-table/src/components/data_table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 3cee7a6310ed5..5f82fb671d3b7 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -238,7 +238,7 @@ export interface UnifiedDataTableProps { */ showDensitySelector?: boolean; /** - * Update row height state + * Callback when the density configuration is modified */ onUpdateDensity?: (density: EuiDataGridStyle) => void; /** From 68d0408fd1bb9af9ce60a8f45bb0de306482b143 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 19 Jul 2024 10:59:56 -0700 Subject: [PATCH 04/23] Fix source document view --- .../src/components/data_table.tsx | 7 +++++-- .../src/components/source_document.tsx | 4 +++- .../kbn-unified-data-table/src/hooks/use_density.ts | 10 ++++++++-- packages/kbn-unified-data-table/src/types.ts | 1 + .../src/utils/get_render_cell_value.tsx | 4 ++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 5f82fb671d3b7..1254d8fa60de0 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -621,6 +621,8 @@ export const UnifiedDataTable = ({ return getShouldShowFieldHandler(dataViewFields, dataView, showMultiFields); }, [dataView, showMultiFields]); + const { density, onChangeDensity } = useDensity({ storage, consumer, onUpdateDensity }); + /** * Cell rendering */ @@ -636,6 +638,7 @@ export const UnifiedDataTable = ({ maxEntries: maxDocFieldsDisplayed, externalCustomRenderers, isPlainRecord, + isCompressed: density.fontSize === 's', }), [ dataView, @@ -646,6 +649,7 @@ export const UnifiedDataTable = ({ fieldFormats, externalCustomRenderers, isPlainRecord, + density, ] ); @@ -764,8 +768,6 @@ export const UnifiedDataTable = ({ onUpdateRowHeight, }); - const { density, onChangeDensity } = useDensity({ storage, consumer, onUpdateDensity }); - const euiGridColumns = useMemo( () => getEuiGridColumns({ @@ -995,6 +997,7 @@ export const UnifiedDataTable = ({ rowHeight, rowHeightLines, sampleSizeState, + showDensitySelector, ]); const inMemory = useMemo(() => { diff --git a/packages/kbn-unified-data-table/src/components/source_document.tsx b/packages/kbn-unified-data-table/src/components/source_document.tsx index 3726159a6b2ea..952ca2d6103be 100644 --- a/packages/kbn-unified-data-table/src/components/source_document.tsx +++ b/packages/kbn-unified-data-table/src/components/source_document.tsx @@ -37,6 +37,7 @@ export function SourceDocument({ fieldFormats, dataTestSubj = 'discoverCellDescriptionList', className, + isCompressed = true, }: { useTopLevelObjectColumns: boolean; row: DataTableRecord; @@ -48,6 +49,7 @@ export function SourceDocument({ fieldFormats: FieldFormatsStart; dataTestSubj?: string; className?: string; + isCompressed?: boolean; }) { const pairs: FormattedHit = useTopLevelObjectColumns ? getTopLevelObjectPairs(row.raw, columnId, dataView, shouldShowFieldHandler).slice( @@ -59,7 +61,7 @@ export function SourceDocument({ return ( diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.ts b/packages/kbn-unified-data-table/src/hooks/use_density.ts index f2563e66186d4..e9b3d60e601d9 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_density.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_density.ts @@ -14,12 +14,18 @@ import { GRID_STYLE } from '../constants'; interface UseDensityProps { storage: Storage; consumer: string; + densityState?: EuiDataGridStyle; onUpdateDensity?: (gridStyle: EuiDataGridStyle) => void; } -export const useDensity = ({ storage, consumer, onUpdateDensity }: UseDensityProps) => { +export const useDensity = ({ + storage, + consumer, + densityState, + onUpdateDensity, +}: UseDensityProps) => { const [density, setDensity] = useState( - storage.get(`${consumer}:dataGridStyle`) ?? GRID_STYLE + densityState ?? storage.get(`${consumer}:dataGridStyle`) ?? GRID_STYLE ); const onChangeDensity = useCallback( diff --git a/packages/kbn-unified-data-table/src/types.ts b/packages/kbn-unified-data-table/src/types.ts index 5914fa03f8827..5fe1d8bbdce6b 100644 --- a/packages/kbn-unified-data-table/src/types.ts +++ b/packages/kbn-unified-data-table/src/types.ts @@ -53,6 +53,7 @@ export type DataGridCellValueElementProps = EuiDataGridCellValueElementProps & { dataView: DataView; fieldFormats: FieldFormatsStart; closePopover: () => void; + isCompressed: boolean; }; export type CustomCellRenderer = Record< diff --git a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx index 6a10b0950946d..1b856d665d301 100644 --- a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx +++ b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.tsx @@ -36,6 +36,7 @@ export const getRenderCellValueFn = ({ maxEntries, externalCustomRenderers, isPlainRecord, + isCompressed = true, }: { dataView: DataView; rows: DataTableRecord[] | undefined; @@ -46,6 +47,7 @@ export const getRenderCellValueFn = ({ maxEntries: number; externalCustomRenderers?: CustomCellRenderer; isPlainRecord?: boolean; + isCompressed?: boolean; }) => { return function UnifiedDataTableRenderCellValue({ rowIndex, @@ -95,6 +97,7 @@ export const getRenderCellValueFn = ({ dataView={dataView} fieldFormats={fieldFormats} closePopover={closePopover} + isCompressed={isCompressed} /> ); @@ -134,6 +137,7 @@ export const getRenderCellValueFn = ({ shouldShowFieldHandler={shouldShowFieldHandler} maxEntries={maxEntries} isPlainRecord={isPlainRecord} + isCompressed={isCompressed} /> ); } From 96c4d659c9cc902b8cfcc7969797d161548c2cd3 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 19 Jul 2024 16:25:23 -0700 Subject: [PATCH 05/23] Use dataGridStyle instead of density --- .../src/components/data_table.tsx | 22 +++++---- ....test.tsx => use_data_grid_style.test.tsx} | 32 ++++++------- .../src/hooks/use_data_grid_style.ts | 47 +++++++++++++++++++ .../src/hooks/use_density.ts | 44 ----------------- 4 files changed, 76 insertions(+), 69 deletions(-) rename packages/kbn-unified-data-table/src/hooks/{use_density.test.tsx => use_data_grid_style.test.tsx} (69%) create mode 100644 packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts delete mode 100644 packages/kbn-unified-data-table/src/hooks/use_density.ts diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 1254d8fa60de0..642c11205f4fe 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -90,7 +90,7 @@ import { getColorIndicatorControlColumn, type ColorIndicatorControlColumnParams, } from './custom_control_columns'; -import { useDensity } from '../hooks/use_density'; +import { useDataGridStyle } from '../hooks/use_data_grid_style'; export type SortOrder = [string, string]; @@ -238,9 +238,9 @@ export interface UnifiedDataTableProps { */ showDensitySelector?: boolean; /** - * Callback when the density configuration is modified + * Callback when the data grid style configuration is modified */ - onUpdateDensity?: (density: EuiDataGridStyle) => void; + onUpdateDataGridStyle?: (dataGridStyle: EuiDataGridStyle) => void; /** * Is text base lang mode enabled */ @@ -477,7 +477,7 @@ export const UnifiedDataTable = ({ renderCellPopover, getRowIndicator, showDensitySelector = false, - onUpdateDensity, + onUpdateDataGridStyle, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; @@ -621,7 +621,11 @@ export const UnifiedDataTable = ({ return getShouldShowFieldHandler(dataViewFields, dataView, showMultiFields); }, [dataView, showMultiFields]); - const { density, onChangeDensity } = useDensity({ storage, consumer, onUpdateDensity }); + const { dataGridStyle, onChangeDataGridStyle } = useDataGridStyle({ + storage, + consumer, + onUpdateDataGridStyle, + }); /** * Cell rendering @@ -638,7 +642,7 @@ export const UnifiedDataTable = ({ maxEntries: maxDocFieldsDisplayed, externalCustomRenderers, isPlainRecord, - isCompressed: density.fontSize === 's', + isCompressed: dataGridStyle.fontSize === 's', }), [ dataView, @@ -649,7 +653,7 @@ export const UnifiedDataTable = ({ fieldFormats, externalCustomRenderers, isPlainRecord, - density, + dataGridStyle, ] ); @@ -1071,8 +1075,8 @@ export const UnifiedDataTable = ({ } const gridStyle: EuiDataGridStyle = { - ...density, - onChange: onChangeDensity, + ...dataGridStyle, + onChange: onChangeDataGridStyle, ...gridStyleOverride, }; diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx similarity index 69% rename from packages/kbn-unified-data-table/src/hooks/use_density.test.tsx rename to packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx index cab5e33578b11..6ddf1280af065 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_density.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx @@ -9,14 +9,14 @@ import type { EuiDataGridStyle } from '@elastic/eui'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { renderHook } from '@testing-library/react-hooks'; -import { useDensity } from './use_density'; +import { useDataGridStyle } from './use_data_grid_style'; const localStorageMock = { get: jest.fn(), set: jest.fn(), }; -describe('useDensity', () => { +describe('useDataGridStyle', () => { beforeEach(() => { localStorageMock.get.mockClear(); localStorageMock.set.mockClear(); @@ -25,54 +25,54 @@ describe('useDensity', () => { it('should read from local storage', () => { localStorageMock.get.mockReturnValue({ foo: 'bar' }); const { result } = renderHook(() => - useDensity({ + useDataGridStyle({ storage: localStorageMock as unknown as Storage, consumer: 'discover', }) ); const { - current: { density }, + current: { dataGridStyle }, } = result; - expect(density).toMatchInlineSnapshot(` + expect(dataGridStyle).toMatchInlineSnapshot(` Object { "foo": "bar", } `); }); - it('should update local storage when onChangeDensity is called', () => { + it('should update local storage when onChangeDataGridStyle is called', () => { const { result } = renderHook(() => - useDensity({ + useDataGridStyle({ storage: localStorageMock as unknown as Storage, consumer: 'discover', }) ); const { - current: { onChangeDensity }, + current: { onChangeDataGridStyle }, } = result; const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; - onChangeDensity(newValue); + onChangeDataGridStyle(newValue); expect(localStorageMock.set).toBeCalledWith('discover:dataGridStyle', newValue); }); - it('should call provided onUpdateDensity with the updated value', () => { - const onUpdateDensity = jest.fn(); + it('should call provided onUpdateDataGridStyle with the updated value', () => { + const onUpdateDataGridStyle = jest.fn(); const { result } = renderHook(() => - useDensity({ + useDataGridStyle({ storage: localStorageMock as unknown as Storage, consumer: 'discover', - onUpdateDensity, + onUpdateDataGridStyle, }) ); const { - current: { onChangeDensity }, + current: { onChangeDataGridStyle }, } = result; const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; - onChangeDensity(newValue); + onChangeDataGridStyle(newValue); - expect(onUpdateDensity).toBeCalledWith(newValue); + expect(onUpdateDataGridStyle).toBeCalledWith(newValue); }); }); diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts b/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts new file mode 100644 index 0000000000000..836935ac4c77c --- /dev/null +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { useCallback, useState } from 'react'; +import { EuiDataGridStyle } from '@elastic/eui'; +import { GRID_STYLE } from '../constants'; + +interface UseDataGridStyleProps { + storage: Storage; + consumer: string; + dataGridStyleState?: EuiDataGridStyle; + onUpdateDataGridStyle?: (gridStyle: EuiDataGridStyle) => void; +} + +export const DATA_GRID_STYLE_STORAGE_KEY = 'dataGridStyle'; + +export const useDataGridStyle = ({ + storage, + consumer, + dataGridStyleState, + onUpdateDataGridStyle, +}: UseDataGridStyleProps) => { + const storageKey = `${consumer}:${DATA_GRID_STYLE_STORAGE_KEY}`; + const [dataGridStyle, setDataGridStyle] = useState( + dataGridStyleState ?? storage.get(storageKey) ?? GRID_STYLE + ); + + const onChangeDataGridStyle = useCallback( + (newDataGridStyle: EuiDataGridStyle) => { + setDataGridStyle(newDataGridStyle); + storage.set(storageKey, newDataGridStyle); + onUpdateDataGridStyle?.(newDataGridStyle); + }, + [storageKey, storage, onUpdateDataGridStyle] + ); + + return { + dataGridStyle, + onChangeDataGridStyle, + }; +}; diff --git a/packages/kbn-unified-data-table/src/hooks/use_density.ts b/packages/kbn-unified-data-table/src/hooks/use_density.ts deleted file mode 100644 index e9b3d60e601d9..0000000000000 --- a/packages/kbn-unified-data-table/src/hooks/use_density.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { useCallback, useState } from 'react'; -import { EuiDataGridStyle } from '@elastic/eui'; -import { GRID_STYLE } from '../constants'; - -interface UseDensityProps { - storage: Storage; - consumer: string; - densityState?: EuiDataGridStyle; - onUpdateDensity?: (gridStyle: EuiDataGridStyle) => void; -} - -export const useDensity = ({ - storage, - consumer, - densityState, - onUpdateDensity, -}: UseDensityProps) => { - const [density, setDensity] = useState( - densityState ?? storage.get(`${consumer}:dataGridStyle`) ?? GRID_STYLE - ); - - const onChangeDensity = useCallback( - (newDensity: EuiDataGridStyle) => { - setDensity(newDensity); - storage.set(`${consumer}:dataGridStyle`, newDensity); - onUpdateDensity?.(newDensity); - }, - [consumer, storage, onUpdateDensity] - ); - - return { - density, - onChangeDensity, - }; -}; From 9868cafd415511c95d39f5ae1004e4cabd8bcc58 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 22 Jul 2024 16:13:19 -0700 Subject: [PATCH 06/23] Fix tests & types --- .../components/compare_documents/compare_documents.test.tsx | 2 +- .../kbn-unified-data-table/src/components/data_table.tsx | 2 +- packages/kbn-unified-data-table/src/types.ts | 2 +- .../src/utils/get_render_cell_value.test.tsx | 6 ++++++ .../public/application/context/context_app_content.tsx | 1 - .../components/timeline/unified_components/utils.test.ts | 2 +- 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.test.tsx b/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.test.tsx index 5bf4c631cf5cf..6327efaee1806 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.test.tsx +++ b/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.test.tsx @@ -108,7 +108,7 @@ describe('CompareDocuments', () => { "data-test-subj": "unifiedDataTableCompareDocuments", "gridStyle": Object { "border": "horizontal", - "cellPadding": "l", + "cellPadding": "s", "fontSize": "s", "header": "underline", "rowHover": "highlight", diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 642c11205f4fe..b3a4a9b01d191 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -960,7 +960,7 @@ export const UnifiedDataTable = ({ const showDisplaySelector = useMemo(() => { const options: EuiDataGridToolBarVisibilityDisplaySelectorOptions = { - allowDensity: showDensitySelector, + ...(showDensitySelector && { allowDensity: showDensitySelector }), }; if (onUpdateRowHeight || onUpdateHeaderRowHeight || onUpdateSampleSize) { diff --git a/packages/kbn-unified-data-table/src/types.ts b/packages/kbn-unified-data-table/src/types.ts index 5fe1d8bbdce6b..4b4de9bc7e33a 100644 --- a/packages/kbn-unified-data-table/src/types.ts +++ b/packages/kbn-unified-data-table/src/types.ts @@ -53,7 +53,7 @@ export type DataGridCellValueElementProps = EuiDataGridCellValueElementProps & { dataView: DataView; fieldFormats: FieldFormatsStart; closePopover: () => void; - isCompressed: boolean; + isCompressed?: boolean; }; export type CustomCellRenderer = Record< diff --git a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx index 04d160bef5c2e..5d9894e9bcd2c 100644 --- a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx +++ b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx @@ -224,6 +224,7 @@ describe('Unified data table cell rendering', function () { maxEntries: 100, shouldShowFieldHandler: showFieldHandler, row: rows[0], + isCompressed: true, }); }); @@ -329,6 +330,7 @@ describe('Unified data table cell rendering', function () { shouldShowFieldHandler: showFieldHandler, row: rows[0], isPlainRecord: true, + isCompressed: true, }); }); @@ -367,6 +369,7 @@ describe('Unified data table cell rendering', function () { maxEntries: 100, shouldShowFieldHandler: showFieldHandler, row: rows[0], + isCompressed: true, }); }); @@ -406,6 +409,7 @@ describe('Unified data table cell rendering', function () { maxEntries: 1, shouldShowFieldHandler: showFieldHandler, row: rows[0], + isCompressed: true, }); }); @@ -519,6 +523,7 @@ describe('Unified data table cell rendering', function () { shouldShowFieldHandler: showFieldHandler, useTopLevelObjectColumns: true, row: rows[0], + isCompressed: true, }); }); @@ -559,6 +564,7 @@ describe('Unified data table cell rendering', function () { shouldShowFieldHandler: showFieldHandler, useTopLevelObjectColumns: true, row: rows[0], + isCompressed: true, }); }); 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 5562d5b9fb912..6c82a9408d003 100644 --- a/src/plugins/discover/public/application/context/context_app_content.tsx +++ b/src/plugins/discover/public/application/context/context_app_content.tsx @@ -223,7 +223,6 @@ export function ContextAppContent({ configHeaderRowHeight={3} settings={gridSettings} onResize={onResize} - showDensitySelector={true} /> diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.test.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.test.ts index af346e9addabd..08a62bea9275a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.test.ts @@ -68,7 +68,7 @@ describe('utils', () => { expect(tableStylesOverride).toMatchInlineSnapshot(` Object { "border": "horizontal", - "cellPadding": "l", + "cellPadding": "s", "fontSize": "s", "header": "underline", "rowClasses": Object { From 1dc7401822cc17e356d8f88b4df381afb749143b Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 23 Jul 2024 13:54:15 -0700 Subject: [PATCH 07/23] Update snapshots & fix tests --- .../src/components/data_table.test.tsx | 48 ++++++++++-------- .../apps/discover/group5/_url_state.ts | 1 - .../dashboard_embed_mode_scrolling.png | Bin 88013 -> 85725 bytes 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index e1bd33f711949..d6365018a7b94 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -381,17 +381,19 @@ describe('UnifiedDataTable', () => { "additionalControls": null, "showColumnSelector": false, "showDisplaySelector": Object { - "additionalDisplaySettings": , - "allowDensity": false, + "additionalDisplaySettings": + + + , "allowResetButton": false, "allowRowHeight": false, }, @@ -413,16 +415,18 @@ describe('UnifiedDataTable', () => { "additionalControls": null, "showColumnSelector": false, "showDisplaySelector": Object { - "additionalDisplaySettings": , - "allowDensity": false, + "additionalDisplaySettings": + + + , "allowResetButton": false, "allowRowHeight": false, }, @@ -711,7 +715,7 @@ describe('UnifiedDataTable', () => { expect(grid.hasClass('euiDataGrid--bordersHorizontal')).toBeTruthy(); expect(grid.hasClass('euiDataGrid--fontSizeSmall')).toBeTruthy(); - expect(grid.hasClass('euiDataGrid--paddingLarge')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--paddingSmall')).toBeTruthy(); expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeTruthy(); expect(grid.hasClass('euiDataGrid--headerUnderline')).toBeTruthy(); expect(grid.hasClass('euiDataGrid--stripes')).toBeTruthy(); diff --git a/test/functional/apps/discover/group5/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts index 099fbed1589a3..0206bc43bbd21 100644 --- a/test/functional/apps/discover/group5/_url_state.ts +++ b/test/functional/apps/discover/group5/_url_state.ts @@ -178,7 +178,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 22, 2015 @ 20:41:53.463png1,969', 'Sep 22, 2015 @ 20:40:22.952jpg1,576', 'Sep 22, 2015 @ 20:11:39.532png1,708', - 'Sep 22, 2015 @ 19:45:13.813php1,406', ]); expect(await PageObjects.discover.getHitCount()).to.be(totalHitsForOneFilter); diff --git a/test/functional/screenshots/baseline/dashboard_embed_mode_scrolling.png b/test/functional/screenshots/baseline/dashboard_embed_mode_scrolling.png index 3fd3025ebb9a18b2f5b94dd38d4dcdb6f01a4a05..2f5e437ade253b9f070da4c91905b18545267095 100644 GIT binary patch literal 85725 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

C~WM5{x$yq|3I2g%Khqdp4G2U)VG0YjBnX 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 b4*udinU5;UTcr*GWWto>)#XZM9zOd&$?om0 From a1ba3597f433f08b6c43ec2c045a7219c3b56f99 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 26 Jul 2024 11:49:31 -0700 Subject: [PATCH 08/23] Use density key instead of data grid style --- .../src/components/data_table.tsx | 26 ++++--- .../kbn-unified-data-table/src/constants.ts | 25 +++++-- ...est.tsx => use_data_grid_density.test.tsx} | 47 ++++++------ .../src/hooks/use_data_grid_density.ts | 74 +++++++++++++++++++ .../src/hooks/use_data_grid_style.ts | 47 ------------ 5 files changed, 132 insertions(+), 87 deletions(-) rename packages/kbn-unified-data-table/src/hooks/{use_data_grid_style.test.tsx => use_data_grid_density.test.tsx} (52%) create mode 100644 packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts delete mode 100644 packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 6aa1f211a5ac6..803c40fde3c5b 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -48,6 +48,11 @@ import type { ThemeServiceStart } from '@kbn/react-kibana-context-common'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { AdditionalFieldGroups } from '@kbn/unified-field-list'; +import { + DATA_GRID_DENSITY_STYLE_MAP, + DataGridDensity, + useDataGridDensity, +} from '../hooks/use_data_grid_density'; import { UnifiedDataTableSettings, ValueToStringConverter, @@ -75,6 +80,7 @@ import { } from './data_table_document_selection'; import { useRowHeightsOptions } from '../hooks/use_row_heights_options'; import { + DATA_GRID_STYLE_DEFAULT, DEFAULT_ROWS_PER_PAGE, ROWS_HEIGHT_OPTIONS, toolbarVisibility as toolbarVisibilityDefaults, @@ -90,7 +96,6 @@ import { getColorIndicatorControlColumn, type ColorIndicatorControlColumnParams, } from './custom_control_columns'; -import { useDataGridStyle } from '../hooks/use_data_grid_style'; export type SortOrder = [string, string]; @@ -238,9 +243,9 @@ export interface UnifiedDataTableProps { */ showDensitySelector?: boolean; /** - * Callback when the data grid style configuration is modified + * Callback when the data grid density configuration is modified */ - onUpdateDataGridStyle?: (dataGridStyle: EuiDataGridStyle) => void; + onUpdateDataGridDensity?: (dataGridDensity: DataGridDensity) => void; /** * Is text base lang mode enabled */ @@ -477,7 +482,7 @@ export const UnifiedDataTable = ({ renderCellPopover, getRowIndicator, showDensitySelector = false, - onUpdateDataGridStyle, + onUpdateDataGridDensity, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; @@ -621,10 +626,10 @@ export const UnifiedDataTable = ({ return getShouldShowFieldHandler(dataViewFields, dataView, showMultiFields); }, [dataView, showMultiFields]); - const { dataGridStyle, onChangeDataGridStyle } = useDataGridStyle({ + const { dataGridDensity, onChangeDataGridDensity } = useDataGridDensity({ storage, consumer, - onUpdateDataGridStyle, + onUpdateDataGridDensity }); /** @@ -642,7 +647,7 @@ export const UnifiedDataTable = ({ maxEntries: maxDocFieldsDisplayed, externalCustomRenderers, isPlainRecord, - isCompressed: dataGridStyle.fontSize === 's', + isCompressed: dataGridDensity === DataGridDensity.COMPACT, }), [ dataView, @@ -653,7 +658,7 @@ export const UnifiedDataTable = ({ fieldFormats, externalCustomRenderers, isPlainRecord, - dataGridStyle, + dataGridDensity, ] ); @@ -1075,8 +1080,9 @@ export const UnifiedDataTable = ({ } const gridStyle: EuiDataGridStyle = { - ...dataGridStyle, - onChange: onChangeDataGridStyle, + ...DATA_GRID_STYLE_DEFAULT, + ...DATA_GRID_DENSITY_STYLE_MAP[dataGridDensity], + onChange: onChangeDataGridDensity, ...gridStyleOverride, }; diff --git a/packages/kbn-unified-data-table/src/constants.ts b/packages/kbn-unified-data-table/src/constants.ts index 37bfa9dd6c12f..6cbca7d371355 100644 --- a/packages/kbn-unified-data-table/src/constants.ts +++ b/packages/kbn-unified-data-table/src/constants.ts @@ -27,14 +27,29 @@ export const defaultMonacoEditorWidth = 370; export const defaultTimeColumnWidth = 212; export const kibanaJSON = 'kibana-json'; -// Matches the EuiDataGrid "compact" density options -export const GRID_STYLE: EuiDataGridStyle = { - border: 'horizontal', - fontSize: 's', +export const DATA_GRID_STYLE_COMPACT: EuiDataGridStyle = { cellPadding: 's', + fontSize: 's', +}; + +export const DATA_GRID_STYLE_NORMAL: EuiDataGridStyle = { + cellPadding: 'm', + fontSize: 'm', +}; + +export const DATA_GRID_STYLE_EXPANDED: EuiDataGridStyle = { + cellPadding: 'l', + fontSize: 'l', +}; + +export const DATA_GRID_STYLE_DEFAULT: EuiDataGridStyle = { + ...DATA_GRID_STYLE_COMPACT, + border: 'horizontal', + stripes: true, rowHover: 'highlight', header: 'underline', - stripes: true, + footer: 'overline', + stickyFooter: true, }; export const toolbarVisibility = { diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx similarity index 52% rename from packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx rename to packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx index 6ddf1280af065..607897399a840 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx @@ -6,73 +6,70 @@ * Side Public License, v 1. */ -import type { EuiDataGridStyle } from '@elastic/eui'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { renderHook } from '@testing-library/react-hooks'; -import { useDataGridStyle } from './use_data_grid_style'; +import { useDataGridDensity, DataGridDensity } from './use_data_grid_density'; +import { DATA_GRID_STYLE_EXPANDED } from '../constants'; const localStorageMock = { get: jest.fn(), set: jest.fn(), }; -describe('useDataGridStyle', () => { +describe('useDataGridDensity', () => { beforeEach(() => { localStorageMock.get.mockClear(); localStorageMock.set.mockClear(); }); it('should read from local storage', () => { - localStorageMock.get.mockReturnValue({ foo: 'bar' }); + localStorageMock.get.mockReturnValue(DataGridDensity.NORMAL); const { result } = renderHook(() => - useDataGridStyle({ + useDataGridDensity({ storage: localStorageMock as unknown as Storage, consumer: 'discover', }) ); const { - current: { dataGridStyle }, + current: { dataGridDensity }, } = result; - expect(dataGridStyle).toMatchInlineSnapshot(` - Object { - "foo": "bar", - } - `); + expect(dataGridDensity).toBe(DataGridDensity.NORMAL); }); - it('should update local storage when onChangeDataGridStyle is called', () => { + it('should update local storage when onChangeDataGridDensity is called', () => { const { result } = renderHook(() => - useDataGridStyle({ + useDataGridDensity({ storage: localStorageMock as unknown as Storage, consumer: 'discover', }) ); const { - current: { onChangeDataGridStyle }, + current: { onChangeDataGridDensity }, } = result; - const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; - onChangeDataGridStyle(newValue); + onChangeDataGridDensity(DATA_GRID_STYLE_EXPANDED); - expect(localStorageMock.set).toBeCalledWith('discover:dataGridStyle', newValue); + expect(localStorageMock.set).toBeCalledWith( + 'discover:dataGridDensity', + DataGridDensity.EXPANDED + ); }); - it('should call provided onUpdateDataGridStyle with the updated value', () => { - const onUpdateDataGridStyle = jest.fn(); + it('should call provided onUpdateDataGridDensity with the updated value', () => { + const onUpdateDataGridDensity = jest.fn(); const { result } = renderHook(() => - useDataGridStyle({ + useDataGridDensity({ storage: localStorageMock as unknown as Storage, consumer: 'discover', - onUpdateDataGridStyle, + onUpdateDataGridDensity, }) ); const { - current: { onChangeDataGridStyle }, + current: { onChangeDataGridDensity }, } = result; - const newValue: EuiDataGridStyle = { border: 'all', footer: 'shade' }; - onChangeDataGridStyle(newValue); + onChangeDataGridDensity(DATA_GRID_STYLE_EXPANDED); - expect(onUpdateDataGridStyle).toBeCalledWith(newValue); + expect(onUpdateDataGridDensity).toBeCalledWith(DataGridDensity.EXPANDED); }); }); diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts new file mode 100644 index 0000000000000..ccbffb5e38394 --- /dev/null +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { EuiDataGridStyle } from '@elastic/eui'; +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { useCallback, useState } from 'react'; +import { + DATA_GRID_STYLE_COMPACT, + DATA_GRID_STYLE_EXPANDED, + DATA_GRID_STYLE_NORMAL, +} from '../constants'; + +export enum DataGridDensity { + COMPACT = 'compact', + NORMAL = 'normal', + EXPANDED = 'expanded', +} + +export const DATA_GRID_DENSITY_STYLE_MAP = { + [DataGridDensity.COMPACT]: DATA_GRID_STYLE_COMPACT, + [DataGridDensity.NORMAL]: DATA_GRID_STYLE_NORMAL, + [DataGridDensity.EXPANDED]: DATA_GRID_STYLE_EXPANDED, +}; + +interface UseDataGridDensityProps { + storage: Storage; + consumer: string; + dataGridDensityState?: DataGridDensity; + onUpdateDataGridDensity?: (density: DataGridDensity) => void; +} + +export const DATA_GRID_DENSITY_STORAGE_KEY = 'dataGridDensity'; + +export function getDensityFromStyle(style: EuiDataGridStyle) { + return style.cellPadding === DATA_GRID_STYLE_COMPACT.cellPadding && + style.fontSize === DATA_GRID_STYLE_COMPACT.fontSize + ? DataGridDensity.COMPACT + : style.cellPadding === DATA_GRID_STYLE_NORMAL.cellPadding && + style.fontSize === DATA_GRID_STYLE_NORMAL.fontSize + ? DataGridDensity.NORMAL + : DataGridDensity.EXPANDED; +} + +export const useDataGridDensity = ({ + storage, + consumer, + dataGridDensityState, + onUpdateDataGridDensity, +}: UseDataGridDensityProps) => { + const storageKey = `${consumer}:${DATA_GRID_DENSITY_STORAGE_KEY}`; + const [dataGridDensity, setDensity] = useState( + dataGridDensityState ?? storage.get(storageKey) ?? DataGridDensity.COMPACT + ); + + const onChangeDataGridDensity = useCallback( + (gridStyle: EuiDataGridStyle) => { + const newDensity = getDensityFromStyle(gridStyle); + setDensity(newDensity); + storage.set(storageKey, newDensity); + onUpdateDataGridDensity?.(newDensity); + }, + [storageKey, storage, onUpdateDataGridDensity] + ); + + return { + dataGridDensity, + onChangeDataGridDensity, + }; +}; diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts b/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts deleted file mode 100644 index 836935ac4c77c..0000000000000 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_style.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { useCallback, useState } from 'react'; -import { EuiDataGridStyle } from '@elastic/eui'; -import { GRID_STYLE } from '../constants'; - -interface UseDataGridStyleProps { - storage: Storage; - consumer: string; - dataGridStyleState?: EuiDataGridStyle; - onUpdateDataGridStyle?: (gridStyle: EuiDataGridStyle) => void; -} - -export const DATA_GRID_STYLE_STORAGE_KEY = 'dataGridStyle'; - -export const useDataGridStyle = ({ - storage, - consumer, - dataGridStyleState, - onUpdateDataGridStyle, -}: UseDataGridStyleProps) => { - const storageKey = `${consumer}:${DATA_GRID_STYLE_STORAGE_KEY}`; - const [dataGridStyle, setDataGridStyle] = useState( - dataGridStyleState ?? storage.get(storageKey) ?? GRID_STYLE - ); - - const onChangeDataGridStyle = useCallback( - (newDataGridStyle: EuiDataGridStyle) => { - setDataGridStyle(newDataGridStyle); - storage.set(storageKey, newDataGridStyle); - onUpdateDataGridStyle?.(newDataGridStyle); - }, - [storageKey, storage, onUpdateDataGridStyle] - ); - - return { - dataGridStyle, - onChangeDataGridStyle, - }; -}; From 185f791c1dc77fbcde4c7f4d5b571c64fd902432 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 26 Jul 2024 12:49:57 -0700 Subject: [PATCH 09/23] Review feedback --- packages/kbn-unified-data-table/README.md | 2 +- .../src/components/data_table.tsx | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/kbn-unified-data-table/README.md b/packages/kbn-unified-data-table/README.md index d21dce18d5e89..22fa89baf8118 100644 --- a/packages/kbn-unified-data-table/README.md +++ b/packages/kbn-unified-data-table/README.md @@ -53,7 +53,7 @@ Props description: | **consumer** | (optional)string | Name of the UnifiedDataTable consumer component or application. | | **componentsTourSteps** | (optional)Record | Optional key/value pairs to set guided onboarding steps ids for a data table components included to guided tour. | | **showDensitySelector** | (optional)boolean | Optional boolean to toggle whether or not to show the density selector. | -| **onUpdateDensity** | (optional)(EuiDataGridStyle) => void; | Optional callback when the density configuration is modified. | +| **onUpdateDataGridDensity** | (optional)(DataGridDensity) => void; | Optional callback when the data grid density configuration is modified. | *Required **services** list: ``` diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 803c40fde3c5b..dada10c9ab0d9 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -629,9 +629,19 @@ export const UnifiedDataTable = ({ const { dataGridDensity, onChangeDataGridDensity } = useDataGridDensity({ storage, consumer, - onUpdateDataGridDensity + onUpdateDataGridDensity, }); + const gridStyle = useMemo( + () => ({ + ...DATA_GRID_STYLE_DEFAULT, + ...DATA_GRID_DENSITY_STYLE_MAP[dataGridDensity], + onChange: onChangeDataGridDensity, + ...gridStyleOverride, + }), + [dataGridDensity, onChangeDataGridDensity, gridStyleOverride] + ); + /** * Cell rendering */ @@ -973,7 +983,7 @@ export const UnifiedDataTable = ({ options.allowResetButton = false; options.additionalDisplaySettings = ( <> - {showDensitySelector ? : ''} + {showDensitySelector ? : null} From b1e456b15ae80bde889a8035dadc9ea46d78caf9 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 26 Jul 2024 14:11:27 -0700 Subject: [PATCH 10/23] Fix references to grid style --- .../src/components/compare_documents/compare_documents.tsx | 4 ++-- .../components/timeline/unified_components/utils.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.tsx b/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.tsx index f04e8888f37a4..4dfa78b73f707 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.tsx +++ b/packages/kbn-unified-data-table/src/components/compare_documents/compare_documents.tsx @@ -24,7 +24,7 @@ import { AdditionalFieldGroups } from '@kbn/unified-field-list'; import { memoize } from 'lodash'; import React, { useMemo, useState } from 'react'; import useLocalStorage from 'react-use/lib/useLocalStorage'; -import { GRID_STYLE } from '../../constants'; +import { DATA_GRID_STYLE_DEFAULT } from '../../constants'; import { ComparisonControls } from './comparison_controls'; import { renderComparisonToolbar } from './comparison_toolbar'; import { useComparisonCellValue } from './hooks/use_comparison_cell_value'; @@ -55,7 +55,7 @@ export interface CompareDocumentsProps { const COMPARISON_ROW_HEIGHT: EuiDataGridRowHeightsOptions = { defaultHeight: 'auto' }; const COMPARISON_IN_MEMORY: EuiDataGridInMemory = { level: 'sorting' }; -const COMPARISON_GRID_STYLE: EuiDataGridStyle = { ...GRID_STYLE, stripes: undefined }; +const COMPARISON_GRID_STYLE: EuiDataGridStyle = { ...DATA_GRID_STYLE_DEFAULT, stripes: undefined }; const getStorageKey = (consumer: string, key: string) => `${consumer}:dataGridComparison${key}`; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.ts index f76b3c45c303e..3679d9a251ebc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/utils.ts @@ -9,7 +9,7 @@ import type { EuiDataGridStyle } from '@elastic/eui'; import { flattenHit } from '@kbn/data-service'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { DataTableRecord } from '@kbn/discover-utils/types'; -import { GRID_STYLE } from '@kbn/unified-data-table/src/constants'; +import { DATA_GRID_STYLE_DEFAULT } from '@kbn/unified-data-table/src/constants'; import type { TimelineItem } from '../../../../../common/search_strategy'; import { getEventTypeRowClassName } from './data_table/get_event_type_row_classname'; @@ -56,5 +56,8 @@ export function transformTimelineItemToUnifiedRows( }; }); - return { tableRows: unifiedDataTableRows, tableStylesOverride: { ...GRID_STYLE, rowClasses } }; + return { + tableRows: unifiedDataTableRows, + tableStylesOverride: { ...DATA_GRID_STYLE_DEFAULT, rowClasses }, + }; } From 9158a2e3bb5bd28610dd29a9ade948f007c2f25e Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Fri, 26 Jul 2024 16:09:21 -0700 Subject: [PATCH 11/23] Fix tests --- .../kbn-unified-data-table/src/components/data_table.test.tsx | 2 -- packages/kbn-unified-data-table/src/constants.ts | 2 -- test/functional/apps/discover/group5/_url_state.ts | 3 ++- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index d6365018a7b94..91cfa9b3b9db7 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -382,7 +382,6 @@ describe('UnifiedDataTable', () => { "showColumnSelector": false, "showDisplaySelector": Object { "additionalDisplaySettings": - { "showColumnSelector": false, "showDisplaySelector": Object { "additionalDisplaySettings": - { + describe.only('discover URL state', () => { before(async function () { log.debug('load kibana index with default index pattern'); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); @@ -178,6 +178,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 22, 2015 @ 20:41:53.463png1,969', 'Sep 22, 2015 @ 20:40:22.952jpg1,576', 'Sep 22, 2015 @ 20:11:39.532png1,708', + 'Sep 22, 2015 @ 19:45:13.813php1,406', ]); expect(await PageObjects.discover.getHitCount()).to.be(totalHitsForOneFilter); From 101d31106fb7406efcf5d1375a00e576faf7dc8a Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 29 Jul 2024 08:39:01 -0700 Subject: [PATCH 12/23] Remove .only --- test/functional/apps/discover/group5/_url_state.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/apps/discover/group5/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts index 3700d5def6109..099fbed1589a3 100644 --- a/test/functional/apps/discover/group5/_url_state.ts +++ b/test/functional/apps/discover/group5/_url_state.ts @@ -35,7 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { hideAnnouncements: true, }; - describe.only('discover URL state', () => { + describe('discover URL state', () => { before(async function () { log.debug('load kibana index with default index pattern'); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); From 0ae4b4b5463b1df35685c7c75c85e36191d83a56 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 29 Jul 2024 10:19:17 -0700 Subject: [PATCH 13/23] Update test --- test/functional/apps/discover/group5/_url_state.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/apps/discover/group5/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts index 099fbed1589a3..5c90880f8f6ee 100644 --- a/test/functional/apps/discover/group5/_url_state.ts +++ b/test/functional/apps/discover/group5/_url_state.ts @@ -179,6 +179,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 22, 2015 @ 20:40:22.952jpg1,576', 'Sep 22, 2015 @ 20:11:39.532png1,708', 'Sep 22, 2015 @ 19:45:13.813php1,406', + 'Sep 22, 2015 @ 19:40:17.903jpg1,557', ]); expect(await PageObjects.discover.getHitCount()).to.be(totalHitsForOneFilter); From 3cf607aeb31f86e80d489416969c937cb520d62f Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 29 Jul 2024 17:09:15 -0700 Subject: [PATCH 14/23] Fix test --- test/functional/apps/discover/group5/_url_state.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/apps/discover/group5/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts index 5c90880f8f6ee..2516f2ed08659 100644 --- a/test/functional/apps/discover/group5/_url_state.ts +++ b/test/functional/apps/discover/group5/_url_state.ts @@ -205,6 +205,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 22, 2015 @ 18:50:22.335css1,841', 'Sep 22, 2015 @ 18:40:32.329css1,945', 'Sep 22, 2015 @ 18:13:35.361css1,752', + 'Sep 22, 2015 @ 17:22:12.782css1,583', ]; expect(await dataGrid.getRowsText()).to.eql(filteredRows); From 55ad28f0084c23df33cade881ebd8ea003f25016 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Wed, 31 Jul 2024 14:37:19 -0700 Subject: [PATCH 15/23] Add density to saved search config --- packages/kbn-unified-data-table/index.ts | 2 +- .../src/components/data_table.tsx | 13 +- .../kbn-unified-data-table/src/constants.ts | 9 +- .../src/hooks/use_data_grid_density.test.tsx | 4 +- .../src/hooks/use_data_grid_density.ts | 7 +- packages/kbn-unified-data-table/src/types.ts | 2 + .../components/layout/discover_documents.tsx | 46 ++++-- .../discover_app_state_container.ts | 5 + .../state_management/discover_state.test.ts | 1 + .../utils/get_state_defaults.test.ts | 2 + .../utils/get_state_defaults.ts | 4 + .../utils/update_saved_search.ts | 1 + .../embeddable/__mocks__/get_mocked_api.ts | 3 +- .../search_embeddable_grid_component.tsx | 6 +- .../discover/public/embeddable/constants.ts | 1 + .../initialize_search_embeddable_api.tsx | 5 +- .../discover/public/embeddable/types.ts | 1 + .../content_management/v1/cm_services.ts | 7 + .../common/saved_searches_utils.ts | 1 + .../common/service/get_saved_searches.test.ts | 2 + .../service/saved_searches_utils.test.ts | 2 + .../common/service/saved_searches_utils.ts | 1 + src/plugins/saved_search/common/types.ts | 2 + .../saved_searches/to_saved_search.test.ts | 131 +++++++++--------- .../saved_search_storage.ts | 1 + .../server/saved_objects/schema.ts | 6 + .../server/saved_objects/search.ts | 8 ++ 27 files changed, 176 insertions(+), 97 deletions(-) diff --git a/packages/kbn-unified-data-table/index.ts b/packages/kbn-unified-data-table/index.ts index 0929c33208fa0..3ce957f5b81a6 100644 --- a/packages/kbn-unified-data-table/index.ts +++ b/packages/kbn-unified-data-table/index.ts @@ -14,7 +14,7 @@ export { } from './src/components/row_height_settings'; export { getDisplayedColumns } from './src/utils/columns'; export { getTextBasedColumnsMeta } from './src/utils/get_columns_meta'; -export { ROWS_HEIGHT_OPTIONS } from './src/constants'; +export { ROWS_HEIGHT_OPTIONS, DataGridDensity } from './src/constants'; export { JSONCodeEditorCommonMemoized } from './src/components/json_code_editor/json_code_editor_common'; diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index dada10c9ab0d9..415b4a6d606c2 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -48,11 +48,7 @@ import type { ThemeServiceStart } from '@kbn/react-kibana-context-common'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { AdditionalFieldGroups } from '@kbn/unified-field-list'; -import { - DATA_GRID_DENSITY_STYLE_MAP, - DataGridDensity, - useDataGridDensity, -} from '../hooks/use_data_grid_density'; +import { DATA_GRID_DENSITY_STYLE_MAP, useDataGridDensity } from '../hooks/use_data_grid_density'; import { UnifiedDataTableSettings, ValueToStringConverter, @@ -84,6 +80,7 @@ import { DEFAULT_ROWS_PER_PAGE, ROWS_HEIGHT_OPTIONS, toolbarVisibility as toolbarVisibilityDefaults, + DataGridDensity, } from '../constants'; import { UnifiedDataTableFooter } from './data_table_footer'; import { UnifiedDataTableAdditionalDisplaySettings } from './data_table_additional_display_settings'; @@ -242,6 +239,10 @@ export interface UnifiedDataTableProps { * Whether or not to show the density selector */ showDensitySelector?: boolean; + /** + * Density from state + */ + dataGridDensityState?: DataGridDensity; /** * Callback when the data grid density configuration is modified */ @@ -482,6 +483,7 @@ export const UnifiedDataTable = ({ renderCellPopover, getRowIndicator, showDensitySelector = false, + dataGridDensityState, onUpdateDataGridDensity, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = @@ -629,6 +631,7 @@ export const UnifiedDataTable = ({ const { dataGridDensity, onChangeDataGridDensity } = useDataGridDensity({ storage, consumer, + dataGridDensityState, onUpdateDataGridDensity, }); diff --git a/packages/kbn-unified-data-table/src/constants.ts b/packages/kbn-unified-data-table/src/constants.ts index 4ba2eab2ebe49..84179747b6eb4 100644 --- a/packages/kbn-unified-data-table/src/constants.ts +++ b/packages/kbn-unified-data-table/src/constants.ts @@ -5,11 +5,10 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { EuiDataGridStyle } from '@elastic/eui'; +import type { EuiDataGridStyle } from '@elastic/eui'; export const DEFAULT_ROWS_PER_PAGE = 100; export const MAX_LOADED_GRID_ROWS = 10000; - export const ROWS_PER_PAGE_OPTIONS = [10, 25, 50, DEFAULT_ROWS_PER_PAGE, 250, 500]; /** * Row height might be a value from -1 to 20 @@ -56,3 +55,9 @@ export const toolbarVisibility = { allowReorder: true, }, }; + +export enum DataGridDensity { + COMPACT = 'compact', + NORMAL = 'normal', + EXPANDED = 'expanded', +} diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx index 607897399a840..8a6e3c96477ea 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx @@ -8,8 +8,8 @@ import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { renderHook } from '@testing-library/react-hooks'; -import { useDataGridDensity, DataGridDensity } from './use_data_grid_density'; -import { DATA_GRID_STYLE_EXPANDED } from '../constants'; +import { useDataGridDensity } from './use_data_grid_density'; +import { DATA_GRID_STYLE_EXPANDED, DataGridDensity } from '../constants'; const localStorageMock = { get: jest.fn(), diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts index ccbffb5e38394..d96be2f31a4f7 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts @@ -13,14 +13,9 @@ import { DATA_GRID_STYLE_COMPACT, DATA_GRID_STYLE_EXPANDED, DATA_GRID_STYLE_NORMAL, + DataGridDensity, } from '../constants'; -export enum DataGridDensity { - COMPACT = 'compact', - NORMAL = 'normal', - EXPANDED = 'expanded', -} - export const DATA_GRID_DENSITY_STYLE_MAP = { [DataGridDensity.COMPACT]: DATA_GRID_STYLE_COMPACT, [DataGridDensity.NORMAL]: DATA_GRID_STYLE_NORMAL, diff --git a/packages/kbn-unified-data-table/src/types.ts b/packages/kbn-unified-data-table/src/types.ts index 4b4de9bc7e33a..0cb7fb2e6c691 100644 --- a/packages/kbn-unified-data-table/src/types.ts +++ b/packages/kbn-unified-data-table/src/types.ts @@ -14,6 +14,8 @@ import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { EuiDataGridControlColumn } from '@elastic/eui/src/components/datagrid/data_grid_types'; import type { DatatableColumnMeta } from '@kbn/expressions-plugin/common'; +export type { DataGridDensity } from './constants'; + /** * User configurable state of data grid, persisted in saved search */ 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 70ecd9ef45b9c..4ed0fa96fbe4b 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 @@ -27,6 +27,7 @@ import { type DataTableColumnsMeta, getTextBasedColumnsMeta, getRenderCustomToolbarWithElements, + type DataGridDensity, } from '@kbn/unified-data-table'; import { DOC_HIDE_TIME_COLUMN_SETTING, @@ -110,19 +111,29 @@ function DiscoverDocumentsComponent({ const documents$ = stateContainer.dataState.data$.documents$; const savedSearch = useSavedSearchInitial(); const { dataViews, capabilities, uiSettings, uiActions } = services; - const [query, sort, rowHeight, headerRowHeight, rowsPerPage, grid, columns, sampleSizeState] = - useAppStateSelector((state) => { - return [ - state.query, - state.sort, - state.rowHeight, - state.headerRowHeight, - state.rowsPerPage, - state.grid, - state.columns, - state.sampleSize, - ]; - }); + const [ + query, + sort, + rowHeight, + headerRowHeight, + rowsPerPage, + grid, + columns, + sampleSizeState, + density, + ] = useAppStateSelector((state) => { + return [ + state.query, + state.sort, + state.rowHeight, + state.headerRowHeight, + state.rowsPerPage, + state.grid, + state.columns, + state.sampleSize, + state.density, + ]; + }); const expandedDoc = useInternalStateSelector((state) => state.expandedDoc); const isEsqlMode = useIsEsqlMode(); const useNewFieldsApi = useMemo(() => !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE), [uiSettings]); @@ -219,6 +230,13 @@ function DiscoverDocumentsComponent({ [stateContainer] ); + const onUpdateDensity = useCallback( + (newDensity: DataGridDensity) => { + stateContainer.appState.update({ density: newDensity }); + }, + [stateContainer] + ); + // should be aligned with embeddable `showTimeCol` prop const showTimeCol = useMemo( () => !uiSettings.get(DOC_HIDE_TIME_COLUMN_SETTING, false), @@ -437,6 +455,8 @@ function DiscoverDocumentsComponent({ customControlColumnsConfiguration={customControlColumnsConfiguration} additionalFieldGroups={additionalFieldGroups} showDensitySelector={true} + dataGridDensityState={density} + onUpdateDataGridDensity={onUpdateDensity} /> diff --git a/src/plugins/discover/public/application/main/state_management/discover_app_state_container.ts b/src/plugins/discover/public/application/main/state_management/discover_app_state_container.ts index 5ec9ca4d7215c..0ae6936365a0e 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_app_state_container.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_app_state_container.ts @@ -26,6 +26,7 @@ import { IKbnUrlStateStorage, ISyncStateRef, syncState } from '@kbn/kibana-utils import { isEqual, omit } from 'lodash'; import { connectToQueryState, syncGlobalQueryStateWithUrl } from '@kbn/data-plugin/public'; import type { DiscoverGridSettings } from '@kbn/saved-search-plugin/common'; +import type { DataGridDensity } from '@kbn/unified-data-table'; import type { DiscoverServices } from '../../../build_services'; import { addLog } from '../../../utils/add_log'; import { cleanupUrlState } from './utils/cleanup_url_state'; @@ -155,6 +156,10 @@ export interface DiscoverAppState { * Breakdown field of chart */ breakdownField?: string; + /** + * Density of table + */ + density?: DataGridDensity; } export const { Provider: DiscoverAppStateProvider, useSelector: useAppStateSelector } = diff --git a/src/plugins/discover/public/application/main/state_management/discover_state.test.ts b/src/plugins/discover/public/application/main/state_management/discover_state.test.ts index b56600b196944..9adedbe4a8cec 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_state.test.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_state.test.ts @@ -456,6 +456,7 @@ describe('Test discover state actions', () => { "columns": Array [ "default_column", ], + "density": undefined, "headerRowHeight": undefined, "hideAggregatedPreview": undefined, "hideChart": undefined, diff --git a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts index 86d9ffe99c244..8e264ea779c33 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts @@ -32,6 +32,7 @@ describe('getStateDefaults', () => { "dataViewId": "index-pattern-with-timefield-id", "type": "dataView", }, + "density": undefined, "filters": undefined, "grid": undefined, "headerRowHeight": undefined, @@ -71,6 +72,7 @@ describe('getStateDefaults', () => { "dataViewId": "the-data-view-id", "type": "dataView", }, + "density": undefined, "filters": undefined, "grid": undefined, "headerRowHeight": undefined, diff --git a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.ts b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.ts index 7e44adf64dbc1..81ec433da249a 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.ts @@ -81,6 +81,7 @@ export function getStateDefaults({ sampleSize: undefined, grid: undefined, breakdownField: undefined, + density: undefined, }; if (savedSearch.grid) { @@ -113,6 +114,9 @@ export function getStateDefaults({ if (savedSearch.breakdownField) { defaultState.breakdownField = savedSearch.breakdownField; } + if (savedSearch.density) { + defaultState.density = savedSearch.density; + } return defaultState; } diff --git a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts index 6638e511f6b2f..b767cde6c4a92 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts @@ -69,6 +69,7 @@ export function updateSavedSearch({ savedSearch.headerRowHeight = state.headerRowHeight; savedSearch.rowsPerPage = state.rowsPerPage; savedSearch.sampleSize = state.sampleSize; + savedSearch.density = state.density; if (state.viewMode) { savedSearch.viewMode = state.viewMode; diff --git a/src/plugins/discover/public/embeddable/__mocks__/get_mocked_api.ts b/src/plugins/discover/public/embeddable/__mocks__/get_mocked_api.ts index 0c324930e1f85..ea5ba55d8eccf 100644 --- a/src/plugins/discover/public/embeddable/__mocks__/get_mocked_api.ts +++ b/src/plugins/discover/public/embeddable/__mocks__/get_mocked_api.ts @@ -17,7 +17,7 @@ import { DatatableColumnMeta } from '@kbn/expressions-plugin/common'; import { FetchContext } from '@kbn/presentation-publishing'; import { DiscoverGridSettings, SavedSearch, VIEW_MODE } from '@kbn/saved-search-plugin/common'; import { SearchResponseIncompleteWarning } from '@kbn/search-response-warnings/src/types'; -import { SortOrder } from '@kbn/unified-data-table'; +import type { SortOrder, DataGridDensity } from '@kbn/unified-data-table'; export const getMockedSearchApi = ({ searchSource, @@ -52,6 +52,7 @@ export const getMockedSearchApi = ({ headerRowHeight: new BehaviorSubject(savedSearch.headerRowHeight), rowsPerPage: new BehaviorSubject(savedSearch.rowsPerPage), sampleSize: new BehaviorSubject(savedSearch.sampleSize), + density: new BehaviorSubject(savedSearch.density), grid: new BehaviorSubject(savedSearch.grid), rows: new BehaviorSubject([]), totalHitCount: new BehaviorSubject(0), diff --git a/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx b/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx index fe511f5887dd5..fa39e7b356dd4 100644 --- a/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx +++ b/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx @@ -22,7 +22,7 @@ import { } from '@kbn/presentation-publishing'; import { SortOrder } from '@kbn/saved-search-plugin/public'; import { SearchResponseIncompleteWarning } from '@kbn/search-response-warnings/src/types'; -import { columnActions, DataLoadingState } from '@kbn/unified-data-table'; +import { columnActions, DataGridDensity, DataLoadingState } from '@kbn/unified-data-table'; import { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { DiscoverDocTableEmbeddable } from '../../components/doc_table/create_doc_table_embeddable'; @@ -136,6 +136,9 @@ export function SearchEmbeddableGridComponent({ onUpdateSampleSize: (newSampleSize: number | undefined) => { stateManager.sampleSize.next(newSampleSize); }, + onUpdateDensity: (newDensity: DataGridDensity | undefined) => { + stateManager.density.next(newDensity); + }, }), [stateManager, savedSearch.columns] ); @@ -189,6 +192,7 @@ export function SearchEmbeddableGridComponent({ searchTitle={panelTitle || savedSearchTitle} services={discoverServices} showTimeCol={!discoverServices.uiSettings.get(DOC_HIDE_TIME_COLUMN_SETTING, false)} + dataGridDensityState={savedSearch.density} /> ); } diff --git a/src/plugins/discover/public/embeddable/constants.ts b/src/plugins/discover/public/embeddable/constants.ts index 7ada36e3a005d..2574c7abf2a8e 100644 --- a/src/plugins/discover/public/embeddable/constants.ts +++ b/src/plugins/discover/public/embeddable/constants.ts @@ -31,6 +31,7 @@ export const EDITABLE_SAVED_SEARCH_KEYS: Readonly(initialState.headerRowHeight); const sort$ = new BehaviorSubject(initialState.sort); const sampleSize$ = new BehaviorSubject(initialState.sampleSize); + const density$ = new BehaviorSubject(initialState.density); const savedSearchViewMode$ = new BehaviorSubject(initialState.viewMode); /** @@ -132,6 +133,7 @@ export const initializeSearchEmbeddableApi = async ( sort: sort$, totalHitCount: totalHitCount$, viewMode: savedSearchViewMode$, + density: density$, }; /** The saved search should be the source of truth for all state */ @@ -200,6 +202,7 @@ export const initializeSearchEmbeddableApi = async ( ], viewMode: [savedSearchViewMode$, (value) => savedSearchViewMode$.next(value)], grid: [grid$, (value) => grid$.next(value)], + density: [density$, (value) => density$.next(value)], }, }; }; diff --git a/src/plugins/discover/public/embeddable/types.ts b/src/plugins/discover/public/embeddable/types.ts index 8ff429e6476f9..70a929d1dee60 100644 --- a/src/plugins/discover/public/embeddable/types.ts +++ b/src/plugins/discover/public/embeddable/types.ts @@ -41,6 +41,7 @@ export type SearchEmbeddableState = Pick< | 'sampleSize' | 'viewMode' | 'grid' + | 'density' > & { rows: DataTableRecord[]; columnsMeta: DataTableColumnsMeta | undefined; diff --git a/src/plugins/saved_search/common/content_management/v1/cm_services.ts b/src/plugins/saved_search/common/content_management/v1/cm_services.ts index ef9d24bb8722d..7a3f8eb6d5e9d 100644 --- a/src/plugins/saved_search/common/content_management/v1/cm_services.ts +++ b/src/plugins/saved_search/common/content_management/v1/cm_services.ts @@ -72,6 +72,13 @@ const savedSearchAttributesSchema = schema.object( max: MAX_SAVED_SEARCH_SAMPLE_SIZE, }) ), + density: schema.maybe( + schema.oneOf([ + schema.literal('compact'), + schema.literal('normal'), + schema.literal('expanded'), + ]) + ), breakdownField: schema.maybe(schema.string()), visContext: schema.maybe( schema.oneOf([ diff --git a/src/plugins/saved_search/common/saved_searches_utils.ts b/src/plugins/saved_search/common/saved_searches_utils.ts index 232d5286ba32a..1151830f0d8ab 100644 --- a/src/plugins/saved_search/common/saved_searches_utils.ts +++ b/src/plugins/saved_search/common/saved_searches_utils.ts @@ -46,5 +46,6 @@ export const fromSavedSearchAttributes = < sampleSize: attributes.sampleSize, breakdownField: attributes.breakdownField, visContext: attributes.visContext, + density: attributes.density, managed, } as ReturnType); diff --git a/src/plugins/saved_search/common/service/get_saved_searches.test.ts b/src/plugins/saved_search/common/service/get_saved_searches.test.ts index 6572d6addbbbb..4f7d288e185d5 100644 --- a/src/plugins/saved_search/common/service/get_saved_searches.test.ts +++ b/src/plugins/saved_search/common/service/get_saved_searches.test.ts @@ -88,6 +88,7 @@ describe('getSavedSearch', () => { "columns": Array [ "_source", ], + "density": undefined, "description": "description", "grid": Object {}, "headerRowHeight": undefined, @@ -197,6 +198,7 @@ describe('getSavedSearch', () => { "columns": Array [ "_source", ], + "density": undefined, "description": "description", "grid": Object {}, "headerRowHeight": undefined, diff --git a/src/plugins/saved_search/common/service/saved_searches_utils.test.ts b/src/plugins/saved_search/common/service/saved_searches_utils.test.ts index ce8c073dd27c9..96845d7fea7fb 100644 --- a/src/plugins/saved_search/common/service/saved_searches_utils.test.ts +++ b/src/plugins/saved_search/common/service/saved_searches_utils.test.ts @@ -47,6 +47,7 @@ describe('saved_searches_utils', () => { "a", "b", ], + "density": undefined, "description": "foo", "grid": Object {}, "headerRowHeight": undefined, @@ -124,6 +125,7 @@ describe('saved_searches_utils', () => { "c", "d", ], + "density": undefined, "description": "description", "grid": Object {}, "headerRowHeight": undefined, diff --git a/src/plugins/saved_search/common/service/saved_searches_utils.ts b/src/plugins/saved_search/common/service/saved_searches_utils.ts index 866b9876d4dd4..24fcda3255a8c 100644 --- a/src/plugins/saved_search/common/service/saved_searches_utils.ts +++ b/src/plugins/saved_search/common/service/saved_searches_utils.ts @@ -52,6 +52,7 @@ export const toSavedSearchAttributes = ( refreshInterval: savedSearch.refreshInterval, rowsPerPage: savedSearch.rowsPerPage, sampleSize: savedSearch.sampleSize, + density: savedSearch.density, breakdownField: savedSearch.breakdownField, visContext: savedSearch.visContext, }); diff --git a/src/plugins/saved_search/common/types.ts b/src/plugins/saved_search/common/types.ts index fe41fd66042fe..4c5bab04705e5 100644 --- a/src/plugins/saved_search/common/types.ts +++ b/src/plugins/saved_search/common/types.ts @@ -15,6 +15,7 @@ import type { import type { SavedObjectReference } from '@kbn/core-saved-objects-server'; import type { SavedObjectsResolveResponse } from '@kbn/core/server'; import type { SerializableRecord } from '@kbn/utility-types'; +import type { DataGridDensity } from '@kbn/unified-data-table'; import { VIEW_MODE } from '.'; export interface DiscoverGridSettings extends SerializableRecord { @@ -64,6 +65,7 @@ export interface SavedSearchAttributes { rowsPerPage?: number; sampleSize?: number; breakdownField?: string; + density?: DataGridDensity; visContext?: VisContextUnmapped; } diff --git a/src/plugins/saved_search/public/services/saved_searches/to_saved_search.test.ts b/src/plugins/saved_search/public/services/saved_searches/to_saved_search.test.ts index a319188a49f63..968c29831e73b 100644 --- a/src/plugins/saved_search/public/services/saved_searches/to_saved_search.test.ts +++ b/src/plugins/saved_search/public/services/saved_searches/to_saved_search.test.ts @@ -52,72 +52,73 @@ describe('toSavedSearch', () => { }; const savedSearch = await byValueToSavedSearch({ attributes }, mockServices); expect(savedSearch).toMatchInlineSnapshot(` - Object { - "breakdownField": undefined, - "columns": Array [ - "message", - "extension", - ], - "description": "", - "grid": Object {}, - "headerRowHeight": undefined, - "hideAggregatedPreview": undefined, - "hideChart": false, - "id": undefined, - "isTextBasedQuery": false, - "managed": false, - "references": Array [ - Object { - "id": "1", - "name": "ref_0", - "type": "index-pattern", - }, - ], - "refreshInterval": undefined, - "rowHeight": undefined, - "rowsPerPage": undefined, - "sampleSize": undefined, - "searchSource": Object { - "create": [MockFunction], - "createChild": [MockFunction], - "createCopy": [MockFunction], - "destroy": [MockFunction], - "fetch": [MockFunction], - "fetch$": [MockFunction], - "getActiveIndexFilter": [MockFunction], - "getField": [MockFunction], - "getFields": [MockFunction], - "getId": [MockFunction], - "getOwnField": [MockFunction], - "getParent": [MockFunction], - "getSearchRequestBody": [MockFunction], - "getSerializedFields": [MockFunction], - "history": Array [], - "loadDataViewFields": [MockFunction], - "onRequestStart": [MockFunction], - "parseActiveIndexPatternFromQueryString": [MockFunction], - "removeField": [MockFunction], - "serialize": [MockFunction], - "setField": [MockFunction], - "setOverwriteDataViewType": [MockFunction], - "setParent": [MockFunction], - "toExpressionAst": [MockFunction], + Object { + "breakdownField": undefined, + "columns": Array [ + "message", + "extension", + ], + "density": undefined, + "description": "", + "grid": Object {}, + "headerRowHeight": undefined, + "hideAggregatedPreview": undefined, + "hideChart": false, + "id": undefined, + "isTextBasedQuery": false, + "managed": false, + "references": Array [ + Object { + "id": "1", + "name": "ref_0", + "type": "index-pattern", }, - "sharingSavedObjectProps": undefined, - "sort": Array [ - Array [ - "@timestamp", - "desc", - ], + ], + "refreshInterval": undefined, + "rowHeight": undefined, + "rowsPerPage": undefined, + "sampleSize": undefined, + "searchSource": Object { + "create": [MockFunction], + "createChild": [MockFunction], + "createCopy": [MockFunction], + "destroy": [MockFunction], + "fetch": [MockFunction], + "fetch$": [MockFunction], + "getActiveIndexFilter": [MockFunction], + "getField": [MockFunction], + "getFields": [MockFunction], + "getId": [MockFunction], + "getOwnField": [MockFunction], + "getParent": [MockFunction], + "getSearchRequestBody": [MockFunction], + "getSerializedFields": [MockFunction], + "history": Array [], + "loadDataViewFields": [MockFunction], + "onRequestStart": [MockFunction], + "parseActiveIndexPatternFromQueryString": [MockFunction], + "removeField": [MockFunction], + "serialize": [MockFunction], + "setField": [MockFunction], + "setOverwriteDataViewType": [MockFunction], + "setParent": [MockFunction], + "toExpressionAst": [MockFunction], + }, + "sharingSavedObjectProps": undefined, + "sort": Array [ + Array [ + "@timestamp", + "desc", ], - "tags": undefined, - "timeRange": undefined, - "timeRestore": undefined, - "title": "saved-search-title", - "usesAdHocDataView": undefined, - "viewMode": undefined, - "visContext": undefined, - } - `); + ], + "tags": undefined, + "timeRange": undefined, + "timeRestore": undefined, + "title": "saved-search-title", + "usesAdHocDataView": undefined, + "viewMode": undefined, + "visContext": undefined, + } + `); }); }); diff --git a/src/plugins/saved_search/server/content_management/saved_search_storage.ts b/src/plugins/saved_search/server/content_management/saved_search_storage.ts index d3ff8633637d2..3982bca7cf932 100644 --- a/src/plugins/saved_search/server/content_management/saved_search_storage.ts +++ b/src/plugins/saved_search/server/content_management/saved_search_storage.ts @@ -45,6 +45,7 @@ export class SavedSearchStorage extends SOContentStorage { 'rowsPerPage', 'breakdownField', 'sampleSize', + 'density', 'visContext', ], logger, diff --git a/src/plugins/saved_search/server/saved_objects/schema.ts b/src/plugins/saved_search/server/saved_objects/schema.ts index 125ddcceb320c..effbc6f7eeb24 100644 --- a/src/plugins/saved_search/server/saved_objects/schema.ts +++ b/src/plugins/saved_search/server/saved_objects/schema.ts @@ -129,3 +129,9 @@ export const SCHEMA_SEARCH_MODEL_VERSION_4 = SCHEMA_SEARCH_MODEL_VERSION_3.exten ]) ), }); + +export const SCHEMA_SEARCH_MODEL_VERSION_5 = SCHEMA_SEARCH_MODEL_VERSION_4.extends({ + density: schema.maybe( + schema.oneOf([schema.literal('compact'), schema.literal('normal'), schema.literal('expanded')]) + ), +}); diff --git a/src/plugins/saved_search/server/saved_objects/search.ts b/src/plugins/saved_search/server/saved_objects/search.ts index 925a4dd66b180..1295b4b378d98 100644 --- a/src/plugins/saved_search/server/saved_objects/search.ts +++ b/src/plugins/saved_search/server/saved_objects/search.ts @@ -16,6 +16,7 @@ import { SCHEMA_SEARCH_MODEL_VERSION_2, SCHEMA_SEARCH_MODEL_VERSION_3, SCHEMA_SEARCH_MODEL_VERSION_4, + SCHEMA_SEARCH_MODEL_VERSION_5, } from './schema'; export function getSavedSearchObjectType( @@ -70,6 +71,13 @@ export function getSavedSearchObjectType( create: SCHEMA_SEARCH_MODEL_VERSION_4, }, }, + 5: { + changes: [], + schemas: { + forwardCompatibility: SCHEMA_SEARCH_MODEL_VERSION_5.extends({}, { unknowns: 'ignore' }), + create: SCHEMA_SEARCH_MODEL_VERSION_5, + }, + }, }, mappings: { dynamic: false, From ed0866d69a7e2bcfbd299ac13e876a317bc689d7 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 31 Jul 2024 21:47:25 +0000 Subject: [PATCH 16/23] [CI] Auto-commit changed files from 'node scripts/lint_ts_projects --fix' --- src/plugins/saved_search/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/saved_search/tsconfig.json b/src/plugins/saved_search/tsconfig.json index 7100affb2e0c3..f96d7b385aa2c 100644 --- a/src/plugins/saved_search/tsconfig.json +++ b/src/plugins/saved_search/tsconfig.json @@ -28,6 +28,7 @@ "@kbn/utility-types", "@kbn/search-types", "@kbn/discover-utils", + "@kbn/unified-data-table", ], "exclude": ["target/**/*"] } From c899fe46c19067c7336bc07b487000346d50e29e Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 31 Jul 2024 22:29:52 +0000 Subject: [PATCH 17/23] [CI] Auto-commit changed files from 'node scripts/jest_integration -u src/core/server/integration_tests/ci_checks' --- .../ci_checks/saved_objects/check_registered_types.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 02ad163c43931..6234cb7423ae5 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -143,7 +143,7 @@ describe('checking migration metadata changes on all registered SO types', () => "risk-engine-configuration": "aea0c371a462e6d07c3ceb3aff11891b47feb09d", "rules-settings": "892a2918ebaeba809a612b8d97cec0b07c800b5f", "sample-data-telemetry": "37441b12f5b0159c2d6d5138a494c9f440e950b5", - "search": "4579401660a4089d5122b2fc8624825cb97b0480", + "search": "0aa6eefb37edd3145be340a8b67779c2ca578b22", "search-session": "b2fcd840e12a45039ada50b1355faeafa39876d1", "search-telemetry": "b568601618744720b5662946d3103e3fb75fe8ee", "security-rule": "07abb4d7e707d91675ec0495c73816394c7b521f", From 05e8f68edf216dfd47d1b6e22e329e76cb5f6437 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Thu, 1 Aug 2024 11:28:45 -0700 Subject: [PATCH 18/23] Fix additional row settings --- .../src/components/data_table.tsx | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 06b6afe300407..b664c225a7403 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -26,10 +26,10 @@ import { EuiDataGridInMemory, EuiDataGridControlColumn, EuiDataGridCustomBodyProps, - EuiDataGridToolBarVisibilityDisplaySelectorOptions, EuiDataGridStyle, EuiDataGridProps, EuiHorizontalRule, + EuiDataGridToolBarVisibilityDisplaySelectorOptions, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import { @@ -961,15 +961,23 @@ export const UnifiedDataTable = ({ [renderCustomToolbar, additionalControls] ); - const showDisplaySelector = useMemo(() => { - const options: EuiDataGridToolBarVisibilityDisplaySelectorOptions = { - ...(showDensitySelector && { allowDensity: showDensitySelector }), - }; + const showDisplaySelector = useMemo((): + | EuiDataGridToolBarVisibilityDisplaySelectorOptions + | undefined => { + if ( + !onUpdateDataGridDensity && + !onUpdateRowHeight && + !onUpdateHeaderRowHeight && + !onUpdateSampleSize + ) { + return; + } - if (onUpdateRowHeight || onUpdateHeaderRowHeight || onUpdateSampleSize) { - options.allowRowHeight = false; - options.allowResetButton = false; - options.additionalDisplaySettings = ( + return { + allowDensity: Boolean(onUpdateDataGridDensity), + allowRowHeight: false, + allowResetButton: false, + additionalDisplaySettings: ( <> {showDensitySelector ? : null} - ); - } - - return Object.keys(options).length ? options : undefined; + ), + }; }, [ headerRowHeight, headerRowHeightLines, @@ -1005,6 +1011,7 @@ export const UnifiedDataTable = ({ rowHeightLines, sampleSizeState, showDensitySelector, + onUpdateDataGridDensity, ]); const inMemory = useMemo(() => { From 73f460f9eda1e2afee0ea141ec8efd0221bc668f Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 6 Aug 2024 12:09:18 -0700 Subject: [PATCH 19/23] Update jest snapshots --- .../kbn-unified-data-table/src/components/data_table.test.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index 988c401778d3f..ea7afc2279ee1 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -393,6 +393,7 @@ describe('UnifiedDataTable', () => { sampleSize={150} /> , + "allowDensity": false, "allowResetButton": false, "allowRowHeight": false, }, @@ -425,6 +426,7 @@ describe('UnifiedDataTable', () => { sampleSize={200} /> , + "allowDensity": false, "allowResetButton": false, "allowRowHeight": false, }, From 1c215ef936126c0175913fb13b8579ab70cf0de4 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 12 Aug 2024 21:52:09 -0700 Subject: [PATCH 20/23] Review feedback & remove unnecessary state --- .../src/hooks/use_data_grid_density.ts | 9 ++++----- .../components/search_embeddable_grid_component.tsx | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts index d96be2f31a4f7..a53f95e23fb85 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts @@ -8,7 +8,7 @@ import type { EuiDataGridStyle } from '@elastic/eui'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { useCallback, useState } from 'react'; +import { useCallback, useMemo } from 'react'; import { DATA_GRID_STYLE_COMPACT, DATA_GRID_STYLE_EXPANDED, @@ -48,14 +48,13 @@ export const useDataGridDensity = ({ onUpdateDataGridDensity, }: UseDataGridDensityProps) => { const storageKey = `${consumer}:${DATA_GRID_DENSITY_STORAGE_KEY}`; - const [dataGridDensity, setDensity] = useState( - dataGridDensityState ?? storage.get(storageKey) ?? DataGridDensity.COMPACT - ); + const dataGridDensity = useMemo(() => { + return dataGridDensityState ?? storage.get(storageKey) ?? DataGridDensity.COMPACT; + }, [dataGridDensityState, storage, storageKey]); const onChangeDataGridDensity = useCallback( (gridStyle: EuiDataGridStyle) => { const newDensity = getDensityFromStyle(gridStyle); - setDensity(newDensity); storage.set(storageKey, newDensity); onUpdateDataGridDensity?.(newDensity); }, diff --git a/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx b/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx index 2aaeaacb8fe28..6f6ce57a78fd0 100644 --- a/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx +++ b/src/plugins/discover/public/embeddable/components/search_embeddable_grid_component.tsx @@ -137,7 +137,7 @@ export function SearchEmbeddableGridComponent({ onUpdateSampleSize: (newSampleSize: number | undefined) => { stateManager.sampleSize.next(newSampleSize); }, - onUpdateDensity: (newDensity: DataGridDensity | undefined) => { + onUpdateDataGridDensity: (newDensity: DataGridDensity | undefined) => { stateManager.density.next(newDensity); }, }), From 371ee2003dfe8dc69b756e11a7cb2c518cec9125 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 13 Aug 2024 11:41:58 -0700 Subject: [PATCH 21/23] Remove showDensitySelector prop --- packages/kbn-unified-data-table/README.md | 3 +-- .../kbn-unified-data-table/src/components/data_table.tsx | 8 +------- .../main/components/layout/discover_documents.tsx | 1 - .../public/embeddable/components/saved_search_grid.tsx | 1 - 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/kbn-unified-data-table/README.md b/packages/kbn-unified-data-table/README.md index 301327fcea135..0049949f74490 100644 --- a/packages/kbn-unified-data-table/README.md +++ b/packages/kbn-unified-data-table/README.md @@ -50,8 +50,7 @@ Props description: | **visibleCellActions** | (optional)number | An optional value for a custom number of the visible cell actions in the table. By default is up to 3. | | **externalCustomRenderers** | (optional)Record React.ReactNode>; | An optional settings for a specified fields rendering like links. Applied only for the listed fields rendering. | | **consumer** | (optional)string | Name of the UnifiedDataTable consumer component or application. | -| **componentsTourSteps** | (optional)Record | Optional key/value pairs to set guided onboarding steps ids for a data table components included to guided tour. | -| **showDensitySelector** | (optional)boolean | Optional boolean to toggle whether or not to show the density selector. | +| **componentsTourSteps** | (optional)Record | Optional key/value pairs to set guided onboarding steps ids for a data table components included to guided tour. |~~~~ | **onUpdateDataGridDensity** | (optional)(DataGridDensity) => void; | Optional callback when the data grid density configuration is modified. | *Required **services** list: diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index cce1a0ca79ccf..6503953281992 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -235,10 +235,6 @@ export interface UnifiedDataTableProps { * Update row height state */ onUpdateRowHeight?: (rowHeight: number) => void; - /** - * Whether or not to show the density selector - */ - showDensitySelector?: boolean; /** * Density from state */ @@ -483,7 +479,6 @@ export const UnifiedDataTable = ({ cellContext, renderCellPopover, getRowIndicator, - showDensitySelector = false, dataGridDensityState, onUpdateDataGridDensity, }: UnifiedDataTableProps) => { @@ -1005,7 +1000,7 @@ export const UnifiedDataTable = ({ allowResetButton: false, additionalDisplaySettings: ( <> - {showDensitySelector ? : null} + {onUpdateDataGridDensity ? : null} diff --git a/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx b/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx index 47e9252c82175..77d6f44de126b 100644 --- a/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx +++ b/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx @@ -117,7 +117,6 @@ export function DiscoverGridEmbeddable(props: DiscoverGridEmbeddableProps) { showColumnTokens showFullScreenButton={false} className="unifiedDataTable" - showDensitySelector={true} /> ); From b6b708a74f861b0d969600eafa5da9ef601e5e8e Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 13 Aug 2024 14:36:38 -0700 Subject: [PATCH 22/23] Workaround for EUI bug --- packages/kbn-unified-data-table/src/components/data_table.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 6503953281992..778c41c6f5365 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -1141,6 +1141,8 @@ export const UnifiedDataTable = ({ /> ) : ( Date: Wed, 14 Aug 2024 10:41:36 -0700 Subject: [PATCH 23/23] Add density functional tests --- .../group2_data_grid3/_data_grid_density.ts | 96 +++++++++++++++++++ .../apps/discover/group2_data_grid3/index.ts | 1 + test/functional/services/data_grid.ts | 12 +++ 3 files changed, 109 insertions(+) create mode 100644 test/functional/apps/discover/group2_data_grid3/_data_grid_density.ts diff --git a/test/functional/apps/discover/group2_data_grid3/_data_grid_density.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_density.ts new file mode 100644 index 0000000000000..45105fe907a0f --- /dev/null +++ b/test/functional/apps/discover/group2_data_grid3/_data_grid_density.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const dataGrid = getService('dataGrid'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['settings', 'common', 'discover', 'header', 'timePicker']); + const defaultSettings = { defaultIndex: 'logstash-*' }; + const security = getService('security'); + + describe('discover data grid density', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await browser.setWindowSize(1200, 2000); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({}); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + beforeEach(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should use the default density', async () => { + await dataGrid.clickGridSettings(); + const selected = await dataGrid.getCurrentDensityValue(); + expect(selected).to.be('Compact'); + }); + + it('should allow to change density', async () => { + await dataGrid.clickGridSettings(); + await dataGrid.changeDensityValue('Normal'); + + // toggle the popover + // Right now changing the density closes the popover (see packages/kbn-unified-data-table/src/components/data_table.tsx:1144) + // When that workaround is removed we will need to uncomment this next line + // await dataGrid.clickGridSettings(); + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentDensityValue()).to.be('Normal'); + }); + + it('should persist the density selection after reloading the page', async () => { + await dataGrid.clickGridSettings(); + await dataGrid.changeDensityValue('Expanded'); + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentDensityValue()).to.be('Expanded'); + + await browser.refresh(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentDensityValue()).to.be('Expanded'); + }); + + it('should save and revert unsaved densities properly', async () => { + // Open saved search + await PageObjects.discover.loadSavedSearch('A Saved Search'); + + // Change density + await dataGrid.clickGridSettings(); + await dataGrid.changeDensityValue('Expanded'); + await PageObjects.discover.saveUnsavedChanges(); + + // Change density + await dataGrid.clickGridSettings(); + await dataGrid.changeDensityValue('Normal'); + await testSubjects.existOrFail('unsavedChangesBadge'); + + // Revert change + await PageObjects.discover.revertUnsavedChanges(); + + // Verify density reset + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentDensityValue()).to.be('Expanded'); + }); + }); +} diff --git a/test/functional/apps/discover/group2_data_grid3/index.ts b/test/functional/apps/discover/group2_data_grid3/index.ts index b7a5e25a491b5..e3e0fd5b9d2be 100644 --- a/test/functional/apps/discover/group2_data_grid3/index.ts +++ b/test/functional/apps/discover/group2_data_grid3/index.ts @@ -25,5 +25,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_data_grid_row_selection')); loadTestFile(require.resolve('./_data_grid_sample_size')); loadTestFile(require.resolve('./_data_grid_pagination')); + loadTestFile(require.resolve('./_data_grid_density')); }); } diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index 70a67d33ffd00..1e66f61f2be36 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -512,6 +512,18 @@ export class DataGridService extends FtrService { await option.click(); } + public async getCurrentDensityValue() { + const buttonGroup = await this.testSubjects.find('densityButtonGroup'); + const selectedButton = await buttonGroup.findByCssSelector('[aria-pressed=true]'); + return selectedButton.getVisibleText(); + } + + public async changeDensityValue(newValue: string) { + const buttonGroup = await this.testSubjects.find('densityButtonGroup'); + const option = await buttonGroup.findByCssSelector(`[data-text="${newValue}"]`); + await option.click(); + } + private async findSampleSizeInput() { return await this.find.byCssSelector( 'input[type="number"][data-test-subj="unifiedDataTableSampleSizeInput"]'