diff --git a/src/platform/packages/shared/kbn-unified-data-table/src/components/data_table.tsx b/src/platform/packages/shared/kbn-unified-data-table/src/components/data_table.tsx index fee6c72f846bd..91dd4fdcba0d2 100644 --- a/src/platform/packages/shared/kbn-unified-data-table/src/components/data_table.tsx +++ b/src/platform/packages/shared/kbn-unified-data-table/src/components/data_table.tsx @@ -50,6 +50,7 @@ import type { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { AdditionalFieldGroups } from '@kbn/unified-field-list'; import { useDataGridInTableSearch } from '@kbn/data-grid-in-table-search'; import { useThrottleFn } from '@kbn/react-hooks'; +import { getDataViewFieldOrCreateFromColumnMeta } from '@kbn/data-view-utils'; import { DATA_GRID_DENSITY_STYLE_MAP, useDataGridDensity } from '../hooks/use_data_grid_density'; import { UnifiedDataTableSettings, @@ -819,21 +820,28 @@ export const UnifiedDataTable = ({ [displayedRows] ); - const cellActionsFields = useMemo( - () => - cellActionsTriggerId - ? visibleColumns.map( - (columnName) => - dataView.getFieldByName(columnName)?.toSpec() ?? { - name: '', - type: '', - aggregatable: false, - searchable: false, - } - ) - : undefined, - [cellActionsTriggerId, visibleColumns, dataView] - ); + const cellActionsFields = useMemo(() => { + if (!cellActionsTriggerId) { + return undefined; + } + + return visibleColumns.map((columnName) => { + const field = getDataViewFieldOrCreateFromColumnMeta({ + dataView, + fieldName: columnName, + columnMeta: columnsMeta?.[columnName], + }); + return ( + field?.toSpec() ?? { + name: '', + type: '', + aggregatable: false, + searchable: false, + } + ); + }); + }, [cellActionsTriggerId, visibleColumns, dataView, columnsMeta]); + const allCellActionsMetadata = useMemo( () => ({ dataViewId: dataView.id, ...(cellActionsMetadata ?? {}) }), [dataView, cellActionsMetadata] diff --git a/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx b/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx index df96e4ee57a37..1bb790ad0d76d 100644 --- a/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx +++ b/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx @@ -30,7 +30,6 @@ import { type DiscoverCellActionExecutionContext, } from '../types'; import { createContextAwarenessMocks } from '../__mocks__'; -import { DataViewField } from '@kbn/data-views-plugin/common'; let mockUuid = 0; @@ -237,12 +236,12 @@ describe('createCellAction', () => { ...context, data: [ { - field: new DataViewField({ - name: 'test', - type: 'string', - aggregatable: true, - searchable: true, - }), + field: { + name: '', + type: '', + aggregatable: false, + searchable: false, + }, }, ], metadata: { instanceId: 'test', dataView: dataViewWithTimefieldMock }, diff --git a/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.ts b/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.ts index e2f1a62cafdbb..add5298640888 100644 --- a/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.ts +++ b/src/platform/plugins/shared/discover/public/context_awareness/hooks/use_additional_cell_actions.ts @@ -88,9 +88,10 @@ export const createCellAction = ( return false; } - const field = data[0]?.field; + const fieldSpec = data[0]?.field; + const field = fieldSpec?.name ? metadata.dataView?.fields.create(fieldSpec) : undefined; - if (!field || !metadata.dataView?.getFieldByName(field.name)) { + if (!field) { return false; } diff --git a/src/platform/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts b/src/platform/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts index 18536bb9738c4..a263c4a95e239 100644 --- a/src/platform/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts +++ b/src/platform/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts @@ -58,6 +58,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await checkAlert('Another example data source action executed'); }); + it('should render additional cell actions for computed columns', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs | sort @timestamp desc | eval foo = "bar"', + }, + columns: ['foo'], + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickCellExpandButton(0, { columnName: 'foo' }); + await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); + await checkAlert('Example data source action executed'); + }); + it('should not render incompatible cell action for message column', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts index 810a9adb6b159..4fe76e19949ee 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts @@ -61,6 +61,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await checkAlert('Another example data source action executed'); }); + it('should render additional cell actions for computed columns', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs | sort @timestamp desc | eval foo = "bar"', + }, + columns: ['foo'], + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickCellExpandButton(0, { columnName: 'foo' }); + await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); + await checkAlert('Example data source action executed'); + }); + it('should not render incompatible cell action for message column', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' },