diff --git a/src/plugins/presentation_util/common/labs.ts b/src/plugins/presentation_util/common/labs.ts index d551b733ecb8..902c22681e55 100644 --- a/src/plugins/presentation_util/common/labs.ts +++ b/src/plugins/presentation_util/common/labs.ts @@ -8,8 +8,9 @@ import { i18n } from '@kbn/i18n'; -export const USE_DATA_SERVICE = 'labs:canvas:useDataService'; -export const TIME_TO_PRESENT = 'labs:presentation:timeToPresent'; +export const LABS_PROJECT_PREFIX = 'labs:'; +export const USE_DATA_SERVICE = `${LABS_PROJECT_PREFIX}canvas:useDataService` as const; +export const TIME_TO_PRESENT = `${LABS_PROJECT_PREFIX}presentation:timeToPresent` as const; export const projectIDs = [TIME_TO_PRESENT, USE_DATA_SERVICE] as const; export const environmentNames = ['kibana', 'browser', 'session'] as const; diff --git a/src/plugins/presentation_util/public/services/kibana/labs.ts b/src/plugins/presentation_util/public/services/kibana/labs.ts index db7810346988..fe0767ff09d8 100644 --- a/src/plugins/presentation_util/public/services/kibana/labs.ts +++ b/src/plugins/presentation_util/public/services/kibana/labs.ts @@ -7,7 +7,6 @@ */ import { - environmentNames, EnvironmentName, projectIDs, projects, @@ -15,6 +14,7 @@ import { Project, getProjectIDs, SolutionName, + LABS_PROJECT_PREFIX, } from '../../../common'; import { PresentationUtilPluginStartDeps } from '../../types'; import { KibanaPluginServiceFactory } from '../create'; @@ -31,6 +31,16 @@ export type LabsServiceFactory = KibanaPluginServiceFactory< PresentationUtilPluginStartDeps >; +const clearLabsFromStorage = (storage: Storage) => { + projectIDs.forEach((projectID) => storage.removeItem(projectID)); + + // This is a redundancy, to catch any labs that may have been removed above. + // We could consider gathering telemetry to see how often this happens, or this may be unnecessary. + Object.keys(storage) + .filter((key) => key.startsWith(LABS_PROJECT_PREFIX)) + .forEach((key) => storage.removeItem(key)); +}; + export const labsServiceFactory: LabsServiceFactory = ({ coreStart }) => { const { uiSettings } = coreStart; const localStorage = window.localStorage; @@ -75,17 +85,18 @@ export const labsServiceFactory: LabsServiceFactory = ({ coreStart }) => { }; const reset = () => { - localStorage.clear(); - sessionStorage.clear(); - environmentNames.forEach((env) => - projectIDs.forEach((id) => setProjectStatus(id, env, projects[id].isActive)) - ); + clearLabsFromStorage(localStorage); + clearLabsFromStorage(sessionStorage); + projectIDs.forEach((id) => setProjectStatus(id, 'kibana', projects[id].isActive)); }; + const isProjectEnabled = (id: ProjectID) => getProject(id).status.isEnabled; + return { getProjectIDs, getProjects, getProject, + isProjectEnabled, reset, setProjectStatus, }; diff --git a/src/plugins/presentation_util/public/services/labs.ts b/src/plugins/presentation_util/public/services/labs.ts index ef583bd4189a..70c40eaafa2e 100644 --- a/src/plugins/presentation_util/public/services/labs.ts +++ b/src/plugins/presentation_util/public/services/labs.ts @@ -20,6 +20,7 @@ import { } from '../../common'; export interface PresentationLabsService { + isProjectEnabled: (id: ProjectID) => boolean; getProjectIDs: () => typeof projectIDs; getProject: (id: ProjectID) => Project; getProjects: (solutions?: SolutionName[]) => Record; diff --git a/src/plugins/presentation_util/public/services/storybook/labs.ts b/src/plugins/presentation_util/public/services/storybook/labs.ts index 396db5246005..8bc526987d95 100644 --- a/src/plugins/presentation_util/public/services/storybook/labs.ts +++ b/src/plugins/presentation_util/public/services/storybook/labs.ts @@ -46,13 +46,17 @@ export const labsServiceFactory: LabsServiceFactory = () => { }; const reset = () => { + // This is normally not ok, but it's our isolated Storybook instance. storage.clear(); }; + const isProjectEnabled = (id: ProjectID) => getProject(id).status.isEnabled; + return { getProjectIDs, getProjects, getProject, + isProjectEnabled, reset, setProjectStatus, }; diff --git a/src/plugins/presentation_util/public/services/stub/labs.ts b/src/plugins/presentation_util/public/services/stub/labs.ts index c511ed26ef32..aee7ce20bd86 100644 --- a/src/plugins/presentation_util/public/services/stub/labs.ts +++ b/src/plugins/presentation_util/public/services/stub/labs.ts @@ -64,11 +64,13 @@ export const labsServiceFactory: LabsServiceFactory = () => { const setProjectStatus = (id: ProjectID, env: EnvironmentName, value: boolean) => { statuses[id] = { ...statuses[id], [env]: value }; }; + const isProjectEnabled = (id: ProjectID) => getProject(id).status.isEnabled; return { getProjectIDs, getProject, getProjects, + isProjectEnabled, setProjectStatus, reset: () => { statuses = reset(); diff --git a/x-pack/plugins/canvas/public/services/expressions.ts b/x-pack/plugins/canvas/public/services/expressions.ts index fd733862c4b6..35493341e0e8 100644 --- a/x-pack/plugins/canvas/public/services/expressions.ts +++ b/x-pack/plugins/canvas/public/services/expressions.ts @@ -25,8 +25,7 @@ export const expressionsServiceFactory: CanvasServiceFactory if (!cached) { cached = (async () => { const labService = startPlugins.presentationUtil.labsService; - const useDataSearchProject = labService.getProject('labs:canvas:useDataService'); - const hasDataSearch = useDataSearchProject.status.isEnabled; + const hasDataSearch = labService.isProjectEnabled('labs:canvas:useDataService'); const dataSearchFns = ['essql', 'esdocs', 'escount']; const serverFunctionList = await coreSetup.http.get(API_ROUTE_FUNCTIONS); diff --git a/x-pack/plugins/canvas/public/services/stubs/labs.ts b/x-pack/plugins/canvas/public/services/stubs/labs.ts index 7caa1d0139a7..db89c5c35d5f 100644 --- a/x-pack/plugins/canvas/public/services/stubs/labs.ts +++ b/x-pack/plugins/canvas/public/services/stubs/labs.ts @@ -14,6 +14,7 @@ export const labsService: CanvasLabsService = { getProject: noop, getProjects: noop, getProjectIDs: () => projectIDs, + isProjectEnabled: () => false, isLabsEnabled: () => true, projectIDs, reset: noop,