Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 1 addition & 35 deletions examples/discover_customization_examples/public/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import type { IconType } from '@elastic/eui';
import { EuiButton, EuiContextMenu, EuiFlexItem, EuiPopover } from '@elastic/eui';
import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/public';
import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public';
Expand Down Expand Up @@ -74,7 +73,6 @@ export class DiscoverCustomizationExamplesPlugin implements Plugin {
}}
scopedHistory={appMountParams.history}
customizationCallbacks={[this.customizationCallback]}
customizationContext={{ displayMode: 'standalone' }}
/>
</Route>
</Routes>
Expand Down Expand Up @@ -102,18 +100,8 @@ export class DiscoverCustomizationExamplesPlugin implements Plugin {
});
}

start(core: CoreStart, plugins: DiscoverCustomizationExamplesStartPlugins) {
start(_: CoreStart, plugins: DiscoverCustomizationExamplesStartPlugins) {
this.customizationCallback = ({ customizations, stateContainer }) => {
customizations.set({
id: 'top_nav',
defaultMenu: {
newItem: { disabled: true },
openItem: { disabled: true },
alertsItem: { disabled: true },
inspectItem: { disabled: true },
},
});

customizations.set({
id: 'search_bar',
CustomDataViewPicker: () => {
Expand Down Expand Up @@ -280,28 +268,6 @@ export class DiscoverCustomizationExamplesPlugin implements Plugin {
},
});

customizations.set({
id: 'flyout',
size: 650,
title: 'Example custom flyout',
actions: {
getActionItems: () =>
Array.from({ length: 5 }, (_, i) => {
const index = i + 1;
return {
id: `action-item-${index}`,
enabled: true,
label: `Action ${index}`,
iconType: ['faceHappy', 'faceNeutral', 'faceSad', 'infinity', 'bell'].at(
i
) as IconType,
dataTestSubj: `customActionItem${index}`,
onClick: () => alert(index),
};
}),
},
});

return () => {
// eslint-disable-next-line no-console
console.log('Cleaning up Logs explorer customizations');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import { buildDataTableRecord } from '@kbn/discover-utils';
import type { EsHitRecord } from '@kbn/discover-utils/types';
import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock';
import type { DiscoverAppState } from '../../state_management/redux';
import type { DiscoverCustomization } from '../../../../customizations';
import { createCustomizationService } from '../../../../customizations/customization_service';
import { DiscoverGrid } from '../../../../components/discover_grid';
import { createDataViewDataSource } from '../../../../../common/data_sources';
Expand Down Expand Up @@ -152,36 +151,13 @@ describe('Discover documents layout', () => {
expect(container.getCurrentTab().appState.grid?.columns?.someField.width).toEqual(206);
});

test('should render customisations', async () => {
const customization: DiscoverCustomization = {
id: 'data_table',
logsEnabled: true,
rowAdditionalLeadingControls: [],
};

customisationService.set(customization);
const component = await mountComponent(FetchStatus.COMPLETE, esHitsMock);
const discoverGridComponent = component.find(DiscoverGrid);
expect(discoverGridComponent.exists()).toBeTruthy();

expect(discoverGridComponent.prop('rowAdditionalLeadingControls')).toBe(
customization.rowAdditionalLeadingControls
);
expect(discoverGridComponent.prop('externalCustomRenderers')).toBeDefined();
});

describe('context awareness', () => {
it('should pass cell renderers from profile', async () => {
customisationService.set({
id: 'data_table',
logsEnabled: true,
});
await discoverServiceMock.profilesManager.resolveRootProfile({ solutionNavId: 'test' });
const component = await mountComponent(FetchStatus.COMPLETE, esHitsMock);
const discoverGridComponent = component.find(DiscoverGrid);
expect(discoverGridComponent.exists()).toBeTruthy();
expect(Object.keys(discoverGridComponent.prop('externalCustomRenderers')!)).toEqual([
'_source',
'rootProfile',
]);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,7 @@ import {
} from '../../../../utils/get_allowed_sample_size';
import { useFetchMoreRecords } from './use_fetch_more_records';
import { SelectedVSAvailableCallout } from './selected_vs_available_callout';
import { useDiscoverCustomization } from '../../../../customizations';
import { onResizeGridColumn } from '../../../../utils/on_resize_grid_column';
import { useContextualGridCustomisations } from '../../hooks/grid_customisations';
import { useIsEsqlMode } from '../../hooks/use_is_esql_mode';
import type {
CellRenderersExtensionParams,
Expand Down Expand Up @@ -457,14 +455,11 @@ function DiscoverDocumentsComponent({
[onAddFilter, dataView, cellRendererDensity, cellRendererRowHeight]
);

const { rowAdditionalLeadingControls } = useDiscoverCustomization('data_table') || {};
const { customCellRenderer } = useContextualGridCustomisations(cellRendererParams) || {};

const getCellRenderersAccessor = useProfileAccessor('getCellRenderers');
const cellRenderers = useMemo(() => {
const getCellRenderers = getCellRenderersAccessor(() => customCellRenderer ?? {});
const getCellRenderers = getCellRenderersAccessor(() => ({}));
return getCellRenderers(cellRendererParams);
}, [cellRendererParams, customCellRenderer, getCellRenderersAccessor]);
}, [cellRendererParams, getCellRenderersAccessor]);

const documents = useObservable(stateContainer.dataState.data$.documents$);

Expand Down Expand Up @@ -580,7 +575,6 @@ function DiscoverDocumentsComponent({
totalHits={totalHits}
onFetchMoreRecords={onFetchMoreRecords}
externalCustomRenderers={cellRenderers}
rowAdditionalLeadingControls={rowAdditionalLeadingControls}
dataGridDensityState={density}
onUpdateDataGridDensity={onUpdateDensity}
onUpdateESQLQuery={onUpdateESQLQuery}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import type { AggregateQuery, Query } from '@kbn/es-query';
import { buildDataTableRecord } from '@kbn/discover-utils';
import type { DataTableRecord } from '@kbn/discover-utils/types';
import type { DiscoverCustomizationId } from '../../../../customizations/customization_service';
import type { FieldListCustomization, SearchBarCustomization } from '../../../../customizations';
import type { SearchBarCustomization } from '../../../../customizations';
import { DiscoverTestProvider } from '../../../../__mocks__/test_provider';
import type { DataView } from '@kbn/data-views-plugin/common';
import type { UnifiedFieldListRestorableState } from '@kbn/unified-field-list';
Expand All @@ -47,11 +47,6 @@ const mockSearchBarCustomization: SearchBarCustomization = {
.mockName('CustomDataViewPickerMock'),
};

const mockFieldListCustomisation: FieldListCustomization = {
id: 'field_list',
logsFieldsEnabled: true,
};

let mockUseCustomizations = false;

jest.mock('../../../../customizations', () => ({
Expand All @@ -64,8 +59,6 @@ jest.mock('../../../../customizations', () => ({
switch (id) {
case 'search_bar':
return mockSearchBarCustomization;
case 'field_list':
return mockFieldListCustomisation;
default:
throw new Error(`Unknown customization id: ${id}`);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@ import { mountWithIntl } from '@kbn/test-jest-helpers';
import { dataViewMock } from '@kbn/discover-utils/src/__mocks__';
import type { DiscoverTopNavProps } from './discover_topnav';
import { DiscoverTopNav } from './discover_topnav';
import { sharePluginMock } from '@kbn/share-plugin/public/mocks';
import { discoverServiceMock as mockDiscoverService } from '../../../../__mocks__/services';
import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock';
import type { SearchBarCustomization, TopNavCustomization } from '../../../../customizations';
import type { SearchBarCustomization } from '../../../../customizations';
import type { DiscoverCustomizationId } from '../../../../customizations/customization_service';
import { useDiscoverCustomization } from '../../../../customizations';
import { useKibana } from '@kbn/kibana-react-plugin/public';
Expand All @@ -34,10 +33,6 @@ jest.mock('@kbn/kibana-react-plugin/public', () => ({
const MockCustomSearchBar: typeof mockDiscoverService.navigation.ui.AggregateQueryTopNavMenu =
() => <div data-test-subj="custom-search-bar" />;

const mockTopNavCustomization: TopNavCustomization = {
id: 'top_nav',
};

const mockSearchBarCustomization: SearchBarCustomization = {
id: 'search_bar',
CustomDataViewPicker: jest.fn(() => <div data-test-subj="custom-data-view-picker" />),
Expand Down Expand Up @@ -113,7 +108,6 @@ const getTestComponent = (props: DiscoverTopNavProps) =>

describe('Discover topnav component', () => {
beforeEach(() => {
mockTopNavCustomization.defaultMenu = undefined;
mockUseCustomizations = false;
capturedTopNavMenu = undefined;
jest.clearAllMocks();
Expand All @@ -124,8 +118,6 @@ describe('Discover topnav component', () => {
}

switch (id) {
case 'top_nav':
return mockTopNavCustomization;
case 'search_bar':
return mockSearchBarCustomization;
default:
Expand Down Expand Up @@ -160,83 +152,6 @@ describe('Discover topnav component', () => {
expect(capturedTopNavMenu?.primaryActionItem).toBeUndefined();
});

describe('top nav customization', () => {
it('should allow disabling default menu items', async () => {
mockUseCustomizations = true;
mockTopNavCustomization.defaultMenu = {
newItem: { disabled: true },
openItem: { disabled: true },
shareItem: { disabled: true },
alertsItem: { disabled: true },
inspectItem: { disabled: true },
saveItem: { disabled: true },
};
const props = getProps();
await act(async () => {
getTestComponent(props);
});

const itemIds = capturedTopNavMenu?.items?.map((item) => item.id) || [];
expect(itemIds).toEqual([]);
});

describe('share service available', () => {
let availableIntegrationsSpy: jest.SpyInstance;

beforeAll(() => {
mockDiscoverService.share = sharePluginMock.createStartContract();
});

afterAll(() => {
mockDiscoverService.share = undefined;
});

beforeEach(() => {
(availableIntegrationsSpy = jest.spyOn(
mockDiscoverService.share!,
'availableIntegrations'
)).mockImplementation(() => []);
});

it('will include share menu item if the share service is available', async () => {
const props = getProps();
await act(async () => {
getTestComponent(props);
});

const itemIds = capturedTopNavMenu?.items?.map((item) => item.id) || [];
expect(itemIds).toEqual(['inspect', 'new', 'open', 'share']);
expect(capturedTopNavMenu?.primaryActionItem?.id).toBe('save');
});

it('will include export menu item if there are export integrations available', async () => {
availableIntegrationsSpy.mockImplementation((_objectType, groupId) => {
if (groupId === 'export') {
return [
{
id: 'export',
shareType: 'integration',
groupId: 'export',
config: () => Promise.resolve({}),
},
];
}

return [];
});

const props = getProps();
await act(async () => {
getTestComponent(props);
});

const itemIds = capturedTopNavMenu?.items?.map((item) => item.id) || [];
expect(itemIds).toEqual(['inspect', 'new', 'open', 'export', 'share']);
expect(capturedTopNavMenu?.primaryActionItem?.id).toBe('save');
});
});
});

describe('search bar customization', () => {
it('should render custom Search Bar', async () => {
(useDiscoverCustomization as jest.Mock).mockImplementation((id: DiscoverCustomizationId) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import { useMemo } from 'react';
import type { DiscoverSession } from '@kbn/saved-search-plugin/common';
import { useIsWithinBreakpoints } from '@elastic/eui';
import { useDiscoverCustomization } from '../../../../customizations';
import { useDiscoverServices } from '../../../../hooks/use_discover_services';
import { useInspector } from '../../hooks/use_inspector';
import { useIsEsqlMode } from '../../hooks/use_is_esql_mode';
Expand All @@ -32,7 +31,6 @@ export const useDiscoverTopNav = ({
persistedDiscoverSession: DiscoverSession | undefined;
}) => {
const services = useDiscoverServices();
const topNavCustomization = useDiscoverCustomization('top_nav');
const hasUnsavedChanges = useInternalStateSelector((state) => state.hasUnsavedChanges);
const isMobile = useIsWithinBreakpoints(['xs']);

Expand Down Expand Up @@ -63,7 +61,6 @@ export const useDiscoverTopNav = ({
hasUnsavedChanges,
isEsqlMode,
adHocDataViews,
topNavCustomization,
hasShareIntegration,
persistedDiscoverSession,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ describe('useTopNavLinks', () => {
hasUnsavedChanges: false,
isEsqlMode: false,
adHocDataViews: [],
topNavCustomization: undefined,
hasShareIntegration,
persistedDiscoverSession: undefined,
...hookAttrs,
Expand Down Expand Up @@ -173,7 +172,6 @@ describe('useTopNavLinks', () => {
hasUnsavedChanges: false,
isEsqlMode: false,
adHocDataViews: [],
topNavCustomization: undefined,
hasShareIntegration: true,
persistedDiscoverSession: undefined,
}),
Expand Down
Loading
Loading