Skip to content

Commit

Permalink
try out useDiscoverLayout
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelolo24 committed May 22, 2023
1 parent 4b678be commit d11ab9e
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 8 deletions.
17 changes: 12 additions & 5 deletions src/plugins/discover/public/application/main/discover_main_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import React, { useCallback, useEffect } from 'react';
import { RootDragDropProvider } from '@kbn/dom-drag-drop';
import { useHistory } from 'react-router-dom';
import { CoreStart } from '@kbn/core/public';
import { useUrlTracking } from './hooks/use_url_tracking';
import { useSearchSession } from './hooks/use_search_session';
import { DiscoverStateContainer } from './services/discover_state';
Expand All @@ -19,6 +20,7 @@ import { useSavedSearchAliasMatchRedirect } from '../../hooks/saved_search_alias
import { useSavedSearchInitial } from './services/discover_state_provider';
import { useAdHocDataViews } from './hooks/use_adhoc_data_views';
import { useTextBasedQueryLanguage } from './hooks/use_text_based_query_language';
import { DiscoverServices } from '../../build_services';

const DiscoverLayoutMemoized = React.memo(DiscoverLayout);

Expand All @@ -27,13 +29,18 @@ export interface DiscoverMainProps {
* Central state container
*/
stateContainer: DiscoverStateContainer;

/**
* Services passed in
*/
providedServices?: Partial<CoreStart> & DiscoverServices;
}

