Skip to content

Commit

Permalink
Add 'New' button support
Browse files Browse the repository at this point in the history
  • Loading branch information
davismcphee committed Mar 5, 2025
1 parent b246bee commit 14becb8
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import { useEffect, useMemo, useState } from 'react';
import { useMemo } from 'react';
import { i18n } from '@kbn/i18n';
import type { DataView } from '@kbn/data-views-plugin/public';
import type { TopNavMenuData } from '@kbn/navigation-plugin/public';
import { METRIC_TYPE } from '@kbn/analytics';
import { ENABLE_ESQL } from '@kbn/esql-utils';
import { ENABLE_ESQL, getInitialESQLQuery } from '@kbn/esql-utils';
import { AppMenuItemPrimary, AppMenuItemSecondary, AppMenuRegistry } from '@kbn/discover-utils';
import { ESQL_TYPE } from '@kbn/data-view-utils';
import { DISCOVER_APP_ID } from '@kbn/deeplinks-analytics';
import { createDataViewDataSource } from '../../../../../common/data_sources';
import { ESQL_TRANSITION_MODAL_KEY } from '../../../../../common/constants';
import { DiscoverServices } from '../../../../build_services';
import { onSaveSearch } from './on_save_search';
Expand All @@ -29,7 +32,13 @@ import {
} from './app_menu_actions';
import type { TopNavCustomization } from '../../../../customizations';
import { useProfileAccessor } from '../../../../context_awareness';
import { internalStateActions, useInternalStateDispatch } from '../../state_management/redux';
import {
internalStateActions,
useCurrentDataView,
useInternalStateDispatch,
} from '../../state_management/redux';
import { DiscoverAppLocatorParams } from '../../../../../common';
import { DiscoverAppState } from '../../state_management/discover_app_state_container';

/**
* Helper function to build the top nav links
Expand All @@ -54,14 +63,7 @@ export const useTopNavLinks = ({
shouldShowESQLToDataViewTransitionModal: boolean;
}): TopNavMenuData[] => {
const dispatch = useInternalStateDispatch();
const [newSearchUrl, setNewSearchUrl] = useState<string | undefined>(undefined);
useEffect(() => {
const fetchData = async () => {
const url = await services.locator.getUrl({});
setNewSearchUrl(url);
};
fetchData();
}, [services]);
const currentDataView = useCurrentDataView();

const discoverParams: AppMenuDiscoverParams = useMemo(
() => ({
Expand Down Expand Up @@ -100,10 +102,24 @@ export const useTopNavLinks = ({
}

if (!defaultMenu?.newItem?.disabled) {
const defaultEsqlState: Pick<DiscoverAppState, 'query'> | undefined =
isEsqlMode && currentDataView.type === ESQL_TYPE
? { query: { esql: getInitialESQLQuery(currentDataView) } }
: undefined;
const locatorParams: DiscoverAppLocatorParams = defaultEsqlState
? defaultEsqlState
: currentDataView.isPersisted()
? { dataViewId: currentDataView.id }
: { dataViewSpec: currentDataView.toMinimalSpec() };
const newSearchMenuItem = getNewSearchAppMenuItem({
newSearchUrl,
newSearchUrl: services.locator.getRedirectUrl(locatorParams),
onNewSearch: () => {
services.locator.navigate({});
const initialState: DiscoverAppState = defaultEsqlState ?? {
dataSource: currentDataView.id
? createDataViewDataSource({ dataViewId: currentDataView.id })
: undefined,
};
services.application.navigateToApp(DISCOVER_APP_ID, { state: { initialState } });
},
});
items.push(newSearchMenuItem);
Expand All @@ -126,7 +142,15 @@ export const useTopNavLinks = ({
}

return items;
}, [discoverParams, state, services, defaultMenu, onOpenInspector, newSearchUrl]);
}, [
defaultMenu,
services,
onOpenInspector,
discoverParams,
state,
isEsqlMode,
currentDataView,
]);

const getAppMenuAccessor = useProfileAccessor('getAppMenu');
const appMenuRegistry = useMemo(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import useLatest from 'react-use/lib/useLatest';
import { cloneDeep } from 'lodash';
import { getInitialESQLQuery } from '@kbn/esql-utils';
import { ESQL_TYPE } from '@kbn/data-view-utils';
import { isOfAggregateQueryType } from '@kbn/es-query';
import { createEsqlDataSource, isEsqlSource } from '../../../common/data_sources';
import { useDiscoverServices } from '../../hooks/use_discover_services';
import { CustomizationCallback, DiscoverCustomizationContext } from '../../customizations';
Expand Down Expand Up @@ -180,6 +181,12 @@ interface DiscoverSessionViewProps {
initializeMain: InitializeMain;
}

interface SessionInitializationState {
showNoDataPage: boolean;
}

type InitializeSession = (initialState?: DiscoverAppState) => Promise<SessionInitializationState>;

const DiscoverSessionView = ({
rootProfileState,
mainInitializationState,
Expand All @@ -204,16 +211,18 @@ const DiscoverSessionView = ({
() => getScopedHistory<MainHistoryLocationState>()?.location.state
);
const { initializeProfileDataViews } = useDefaultAdHocDataViews2({ rootProfileState });
const initialize = useLatest(async () => {
const initialize = useLatest<InitializeSession>(async (initialState = {}) => {
const discoverSessionLoadTracker = ebtManager.trackPerformanceEvent('discoverLoadSavedSearch');
const urlState = cleanupUrlState(
urlStateStorage.get<AppStateUrl>(APP_STATE_URL_KEY) ?? {},
urlStateStorage.get<AppStateUrl>(APP_STATE_URL_KEY) ?? initialState,
uiSettings
);
const isEsqlQuery = isEsqlSource(urlState.dataSource);
const discoverSession = discoverSessionId
? await savedSearch.get(discoverSessionId)
: undefined;
const discoverSessionQuery = discoverSession?.searchSource.getField('query');
const isEsqlMode =
isEsqlSource(urlState.dataSource) || isOfAggregateQueryType(discoverSessionQuery);
const discoverSessionDataView = discoverSession?.searchSource.getField('index');
const discoverSessionHasAdHocDataView = Boolean(
discoverSessionDataView && !discoverSessionDataView.isPersisted()
Expand All @@ -222,7 +231,7 @@ const DiscoverSessionView = ({
const profileDataViewsExist = profileDataViews.length > 0;
const locationStateHasDataViewSpec = Boolean(historyLocationState?.dataViewSpec);
const canAccessWithoutPersistedDataView =
isEsqlQuery ||
isEsqlMode ||
discoverSessionHasAdHocDataView ||
profileDataViewsExist ||
locationStateHasDataViewSpec;
Expand Down Expand Up @@ -251,8 +260,8 @@ const DiscoverSessionView = ({

return { showNoDataPage: false };
});
const [initializationState, initializeSession] = useAsyncFn(
() => initialize.current(),
const [initializationState, initializeSession] = useAsyncFn<InitializeSession>(
(...params) => initialize.current(...params),
[initialize],
{
loading: true,
Expand Down Expand Up @@ -281,11 +290,9 @@ const DiscoverSessionView = ({
history,
savedSearchId: discoverSessionId,
onNewUrl: useCallback(() => {
initializeMain({
hasESData: true,
hasUserDataView: true,
});
}, [initializeMain]),
const scopedHistory = getScopedHistory<{ initialState?: DiscoverAppState }>();
initializeSession(scopedHistory?.location.state?.initialState);
}, [getScopedHistory, initializeSession]),
});

if (initializeSessionState.loading) {
Expand Down

0 comments on commit 14becb8

Please sign in to comment.