export function DiscoverMainApp(props: DiscoverMainProps) {
const { stateContainer } = props;
const { providedServices, stateContainer } = props;
const savedSearch = useSavedSearchInitial();
const services = useDiscoverServices();
const { chrome, docLinks, data, spaces, history } = services;
const { chrome, docLinks, data, spaces, history } = services ?? providedServices;
const usedHistory = useHistory();
const navigateTo = useCallback(
(path: string) => {
Expand All @@ -47,21 +54,21 @@ export function DiscoverMainApp(props: DiscoverMainProps) {
/**
* Search session logic
*/
useSearchSession({ services, stateContainer });
useSearchSession({ services: services ?? providedServices, stateContainer });

/**
* Adhoc data views functionality
*/
const { persistDataView } = useAdHocDataViews({
stateContainer,
services,
services: services ?? providedServices,
});

/**
* State changes (data view, columns), when a text base query result is returned
*/
useTextBasedQueryLanguage({
dataViews: services.dataViews,
dataViews: services.dataViews ?? providedServices?.dataViews,
stateContainer,
});
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
} from '@kbn/shared-ux-page-analytics-no-data';
import { getSavedSearchFullPathUrl } from '@kbn/saved-search-plugin/public';
import useObservable from 'react-use/lib/useObservable';
import { CoreStart } from '@kbn/core/public';
import { useUrl } from './hooks/use_url';
import { useSingleton } from './hooks/use_singleton';
import { MainHistoryLocationState } from '../../../common/locator';
Expand All @@ -28,21 +29,23 @@ import { useDiscoverServices } from '../../hooks/use_discover_services';
import { getScopedHistory, getUrlTracker } from '../../kibana_services';
import { useAlertResultsToast } from './hooks/use_alert_results_toast';
import { DiscoverMainProvider } from './services/discover_state_provider';
import { DiscoverServices } from '../../build_services';

const DiscoverMainAppMemoized = memo(DiscoverMainApp);

interface DiscoverLandingParams {
id: string;
}

interface Props {
export interface Props {
isDev: boolean;
providedServices?: Partial<CoreStart> & DiscoverServices;
}

export function DiscoverMainRoute(props: Props) {
const history = useHistory();
const services = useDiscoverServices();
const { isDev } = props;
const { isDev, providedServices } = props;
const {
core,
chrome,
Expand All @@ -55,7 +58,7 @@ export function DiscoverMainRoute(props: Props) {
const stateContainer = useSingleton<DiscoverStateContainer>(() =>
getDiscoverStateContainer({
history,
services,
services: services ?? providedServices,
})
);
const [error, setError] = useState<Error>();
Expand Down Expand Up @@ -255,3 +258,5 @@ export function DiscoverMainRoute(props: Props) {
</DiscoverMainProvider>
);
}

export default DiscoverMainRoute;
26 changes: 26 additions & 0 deletions src/plugins/discover/public/application/services_provider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* 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 React from 'react';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { CellActionsProvider } from '@kbn/cell-actions';
import { DiscoverServices } from '../build_services';

export const ServicesContextProvider: React.FC<{ services: DiscoverServices }> = ({
services,
children,
}) => {
const { getTriggerCompatibleActions } = services.uiActions;
return (
<KibanaContextProvider services={services}>
<CellActionsProvider getTriggerCompatibleActions={getTriggerCompatibleActions}>
{children}
</CellActionsProvider>
</KibanaContextProvider>
);
};
38 changes: 38 additions & 0 deletions src/plugins/discover/public/exports/discover_app.tsx
Original file line number Diff line number Diff line change
@@ -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 React, { Suspense, useCallback } from 'react';
import { ServicesContextProvider } from '../application/services_provider';
import { DiscoverServices } from '../build_services';
import type { Props as DiscoverMainRouteProps } from '../application/main/discover_main_route';
import {
setHeaderActionMenuMounter,
setScopedHistory,
syncHistoryLocations,
} from '../kibana_services';

export type ExportedDiscoverMainRoute = Omit<DiscoverMainRouteProps, 'services'>;

const DiscoverMainRoute = React.lazy(() => import('../application/main/discover_main_route'));
export const useDiscoverMainRoute = (services: DiscoverServices) => {
return useCallback(
(history) => (props: ExportedDiscoverMainRoute) => {
setScopedHistory(history);
setHeaderActionMenuMounter(() => {});
syncHistoryLocations();
return (
<ServicesContextProvider services={services}>
<Suspense fallback={null}>
<DiscoverMainRoute {...{ ...props, services }} />
</Suspense>
</ServicesContextProvider>
);
},
[services]
);
};
5 changes: 5 additions & 0 deletions src/plugins/discover/public/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import {
import { DiscoverAppLocator, DiscoverAppLocatorDefinition } from '../common';
import { SEARCH_EMBEDDABLE_CELL_ACTIONS_TRIGGER } from './embeddable/constants';
import { useDiscoverGrid } from './exports/discover_grid';
import { useDiscoverMainRoute } from './exports/discover_app';

const DocViewerLegacyTable = React.lazy(
() => import('./services/doc_views/components/doc_viewer_table/legacy')
Expand Down Expand Up @@ -158,6 +159,7 @@ export interface DiscoverStart {
*/
readonly locator: undefined | DiscoverAppLocator;
useDiscoverGrid: () => ReturnType<typeof useDiscoverGrid>;
useDiscoverMainRoute: () => ReturnType<typeof useDiscoverMainRoute>;
}

/**
Expand Down Expand Up @@ -408,6 +410,9 @@ export class DiscoverPlugin
useDiscoverGrid: () => {
return useDiscoverGrid(services);
},
useDiscoverMainRoute: () => {
return useDiscoverMainRoute(services);
},
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,7 @@ export enum TimelineTabs {
pinned = 'pinned',
eql = 'eql',
session = 'session',
discover = 'discover',
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* 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; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React from 'react';
import { css } from '@emotion/react';
import { useHistory } from 'react-router-dom';
import { useKibana } from '../../../../common/lib/kibana';

const DiscoverTabContent = () => {
const history = useHistory();
const { discover } = useKibana().services;
const { useDiscoverMainRoute } = discover;
const getDiscoverLayout = useDiscoverMainRoute();
const DiscoverLayout = getDiscoverLayout(history);
return (
<div
css={css`
width: 100%;
overflow: scroll;
`}
>
<DiscoverLayout isDev={false} />
</div>
);
};

// eslint-disable-next-line import/no-default-export
export default DiscoverTabContent;
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ const GraphTabContent = lazy(() => import('../graph_tab_content'));
const NotesTabContent = lazy(() => import('../notes_tab_content'));
const PinnedTabContent = lazy(() => import('../pinned_tab_content'));
const SessionTabContent = lazy(() => import('../session_tab_content'));
const DiscoverTabContent = lazy(() => import('../discover_tab_content'));

interface BasicTimelineTab {
renderCellValue: (props: CellValueElementProps) => React.ReactNode;
Expand Down Expand Up @@ -130,6 +131,13 @@ const PinnedTab: React.FC<{
));
PinnedTab.displayName = 'PinnedTab';

const DiscoverTab: React.FC = memo(() => (
<Suspense fallback={<EuiSkeletonText lines={10} />}>
<DiscoverTabContent />
</Suspense>
));
DiscoverTab.displayName = 'DiscoverTab';

type ActiveTimelineTabProps = BasicTimelineTab & { activeTimelineTab: TimelineTabs };

const ActiveTimelineTab = memo<ActiveTimelineTabProps>(
Expand All @@ -143,6 +151,8 @@ const ActiveTimelineTab = memo<ActiveTimelineTabProps>(
return <NotesTab timelineId={timelineId} />;
case TimelineTabs.session:
return <SessionTab timelineId={timelineId} />;
case TimelineTabs.discover:
return <DiscoverTab />;
default:
return null;
}
Expand Down Expand Up @@ -183,6 +193,12 @@ const ActiveTimelineTab = memo<ActiveTimelineTabProps>(
timelineId={timelineId}
/>
</HideShowContainer>
<HideShowContainer
$isVisible={TimelineTabs.discover === activeTimelineTab}
data-test-subj={`timeline-tab-content-${TimelineTabs.discover}`}
>
<DiscoverTab />
</HideShowContainer>
{timelineType === TimelineType.default && (
<HideShowContainer
$isVisible={TimelineTabs.eql === activeTimelineTab}
Expand Down Expand Up @@ -309,6 +325,10 @@ const TabsContentComponent: React.FC<BasicTimelineTab> = ({
setActiveTab(TimelineTabs.session);
}, [setActiveTab]);

const setDiscoverAsActiveTab = useCallback(() => {
setActiveTab(TimelineTabs.discover);
}, [setActiveTab]);

useEffect(() => {
if (!graphEventId && activeTab === TimelineTabs.graph) {
setQueryAsActiveTab();
Expand Down Expand Up @@ -389,6 +409,15 @@ const TabsContentComponent: React.FC<BasicTimelineTab> = ({
</div>
)}
</StyledEuiTab>
<StyledEuiTab
data-test-subj={`timelineTabs-${TimelineTabs.discover}`}
onClick={setDiscoverAsActiveTab}
isSelected={activeTab === TimelineTabs.discover}
disabled={false}
key={TimelineTabs.discover}
>
<span>{i18n.DISCOVER_TAB}</span>
</StyledEuiTab>
</EuiTabs>
)}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,10 @@ export const SESSION_TAB = i18n.translate(
defaultMessage: 'Session View',
}
);

export const DISCOVER_TAB = i18n.translate(
'xpack.securitySolution.timeline.tabs.discoverTabTimelineTitle',
{
defaultMessage: 'Discover',
}
);

0 comments on commit d11ab9e

Please sign in to comment.